# task-2729+11 보고서 — POST#186 Callback/Finalize Dogfood + G4 Cap Audit

> 팀: dev4 (비슈누) | 레벨: Lv.3 audit-first | 작성: 2026-06-07 13:5x KST
> 최종 verdict: **`CALLBACK_FINALIZE_DOGFOOD_PASS_ACTIVE_FALSE`** (ACTIVE=false 유지)

## SCQA 요약

**S**: (Situation) PR#186(7e18ab4d, origin/main)이 start_task_guard #7 을 worktree-root 기준으로 hardening + finish-task G2 nullglob-safe 로 수정했으나 dogfood 미수행 상태(`CALLBACK_FINALIZE_PATH_EXPECTED_IMPROVED_NOT_YET_DOGFOODED`)였다. canonical working tree 는 task-2716(75fdf540, non-main)에 parked 중이다.

**C**: (Complication) task-2729+5/+7/+8/+10 에서 callback 미발사가 반복됐고, 원인 후보는 START_TASK_GUARD #7 의 canonical=main 가정과 G4 fix_loop_cap 였다. canonical 이 parked 라 canonical 체크아웃의 start_task_guard.py 는 #186 미포함 구버전(`main_current_branch != "main"` 강제)이다.

**Q**: (Question) #186 의 worktree-root #7 + G2 가 canonical-parked 상태에서도 정상 작동하는가? task-2729+10 의 G4 cap(count=2)은 stale residue 인가 live blocker 인가?

**A**: (Answer) 격리 temp repo + **실제 canonical-parked 라이브 worktree** 이중 dogfood 결과 #186 #7 이 검증 #1~#9 전부 LIVE 통과(exit 0). G2 nullglob-safe 면제 매트릭스 3종 PASS. G4 cap 은 **STALE_RESIDUE**(cap 11:49 < PR#186 merge 13:24, finalize 경로가 pre-existing count=2 를 읽어 발생, PR 결함 0 으로 정상 머지). callback prereg seed/robust 분리 성공. 회귀 10건 PASS. **production activation 0, real ANU spawn 0, 수동 .done 0, G4 counter reset 0.**

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/harness/v36/post186_callback_finalize_dogfood_audit.py | dogfood/G4/callback audit 하니스 (신규) | grep "CALLBACK_FINALIZE_DOGFOOD_PASS_ACTIVE_FALSE" OK | verified |
| tests/regression/test_post186_callback_finalize_dogfood_2729p11.py | 회귀 10건 (신규) | grep "test_a1_worktree_root_pass" OK | verified |
| memory/plans/p0b-pickup/post186_dogfood_g4_audit_design_260607.md | 설계 문서 (신규) | grep "worktree-root" OK | verified |

## 검증 결과 상세

