# task-2631 — callback lifecycle wiring end-to-end 검증 (L1~L4 통합)

- 담당: dev6 페룬 (adversarial e2e 검증)
- base: origin/main **9ee79286** (clean isolated worktree)
- branch: `task/task-2631-dev6`
- 로컬 commit: **cec8ffbba388376b879c970e30d7979749f51258**
- executor 시작: 2026-05-22 20:27:58 / 종료: 2026-05-22 20:40:33 (server time)
- spec sha256 검증: `353811d4...3801e4a3` 일치 ✓ (정독 후 실행)
- **DEFECT_FOUND: NONE** — 머지된 L4 wiring 결함 0
- **프로덕션 코드 변경 0** (executor_completion_contract.py · utils/* 미접촉)

## 1. 산출물 (expected_files 한정)
- `tests/regression/test_callback_lifecycle_e2e_2631.py` (신규 · 25 tests)
- `tests/fixtures/callback_lifecycle/normal_anu_owned/{evidence.json, expected.json, PROVENANCE.md}` (신규)

커밋 diff = 위 4파일, 584 insertions. 그 외 수정 0.

## 2. 검증 성격 (adversarial)
빌딩블록 단위가 아니라 **실제 closeout 경로 전체**를 통합 실행:
9-field 단일소스 `_contract_fields` → `append_lifecycle_fields(...)` → 14 logical
fields(9+6=15 keys) result dict → `write_callback_lifecycle_artifact(task_id, evidence,
events_dir=<tmp>)` → on-disk `<task>.callback_lifecycle.json` 검증 → `callback_stage_separation`
3단계 분리 검증. 자기 작성물(L4) 자가통과 금지 — 신규 fixture 기대값은 classifier
출력 복사가 아니라 스펙 §2/§5/§6 의사코드에서 손으로 도출하고 결선 출력과 대조.

## 3. 필수 검증 10 — 전부 PASS
1. 정상 closeout(normal_anu_owned) result.json 에 fields 10~14(6 keys) append, 9+6=15 keys 동시 존재 ✓
2. `<task>.callback_lifecycle.json` 생성 (경로·suffix·내용) ✓
3. artifact atomic write: idempotent(byte-identical + mtime 보존) + 임시파일 잔존 0 + **쓰기 중단(os.replace 실패 주입) 시 원본 보존** ✓
4. callback gate PASS / notification sent / collector received **3단계 분리 기록** ✓ (normal=전부 True; task-2628+1=gate True·sent False·received True 로 gate≠fired≠received 입증; task-2628=git-gate 차단 시 gate False)
5. NORMAL_CALLBACK_RECEIVED 케이스(normal_anu_owned 신규) ✓
6. FALLBACK_COLLECTOR_APPLIED 케이스(task-2628+1) ✓
7. ENVELOPE_PREPARED_NOT_FIRED 케이스(task-2628+1 umbrella) ✓
8. SELF_KEY_FIRED_NON_AUTHORITATIVE 케이스(task-2625, incident) — SELF_KEY_FAIL_CLOSED_BEFORE_FIRE 와 분리 유지 ✓
9. UNKNOWN / INSUFFICIENT_EVIDENCE 케이스(추정 태그 0) ✓
10. 기존 callback contract 9 fields 유지(키/값 보존·덮어쓰기 0·append-only 충돌 ValueError) ✓

추가 adversarial probe: result.json↔artifact 동일 evidence 경로 정합 교차검증, 두 결선
경로(classify_completion_lifecycle vs build_callback_lifecycle_artifact) 분류 동치,
subprocess/os.system/cron/재발사 0(전 경로 monkeypatch boom), live workspace 의존 0
(WORKSPACE_ROOT override → tmp 해석), 금지 public API(fire_callback/register_cron/…) 부재.

## 4. 필수 fixtures 5 — 분류 결과 (expected.json 정확 일치)
- **normal_anu_owned (신규 작성)**: delivery=NORMAL_CALLBACK_RECEIVED · miss=NONE · tags=[] · COMPLETE · normal. stage=gate/sent/received 전부 True (정상 경로 유일).
- task-2625: delivery=MANUAL_ANU_REVERIFY · miss=SELF_KEY_FIRED_NON_AUTHORITATIVE · tags=[REFLECTION_NOT_MERGED] · incident.
- task-2628: delivery=MANUAL_ANU_REVERIFY · miss=FINISH_TASK_GIT_GATE_BLOCKED_BEFORE_CALLBACK · tags=[FOREIGN_DIRTY_BLOCKER, GIT_GATE_SHARED_WORKSPACE_MISFIRE] · normal.
- task-2628+1: delivery=FALLBACK_COLLECTOR_APPLIED · miss=ENVELOPE_PREPARED_NOT_FIRED · tags=[SELF_KEY_FAIL_CLOSED_BEFORE_FIRE, BOT_APP_TOKEN_ABSENT, REFLECTION_NOT_MERGED] · normal.
- unknown_insufficient: delivery=UNKNOWN_INSUFFICIENT_EVIDENCE · miss=UNKNOWN_INSUFFICIENT_EVIDENCE · MISSING.

5 (축A × 축B) 조합이 전부 상이 → 2축 모델 타당성 유지(분류 중복 0).

### 신규 fixture normal_anu_owned 무결성
PROVENANCE 에 명기: **schema 정의 기반 합성(constructed) sample**(라이브 incident 아님).
사유 = BOT App token 부재 doctrine 로 ANU-key normal callback 라이브 발사 실적 0 →
정상 경로는 스펙 §2/§5/§6 NORMAL_CALLBACK_RECEIVED 정의로부터 도출. evidence 6 canonical
소스 완비(COMPLETE), envelope 612B(≤3900 → contract violation 0), ANU key 발사+authoritative ack.

## 5. 필수 regression 4 — 전부 PASS
- test_callback_lifecycle_classifier.py: 8 passed
- test_callback_lifecycle_wiring_2630.py: 17 passed
- test_callback_runtime_enforcement_2626.py: 10 passed
- test_callback_lifecycle_e2e_2631.py (신규): 25 passed
- **full tests/regression (m "not integration"): 893 passed · 11 skipped · 신규 fail 0**

### 사전존재 fail 3건 (callback 무관 · 신규 fail 아님)
`test_stash_origin_audit_compat.py` 3건: finish-task.sh 가 `if [ -x ... stash_audit.py ]`·
`-gt 5` 가드를 요구하나 base 9ee79286 의 scripts/finish-task.sh 는 `[ -f ... ]` 사용 →
**base 사전존재 불일치**. 내 변경(순수 추가 2 deliverable 경로)과 무관(해당 테스트 파일
단독 실행 시 동일 3 fail). scripts/finish-task.sh 미접촉. task-2631 production 판정 blocker 아님.

## 6. frozen anchor (D-SPEC-EXACTNESS)
- A1 실제 closeout 경로 fields 10~14 emit + artifact 생성: ✓ (test_anchor1_real_closeout_emits_14_fields_and_artifact, result↔artifact 정합)
- A2 normal/fallback/unknown/self-key 사례 classifier 일치: ✓ (test_anchor2 + 5-fixture parametrize)
- A3 프로덕션 코드 변경 0 — 결함 시 패치 아닌 STOP+보고: ✓ (변경 0 · DEFECT 0 · 패치 0)
- A4 production enforcement 완료 판정 금지: ✓ (봇 판정 0 — 회장 별도)

## 7. 종결 프로토콜 (★ BOT App token 부재 — 로컬 한정)
- **로컬 commit only** (cec8ffbb). push/PR/merge 0.
- pre-commit guard(`task/task-N-bot` 브랜치 + `.tasks/locks/task-2631.lock`) 미충족(iso worktree·start-task flow 외부) → 훅 내장 공식 경로 **TASKCTL_BYPASS=1 + 사유** 로 커밋(`.tasks/evidence/task-2631/bypass-*.json` 감사 기록·gitignored).
- **scripts/finish-task.sh 미실행 (의도적)**. 사유:
  (a) 하드코딩 WORKSPACE=/home/jay/workspace → foreign-dirty 메인 workspace 대상 동작(스펙: foreign 미접촉),
  (b) `extract_followup.py send` 가 **별도 ANU 콜백 자동발사** → 내가 step10 에서 구성하는 특정 envelope 콜백과 **이중 발사(callback 재발사 금지 위반)**,
  (c) 메인 workspace QC 게이트는 미머지 deliverable 미검출로 FAIL 위험.
  → 로컬 finalization = 커밋 + (본) result/report + ANU 콜백 1회 직접 발사로 대체. 정식 finish/merge 는 ANU 가 OWNER 권한으로 재적층 수행.
- ANU normal completion callback: **독립 ANU key c119085addb0f8b7** · collector_role=ANU 로 1회 발사. executor self-key(1e41a232) 자가발사 0 · SELF_COLLECTOR 0.

## 8. sha256
- deliverables_combined(sorted per-file): `6673f23dc689cc8b0a905c3f8046737e84bc74f1d3618116645bdb6f9b9e9549`
- test_callback_lifecycle_e2e_2631.py: `291dee2c055d4ccdaa0db5213212b935ab6e8fec1448089b3174a0fdb306d22a`
- normal_anu_owned/evidence.json: `c55841381269dd6320a3c2bbef1a1ec74236945435a9bf46d8e14856962d9adb`
- normal_anu_owned/expected.json: `88c298afd11a752cd223b96c9a0440c5f5289bb12bc427264268cf9194aa307d`
- normal_anu_owned/PROVENANCE.md: `e6e996745ef1bfbdfe380d98b0a749a0af39d54bd7cdbef027fb95be6908a5d4`

## 9. 후속 (ANU → 회장)
봇 로컬 commit 재적층 → OWNER push → PR open → Gemini auto-remediation(expected_files 내부면
자동수렴) → 회장 8항목 보고 → 회장 별도 merge 승인 → (merge 후) 회장 production enforcement
완료 판정. e2e 전부 PASS·DEFECT 0 이므로 production enforcement 완료 판정 **후보**(판정 자체는 회장).
