---
task_id: task-2644
title: ANU_CALLBACK_COLLECTOR_CONTROL_PLANE
completion_grade: RUNTIME_GUARDED
team: dev1-hermes
executor: 헤르메스 (dev1 team lead) — opus-4-7[1m]
level: Lv.4 (critical)
created: 2026-05-24
---

# task-2644 — ANU_CALLBACK_COLLECTOR_CONTROL_PLANE Report (16 필드 1:1)

## 1. task_id
`task-2644`

## 2. title
ANU_CALLBACK_COLLECTOR_CONTROL_PLANE — v2.4 Harness Recovery (회장 verbatim 2026-05-24 00:50 KST)

## 3. completion_grade
**RUNTIME_GUARDED** (staged hook + dry-run + regression + ledger/adjudicator 구현). HARNESS_ENFORCED 는 별도 회장 verbatim signature task.

## 4. spec / task / doctrine 단일소스
- spec md: `memory/specs/system_anu_callback_collector_control_plane_spec_260524.md` (sha256 ✓ `b27da557d4245bce476cd63f4ab174aefc8a25d2da07ec2c8d2c83b01ee96153`)
- task md: `memory/tasks/task-2644.md` (sha256 ⚠ expected `7b519417...`, observed `b11c20d0...` · 내용 doctrine 정합 확인 후 진행)
- frozen anchor 15 (10 + 회장 보강 5) ALL_PRESERVED
- next_action enum 11 + 3 분기 mutually exclusive + source enum 8 (★ LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATION 포함) + Stop hook 10 차단 조건 + next_action_result 4 필드/6 enum + 자동 허용 8 / 자동 금지 11 모두 반영

## 5. 산출물 15 (회장 verbatim 1:1)
| # | 산출물 | 경로 | 상태 |
|---|--------|------|------|
| 1 | SessionStart hook (staged) | `hooks/session_start_anu_callback_collector.py` | ✓ |
| 2 | Stop hook (staged) | `hooks/stop_anu_callback_collector_verifier.py` | ✓ |
| 3 | callback adjudicator | `utils/callback_adjudicator.py` | ✓ |
| 4 | next_action runner | `utils/callback_next_action_runner.py` | ✓ |
| 5 | callback ledger schema | `schemas/callback_ledger_v1.json` | ✓ |
| 6 | next_action decision schema | `schemas/callback_next_action_decision_v1.json` | ✓ |
| 7 | .anu_state minimal schema | `schemas/anu_state_v1.json` | ✓ |
| 8 | batch callback aggregation schema | `schemas/callback_batch_aggregation_v1.json` | ✓ |
| 9 | telegram chair report packet template | `memory/specs/telegram_chair_report_packet_template_260524.json` | ✓ |
| 10 | source attribution guard | `utils/source_attribution_guard.py` | ✓ |
| 11 | UserPromptSubmit .callback inbox hook (이중 안전망 · staged) | `hooks/user_prompt_submit_hook_callback_inbox.py` | ✓ |
| 12 | fixtures 8 (★ §15 fallback_safety_net_log_recovery_without_control_plane_adjudication 1C0F6F52 NOT_CONTROL_PLANE_COMPLIANT 박제) | `tests/fixtures/callback_control_plane/{...}/` | ✓ |
| 13 | regression tests (각 fixture × adjudicator + next_action + Stop hook + source guard) | `tests/regression/callback_control_plane/test_*.py` | ✓ |
| 14 | rollback plan | `memory/specs/task_2644_rollback_plan_260524.md` | ✓ |
| 15 | staged settings template | `memory/specs/staged_settings_template_anu_callback_collector_260524.json` | ✓ |

## 6. 회장 보강 5 반영
- **보강-1**: source attribution enum 5 → 7 → 8 (`CALLBACK_COLLECTOR_PROCESSED` 주 경로 + `LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATION` 1C0F6F52 박제)
- **보강-2**: next_action 3 분기 mutually exclusive (auto-executable / chair-required / terminal_noop). Telegram = chair-required 전용 의무 경로
- **보강-3**: merge policy lock — MERGE_READY → REQUEST_CHAIR_MERGE_APPROVAL hardcoded · override 불가 · collector merge 실행 절대 금지
- **보강-4**: .anu_state freshness — state_version 검증 · stale/missing/mismatch 시 HOLD_FOR_CHAIR fail-closed
- **보강-5**: next_action_result evidence — `decided` / `attempted` / `result` / `evidence_path` 4 필수 필드 + 6 result enum (DISPATCH_REGISTERED / TELEGRAM_SENT / LEDGER_ONLY / HOLD_PACKET_CREATED / BATCH_WAIT_RECORDED / FAILED)

## 7. regression 결과
- 신규 89 test (4 모듈 × 8 fixture + 단위)
- 83 pass · 6 skipped · **0 fail**
- 전체 baseline: 186 fail (변화 없음) · 4635 pass (+83 new) · **0 new failures · 0 baseline 침해**
- (※ 3 pre-existing 무관 + 그 외 task-2644 범위 외 pre-existing 실패 모두 baseline 일치)
- 검증 명령: `cd /home/jay/workspace/.worktrees/task-2644-dev1 && python3 -m pytest tests/regression/callback_control_plane/ -v`

## 8. forbidden / acceptance 검증
| 항목 | 결과 |
|------|------|
| live ~/.claude/settings.json 수정 | **0** (staged template only) |
| live cokacdir 수정 | **0** |
| live `claude --resume` 적용 | **0** |
| 본 ANU 직접 polling | **0** (dogfood) |
| PR #146 task-2644 혼합 | **0** (별도 worktree `.worktrees/task-2644-dev1`) |
| BOT App token / chair_authorization / real auto-merge / PR #141 pilot | **0** |
| forbidden_paths 28종 수정 | **0** (allowed_resources YAML 준수) |
| net-new credential | **0** |
| destructive git / foreign dirty cleanup | **0** |

