# task-2712+1 — task-2712 FAILURE_CALLBACK_BEFORE_EXIT_GUARD 독립 verifier 보고

- **작업 ID**: task-2712+1 (READ_ONLY 독립 verifier)
- **팀**: dev2-team (오딘 · Odin)
- **parent_task**: task-2712 (dev4 Vishnu 원작)
- **chair_authorization_id**: CHAIR-AUTH-TASK-2712PLUS1-FAILURE-CALLBACK-INDEPENDENT-VERIFIER-260530
- **타겟**: `/home/jay/.cokacdir/workspace/AA8CB448/wt-2712-dev4` @ `58a15618` (read-only, 수정 0)
- **작성일**: 2026-05-30 14:10
- **검증 레벨**: normal

---

## SCQA 요약

### S — Situation (현재 상황)
task-2712(FAILURE_CALLBACK_BEFORE_EXIT_GUARD 구현)는 dev4 Vishnu가 완료(`.done` 생성, ANU cron 256F1B6A 등록)했고, 4-track 병렬 검증 + Codex Track D가 **PASS_WITH_PREEXISTING_REGRESSION_CAVEAT**로 분류, 회장이 verbatim 확정했다.

### C — Complication (문제/변화)
회장은 dev4(원작자)·dev1(오염)·dev3(stale)을 독립성 결격으로 제외하고 dev2 Odin에게 **독립 verifier**를 배정, 13개 검증 항목과 3 caveat 유지(삭제 0), 그리고 "실 finish-task.sh failure-path full run 1회(sandbox strict)"를 지정했다. 원작자가 아닌 제3팀의 증거 기반 재확인이 필요했다.

### Q — Question (핵심 질문)
task-2712 구현은 자체 결함 없이 PR 진입 가능한가? 59 failed + 7 errors는 task-2712가 유발한 regression인가, preexisting인가?

### A — Answer (답변/제안)
**13개 항목 전부 PASS 또는 PASS-with-caveat, task-2712 변경 자체 결함 0.** 59 failed + 7 errors는 main baseline과 **완전 동일**(59/114/7)하여 task-2388 모듈 분리 잔재인 **preexisting 확정** — task-2712 induced 아님. Item 9 sandbox failure-path full run에서 3 failure terminal state(SCOPE_GUARD_FAIL/QC_FAIL/CRASH) 모두 **`.done` 0 생성 + failure marker 1개** 검증. 최종 verdict = **PASS_WITH_PREEXISTING_REGRESSION_CAVEAT**, 3 caveat 유지, **PR 진입 가능(3 caveat 명시 조건)**. final timing은 회장 결정.

---

## 13 verification items 결과

| Item | 항목 | 판정 | 핵심 증거 |
|---|---|---|---|
| 1 | Track A/B/C/D evidence | PASS | synthesis(sha f7c29e88, 10504B) + closeout(sha fd75d700, 5311B), Codex Track D=PASS_WITH_PREEXISTING_REGRESSION_CAVEAT |
| 2 | 23 self-files sha256 | PASS(+caveat) | self-files 정확히 23개 전부 존재 + sha256. 집합=expected 21+edits 2 |
| 3 | finish-task.sh review | CAVEAT | +18/-1 = 목표 9 대비 **2배 확정**, 인라인 hook 2개(QC L390, SCOPE L467) |
| 4 | dispatch.py review | CAVEAT | +56/-1 = 목표 10/15 대비 **3.7~5.6배 확정**, 5-entry는 docstring뿐, 실계측 wrapper 1종 |
| 5 | surgical-change 판단 | CAVEAT | 무관 리팩토링 0이나 overrun 정당화 불충분, 축소 여지 존재 |
| 6 | 신규 23 tests 재실행 | PASS | **23 passed in 0.29s**, fail 0 |
| 7 | test_dispatch preexisting | PASS | 타겟 59/114/7 = main baseline 59/114/7 **완전 동일**, task-2388 잔재, preexisting 확정 |
| 8 | L1 hook smoke 5 sub | PASS | SCOPE/QC/CRASH/SUCCESS/exactly-one 5종 코드 근거(파일:라인) 확보 |
| 9 | 실 failure-path full run (sandbox) | PASS | `/tmp` 격리, no PR/push/merge, 3 failure state .done 0 + marker WRITTEN, schema 11 field 정합 |
| 10 | SUCCESS path .done 보존 | PASS | task-2712.done 존재(395B), failure-envelope 0건 |
| 11 | failure path .done 0 + marker | PASS | 3 failure state .done 0, exactly-one verify 4 task OK |
| 12 | SELF_COLLECTOR_FORBIDDEN | PASS(+minor) | _validate_collector_strict 존재·호출, envelope collector_role=ANU·self_key_used=false |
| 13 | PR 진입 판정 | PR_ELIGIBLE | 3 caveat 명시 조건 PR 진입 가능, final timing 회장 결정 |