### A1. start_task_guard #7 worktree-root — PASS (이중 입증)
- **라이브 dogfood (결정적 증거)**: canonical=task/task-2716(75fdf540, non-main) parked 상태에서 origin/main(7e18ab4d=#186) 기반 worktree(`.worktrees/task-2729+11-dev4`)에서 `start_task_guard.py --task task-2729+11 --bot dev4` 실행 →
  - 검증 #1~#9 전부 통과, exit 0
  - **`검증 #7 통과: worktree base가 origin/main과 일치 (fresh) (7e18ab4d)`**
  - lock 생성: `.worktrees/task-2729+11-dev4/.tasks/locks/task-2729+11.lock`
- **정적 검증**: #186 #7 은 `cwd=cwd`(worktree) 기준 origin/main·HEAD 비교만 수행, `main_current_branch != "main"` 패턴 **부재** 확인. canonical 브랜치 가정 완전 제거.
- 증거 파일: `memory/events/task-2729+11.live-dogfood-evidence.json`

### A2. finish-task G2 nullglob-safe dirty 면제 — PASS×3
- nullglob_safe: worktree dir 부재 시 `_WT_ISOLATED=0`(nullglob ON/OFF 모두 fail-closed), 존재 시 1 — PASS
- external_exempt: EXTERNAL_DIRTY(무관 dirty) + worktree 격리 → EXEMPT — PASS
- own_failclosed: OWN_DIRTY(expected_files dirty) → BLOCKED(면제 불가, fail-closed) — PASS
- `utils/dirty_registry.classify_blocker()` 직접 import 검증

### B. G4 fix_loop_cap — STALE_RESIDUE (counter reset 0)
- 증거: g4-fix-loop-count=2(mtime 11:40), cap.json(ts 02:49Z=**11:49 KST**), PR#186 merge author date=**13:24 KST**(7e18ab4d).
- `cap_before_pr186_merge = true` — cap 은 머지 **이전** finalize-only 경로에서 pre-existing count=2 파일을 읽어 발생. 3차 live fix 시도 아님.
- PR#186 은 회귀 6 passed + HIGH/CRITICAL 0 으로 정상 머지 → live quality 결함 아님.
- 선례 일치: task-2729+1 `P0A_G4_SUPERSEDE_ADJUDICATION` = `STALE_RESIDUE_CONFIRMED`(count=2 는 이미 통과한 run 의 역사적 누적치).
- **조치: counter reset 0 (읽기 전용). stale 판정만 기록 — 회장 지시 없이 reset 금지.**

### C. callback prereg seed vs robust — SEPARATED
- SEED_PLACEHOLDER: `task-2729+9.callback-envelope.json` schema=`utils.anu_callback_registrar.v2` + registration=REGISTERED + delivery=PENDING + receipt=UNCONFIRMED → intent marker(실제 수렴 미확인).
- ROBUST_FRAMEWORK: `task-2729+10.callback-launch.json` schema=`dispatch.normal_fallback_callback_helper.launcher.v1` + verdict=PASS + owner=ANU key + argv 존재 + enforcement.verdict=PASS → 실제 framework registration request.
- ANU key raw 출력 0 (마스킹).

## 라이브 finish-task dogfood (추가 발견 — 근본원인 확정)
- **canonical(task-2716) finish-task.sh git-gate 에는 #186 `_WT_ISOLATED` 면제가 부재**(grep -c=0). 무관 dirty 시 분류에 관계없이 `exit 1`(fail-closed). → task-2729+5/+7/+8/+10 의 **EXTERNAL_DIRTY_BLOCKER 반복 callback 미발사 근본원인 확정**.
- **#186(origin/main) finish-task.sh 에는 면제 존재**(grep -c=5). 본 task 를 #186 버전으로 finish 실행 → `EXTERNAL_DIRTY EXEMPT (task-2729+10 G2)` **라이브 발동** → `memory/events/task-2729+11.external-dirty-exempt.json`(exempt=true, reason=worktree_isolated_unrelated_dirty, unrelated_count=4). G2 nullglob 면제 LIVE 입증.
- **결론**: #186 수정은 origin/main 에 존재·정상 작동하나, **canonical 이 task-2716 에 parked 되어 있는 동안에는 미활성**(canonical 체크아웃이 pre-#186 finish-task.sh/start_task_guard.py 사용). #186 의 실효는 canonical 이 #186 포함 base 로 복귀/머지될 때 발생.
- **scope-guard false-positive**: canonical finish-task SCOPE-GUARD 가 stale local main(14ff8339) 기준 `main..HEAD` diff 로 task-2716 전체 변경을 본 task 변경으로 오인. 올바른 baseline `origin/main(7e18ab4d)..HEAD` = **4 파일(전부 allowed_resources)** 로 task-scope-guard.sh **정식 PASS(exit 0)** 확인 후 `.scope-guard-done` 생성. canonical main ref 무수정.
- **.done**: 전 게이트 PASS(impact_scanner/ci_preflight/l1_smoketest/goal_assertions/unresolved_gate), qc=WARN(수용), status=done. **수동 .done 0**(finish-task.sh #186 경유).
- **ANU normal callback**: 정식 launcher `launch_callback`(verdict=PASS, status=ANU_OWNED_READY) 경유, 독립 ANU key cron 등록(id=39FC44BA, 2026-06-07 14:19:00, --once, collector_role=ANU). **self-key 미사용(SELF_COLLECTOR_FORBIDDEN 회피), 봇 자가검증 0(SELF_COLLECTOR_VERIFICATION_FORBIDDEN 준수)** — 회수는 독립 ANU collector 담당.

## L1 스모크테스트 결과
- 서버 재시작: 해당없음 (audit-first, 서버/API 무관)
- API 응답 확인: 해당없음
- 실동작 확인(L1 대체 — 실제 실행): **라이브 start_task_guard dogfood** — canonical-parked 환경에서 #186 #7 LIVE PASS (exit 0, 9/9 검증 통과). 하니스 `--json` 실제 실행 → verdict=CALLBACK_FINALIZE_DOGFOOD_PASS_ACTIVE_FALSE. **pytest 10/10 PASS** 가 아닌 실제 가드 바이너리 실행으로 입증.
- 스크린샷: 해당없음 (CLI/스크립트 작업)

## 테스트 결과
- 회귀: `tests/regression/test_post186_callback_finalize_dogfood_2729p11.py` **10 passed** (0.49s)
- 하니스 실행: exit 0, verdict=CALLBACK_FINALIZE_DOGFOOD_PASS_ACTIVE_FALSE
- pyright: 미사용 import 정리 완료, import 오류 0

## 생성 파일 (EXPECTED 5)
1. `scripts/harness/v36/post186_callback_finalize_dogfood_audit.py` (신규)
2. `tests/regression/test_post186_callback_finalize_dogfood_2729p11.py` (신규)
3. `memory/reports/task-2729+11.md` (본 보고서)
4. `memory/plans/p0b-pickup/post186_dogfood_g4_audit_design_260607.md` (설계)
5. `memory/events/task-2729+11.live-dogfood-evidence.json` (라이브 증거, gitignored on-disk)
- read-only 참조 스크립트(start_task_guard/finish-task/gemini_cli_gate_check) **수정 0**.

## 발견 이슈 및 해결
- **이슈1 (서브에이전트 버전 혼동)**: 카르티케야가 A1 작성 시 canonical(task-2716 구버전) start_task_guard.py 를 읽어 "#7 fail=정상"으로 논지를 역전. → **해결**: #186 버전(worktree 내 origin/main)으로 재지정, 라이브+격리 이중 dogfood 로 #7 PASS 실증.
- **이슈2 (pre-commit lock 데드락)**: 하니스 작성 후 dirty 상태라 start_task_guard #6(clean) 미충족 → lock 미생성 → commit 차단. → **해결**: 파일을 worktree 밖 임시 위치로 이동(canonical 무관) → clean 트리에서 가드 실행(라이브 #7 증거 확보) → 복원 → 커밋. canonical reset/clean/stash 0.

## 머지 판단
- **머지 필요**: Yes (audit 산출물 4파일 + 회귀)
- **브랜치**: task/task-2729+11-dev4
- **워크트리 경로**: /home/jay/workspace/.worktrees/task-2729+11-dev4
- **머지 의견**: read-only audit 하니스 + 회귀만 추가, production 코드(start_task_guard/finish-task/gemini_cli_gate_check) 무수정. 회귀 10/10 PASS, 충돌 위험 낮음. Lv.2+ PR 경로 권장.

## 모델 사용 기록
- 카르티케야(백엔드, sonnet): 하니스 작성 + A1 정정
- 하누만(테스터, sonnet): 회귀 10건
- 비슈누(팀장, opus): 설계/통합/라이브 dogfood/보고서. haiku 미사용(분석·검증 작업).

## 결론 / 회장 보고 포인트
- #186 worktree-root #7 + G2 nullglob-safe 는 **canonical-parked 상태에서도 정상 작동**(라이브 실증). #7 canonical=main 가정 블로커 해소.
- G4 cap(count=2)은 **STALE_RESIDUE** — live blocker 아님. counter reset 은 회장 지시 대기(미수행).
- callback seed/robust 분리 명확. 정상 callback **자동수렴 성공은 미관측**(과장 0) — seed envelope 는 intent marker 단계.
- 다음 단계: pickup production activation approval 판단은 회장 결정 영역. 본 task 는 ACTIVE=false audit 으로 완료.
