{
  "marker_version": "v1",
  "marker_type": "anu_new_step_2_scope_guard_false_positive_main_dot_dot_HEAD_misfire_root_cause_260529",
  "recorded_at": "2026-05-29T10:15:00+09:00",
  "recorded_by": "ANU_chair_facing_session_new_step_2_completion",
  "source_attribution": "RECEIVED_INBOUND_THIS_SESSION (★ 회장 verbatim 추가 위임 새 STEP 2 read-only · 코드 수정 0 · 'task-2569 계열 재발 여부' 평가)",

  "confirmed_fact": {
    "main_dot_dot_HEAD_comparison_path_script_source": {
      "script_path": "scripts/finish-task.sh",
      "line_numbers": "L431-437",
      "verbatim_code": "git -C \"$SCOPE_PROJ_DIR\" diff --name-only \"${MAIN_BRANCH}..HEAD\" > \"$SCOPE_DIFF_FILE\" 2>/dev/null \\\n    || git -C \"$SCOPE_PROJ_DIR\" diff --name-only HEAD~1 > \"$SCOPE_DIFF_FILE\" 2>/dev/null \\\n    || true",
      "project_dir_source": "SCOPE_PROJ_DIR=${PROJECT_PATH:-$WORKSPACE} (★ system task 시 workspace 자체 사용)",
      "fallback_path": "HEAD~1 (★ main..HEAD 실패 시)",
      "anu_conclusion": "★ scope-diff source = git diff --name-only main..HEAD · task 시작 시점 (lock_sha) 비교 0"
    },
    "workspace_dirty_state_audit": {
      "git_status_porcelain_count_lines": 1046,
      "dirty_examples_first_15": [
        "M config/constants.json",
        "D memory/events/task-2309.done.acked",
        "D memory/events/task-2309.done.notified",
        "D memory/events/task-2310.done.acked",
        "D memory/events/task-2311.done.acked",
        "D memory/events/task-2311.done.notified",
        "D memory/events/task-2312.done.acked",
        "D memory/events/task-2313.done.acked",
        "D memory/events/task-2313.done.notified",
        "D memory/events/task-2314.done.acked",
        "D memory/events/task-2314.done.notified",
        "D memory/events/task-2315.done.acked",
        "D memory/events/task-2315.done.escalated",
        "D memory/events/task-2315.done.notified",
        "D memory/events/task-2316.done.acked"
      ],
      "anu_conclusion": "★ workspace dirty 1046 files · task-2300대부터 매우 오래된 누적 잔여 · task-2705+3 의 의도적 변경 ~5 files 외 무관 dirty 1041+ files"
    },
    "task_2569_fix_application_status": {
      "scripts_finish_task_sh_lock_sha_grep_hits": 0,
      "applied_task_2569_components": ["RC-3 stash lifecycle audit (L31 / L1316)"],
      "missing_task_2569_components": ["RC-1 lock_sha..HEAD branch (★ 핵심 fix)", "RC-2 lock_sha 박제 marker"],
      "anu_conclusion": "★ task-2569 핵심 fix (lock_sha..HEAD 자동 분기) 미적용 · stash audit 만 적용"
    },
    "task_2705plus3_scope_violation_25_origin_per_dirty_audit": {
      "actual_task_2705plus3_intended_changes_estimated": 5,
      "scope_violation_25_files": "★ STEP 1 직전 박제 정합 — 25/25 = task-2701~2705+1 prior task lineage 잔여 dirty 가 main..HEAD 에 포함",
      "session_watchdog_sh_specific_evidence": [
        "★ mtime 2026-05-28 16:15:25 = task-2704 commit d96ab6f2 시점",
        "★ git diff HEAD = EMPTY (★ task-2705+3 시점 byte-identical with HEAD)",
        "★ 그러나 main..HEAD 비교 시 task-2704 변경 포함 → scope-guard 가 task-2705+3 의 변경으로 잘못 분류",
        "★ task-2705+3 forbidden_paths 에 session-watchdog.sh 명시 박제 → forbidden_paths 위반 결과"
      ],
      "anu_conclusion": "★ session-watchdog.sh false positive = task-2704 commit 잔여 dirty + main..HEAD 비교 + forbidden_paths 명시 박제 3중 결과 (★ task-2705+3 실 변경 0 확정)"
    }
  },

  "root_cause": {
    "primary_root_cause": "★ scripts/finish-task.sh L435 의 `git diff --name-only main..HEAD` 가 task 시작 시점 (lock_sha) 가 아닌 main 과 비교 → workspace 누적 dirty state (1046 files) 가 main..HEAD diff 에 모두 포함 → scope-guard 가 무관 prior task lineage 의 변경을 본 task 의 변경으로 잘못 분류",
    "secondary_root_cause": "★ task-2569 RC-1/RC-2 (lock_sha..HEAD 분기) 미적용 · RC-3 (stash audit) 만 적용 → task-2569 fix proposal 부분 적용 상태 유지",
    "tertiary_root_cause": "★ workspace 1046 files dirty 누적 (★ task-2300대부터) · main 에 commit/push 안 함 (★ 회장 verbatim PR 금지 정합) → main..HEAD diff 가 모든 누적 dirty 누적 분류"
  },

  "recurrence_risk": {
    "level": "HIGH",
    "rationale": [
      "★ task-2569 RC-1/RC-2 lock_sha fix 미적용 (★ scripts/finish-task.sh lock_sha 0 hits)",
      "★ workspace 1046 files dirty 누적 유지 (★ commit/push 안 함)",
      "★ 모든 후속 sub-task (★ task-2705+5/+6/+7 등) 가 동일 false positive 재발 예상",
      "★ session-watchdog.sh / settings.json / scripts/harness/v36/** / tests/harness/test_v36_** 등 forbidden_paths 명시 파일이 main..HEAD diff 에 매번 포함 → 매번 violation 발생",
      "★ task-2569 fix 가 production 적용되지 않는 한 영구 재발"
    ],
    "estimated_recurrence_frequency": "★ 모든 후속 sub-task 에서 100% 재발 예상 (★ scope-guard FAIL → finish-task.sh L451 exit 1 → .done 부재 → task-timer running 무한 누적)"
  },

  "candidate_contract_fix": {
    "fix_option_A_finish_task_sh_lock_sha_branch": {
      "scope": "★ finish-task.sh L435 의 main..HEAD → lock_sha..HEAD 자동 분기 (★ task-2569 RC-1 fix proposal 정합)",
      "implementation_outline": "① dispatch.py 또는 task md 기준 시점 lock_sha 박제 마커 작성 (★ 예: memory/events/<task_id>.lock-sha.txt) ② finish-task.sh L431-437 가 lock_sha 마커 존재 시 lock_sha..HEAD diff 사용 · 없으면 main..HEAD 폴백",
      "risk": "MEDIUM (★ finish-task.sh 직접 수정 = 회장 verbatim 'finish-task.sh 수정 금지' 정합 위배)",
      "chair_authorization_required": true,
      "anu_action": "★ 자체 implementation 0 · 회장 결재 시 별도 task 후보"
    },
    "fix_option_B_p1b_external_layer": {
      "scope": "★ P1-B finish-task profile contract 외부 layer 적용 (★ task_mode 기반 분기로 task-2569 fix 우회)",
      "implementation_outline": "★ scripts/harness/v36/finish_task_profile_judge.py 가 scope-guard FAIL 결과를 task_mode 별 PASS/WARN/FAIL/ESCALATE 분류 → main..HEAD misfire 시 task_mode + lock_sha 정합 평가",
      "risk": "LOW (★ finish-task.sh NO TOUCH · 외부 contract layer)",
      "dependency": "★ P1-B 구현 결재 (★ 회장 결재 시)",
      "anu_action": "★ STEP 3 P1-B matrix 정밀화 (★ 본 ANU 작업 진행 중)"
    },
    "fix_option_C_lock_sha_marker_only": {
      "scope": "★ dispatch.py 가 task 시작 시점 lock_sha 마커만 박제 (★ finish-task.sh 0 touch)",
      "implementation_outline": "★ dispatch.py 진입 시 memory/events/<task_id>.lock-sha.txt 박제 → 외부 contract layer (P1-B 등) 가 read-only 활용",
      "risk": "LOW (★ dispatch.py 추가 결선 · finish-task.sh NO TOUCH)",
      "anu_action": "★ 회장 결재 시 별도 task 후보"
    },
    "fix_option_D_workspace_dirty_cleanup_no_action_now": {
      "scope": "★ workspace 1046 files dirty 누적 정리 (★ commit 또는 stash)",
      "risk": "HIGH (★ 회장 verbatim 'PR/branch push/merge 금지' 정합 위배 + 1046 files 일괄 commit 위험)",
      "anu_action": "★ 회장 결재 시에만 별도 task 후보 (★ 자동 0)"
    },
    "anu_preferred_option_per_evidence_doctrine": "B (★ P1-B 외부 layer · finish-task.sh NO TOUCH 정합 · IMPLEMENT_LATER 권고 정합)"
  },

  "anu_self_limitation": [
    "★ ANU 자체 finish-task.sh 수정 0 (★ 회장 verbatim 'finish-task.sh 수정 금지')",
    "★ ANU 자체 dispatch.py lock_sha 마커 결선 0 (★ 회장 결재 시에만)",
    "★ ANU 자체 workspace 1046 files dirty cleanup 0 (★ PR/commit/push 금지 + 일괄 정리 위험)",
    "★ ANU 자체 task-2569 fix 재시작 task 자동 발의 0 (★ 회장 결재 시에만)"
  ],

  "anu_mutating_action_count": 0,
  "anu_forbidden_action_count": 0,
  "anu_automatic_implementation_dispatch_count": 0,
  "linked_markers": [
    "memory/events/anu_step_0_task_2705plus3_artifacts_recovery_260529.json (★ STEP 0 25 violations 정합)",
    "memory/events/anu_step_1_scope_guard_25_classification_260529.json (★ STEP 1 A/B/C 25/0/0)",
    "memory/events/anu_step_1_task_2705plus3_done_qc_warn_investigation_260529.json (★ STEP 1 직전 finish-task.sh L451 exit 1)",
    "memory/specs/v36_finish_task_profile_contract_design_draft_260529.md (★ P1-B fix option B)",
    "scripts/finish-task.sh (★ L431-437 main..HEAD 박제 source · L31/L34/L1316 task-2569 RC-3 stash audit only)",
    "feedback_pr_subtask_worktree_isolation_260513.md (★ task-2569 박제 정합)"
  ]
}
