# task-2724+1 — terminal_state_callback bounded fix: canonical_root 하드코딩 제거 + 테스트 실제 cron 등록 0 (회장 승인)

## 회장 인가 (2026-06-03, bounded fix — PR #170 fresh HIGH 2건)
PR #170(head `e78053f9`) Gemini fresh HIGH 유효:
1. **canonical_root `/home/jay/workspace` 하드코딩** → task-2723+3/2724 에서 반복된 PROJECT_PATH/main workspace misbinding 을 terminal callback 계층에 재상속. (terminal_state_callback.py line 235·278)
2. **`_register_callback` workspace passthrough 부족**.
3. **★ 테스트/스모크가 실제 cokacdir ANU callback cron 을 등록**(L1 스모크가 7DA1D123 등록 후 제거) → 운영 activation/pilot 금지 원칙 위반. (line 300 `subprocess.run([cokacdir --cron])` 가 flag/테스트 우회로 실제 등록)
→ bounded fix. expected_files 3개 내부 surgical.

## worktree
- branch `task/task-2724-dev1` (head `e78053f9`, origin push 됨)에서 **이어서**. new head → non-force push. PR #170 갱신.
- ★ start_task_guard 가 scheduler/cokacdir worktree(`/home/jay/.cokacdir/workspace/<sid>/wt-2724-dev1`)를 표준 worktree 로 인식 못 할 수 있음 — lock 수동생성 회피, 정상 worktree 경로 확보(별도 backlog 기록됨, 이 task blocker 아님).

## 허용 파일 (expected_files 3개 — 그 외 수정 금지)
1. `scripts/finish-task.sh` (필요 시 hook 의 context 전달 보강만 — 여전히 1줄 수준)
2. `scripts/harness/v36/terminal_state_callback.py` (주 수정)
3. `tests/regression/test_terminal_state_callback_2724.py` (dry-run/mock + 회귀)

## 수정 방향 (회장 9 — surgical)
1. **`/home/jay/workspace` 하드코딩 제거** (line 235 prompt 문자열 + line 278 launch_callback 인자). canonical_root = **전달받은 `workspace`** 사용.
2. canonical_root/workspace 는 finish-task hook 의 `--workspace`(WORKSPACE) → CLI 인자 → env/context 순으로 수신. (emit 은 이미 `workspace` 인자 보유 → 하류로 passthrough)
3. **`_register_callback` 에 `workspace`/`canonical_root` context passthrough** (emit → _register_callback 인자 추가, 하드코딩 제거).
4. self-key guard / owner 검증 / argv 존재 확인 **유지**.
5. `TERMINAL_CALLBACK_ENABLED` default-off **유지**.
6. flag on / activation / pilot / actual operational callback 실행 **금지**.
7. **테스트/스모크 경로에서 실제 cokacdir cron 등록 절대 0**.
8. 테스트는 **dry-run/mock backend** 사용 — `_register_callback` 의 실제 등록 backend(line 300 `subprocess.run`)를 **주입가능(injectable runner) 또는 dry_run 분기**로 추상화. 테스트는 mock runner/dry_run=True 주입 → 실제 cokacdir 미호출. 운영 경로(flag on)에서만 real registration.
9. real registration 은 운영 경로에서만 가능, 이번 PR 은 flag default-off 라 비활성.

## 필수 regression/검증 (회장 12)
1. canonical_root 가 하드코딩 `/home/jay/workspace` 미사용 (grep `/home/jay/workspace` 하드코딩 = 0).
2. workspace/root 가 인자 전달 → envelope/registration 에 반영 (다른 workspace 주입 시 그 값 사용).
3. `_register_callback` workspace passthrough 검증.
4. **테스트/스모크에서 실제 cron 등록 0** (mock runner 호출만, 실 subprocess cokacdir 미실행 단언).
5. dry-run/mock registration 으로 `callback_registered` 결과 검증.
6. NORMAL_SUCCESS / EXTERNAL_DIRTY / SCOPE / GIT_GATE / QC_FAILED / UNKNOWN_FINISH_FAILURE 기존 15 regression 유지.
7. `.done` 위조 0. 8. duplicate emit 1회 보장. 9. ANU key literal source 노출 0 (test 의 negative-assertion 제외). 10. `TERMINAL_CALLBACK_ENABLED` default-off 유지. 11. finish-task.sh hook 1줄 수준 유지. 12. diff = expected_files 3파일 내부.
- smoke: `python3 -m pytest tests/regression/test_terminal_state_callback_2724.py -q` + `bash -n scripts/finish-task.sh`.

## 금지 (회장 verbatim)
- expected_files 3개 밖 수정 금지 · task-2725 혼입 금지 · PR #169 commit 금지 · dispatch runtime 광범위 수정 금지 · pickup/systemd 수정 금지 · activation flag 생성·systemctl·actual wake 금지 · credential 확장 / Work 착수 / merge 금지 · **TERMINAL_CALLBACK_ENABLED 활성화 금지 · pilot 금지 · 테스트/스모크의 실제 cron 등록 금지**.

## doctrine
- same-PR post-Gemini push 금지(bounded fix = 새 commit→new head→non-force push). bot `/gemini review` 무효(인간 OWNER 1회). long polling 금지(watcher 위임).

## finalize (PR #170 갱신 → MERGE_READY_CANDIDATE — merge 금지)
1. fix → 12 검증 PASS → `git add` 3파일(±) → commit → **non-force push**(PR #170 갱신).
2. `memory/reports/task-2724.md` 갱신(L1 + 실제 cron 등록 0 확인 명시). 3. `memory/events/task-2724+1.done` 생성.
4. ANU normal callback cron 강제 등록 — collector_role=ANU, ANU_KEY=c119085addb0f8b7(sealed, literal 노출 금지). self-key 금지. cron 0+sendfile only=NOT_REGISTERED fail-closed.
5. ★ merge 금지 — ANU/watcher 가 새 head OWNER /gemini review → CI/Gemini watcher → CI GREEN + fresh unresolved 0 + diff 3파일 + forbidden 0 + ANU key 0 + flag default-off + **test cron registration 0** 시 MERGE_READY_CANDIDATE 보고.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "scripts/finish-task.sh"
    - "scripts/harness/v36/terminal_state_callback.py"
    - "tests/regression/test_terminal_state_callback_2724.py"
    - "memory/reports/task-2724.md"
    - "memory/events/task-2724+1.done"
  forbidden_paths:
    - "teams/shared/verifiers/critical_gap.py"
    - "dispatch/normal_fallback_callback_helper.py"
    - "deploy/systemd/**"
    - ".github/**"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
    - "bash -n"
  merge_policy: "none"
  ttl_hours: 48
```

## goal_assertions (auto)
- `python3 -m pytest tests/regression/test_terminal_state_callback_2724.py -q`
- `bash -n scripts/finish-task.sh`
- `python3 -c "import sys; s=open('scripts/harness/v36/terminal_state_callback.py').read(); sys.exit(1 if '/home/jay/workspace' in s else 0)"`
- `python3 -c "import sys; s=open('scripts/harness/v36/terminal_state_callback.py').read(); sys.exit(1 if 'c119085addb0f8b7' in s else 0)"`

## 상태
CHAIR_APPROVED_BOUNDED_FIX — dev1 재위임. flag on/activation/pilot = merge 이후 별도 승인. PR #169(task-2725) 분리·HOLD 유지.