# task-2729+16 — FINISH_TASK_CODE_ROOT_EVIDENCE_ENV_FIX (FRESH BASE replacement, activation 0)

## 레벨
Lv.3 (production infra fix — finish-task.sh-only. fresh origin/main base 재구현. git_evidence 무수정. activation 아님)

## 발번 주석
task-2729+15(dev4 9e4a3d34) = base 오염(canonical task-2716 분기)으로 PR 불가 → fresh origin/main 재구현. **task-2729+16** 발번. dev4 9e4a3d34 = reference design/evidence(read-only). dev4 branch 재사용 금지.

## ★★★ 최우선 — FRESH BASE HARD GATE (지난 실패 근본원인)
1. 작업 worktree 는 **반드시 origin/main `0307748b`(또는 이후 최신 main)** 에서 분기. **canonical(/home/jay/workspace, task-2716 계열) 분기 절대 금지.**
2. worktree 생성: `git fetch origin main && git worktree add -b task/task-2729+16-dev5 <worktree_path> origin/main` (★ origin/main 명시 base).
3. **작업·commit 전 base 검증(HARD GATE)**: `git -C <worktree> merge-base --is-ancestor 0307748b HEAD` == YES **AND** `git -C <worktree> log --oneline --grep='task-2716' | wc -l` == 0(task-2716 divergence 미상속). 둘 중 하나라도 실패 → **즉시 HOLD_FOR_CHAIR**(contaminated base).
4. diff 는 반드시 `origin/main..HEAD` 기준 expected_files 4~5 만. 84-파일 오염 diff 발생 시 = base 오염 → HOLD.

## 한 줄 목표
dev4 9e4a3d34 가 입증한 동일 logical env-fix 를 **fresh origin/main 의 현재 finish-task.sh 구조 위에 재구현**: (1) QC subprocess 에 PROJECT_PATH/WORKTREE_PATH(=selected evidence root=CODE_ROOT) 명시 전달 (2) CODE_ROOT clean task finalize 가 canonical dirty 로 false-block 되지 않게 dirty-scope 분리. **git_evidence.py 무수정·callback prereg root 무수정·GOAL-GATE/UNRESOLVED-GATE 미수정·activation 0.**