---

## 3 Caveats 유지 strict (삭제 0)

1. **preexisting regression** — Item 7: 59 failed + 7 errors, main baseline 완전 동일(task-2388 분리 + 빈 `tests/dispatch/__init__.py` shadow). **blocker 아님.**
2. **surgical-change overrun** — Item 3/4/5: finish-task.sh +18/-1(2x), dispatch.py +56/-1(3.7~5.6x), numstat 확정. 축소 여지 존재.
3. **failure-path coverage** — Item 8/9: fixture + L1 smoke + sandbox full run 성공. 실 production full run은 sandbox 재현이므로 caveat 유지.

---

## L1 스모크테스트 결과 (필수 기록)

- **서버 재시작**: 해당없음 (READ_ONLY verifier — 서버 코드 무수정)
- **API 응답 확인**: 해당없음 (백엔드 API 변경 없음)
- **실 동작 검증 (Item 9 sandbox full run)**: 성공
  - 격리 sandbox `/tmp/task-2712plus1-sandbox-3287018`에서 production hook/writer/classifier 실제 실행
  - SCOPE_GUARD_FAIL → `sbox-scope-1.failure-envelope.json` (574B) WRITTEN, `.done` 미생성
  - QC_FAIL → `sbox-qc-1.failure-envelope.json` (553B) WRITTEN, `.done` 미생성
  - CRASH(실제 EXIT trap exit 42) → `sbox-crash-1.supervisor-crash-marker.json` WRITTEN, `.done` 미생성
  - SUCCESS → failure marker 0, `.done` 1개만 (no-op 정상)
  - no PR / no push / no merge / no GitHub write 조건 strict 준수
- **pytest**: `tests/test_failure_callback_before_exit_guard_2712.py` 23 passed in 0.29s

---

## 발견 이슈 및 해결

- **spec 표현 vs 구현 형태 간극** (verifier 발견): spec §9.1 "6 inner hook"·"5 entry"는 인라인 코드가 아니라 sourced module(`before_exit_guard_hook.sh`) / wrapper(`_main_with_failure_guard`) / docstring 형태로 실현. 기능 정합하나 surgical 축소 검토 권고 대상. → caveat 2로 박제, NEEDS_FIX 아님(기능 결함 0).
- **expected_files 집합 차이** (Item 2): self-files 23 = expected_files 21 + allowed_existing_file_edits 2(dispatch.py, finish-task.sh). spec §9.1 허용 범위 → caveat 처리.
- 미해결 이슈 0. forbidden 파일 sha256 변경 0, forbidden_actions 8 위반 0.

---

## 머지 판단

- **머지 필요**: No (READ_ONLY verifier — 본 task는 verifier artifacts만 생성, 코드 변경 0)
- **타겟 worktree**: `task/task-2712-dev4` @ 58a15618 (read-only, 수정 0)
- **PR 진입 의견**: task-2712 본체는 PR 진입 가능(3 caveat 명시 조건). 단 PR 생성/머지 권한은 본 verifier 범위 밖 — 회장 PR 인가 대기. 59 preexisting failure는 별도 후속 task 생성 0 (회장 verbatim: verifier 결과로 blocker 아님 재확인됨 → 별도 결정).

---

## 최종 Verdict

**PASS_WITH_PREEXISTING_REGRESSION_CAVEAT** (verifier evidence-only, ANU 자체 분류 0)
- 근거: 13 items 모두 PASS/caveat + task-2712 변경 자체 결함 0 + 3 caveat 유지 + Codex Track D 정합 + Item 9 sandbox full run 성공
- next action: 회장 PR 인가 대기 (ANU normal callback 경유 보고)

---

## 모델 사용 기록

- **오딘(팀장)**: opus — 설계/분배/검토/통합/verdict 결정 (직접 코딩 0)
- **토르(백엔드)**: sonnet — Item 1,2,3,4,5,10,12 (evidence/code review). 정당성: 코드 diff 분석·sha256 박제는 정확성 요구 → sonnet
- **헤임달(테스터)**: sonnet — Item 6,7,8,9,11 (test 재실행 + sandbox full run). 정당성: 테스트 실행·격리 sandbox 구성은 신중함 요구 → sonnet
- haiku 미사용 (전 항목 분석/검증 작업으로 sonnet 이상 필수)
