# task-2729+19 — POST_GOAL_GATE_FINALIZE_CALLBACK_DOGFOOD (DOGFOOD_PASS_ACTIVE_FALSE)

## 메타
- 작업 ID: task-2729+19
- 팀/봇: dev2-team · 오딘(Odin)/bot-b
- 레벨: Lv.2 (verification-only dogfood — finish-task GOAL-GATE finalize/callback 정상화 검증. **production activation 검증 아님**)
- Fresh base: origin/main `571a4ce3` (= task-2729+18 PR #192 GOAL-GATE placeholder hardening merge)
- 격리 워크트리: `/tmp/dogfood-2729p19/wt` (detached HEAD `571a4ce3`, **canonical 무손상**)
- 결과: **DOGFOOD_PASS_ACTIVE_FALSE**

---

## S — Situation
task-2729+17 이 finish-task.sh `goal_gate_evaluate()` 에 placeholder default-deny + timeout guard + 4-state 판정을 도입했고, task-2729+18(PR #192)이 이를 main(`571a4ce3`)에 squash merge 했다. 본 task 는 **merged main 의 GOAL-GATE 가 실제 finish-task 경로에서 hang 없이 4-state 로 동작하고 finalize/callback 단계까지 도달**하는지를 격리 fixture 로 dogfood 한다.

## C — Complication
- 수정 전 결함: task md 자동생성 `## goal_assertions` 에 미확장 placeholder `python3 $QC_SCRIPT --gate --task-id ...` 가 들어오면 GOAL-GATE 가 `eval` 로 그대로 실행 → 무한 행(hang) → finalize 정지 → 세션 사망(+14/+15/+16 callback miss 의 직접 원인).
- 본 dogfood 는 **production 코드 무수정** 원칙 하에, 실제 ANU spawn / live callback cron 발사가 필요한 지점에서는 **발사하지 않고 HELD 로 분리 기록**해야 한다.

## Q — Question
merged main(`571a4ce3`) GOAL-GATE 가 격리 fixture 에 대해 (1) placeholder skip + normal pass 최소 + 가능 시 fail/timeout 4-state 분리, (2) hang 0, (3) set +e/-e 누수 0, (4) finalize/callback 단계 도달을 **production 무수정·activation 0·live callback 발사 0** 으로 실증할 수 있는가?

## A — Answer
**YES — DOGFOOD_PASS_ACTIVE_FALSE.** 격리 detached 워크트리(`571a4ce3`)에서 `GOAL_GATE_LIB_MODE=1` 로 `goal_gate_evaluate` 만 source 하여 6개 fixture 시나리오를 실행. 4-state 전부 분리·hang 0·set-e 누수 0·finalize-reachability(verbatim 분기) 확인. live callback 발사·real spawn·activation 은 전부 미수행(HELD).

---

## 1. Fresh base / 격리 확인
- 워크트리 HEAD = `571a4ce3` (`git worktree add --detach /tmp/dogfood-2729p19/wt 571a4ce3`).
- `571a4ce3` 커밋 = `task-2729+18: GOAL-GATE placeholder hardening (Option A replacement, fresh base, ACTIVE=false) (#192)`.
- canonical `/home/jay/workspace` = branch `task/task-2716-pr-diff-hygiene-guard-dev4`, HEAD `75fdf540` — **dogfood 전후 불변**.
- 모든 fixture 는 `/tmp/dogfood-2729p19/`(isolated temp). canonical write 0.

## 2. 4-STATE 관측 + HANG 0 실증
`goal_gate_evaluate <fixture>` 를 lib 모드에서 직접 호출, stdout=4-state·elapsed 측정:

```
placeholder_var  state=SKIP     expect=SKIP     elapsed= 0.03s  OK   # python3 $QC_SCRIPT --gate --task-id ...
template_token   state=SKIP     expect=SKIP     elapsed= 0.03s  OK   # grep <foo> ...
normal_pass      state=PASS     expect=PASS     elapsed= 0.03s  OK   # grep -q '^#' pass_target.txt
real_fail        state=FAIL     expect=FAIL     elapsed= 0.03s  OK   # grep -q 'ZZZ_NOT_PRESENT_MARKER'
timeout_state    state=TIMEOUT  expect=TIMEOUT  elapsed= 2.04s  OK   # python3 sleep(20), GOAL_CMD_TIMEOUT=2
mixed_priority   state=FAIL     expect=FAIL     elapsed= 0.07s  OK   # SKIP+PASS+FAIL → FAIL (우선순위)
```

### 핵심 실증
- **placeholder hang 해소**: 수정 전 무한 행을 유발하던 정확한 명령 `python3 $QC_SCRIPT --gate --task-id ...` 가 **실행되지 않고 0.03~0.04s 에 SKIP**(default-deny). 미확장 `$VAR`/`${VAR}` + 리터럴 `...` + 토큰형 `<foo>` 3종 모두 실행 전 차단.
- **hang 0 (timeout guard)**: 진짜로 20초 멈추는 명령(`sleep(20)`)도 `GOAL_CMD_TIMEOUT=2` 의 `timeout 2s` 가 **2.04s 에 강제 차단 → TIMEOUT**. 어떤 시나리오도 무한 행 없음 (driver 전체 4.3s 완주, 그 중 2s+2s 가 의도된 timeout 케이스).
- **2중 안전망**: (a) placeholder default-deny 로 위험 명령 자체를 실행 안 함, (b) 실행되는 명령은 timeout guard 로 상한. 둘 중 하나만으로도 hang 차단.
- **4-state 우선순위**: TIMEOUT > FAIL > SKIP > PASS 검증(mixed = SKIP+PASS+FAIL → FAIL).
- **skip ≠ PASS 과장 금지 준수**: SKIP 은 `GOAL_ASSERTION_PLACEHOLDER_SKIPPED` 로 stderr 명시 기록, PASS 와 분리.

stderr 마커(증거):
```
[GOAL-GATE] SKIP GOAL_ASSERTION_PLACEHOLDER_SKIPPED: python3 $QC_SCRIPT --gate --task-id ...
[GOAL-GATE] SKIP GOAL_ASSERTION_PLACEHOLDER_SKIPPED: grep <foo> ...
[GOAL-GATE] PASS: grep -q '^#' ...
[GOAL-GATE] FAIL: grep -q 'ZZZ_NOT_PRESENT_MARKER' ...
[GOAL-GATE] TIMEOUT (fail-closed): python3 -c "import time; time.sleep(20)"
```

## 3. set +e/-e 누수 0
caller 에서 `set -e`(errexit ON) 상태로 내부 FAIL·TIMEOUT assertion 을 통과시킨 뒤 `$-` 재확인:
```
[pre]  caller errexit ON
[post] caller errexit ON  -> NO LEAK (preserved)
```
`goal_assertion_exec_isolated` 의 `$-` 저장·복원(in-shell) + 호출부 subshell 캡처(이중 격리)로 **caller errexit 누수 0**. 내부 실패가 caller shell 을 죽이지 않음.

## 4. FINALIZE / CALLBACK 도달 (분리 기록 — live 발사 HELD)
merged finish-task.sh L1664~1680 4-state 분기를 **verbatim** 으로 격리 재현(전체 finish-task·canonical·callback 미실행):
```
PASS     -> PROCEED to finalize (.done)                         branch_exit=0
SKIP     -> SKIPPED, skip!=PASS, PROCEED to finalize (비차단)    branch_exit=0
FAIL     -> BLOCKED_FAIL_CLOSED (exit 1), finalize NOT reached   branch_exit=1
TIMEOUT  -> BLOCKED_FAIL_CLOSED (exit 1), finalize NOT reached   branch_exit=1
```
- **finalize 도달 보장 입증**: placeholder SKIP 은 BLOCK/hang 없이 **finalize(.done) 단계로 진행**(skip≠PASS 이되 비차단). PASS 도 진행. → "GOAL-GATE 에서 죽거나 멈추지 않고 finalize 관련 단계까지 도달" 충족.
- **fail-closed 보존**: 정상 assertion 의 FAIL/TIMEOUT 만 `GOAL_MODE=fail` 에서 차단(exit 1). 설계 의도대로 동작.

### 분리 기록 (혼합 금지)
| 항목 | 상태 | 근거 |
|---|---|---|
| GOAL-GATE → finalize 단계 **도달(코드 경로)** | **REACHED** | 4-state 분기 verbatim 재현 — SKIP/PASS branch_exit=0 |
| callback prereg·envelope **생성 가능 여부** | **NOT_TESTED / HELD** | 본 task 범위 밖(callback prereg Phase B DEFER). 격리 fixture 내부 real spawn 금지 |
| result·report **기록 가능** | **YES** | 본 보고서(memory/reports/task-2729+19.md) 정상 작성 |
| robust normal callback **자동수렴 성공** | **NOT_TESTED / HELD** | live callback 발사가 승인 범위 밖 → 단정·과장 금지. "도달했으나 live 발사 held" |
| dogfood fixture 내부 callback 단계 **live 발사** | **HELD (미발사)** | real ANU spawn / live callback cron 0 (금지 준수) |

★ 봇→ANU **완료보고 normal callback**(본 task 결과 전달용, 정상 운영 경로)과 **dogfood fixture 내부의 callback 단계 도달 관측(held)** 은 분리. 후자는 발사하지 않음.

## 5. file_touch_ratio_check root mismatch (분리 — FILE_TOUCH_RATIO_CHECK_CODE_ROOT_RECOGNITION)
**실관측 (과장 금지):**
- 실행: `python3 teams/shared/verifiers/file_touch_ratio_check.py task-2729+19` (canonical default root).
- **결과 = `SKIP` ("보고서에 수정 파일 섹션 없음")** — 본 보고서는 상대경로 표기/절대경로 `- /home/jay/workspace/...` 변경파일 목록 부재 → 파서가 변경파일 0건 추출 → **비차단 SKIP**(FAIL 아님). 이번 run 에서 false-negative FAIL 로 .done 을 차단한 사실 **없음**.

**구조적 caveat (코드 root 인식):**
- 시그니처 `verify(task_id, workspace_root="/home/jay/workspace")` — workspace_root **하드코딩 default** 가 (a) 보고서 read 경로 `{root}/memory/reports/{task_id}.md`, (b) `git -C {root} diff --name-only HEAD~5`, (c) `_extract_reported_files` 의 경로 prefix(`base = workspace_root`) **3곳 모두**에 결합. **PROJECT_PATH/WORKTREE_PATH env 미인식**.
- 결과: 격리 worktree·검증전용 task 에서는 보고서가 어느 root prefix 로 파일을 적느냐에 따라, 그리고 diff 가 canonical(task-2716) 기준으로 계산되어, **root 선택에 따라 판정이 달라지는 결합**이 존재. (실측: 동일 절대경로 변경목록도 workspace_root 가 canonical 이냐 worktree 이냐에 따라 prefix 매칭/SKIP 분기.)
- **분류 = `FILE_TOUCH_RATIO_CHECK_CODE_ROOT_RECOGNITION`** (구조적 root-결합 caveat). 본 task 는 verifier **무수정**(production code 수정 금지). 회장 승인 하 env-aware root 인식(PROJECT_PATH/WORKTREE_PATH) 개선 후보로 **분리 기록만**.

## 완료 판정 (회장 verbatim 11 조건)
1. fresh base 확인 — ✅ `571a4ce3`
2. GOAL-GATE hang 0 — ✅ (timeout guard 2.04s 상한, driver 완주)
3. placeholder skip + normal pass — ✅ (0.03s SKIP / PASS)
4. skip/pass/fail/timeout 상태 분리 — ✅ (4-state + 우선순위)
5. raw key 0 — ✅ (credential literal 0, 본 보고서·아티팩트 스캔)
6. ACTIVE=false — ✅
7. systemd enable 0 — ✅ (artifacts 내 systemctl 0)
8. activation_epoch absent — ✅
9. real spawn 0 — ✅
10. canonical task-2716 branch·live artifacts 무손상 — ✅ (HEAD 75fdf540 불변)
11. file_touch_ratio mismatch 분리 기록 — ✅ (§5)

→ **DOGFOOD_PASS_ACTIVE_FALSE**

## 금지사항 준수 (회장 verbatim 13)
production ACTIVE 전환 0 / systemctl enable 0 / ACTIVE=true 선언 0 / activation_epoch 생성 0 / real ANU spawn 0 / **live ANU callback cron 발사 0(완료보고 callback 제외)** / canonical result.json 이동·삭제·quarantine 0 / canonical reset·clean·stash -u·checkout -f 0 / task-2716 branch 수정 0 / live memory artifacts 이동·삭제 0 / callback prereg Phase B 착수 0 / **production 코드 수정 0**(finish-task.sh·dispatch.py·callback prereg·git_evidence·file_touch_ratio_check 무수정) / PR merge 자동 실행 0.

## 산출물
- `memory/reports/task-2729+19.md` — 본 보고서 (canonical, untracked 작업 아티팩트).
- 격리 드라이버/픽스처: `/tmp/dogfood-2729p19/` (isolated temp — driver.sh / reach.sh / fixtures/).

## 모델 사용 기록
- 오딘(봇, dev2): dogfood 실행·관측·보고 (격리 검증 성격, 직접 production 코딩 0).

## 완료 후 callback
- 봇 → ANU(collector) **normal 완료보고 callback**: task_id / result_path / report_path / terminal_state=DOGFOOD_PASS_ACTIVE_FALSE / sha256 / one-line summary (envelope only, UTF-8 ≤3900 bytes). dogfood fixture 내부의 real ANU spawn·production activation 은 미트리거(분리).