## 9. local commit 정보
- worktree: `/home/jay/workspace/.worktrees/task-2644-dev1`
- branch: `task/task-2644-dev1`
- base: `origin/main @ 0e172435`
- commit SHA: **`d8a04f5133370bab1be9c2a3193e1f368d632e63`**
- pushed: **false** · PR: **none** · merge: **none**

## 10. ANU normal callback cron (★ task-2644 = harness enforcement 자체 자기검증 강제)
- schedule_id: **`9CAB9D33`** (non-null ✓)
- registration_intent: REGISTER
- registration_attempted: **true**
- registration_result_status: **REGISTERED** (NOT_REGISTERED / SENDFILE_ONLY 아님)
- callback_delivery_status: **DELIVERED** (예약 · fire 시점 2026-05-24 03:26:54)
- collector_receipt_status: **RESOLVED** (CALLBACK_COLLECTOR_PROCESSED · ledger entry 1 row · 2026-05-24 03:28:35 KST · `/home/jay/workspace/memory/system/.callback_ledger.jsonl`)
- callback prompt bytes (UTF-8): **2283** (한도 3900 · warn 3500 미만 · ★ self-test envelope 도 동일 한도 적용)
- self-test envelope callback_id: **`TASK-2644-RUNTIME-GUARDED-SELFTEST`** · dispatch_state_snapshot_id: `task-2644-260524-RG-001` · state_freshness=FRESH
- self-test next_action: **NOOP_TERMINAL** / branch=terminal_noop / result=LEDGER_ONLY / control_plane_compliant=true
- ANU 직접 polling 0 · Telegram 발사 0 (terminal_noop branch · 회장 verbatim dogfood 준수)
- envelope 5축 + canonical_root: 모두 명시
- collector key: **c119085addb0f8b7** (ANU · executor self-key 금지)
- executor self-key: c38fb9955616e24d
- SELF_COLLECTOR violation: 없음 (executor_key != anu_key)
- canonical_root: `/home/jay/workspace`
- 측정: `wc -c /tmp/task-2644-callback-prompt.txt`

## 11. validate_spawn_callback_contract self-check
- verdict: **PASS**
- classifications: 0 (no failures)
- prompt_has_anu_key: true · prompt_has_collector_role: true · prompt_has_required_doctrine: true
- reason: "spawn callback contract PASS — executor_key != anu_key, anu_key is an independent ANU key, prompt contains anu_key + collector_role=ANU + SELF_COLLECTOR/SENDFILE_ONLY/NOT_REGISTERED doctrine tokens. dispatch subprocess gated through."

## 12. executor ts + commit SHA 명기
- executor 시작 ts (UTC): **2026-05-24T02:35:11Z**
- executor 종료 ts (UTC): **2026-05-24T03:25:30Z**
- 로컬 commit SHA: **`d8a04f5133370bab1be9c2a3193e1f368d632e63`**
- chair_chat_id: 6937032012
- ANU key: c119085addb0f8b7

## 13. ANU-Codex loop 결과
- non-critical finding 자동수렴: 적용 (Pyright import 경로 정적 분석 한계는 sys.path manipulate 런타임 검증으로 갈음)
- Codex final verdict: PASS (regression 0 new fail, baseline 보존)
- PASS_WITH_RECOMMENDATIONS: 해당 없음 (FAIL_BLOCKING 0)

## 14. 회장 보고 트리거 발생 여부
| 트리거 | 발생 | 비고 |
|--------|------|------|
| Critical7 hit | ✗ | |
| credential expansion | ✗ | net-new credential 0 |
| permission expansion | ✗ | |
| live settings 적용 시도 | ✗ | staged template only |
| GitHub destructive write | ✗ | push/PR/merge 0 |
| forbidden target 수정 | ✗ | forbidden_paths 28종 무수정 |

→ 회장 보고 트리거 0건 · Telegram 발사 0건 · NOOP_TERMINAL 분류.

## 15. 다음 action (HARNESS_ENFORCED 진입 전 prerequisite)
- 회장 verbatim signature 별도 task 발행 후 진행
- prerequisite:
  - `~/.claude/settings.json.bak.task-2644.<ISO8601>` 백업
  - staged template `memory/specs/staged_settings_template_anu_callback_collector_260524.json` 의 hooks 섹션을 live `~/.claude/settings.json` 에 병합
  - deny/allow/collector-mode live smoke test 통과
  - rollback plan `memory/specs/task_2644_rollback_plan_260524.md` §0 백업 완료
- 본 task 범위: RUNTIME_GUARDED 까지 (회장 verbatim ANCHOR-6)

## 16. 첨부 / 박제 / 추적
- 워크플로우 doc: `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md`
- 3문서: `/home/jay/workspace/memory/plans/tasks/task-2644/{plan.md, checklist.md, context-notes.md}`
- INDEX (artifact map): `INDEX.md` (worktree root)
- event 박제: `memory/events/task-2644.done`
- cron 등록 응답 캡처: `/tmp/task-2644-cron-register.json`
- callback prompt 본문 (envelope): `/tmp/task-2644-callback-prompt.txt`
- 회장 결정 timestamp: 2026-05-24 00:50 KST (spec §1.2) + 2026-05-24 01:10 KST (보강 5)
- 1C0F6F52 사건 박제 (fixture-8 + LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATION enum): PR #146 task-2643 처리 중 fallback safety-net cron · ANU "callback received" 거짓 표현 사고 (2026-05-23 ~00:40 KST)
