# task-2627 — CALLBACK_RUNTIME_ENFORCEMENT_FRESH_REFLECTION (B안)

- **task_id**: task-2627
- **work_level**: Lv.3 (fresh origin/main replacement reflection + 3 risk closure)
- **dispatched_by**: ANU (회장 결정 2026-05-21 B안 승인)
- **assignee**: dev6 페룬 (callback context 연속 — task-2623/2624/2625/2626)
- **base_docs**:
  - memory/events/task-2626.independent_reverify_and_reflection.result.json
  - memory/events/callback_self_key_root_cause_audit.json

---

## 0. PRE-DISPATCH SPEC (회장 verbatim 박제 · D-SPEC-EXACTNESS · paraphrase 금지)

회장 verbatim (2026-05-21):

> task-2626 후속은 B안으로 진행한다.
> 목표: fresh origin/main replacement reflection 방식으로 callback runtime enforcement를 production path에 안전 반영한다. 단순히 4a01553a를 옮기는 것이 아니라, 독립 재검증에서 남은 3개 risk를 함께 닫는 것을 목표로 한다.

---

## 1. 핵심 잔여 risk (회장 verbatim · 3건 — 본 task 가 닫는 대상)

1. 4a01553a가 main에 미반영이라 origin/main 기준 self-key callback 취약점이 아직 전역에 남아 있음
2. cancel-on-success 모듈은 존재하지만 finish-task / extract_followup / launch_callback 호출처 결선이 0임
3. finish-task §5.5 게이트가 non-blocking이라 게이트 외 self-key 발사 우회 가능성이 남아 있음

---

## 2. 진행 방식 (회장 verbatim)

- fresh origin/main worktree에서 시작하라.
- 로컬 HEAD 그대로 사용하지 말 것.
- 4a01553a의 clean 부분을 replacement reflection으로 재적용하라.
- task-2626 산출물 중 expected_files 정합 파일만 반영하라.
- main..HEAD divergence / task-2625 오염 기준을 쓰지 말고 per-task diff 기준으로 검증하라.

### 2.1 구현 가이드 (anchor)
- fresh worktree: `git worktree add <path> origin/main` (origin/main HEAD=4187332c)
- 4a01553a (sha 4a01553a72c0892aa9ff124be999c3cc236f05fe) 의 expected_files 정합 파일을 fresh worktree 에 가져오는 방법: `git checkout 4a01553a -- <file>` 또는 per-task patch apply. callback 모듈 5개는 origin/main 부재이므로 4a01553a 에서 추출.
- per-task diff 기준 검증 (4a01553a 의 9 files, 3171 insertions) — main..HEAD divergence (로컬 edf05f49 등) 무시.

---

## 3. 필수 보강 (회장 verbatim · 9항목)

1. normal callback과 fallback이 모두 build_anu_owned_callback_request / launch_callback 단일 경로를 타게 하라.
2. executor self-key는 fail-closed 처리하라.
3. ANU key(c119085addb0f8b7)만 authoritative collector key로 허용하라.
4. finish-task §5.5 게이트를 단순 non-blocking 관찰이 아니라 production enforcement 관점에서 우회 불가능하게 강화하라. 단, task completion 자체를 불필요하게 죽이는 방식이 아니라 self-key callback 등록만 차단해야 한다.
5. cancel-on-success를 실제 호출처에 결선하라. normal callback success 시 fallback이 취소되거나, fallback이 나중에 발화해도 NO_OP / no ledger append가 보장되어야 한다.
6. fallback은 recovery-only이며 final report trigger로 쓰지 말 것.
7. canonical root는 /home/jay/workspace로 고정하라.
8. callback prompt는 envelope-only이며 UTF-8 3900 bytes 이하를 강제하라.
9. self-key collector/adjudication 결과는 non-authoritative로만 기록하라.

---

## 4. 필수 regression (회장 verbatim · 11건)

test 파일: `tests/regression/test_callback_runtime_enforcement_2626.py` (확장) · mock-based · 실 cron 0 · 실 발사 0 · subprocess 0