## 재구현할 logical fix (dev4 9e4a3d34 reference, 3 hunk — 현재 finish-task.sh 구조에 맞게 재작성)
- **H1 (상단 var/함수)**: `WORKSPACE="/home/jay/workspace"` → `WORKSPACE="${FINISH_TASK_WORKSPACE_OVERRIDE:-/home/jay/workspace}"` + `_detect_task_worktree()` 함수 추가(git worktree list --porcelain 에서 canonical 아닌 worktree 중 task_id commit 보유한 첫 worktree 반환, evidence-root tier③).
- **H2 (PROJECT_PATH resolution)**: 기존 PROJECT_PATH 자동탐지/strict 블록 **뒤에** tier③ 추가 — `[ -z "$PROJECT_PATH" ] || [ "$PROJECT_PATH" = "$WORKSPACE" ]` 시 `_detect_task_worktree` 결과로 PROJECT_PATH 설정. 그리고 **selected evidence root 변수**(예 `QC_EVIDENCE_ROOT`) 를 PROJECT_PATH(or WORKSPACE fallback)로 정의(set -u 안전).
- **H3 (QC 호출)**: 현재 finish-task.sh 의 QC 실행 라인(`python3 "$QC_SCRIPT" --gate --task-id ...`, 팀별/shared 양 분기) 앞에 `PROJECT_PATH="$QC_EVIDENCE_ROOT" WORKTREE_PATH="$QC_EVIDENCE_ROOT"` 명시 전파.
- **(dirty-scope)**: GIT-GATE PROJ_DIR 가 selected evidence root(CODE_ROOT) 기준이 되고 EXTERNAL_DIRTY 가 CODE_ROOT-격리 clean worktree finalize 를 false-block 안 하도록. 단 **OWN_DIRTY/forbidden/expected초과/stale·behind·diverged 는 fail-closed 유지.**
- ★ 현재 origin/main finish-task.sh 는 dev4 base 대비 16 hunk 다름(task-2729+3 finalize-env·#182·#186 G2 포함) — **dev4 hunk 를 그대로 붙이지 말고 현재 구조에 맞게 재배치**. 충돌/모호 시 HOLD.
- backward-compat: 일반 canonical-path task 는 기존 동작 100% 동일(회귀 증명).

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "scripts/finish-task.sh"
    - "tests/regression/test_finish_task_coderoot_evidence_env_fix_2729p16.py"
    - "memory/reports/task-2729+16.md"
    - "memory/plans/p0b-pickup/finish_task_coderoot_evidence_env_fix_fresh_base_design_260608.md"
    - "memory/events/task-2729+16.*"
    - "memory/tasks/task-2729+16-finish-task-coderoot-evidence-env-fix-fresh-base.md"
  read_only_reference:
    - "task/task-2729+15-dev4 commit 9e4a3d34 (reference design — diff 9e4a3d34^..9e4a3d34, read only)"
    - "memory/plans/p0b-pickup/finish_task_git_evidence_coderoot_commit_exists_blocker_diagnosis_260608.md"
    - "teams/shared/verifiers/git_evidence.py (resolution 참조 — 무수정)"
  forbidden_paths:
    - "/home/jay/workspace (canonical working tree — reset/clean/stash/switch/분기 금지)"
    - "teams/shared/verifiers/git_evidence.py"
    - "teams/dev*/qc/verifiers/git_evidence.py"
    - "scripts/harness/v36/callback_preregistration.py"
    - "dispatch/normal_fallback_callback_helper.py"
    - "memory/state/**"
    - "memory/events/task-*.result.json"
    - "memory/events/task-*.g4-fix-loop-count"
    - "deploy/systemd/**"
    - "dispatch.py"
    - "task-2716 branch (수정/분기 금지)"
    - "task/task-2729+15-dev4 (evidence-only 보존 — 재사용/rebase/force/push 금지)"
```

## EXPECTED FILES (정확히 4 — 초과 시 즉시 HOLD_FOR_CHAIR)
1. `scripts/finish-task.sh` — fresh origin/main 구조 위 env 전파 + dirty-scope(fail-closed 유지)
2. `tests/regression/test_finish_task_coderoot_evidence_env_fix_2729p16.py` — 회귀(isolated temp)
3. `memory/reports/task-2729+16.md`
4. `memory/plans/p0b-pickup/finish_task_coderoot_evidence_env_fix_fresh_base_design_260608.md`
- (필요 시 evidence 1개 — 4+1=5 초과 금지)
- ★ git_evidence(9사본)/callback prereg/GOAL-GATE/UNRESOLVED-GATE **무수정**. 수정 필요 판명 시 즉시 HOLD.

## 필수 검증 (회장 verbatim 13)
1. fresh branch base = origin/main 0307748b(이후 최신) — merge-base 검증. 2. diff(origin/main..HEAD) expected_files 4~5 이하. 3. git_evidence 9사본 변경 0. 4. callback prereg/normal_fallback_callback_helper 변경 0. 5. pytest 회귀 PASS. 6. bash -n finish-task.sh PASS. 7. QC subprocess 에 PROJECT_PATH/WORKTREE_PATH=selected CODE_ROOT 전달 확인. 8. CODE_ROOT COMMIT_EXISTS PASS. 9. canonical HEAD lineage 에 commit 없어도 selected root 기준 PASS. 10. canonical dirty 가 CODE_ROOT clean finalize false-block 안 함. 11. CODE_ROOT own dirty/forbidden/expected초과/stale·behind·diverged fail-closed. 12. canonical-path backward-compat PASS. 13. raw key 0·ACTIVE=false·systemd enable 0·activation_epoch absent·real spawn 0·canonical result.json mutation 0.

## 금지 (회장 verbatim)
1. ANU 수기 merge(N/A, 봇 작업)  2. contaminated dev4 branch 재사용  3. rebase/force  4. git_evidence.py 수정  5. 9 verifier 사본 수정  6. callback prereg root 변경  7. canonical reset/clean/stash -u/checkout -f  8. task-2716 수정/분기  9. 수동 .done  10. real spawn  11. systemctl enable  12. ACTIVE=true  13. activation_epoch 생성  14. PR push/merge/comment 자동
- 모든 검증 isolated temp. canonical 무손상.

## 이번 라운드 범위
- 구현 + isolated verify + PR_READY_CANDIDATE 까지. PR 생성/CI·Gemini gate/merge/activation = 별도 승인 전까지 0.
- ★ 재귀 주의: 본 task finalize 도 동일 블로커 가능 → 봇 self-dogfood(수정본 finish-task), 막히면 EXTERNAL_DIRTY/COMMIT_EXISTS/GOAL-GATE 분리 기록(robust callback 성공 과장 금지). ANU 가 origin/main..HEAD diff 독립검증 회수.

## 완료 판정
- 필수검증 13 PASS → **`PR_READY_CANDIDATE_FINISH_TASK_CODE_ROOT_EVIDENCE_ENV_FIX_ACTIVE_FALSE_FRESH_BASE`**(로컬 verify, PR 미생성).
- expected_files 초과 / fresh origin/main base 불충족 / git_evidence·callback prereg·9사본 수정 필요 / canonical reset·clean·stash 필요 / 수동 .done 필요 / real spawn·ACTIVE=true·systemd enable·activation_epoch 필요 / task-2716 수정 필요 → **`HOLD_FOR_CHAIR`**.
- ★ PR·activation 별도 회장 승인 전까지 금지.

## doctrine
직접 코딩 금지(ANU)/봇 위임 / fresh origin/main base 강제(canonical 분기 금지) / canonical·task-2716·dev4 branch 무손상 / isolated temp / git_evidence·callback prereg·GOAL/UNRESOLVED-GATE 무수정 / backward-compat 필수 / activation 0 / raw key 0 / same-PR push 금지·bot trigger 금지·long polling 금지.
```yaml
callback_envelope_byte_limit: 3900
callback_collector_role: ANU
callback_owner_key_source: ".env.keys COKACDIR_KEY_ANU (sealed, literal 출력 0)"
```
