# task-2677 — CALLBACK_SELF_KEY_REGISTRATION_HARDENING_PACKET (Track 6)

- Level: Lv.3 (★ packet only · 코드 수정 0 · helper 변경 0 · live runtime 변경 0)
- 담당: **dev2 오딘** (★ idle 봇 · task-2662 작성자 ownership 보유 · callback context 강함 · task-2670~2676 충돌 0)
- 단일소스: 본 task md + feedback_callback_authority_actual_owner_key_260524.md + feedback_callback_self_key_helper_not_wired_260521.md
- chair_authorization_id: **`CHAIR-AUTH-CALLBACK-SELF-KEY-HARDENING-PACKET-20260526-JJONGS-HARDENING-001`** (★ 회장 verbatim 발급 권고 · ANU 임의 생성 0 anchor)

## 배경

5 Track 병렬 처리 중 **callback self-key 사고 반복 발생**:
- Track A (task-2667 dev7 이참나 · 4bb627fe watcher → task-2672 dev4 비슈누 · 67ba75de watcher · schedule 91DDBCDA → callback 78F385CF = **dev4 self-key 7943afbe12c12f7d**)
- Track J (task-2676 dev5 마르둑 · schedule A6200C2F → callback 33E60E8B = **dev5 self-key 109fa85250c6d46b**)

★ **공통 패턴**:
- task md에 ANU key c119085addb0f8b7 정확 명기
- 봇이 envelope text에 owner_key: c119085addb0f8b7 + self_key: 0 정확 명기
- 그러나 actual cokacdir cron 등록은 self-key로 발사 → SELF_COLLECTOR 자가심사

→ 봇 개별 문제 아님 · **helper 결선 미흡** 가능성 (★ memory anchor `feedback_callback_self_key_helper_not_wired_260521`)

## 회장 verbatim 결정 (1:1)

- 범위: hardening **packet only** (★ 바로 코드 수정 금지)
- 완료 상태: `CALLBACK_SELF_KEY_REGISTRATION_HARDENING_PACKET_READY`

## 검토 영역 5 (회장 verbatim)

1. **task md ANU key vs 실제 cokacdir cron self-key 발사 원인 분석**
   - 봇 finalize 시퀀스에서 어디가 --key 인자를 잘못 채우는지
   - dispatch/normal_fallback_callback_helper.py · scripts/finish-task.sh · utils/anu_callback_registrar.py 등 path 추적
2. **helper가 실제 --key 인자를 강제하지 못하는 지점**
   - DEFAULT_ANU_KEYS 적용 시점 · KEY env var · 인자 우선순위
   - 어디서 self-key가 fallback으로 들어가는지
3. **actual owner key 검증을 callback collector gate에 넣는 방식**
   - collector spawn 시 callback prompt owner_key 텍스트 vs actual schedule owner key 4 source 교차 강제
   - 불일치 시 NON_AUTHORITATIVE_SELF_COLLECTOR 자동 분류
4. **self-key callback 발생 시 NON_AUTHORITATIVE_SELF_COLLECTOR 자동 분류 정책**
   - callback fire 시점 분류 · 후속 ANU 독립 검증 강제 trigger
5. **ANU 독립 검증 강제 플로우**
   - SELF_COLLECTOR 분류 시 ANU re-verify task 자동 dispatch
   - 또는 회장 보고 강제

## 허용 9

1. `memory/specs/callback_self_key_registration_hardening_*.md` 작성 (★ packet + sub-spec)
2. `memory/events/task-2677.*` 작성
3. `memory/reports/task-2677.md` 작성
4. helper 코드 5개 **read-only 분석** (★ utils/anu_callback_registrar.py · dispatch/normal_fallback_callback_helper.py · scripts/finish-task.sh · scripts/start-task.sh · utils/callback_collector_helper_integration.py)
5. dispatch/__init__.py / dispatch.py read-only 분석
6. 4 source 교차 검증 doctrine 박제 (★ schedule_history + cron-history + envelope + result artifact)
7. SELF_COLLECTOR 분류 enum 정의
8. ANU collector gate 분기 plan 설계
9. result + report + done marker

## 금지 10 (회장 verbatim)

1. 코드 수정 (★ helper / dispatch / finish-task / utils 변경 0)
2. PR 생성
3. merge
4. auto-merge
5. dev bot 재dispatch
6. runtime 변경
7. live settings.json 변경
8. hooks live 변경
9. dispatch.py 변경
10. HARNESS_ENFORCED 전체 선언

