{
  "schema": "diagnosis_packet_v1",
  "generated_by": "ANU (read-only diagnosis, chair directive A 2026-06-03)",
  "generated_at": "2026-06-03 KST",
  "title": "finish-task EXTERNAL_DIRTY / shared-main dirty / lifecycle — 1순위 Core 병목",
  "status": "READ_ONLY_DIAGNOSIS — 코드 수정/cleanup 0. CHAIR decision 대기.",

  "1_shared_main_dirty_summary": {
    "total": 1238,
    "untracked_qq": 1144,
    "deleted_D": 79,
    "modified_M": 15,
    "top_categories": {
      "memory/events": 284, "memory/tasks": 266, "memory/reports": 231,
      "memory/specs": 62, "tests/regression": 56, "schemas": 44, "anu_v3": 44,
      "memory/events/archive": 28, "scripts": 21, "memory": 16, "utils": 11
    },
    "modified_files_15": ["config/constants.json", "memory/MEMORY.md(ANU 이번 세션 편집)", "memory/logs/app.log.1~5", "memory/reports/task-2708/2709/2711.md", "memory/specs/anu-system-spec.md + changelog", "memory/tasks/task-2.md", "tests/regression/test_replacement_pr_runner_2510.py", "utils/replacement_pr_runner.py"],
    "deleted_79": "대부분 memory/backups/system-spec/* (백업 정리로 삭제됐으나 미커밋)",
    "gitignore_note": "일부 memory/events/heartbeat*·memory/state/·memory/runtime/·memory/logs/*.log 만 ignore. 나머지 memory/events·tasks·reports·anu_v3·schemas 는 tracked-eligible 인데 미커밋 누적."
  },

  "2_dev4_task2716_relationship": {
    "finding": "★ dirty 는 dev4 단일 작업물이 아님. dev4 task-2716 = PR #162 harness same-PR bounded fix (commits f85e7a89/430c58df/8cd6e768, MERGED). task-2716 기여분은 일부.",
    "bulk_source": "1238 중 대다수는 ANU/system 이 dispatch·governance 과정에서 생성한 artifact (task md·reports·decision JSON·anu_v3 모듈) 가 main 작업트리에 미커밋 누적된 것. 특정 봇/task 귀속 아님 = SYSTEM_ARTIFACT_ACCUMULATION.",
    "correction": "이전 incident 기록('dev4 task-2716 1227줄 dirty')은 일부 정확하나 — 실제 근본은 dev4 1팀 작업 + 전 시스템 미커밋 누적의 합. 단일 owner cleanup 으로 안 끝남."
  },

  "3_intended_vs_artifact_classification": {
    "INTENDED_WORK_OR_SOURCE": ["config/constants.json(M — 의도 변경 가능성, 확인 필요)", "anu_v3/*.py(44 — 신규 모듈, 미커밋 작업물 가능)", "schemas/*(44)", "tests/regression/*(56)", "utils/replacement_pr_runner.py(M)", "scripts/*(21)"],
    "ANU_SYSTEM_ARTIFACT": ["memory/events/*(284 — decision/incident/callback/done marker)", "memory/tasks/*(266 — task md)", "memory/reports/*(231)", "memory/specs/*(62)", "memory/daily/*(14)", "memory/events/archive/*(28)"],
    "TRANSIENT_OR_IGNORABLE": ["memory/logs/app.log.* (M — gitignore 대상 후보)", "memory/backups/system-spec/* (D — 의도 삭제)"],
    "judgment": "memory/* artifact 는 운영 산출물(감사 가치 있으나 코드 아님). source(config/anu_v3/schemas/tests/utils)는 별도 검토 — 의도 작업이면 커밋, 아니면 정리."
  },

  "4_why_finish_task_blocks_all_done": {
    "mechanism": "finish-task GIT-GATE → utils.dirty_registry.classify_blocker(expected_files, dirty_paths). expected_files 밖 dirty 가 있으면 EXTERNAL_DIRTY_BLOCKER → exit 1 (line 707 영역) → .done 미생성 → ANU callback cron 미발사.",
    "root": "★ dirty 체크가 shared main 작업트리의 1238 누적 dirty 를 봄. task worktree 의 격리된 변경만 봐야 하는데, scope-base/PROJECT_PATH 가 main 에 묶여(recurrence WORKSPACE_ROOT_HARDCODE / backlog B finish_task_scope_guard_cumulative_diff) main dirty 를 task 밖 dirty 로 분류 → 모든 task 가 동일 차단.",
    "evidence": "task-2723+3·task-2724 external-dirty-blocker.json 에 memory/specs/anu-system-spec.md·memory/backups/* (main 파일) 가 unrelated_dirty 로 기록됨 = main 기준 체크 확정.",
    "scope_base_defect_link": "finish-task.sh line 457 `${MAIN_BRANCH}..HEAD` (로컬 main base) + classify 가 main 작업트리 status 사용 → backlog B 와 동일 근본."
  },

  "5_cleanup_options_3": {
    "OPTION_A_dev4_owner_cleanup": {
      "desc": "dev4(또는 각 작업 owner)가 자기 미커밋 작업물(anu_v3 모듈·source 변경)을 커밋/정리. memory artifact 는 별도.",
      "covers": "source dirty(anu_v3/schemas/tests/utils/config) 일부. memory/* 누적(781+)은 미해결.",
      "limit": "dirty 다수가 system artifact 라 owner 귀속 불명 → 부분 해결."
    },
    "OPTION_B_ANU_evidence_preserving_quarantine": {
      "desc": "ANU 가 memory/* artifact 를 evidence-preserving 방식으로 정리 — 삭제 0, archive/ 로 이동 또는 .gitignore 확장(memory/events·tasks·reports 를 ignore) 또는 일괄 commit(감사 보존). git stash/reset/clean 전체 금지 doctrine 준수.",
      "covers": "memory/* 누적(781+) 대부분.",
      "limit": "정리 방식(ignore vs commit vs archive) 결정 필요. config/anu_v3 source 는 별도."
    },
    "OPTION_C_task_specific_finish_path_correction": {
      "desc": "근본 수정 — finish-task scope-base/dirty 체크를 worktree 격리 기준으로 교정(backlog B). main 누적 dirty 와 무관하게 task 자기 변경만 평가 → 모든 task 의 EXTERNAL_DIRTY 차단 해소.",
      "covers": "★ 근본 — dirty 정리 없이도 finish-task .done/callback 정상화. 미래 누적에도 견고.",
      "limit": "finish-task.sh 코드 수정 = 자동 dispatch 금지 영역 + 회장 승인 필수. 회귀 광범위."
    },
    "recommended_combo": "C(근본, 회장 승인 후 task) + B(memory artifact 누적 위생, ignore 확장 권장). A 는 source dirty 한정 보조."
  },

  "6_risk_permission_approval": {
    "OPTION_A": {"risk": "LOW-MEDIUM (owner 작업물 오삭제 가능)", "permission": "각 owner / dev4 branch 개입 = 회장 승인", "approval": "CHAIR (dev4 branch 개입 금지 현행)"},
    "OPTION_B": {"risk": "MEDIUM (artifact 감사 가치 — 삭제 절대 금지, archive/ignore/commit 중 택)", "permission": "shared main 변경 = 회장 승인. git stash/reset/clean 전체 금지 doctrine", "approval": "CHAIR (정리 방식 결정 + 인가)"},
    "OPTION_C": {"risk": "MEDIUM-HIGH (finish-task = 모든 종료 경로 핵심, 회귀 광범위)", "permission": "finish-task.sh 수정 = 자동 dispatch 금지 영역", "approval": "CHAIR (backlog B task 발행 승인 + 설계검토 선행)"}
  },

  "chair_decision_needed": [
    "근본(C) finish-task scope/dirty worktree 격리 교정 task 발행 여부 (backlog B 승격)",
    "위생(B) memory/* 누적 정리 방식: .gitignore 확장 vs 일괄 commit vs archive 이동 — 택1 + 인가",
    "source dirty(config/anu_v3/schemas) — 의도 작업물인지 owner 확인 후 커밋 여부"
  ],
  "forbidden_now": ["finish-task.sh 수정", "shared main stash/reset/clean/delete", "dev4 branch 개입", "merge", "Work 착수"],
  "related": ["backlog_finish_task_scope_guard_cumulative_diff_260601", "backlog_start_task_guard_shared_main_coupling_260603", "feedback_gemini_high_recurring_5patterns_260603(WORKSPACE_ROOT_HARDCODE)", "task-2723+3/2724 callback-miss-incident"]
}
