---
task_id: task-2627
type: context
scope: dev6-team
status: completed
---

# task-2627 context-notes

## 결정 근거
- B안(fresh origin/main replacement reflection): 회장 결정 2026-05-21. 로컬 HEAD(edf05f49)가 origin/main 앞서고 task-2625 오염 위험 → feedback_local_operational_patch_doctrine에 따라 fresh origin/main base 강제.
- per-task diff 기준 검증: 4a01553a 9 files / 3171 insertions. main..HEAD divergence 무시.

## 참조 자료
- 4a01553a (sha 4a01553a72c0892aa9ff124be999c3cc236f05fe): callback launcher 결선 + callback 모듈 5개 추적
- memory/events/task-2626.independent_reverify_and_reflection.result.json: REVERIFY_PASS, runtime 결선 PARTIAL, #4/#6 미완 지적
- memory/events/callback_self_key_root_cause_audit.json: self-key root cause (텍스트 doctrine만, 코드 강제 부재)

## 핵심 발견 (중요)
- **anu_v3 origin/main 부재**: callback 모듈(4a01553a 9 files)은 anu_v3.dispatch_callback_contract 등을 import하나 origin/main에 anu_v3 0 files. local HEAD에 10 files tracked. tests/conftest.py가 /home/jay/workspace를 sys.path 주입하므로 테스트는 main workspace anu_v3로 resolve(통과). → 실 main 반영 시 anu_v3 동반 반영이 precondition. 본 task 범위(expected_files) 밖이므로 보고서에 dependency closure로 명시.

## 설계 결정
- 게이트 외 self-key 우회 hard-block: enforce_callback_fire(gate_route != finish_task_anu_gate + self-key → FAIL_CLOSED). default-deny.
- extract_followup 실 발사 결선은 self-key만 차단(ANU key 항상 PASS) + ImportError-safe → production blast radius 최소화.
- cancel-on-success는 marker 부재 시 안전 no-op(오발 제거 0).

## 3 Step Why (self-questioning)
- 1st Why: 왜 self-key callback이 발생했나? → 코드 강제 없이 텍스트 doctrine만 존재해 봇이 자율로 self-key 발사.
- 2nd Why: 왜 코드 강제가 없었나? → launcher는 결선됐으나 finish-task 게이트가 non-blocking이고 실 발사 경로(extract_followup)에 owner-key fail-closed 게이트 미적용.
- 3rd Why: 왜 게이트 외 우회가 가능했나? → 단일 chokepoint 부재. enforce_callback_fire로 게이트 외 self-key를 GATE_BYPASS_SELF_KEY_FORBIDDEN hard-block + extract_followup 결선으로 해소.