## 완료 상태

성공: **`CALLBACK_SELF_KEY_REGISTRATION_HARDENING_PACKET_READY`**

## 보고 필수 7

1. self-key 발사 root cause classification (★ helper 결선 위치 verbatim)
2. helper 5종 code path 인용 (★ line + verbatim)
3. 4 source 교차 검증 doctrine 설계 (★ 적용 시점 + gate 위치)
4. NON_AUTHORITATIVE_SELF_COLLECTOR 자동 분류 plan
5. ANU 독립 검증 강제 플로우 설계
6. hardening fix diff preview (★ 실제 diff 0 · preview only)
7. file overlap (★ task-2662~2676 코드 변경 0)
8. forbidden_action_count (target 0)
9. recommended next action (★ fix implementation 별도 chair signature 강제)

## expected_files (~5)

- `memory/specs/callback_self_key_registration_hardening_packet_260526.md` (★ 통합)
- `memory/specs/callback_self_key_registration_hardening_root_cause_analysis_260526.md`
- `memory/specs/callback_self_key_registration_hardening_4source_verify_doctrine_260526.md`
- `memory/specs/callback_self_key_registration_hardening_fix_diff_preview_260526.md`
- `memory/events/task-2677.done`
- `memory/events/task-2677.callback-self-key-hardening-result-260526.json`
- `memory/reports/task-2677.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "memory/specs/callback_self_key_registration_hardening_*.md"
    - "memory/events/task-2677.*"
    - "memory/reports/task-2677.md"
    - "memory/tasks/task-2677.md"
    - "INDEX.md"
  read_only_reference:
    - "utils/anu_callback_registrar.py"
    - "dispatch/normal_fallback_callback_helper.py"
    - "scripts/finish-task.sh"
    - "scripts/start-task.sh"
    - "utils/callback_collector_helper_integration.py"
    - "dispatch/__init__.py"
    - "dispatch.py"
    - "/home/jay/.cokacdir/schedule_history/91DDBCDA.log (★ Track A executor)"
    - "/home/jay/.cokacdir/schedule_history/78F385CF.log (★ Track A self-key callback)"
    - "/home/jay/.cokacdir/schedule_history/A6200C2F.log (★ Track J executor)"
    - "/home/jay/.cokacdir/schedule_history/33E60E8B.log (★ Track J self-key callback)"
    - "memory/feedback_callback_authority_actual_owner_key_260524.md"
    - "memory/feedback_callback_self_key_helper_not_wired_260521.md"
  forbidden_paths:
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "hooks/**"
    - "memory/specs/v3_1_*.md"
    - "memory/specs/v3_6_*.md"
    - "memory/specs/worktree_promotion_*.md"
    - "memory/specs/pr_watcher_*.md"
    - "memory/events/task-2662*"
    - "memory/events/task-2663*"
    - "memory/events/task-2664*"
    - "memory/events/task-2665*"
    - "memory/events/task-2666*"
    - "memory/events/task-2667*"
    - "memory/events/task-2668*"
    - "memory/events/task-2669*"
    - "memory/events/task-2670*"
    - "memory/events/task-2671*"
    - "memory/events/task-2672*"
    - "memory/events/task-2673*"
    - "memory/events/task-2674*"
    - "memory/events/task-2675*"
    - "memory/events/task-2676*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m json.tool"
    - "python3 -c"
    - "ls"
    - "cat"
    - "stat"
    - "git status"
    - "git log"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "head"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
  merge_policy: "hardening_packet_only_no_code_change_no_pr"
  ttl_hours: 48
```

## frozen anchors

- ANCHOR-1: "hardening packet only · 코드 수정 0 · helper 변경 0 · runtime 변경 0"
- ANCHOR-2: "helper 5종 read-only 분석 + 4 source 교차 검증 doctrine 설계"
- ANCHOR-3: "fix implementation은 본 packet 박제 후 별도 chair signature 강제"
- ANCHOR-4: "task-2662~2676 파일 충돌 0 · 본 packet prefix `callback_self_key_registration_hardening_*` 차별화"

## 종결

성공: **`CALLBACK_SELF_KEY_REGISTRATION_HARDENING_PACKET_READY`**

끝