1. ANU key normal callback PASS
2. executor self-key normal callback FAIL_CLOSED
3. ANU key fallback PASS
4. executor self-key fallback FAIL_CLOSED
5. normal callback success 후 fallback cancel-on-success PASS
6. fallback fires after success → NO_OP, no ledger append
7. result exists + normal missing + fallback missing → DISPATCH_CONTRACT_VIOLATION
8. callback prompt >3900 bytes → CALLBACK_PROMPT_TOO_LARGE
9. canonical root missing → fail-closed 또는 root correction
10. self-collector attempt → SELF_COLLECTOR_FORBIDDEN
11. ★ finish-task 게이트 외 self-key 직접 발사 우회 시도 → FAIL_CLOSED (신규)

---

## 5. expected_files (4a01553a 정합 · per-task diff 기준)

1. `dispatch/normal_fallback_callback_helper.py` (launch_callback launcher)
2. `dispatch/callback_owner_enforcer.py`
3. `dispatch/cron_dispatch_guard.py`
4. `dispatch/executor_completion_contract.py`
5. `dispatch/spec_template_validator.py`
6. `utils/completion_callback_fallback_cancel.py` (cancel-on-success 결선 대상)
7. `scripts/finish-task.sh` (§5.5 게이트 blocking 강화)
8. `prompts/DIRECT-WORKFLOW.md`
9. `tests/regression/test_callback_runtime_enforcement_2626.py` (11건으로 확장)

추가 허용(결선 필요 시): `dispatch/__init__.py` · `scripts/extract_followup.py` (cancel-on-success / 게이트 결선 위치). 봇이 최소 결선 경로 확정.

---

## 6. 금지 (회장 verbatim)

- 기존 로컬 HEAD 그대로 merge 금지
- 즉시 merge 금지
- 회장 승인 전 push / PR open / merge 금지
- credential raw exposure 금지
- OWNER PAT 조작 금지
- task-2625 산출물 삭제 금지
- Track C task-2619 수정 금지
- zombie cron 정리 금지
- replacement PR runner 수정 금지 (utils/replacement_pr_runner.py)
- merge queue 수정 금지 (utils/merge_queue_executor.py)
- self-collector 결과 authoritative 승격 금지
- 문서/report만으로 완료 처리 금지

---

## 7. 완료 보고 (회장 verbatim · 9항목)

result.json + report 가 답변:
1. fresh origin/main reflection diff
2. expected_files / forbidden path 결과
3. runtime 결선 위치
4. self-key 차단 결과
5. ANU-key normal/fallback 결과
6. cancel-on-success 실제 호출처 결선 결과
7. finish-task 게이트 blocking/우회 차단 결과
8. regression / Codex audit 결과
9. push/PR/merge 필요 여부와 회장 결정 항목

---

## 8. 판정 기준 (회장 verbatim · 5항목)

- main 반영 전에는 production enforcement 완료로 판정하지 말 것.
- cancel-on-success 호출처 미결선이면 완료로 판정하지 말 것.
- finish-task 게이트 외 self-key 우회 가능성이 남으면 완료로 판정하지 말 것.
- Critical7 / credential expansion / forbidden path가 발생하면 즉시 CHAIR_HOLD.
- 위 3개 잔여 risk가 코드와 regression으로 닫히면 **reflection ready로 보고하라.**

---

## 9. ★ 본 task 자체의 callback self-key 위험 (필수 인지)

본 reflection 이 main 반영 전까지, 본 task-2627 의 normal callback/fallback 도 여전히 self-key 위험 잔존.
- 봇은 ANU key(c119085a) 발사 시도하되, self-key 면 collector 결과 NON_AUTHORITATIVE → ANU 독립 재검증 필수.
- result.json 에 callback contract 9 fields 기록 (self-key 여부 관측).

---

## 10. callback contract 9 필수 fields (result.json)

1. callback_prompt_utf8_bytes 2. callback_prompt_chars 3. callback_cron_id 4. callback_registration_status 5. callback_role ("COLLECTOR_ANU") 6. envelope_only_compliance 7. fallback_prompt_utf8_bytes 8. fallback_safety_net_registered 9. fallback_safety_net_role_single_purpose ("RECOVERY_ONLY_NO_FINAL_REPORT_TRIGGER")

