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

- Level: Lv.3 (e2e 통합 검증 · 테스트/fixture 작성)
- 담당: dev6 페룬
- base: origin/main **9ee79286** (L1+L2+L3+L4 전 계층 머지 완료분)
- 단일소스 스펙: `memory/specs/system_callback_lifecycle_state_schema_260522.md`
- 성격: **adversarial e2e 검증** — 자기 작성물(L4) 자가 통과 금지. 결함을 적극 탐색하라.

## 목표 (회장 verbatim)
실제 closeout 경로에서 result.json fields 10~14가 emit되고, `memory/events/<task>.callback_lifecycle.json` artifact가 생성되며, normal/fallback/unknown/self-key 사례가 classifier와 일치하는지 검증한다.

## 필수 검증 (회장 verbatim — 10항)
1. 정상 closeout result.json에 fields 10~14 append 확인
2. callback_lifecycle.json 생성 확인
3. artifact writer atomic write 확인
4. callback gate PASS / notification sent / collector received가 분리 기록되는지 확인
5. normal callback received 케이스 분류 확인
6. fallback collector applied 케이스 분류 확인
7. ENVELOPE_PREPARED_NOT_FIRED 케이스 분류 확인
8. SELF_KEY_FIRED_NON_AUTHORITATIVE 케이스 분류 확인
9. UNKNOWN / INSUFFICIENT_EVIDENCE 케이스 분류 확인
10. 기존 callback contract 9 fields 유지 확인

## 필수 fixtures (회장 verbatim — 5)
- task-2625 (기존) → SELF_KEY_FIRED_NON_AUTHORITATIVE
- task-2628 (기존) → FINISH_TASK_GIT_GATE_BLOCKED_BEFORE_CALLBACK + FOREIGN_DIRTY_BLOCKER
- task-2628+1 (기존) → FALLBACK_COLLECTOR_APPLIED + ENVELOPE_PREPARED_NOT_FIRED
- unknown / insufficient evidence (기존)
- **정상 ANU-owned callback sample (신규 작성)** → NORMAL_CALLBACK_RECEIVED / miss_cause NONE / classification NORMAL
  - 신규 fixture 경로: `tests/fixtures/callback_lifecycle/normal_anu_owned/{evidence.json,expected.json,PROVENANCE.md}`
  - evidence 는 ANU key 소유 normal callback 발사 + authoritative 수집 사례를 표현. PROVENANCE 에 출처/근거 명기.

## 필수 regression (회장 verbatim — 4)
- callback lifecycle classifier regression (test_callback_lifecycle_classifier.py)
- callback lifecycle wiring regression (test_callback_lifecycle_wiring_2630.py)
- completion contract regression (test_callback_runtime_enforcement_2626.py 등)
- full tests/regression 신규 fail 0

## 구현 가이드
- 신규 e2e 테스트: `tests/regression/test_callback_lifecycle_e2e_2631.py`
- **실제 closeout 경로**를 호출하라(빌딩블록 단위 호출 아님): 9-field callback contract closeout dict → `append_lifecycle_fields(...)` → 14-field result dict 검증 → `write_callback_lifecycle_artifact(task_id, evidence, events_dir=<tmp>)` → 생성된 `<task>.callback_lifecycle.json` 검증(atomic·idempotent·내용) → `callback_stage_separation` 3단계 분리 검증.
- 5 fixture 각각 evidence.json 입력 → `classify_completion_lifecycle` 결선 경로 출력이 expected.json (delivery_outcome·normal_callback_miss_cause·root_cause_tags 등) 와 정확히 일치하는지 단언.
- atomic write 검증: 동일 입력 2회 → byte-identical(idempotent) + 임시파일 잔존 0. (가능하면) 쓰기 중단 시 원본 보존 시나리오 검증.
- 9-field 유지: append 후에도 기존 9 fields 키/값 보존(덮어쓰기 0) 단언.
- live workspace 의존 0: events_dir 는 tmp_path 사용. WORKSPACE_ROOT env override / Path(__file__) 기반. 실제 외부 cron 호출 0 · callback 재발사 0.