callback prompt UTF-8 ≤3900 bytes · envelope-only · 초과 시 CALLBACK_PROMPT_TOO_LARGE fail-closed.

---

## 11. doctrines (필수)

- B안 fresh origin/main base 강제 (feedback_local_operational_patch_doctrine — 로컬 HEAD 앞섬 시 fresh base)
- per-task diff 기준 검증 (main..HEAD divergence 금지)
- callback/fallback 발사 runtime 코드 enforce (봇 자율 텍스트 의존 금지)
- build_anu_owned_callback_request / launch_callback 단일 경로
- executor self-key → fail-closed (argv=None)
- 게이트 blocking 강화 (self-key 등록만 차단 · completion 죽이지 않음)
- cancel-on-success 실 호출처 결선 (NO_OP/no ledger append 보장)
- canonical root=/home/jay/workspace 고정
- self-collector 결과 NON_AUTHORITATIVE
- baseline 3-way blob 재검증 (feedback_audit_baseline_3way_blob_verify_260521)
- artifact visibility: 4a01553a 에서 callback 모듈 추출 (origin/main 부재 정상)
- attempt-1 only · spec drift/baseline 불일치 시 HOLD + 회장 escalate

---

## 12. push/merge 처리

- 회장 승인 전 push/PR open/merge 금지 (회장 verbatim)
- BOT App token 부재 시 fresh worktree 로컬 reflection + 로컬 검증까지 수행 → "reflection ready" 보고
- 실제 origin/main 반영(push/PR/merge)은 회장/OWNER 승인 후 별도 수행
- 본 task 는 reflection ready 상태 도달이 goal (production enforcement 완료 판정은 main 반영 후)

---

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "dispatch/normal_fallback_callback_helper.py"
    - "dispatch/callback_owner_enforcer.py"
    - "dispatch/cron_dispatch_guard.py"
    - "dispatch/executor_completion_contract.py"
    - "dispatch/spec_template_validator.py"
    - "dispatch/__init__.py"
    - "utils/completion_callback_fallback_cancel.py"
    - "scripts/finish-task.sh"
    - "scripts/extract_followup.py"
    - "prompts/DIRECT-WORKFLOW.md"
    - "tests/regression/test_callback_runtime_enforcement_2626.py"
    - "memory/events/task-2627.result.json"
    - "memory/reports/task-2627.md"
    - "memory/tasks/task-2627.md"
  forbidden_paths:
    - "utils/replacement_pr_runner.py"
    - "utils/merge_queue_executor.py"
    - "memory/tasks/task-2619.md"
    - "memory/events/task-2625.*"
    - "anu_v2/**"
    - ".github/**"
    - ".env*"
    - "*.pem"
    - "*.key"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "ruff"
    - "git"
  merge_policy: "manual"
  ttl_hours: 24
```

## 13. 산출물

- fresh origin/main worktree reflection (4a01553a clean + 3 risk closure)
- cancel-on-success 호출처 결선 (completion_callback_fallback_cancel.py ↔ finish-task/launch_callback)
- finish-task §5.5 게이트 blocking 강화 (self-key 등록만 차단)
- regression 11건 (게이트 외 self-key 우회 FAIL_CLOSED 신규)
- `memory/events/task-2627.result.json` (9 fields + 9항목 보고)
- `memory/reports/task-2627.md`
- 로컬 reflection 커밋 (push/PR/merge 0 · 회장 승인 대기)

## 14. callback envelope (참고)

```
task_id=task-2627
result_path=memory/events/task-2627.result.json
report_path=memory/reports/task-2627.md
sha256=<task md sha256>
collector_role=ANU
owner_key=c119085addb0f8b7
canonical_root=/home/jay/workspace
summary=CALLBACK_RUNTIME_ENFORCEMENT_FRESH_REFLECTION result · reflection ready 여부 · 9항목 result.json 참조
```

끝