## ★ 결함 발견 시 (중요)
이건 검증 task다. e2e 가 머지된 L4 wiring 의 **실제 결함**(fields 10~14 미emit·artifact 미생성·분류 불일치 등)을 드러내면:
- **프로덕션 코드(executor_completion_contract.py 등)를 패치하지 말 것.**
- 즉시 STOP → result.json 에 결함 상세 기록 → ANU 에게 보고(콜백 envelope 에 DEFECT_FOUND 명시).
- 회장 production enforcement 완료 판정의 blocker 이므로 ANU 가 회장에게 escalate 한다.
- e2e 가 전부 PASS 해야만 production enforcement 완료 판정 후보가 된다(판정 자체는 회장).

## 자동수렴 원칙 (회장 verbatim)
- Gemini medium/style/quality 제안은 expected_files 내부면 자동 반영하라.
- Critical7, credential/permission expansion, expected_files 밖 수정, admin override 필요, post-merge smoke failure 만 회장에게 보고하라.
- credential 은 3계층 doctrine(`memory/feedback_credential_scan_3tier_doctrine_260522.md`): 기존 식별상수 재사용 fail 아님.

## expected_files (task-2631 범위 — 검증/fixture 한정)
- `tests/regression/test_callback_lifecycle_e2e_2631.py` (신규)
- `tests/fixtures/callback_lifecycle/normal_anu_owned/{evidence.json,expected.json,PROVENANCE.md}` (신규)
- **프로덕션 코드 변경 0** (executor_completion_contract.py·utils/* 등 수정 금지 — 결함 시 패치 아닌 STOP+보고)

## 금지 (회장 verbatim)
- production enforcement 완료 판정 금지
- foreign dirty 5건 정리 금지
- replacement_pr_runner 수정 금지
- callback 재발사 실험 금지
- 실제 외부 cron 남발 금지
- marker 삭제 금지
- L4(=expected_files) 범위 밖 수정 금지
- merge는 PR 생성 및 모든 gate 확인 후 별도 승인 전 금지

## finalize 프로토콜 (★ BOT App token 부재 — 로컬 한정)
1. base = 최신 origin/main 9ee79286 clean worktree
2. e2e 테스트 + 신규 fixture 작성 → 필수 regression 4 전부 PASS + full new-fail 0
3. **로컬 commit만** (push/PR/merge 금지). finish-task.sh 는 project_path 없이 로컬 종결
4. ANU normal completion callback 발사 — **반드시 독립 ANU key `c119085addb0f8b7`** (executor self-key 자가발사 절대 금지·SELF_COLLECTOR 금지)·collector_role=ANU
5. callback envelope UTF-8 ≤3900 bytes (printf '%s'|wc -c), envelope 만: task_id=task-2631 · 로컬 commit SHA · result_path · report_path · 10 검증 결과 요약 · 5 fixture 분류 결과 · regression 요약 · DEFECT_FOUND 여부 · sha256. 상세는 result.json/report.md 위임
6. result.json 에 callback prompt UTF-8 byte 수 기록. executor 시작/종료 ts·로컬 commit SHA 명기

이후 ANU: 봇 로컬 commit 재적층 → OWNER push → PR open → Gemini auto-remediation → 회장 8항목 보고 → 회장 별도 merge 승인 → (merge 후) 회장 production enforcement 완료 판정.

## 검증 시나리오 (이게 되면 성공)
- 5 fixture 전부 expected 와 일치 분류 + 정상 closeout 에 9+5=14 fields 동시 존재 + callback_lifecycle.json idempotent 생성 + stage 3분리 + 필수 regression 4 PASS + 프로덕션 코드 변경 0
- 결함 0 이면 production enforcement 완료 판정 후보(회장 결정)

## frozen anchor (D-SPEC-EXACTNESS)
- ANCHOR-1: "실제 closeout 경로에서 result.json fields 10~14 emit + memory/events/<task>.callback_lifecycle.json artifact 생성"
- ANCHOR-2: "normal/fallback/unknown/self-key 사례가 classifier와 일치"
- ANCHOR-3: "프로덕션 코드 변경 0 — 결함 시 패치 아닌 STOP+보고"
- ANCHOR-4: "production enforcement 완료 판정 금지(회장 별도)"
