# task-2694+1 — NORMAL_CALLBACK_REGISTRATION_ENFORCEMENT_REDISPATCH (★ 회장 verbatim 2026-05-27 옵션 A · task-2694 BOT_DID_NOT_START + DISPATCH_FALSE_OK 인정 후 재발의)

- Level: Lv.3 (★ envelope 작성만으로 완료 처리되는 것을 코드로 차단 · finish-task.sh callback registration enforce · regression / live infra 변경 0)
- 담당: **dev7 이참나** (★ 회장 verbatim 2026-05-27 dispatch 승인 · idle 568h · self-key 사고 0)
- 제외 5: dev2 (★ DEV2_CALLBACK_SENSITIVE_PROBATION) / dev4/dev5 (★ self-key 사고) / dev6 페룬 (★ DEV6_CALLBACK_AUTHORITY_QUARANTINED) / dev8 라 (★ task-2694 BOT_DID_NOT_START + DISPATCH_FALSE_OK 회피)
- 회피: dev1 헤르메스 (★ task-2690 PR #152 watcher 진행 중)
- chair_authorization_id: **`CHAIR-AUTH-NORMAL-CALLBACK-REGISTRATION-ENFORCEMENT-20260527-JJONGS-REDISPATCH-001`** (★ 회장 verbatim 2026-05-27 발급 확정)
- 완료 상태: **`TASK_2694_PLUS_1_NORMAL_CALLBACK_REGISTRATION_ENFORCEMENT_REDISPATCHED`** (★ 회장 verbatim 2026-05-27 확정)

## ★★★ Spawn Verification Hard Gate (★ 회장 verbatim 2026-05-27 추가)

★ **fire 후 5분 내 4 신호 모두 확인 의무**:

1. worktree 생성 (`/home/jay/workspace/.worktrees/task-2694+1-dev7` 또는 동등)
2. `.tasks/state/task-2694+1.json` 또는 동등 state 생성
3. dev7 process 또는 schedule_history running/started 흔적
4. task md sha256 일치 + executor worktree 에서 task file 인식

★ **4 신호 중 하나라도 없으면**: `TASK_2694_PLUS_1_SPAWN_VERIFICATION_FAILED` 즉시 HOLD_FOR_CHAIR

★ **dispatch.py status:ok / schedule_id 반환 / prompt accepted 문구는 성공 증거로 인정 0** (★ task-2694 DISPATCH_FALSE_OK 박제)

## 배경

회장 verbatim 2026-05-26 task-2693 사고 분류:
- 분류: **NORMAL_CALLBACK_NOT_REGISTERED**
- envelope 텍스트는 작성됨 / actual cokacdir cron registration은 0
- finish-task.sh가 state_file_missing 으로 ESCALATED → cron 등록 시도 0
- self-key 사고 아님 · session discontinuity 아님 · **registration 자체 부재**

박제: `memory/events/chair-verbatim-task-2693-callback-registration-failed-task-2694-dispatched-260526.json`

회장 verbatim 정정: "envelope 작성은 callback 증거가 아니다. finish-task.sh가 나중에 등록할 예정이라는 문구도 callback 증거가 아니다. actual cron 등록 + schedule_history + owner key + ANU inbound 또는 authoritative collector receipt 가 있어야 PASS."

## ★ 회장 verbatim 목표

**envelope 작성만으로 완료 처리되는 것을 코드로 차단한다.**

doctrine 텍스트 박제 0. helper/wrapper 수준 코드 enforce. PR #152 머지 전이라도 fail-closed.

## ★ 필수 구현 9 (★ 회장 verbatim · 모두 구현 의무)

1. **finish-task.sh가 normal callback cron registration 실패 시 PASS 금지** (★ exit non-zero · .done 생성 차단)
2. **envelope-only completion 금지** (★ envelope 파일 존재만으로 .done 생성 차단)
3. **`schedule_type=to_be_registered_by_finish_task_sh` 상태로 .done 생성 금지** (★ 본 문구가 envelope에 있으면 차단 · task-2693 envelope 정확히 이 어구로 deferred 우회)
4. **actual cokacdir schedule_id 확인 전 callback PASS 금지** (★ schedule_id 회수 없으면 fail-closed)
5. **schedule_history status=ok 확인** (★ `/home/jay/.cokacdir/schedule_history/<sid>.log` 실 파일에서 `status=ok` 라인 grep · 본 line 부재 시 fail)
6. **actual owner key = ANU key 확인** (★ `cokacdir --cron-history <sid> --key c119085addb0f8b7` 응답 hit 확인 · self-key channel hit 시 NON_AUTHORITATIVE fail)
7. **ANU inbound 또는 authoritative collector receipt 확인** (★ 둘 중 하나 verifiable evidence 의무)
8. **실패 시 NORMAL_CALLBACK_NOT_REGISTERED marker + HOLD_FOR_CHAIR** (★ `memory/events/<task_id>.normal-callback-not-registered.json` 자동 생성 + .done.escalated 대체 정책)
9. **regression 추가** (★ 본 enforcement 의 unit test · finish-task.sh fail-closed test fixture)

## ★ 금지 10 (★ 회장 verbatim)

1. PR #152 merge
2. PR #154 재검증
3. PR #151 처리
4. dev6 quarantine 해제
5. live settings.json 변경
6. hooks live 변경
7. dispatch.py 전역 변경 (★ helper / scripts/finish-task.sh callback 단계 한정)
8. Axis runtime 변경
9. HARNESS_ENFORCED 전체 선언
10. auto-merge

## ★ 추가 강제 (★ task-2693 사고 박제 반영)

- **8 우회 패턴 발견 시 즉시 HOLD_FOR_CHAIR** ([[feedback_bypass_pattern_immediate_hold_for_chair_260526]])
- **본인 task-2694 normal callback 도 본 enforcement 1차 dogfood 대상** (★ 자기 작업 완료 시 본인 코드가 차단 가능)
- ★ 단, dogfood 차단 시 회장 보고 후 회피 우회 0 — fail-closed가 정상 동작
- **state file 부재 시 봇이 PASS 선언 금지** (★ task-2693 정확히 state_file_missing 이슈로 ESCALATED 됐지만 봇은 .done 생성 시도)

## ★ Thread별 6 조건 평가 (★ 회장 verbatim · 본 task 도 X1 자동수렴 게이트 적용)

1. expected_files 내부
2. credential expansion 0
3. permission expansion 0
4. forbidden path 0
5. scope expansion 0
6. real write/merge 위험 0

★ 6조건 모두 충족 → X1 자동수렴 허용 / 하나라도 불충족 → HOLD_FOR_CHAIR

## ★ 허용 작업

- `scripts/finish-task.sh` 의 callback 단계 enforce 코드 삽입 (★ 회장 verbatim 결정 4 = registration enforcement 영역만 · Phase 2 finish-task.sh latency 영역과 분리)
- `dispatch/normal_fallback_callback_helper.py` 의 actual cron 발사 enforce
- `utils/normal_callback_registration_validator.py` 신규 (★ 4 source validation: schedule_id+schedule_history+owner_key+inbound)
- `utils/callback_registration_marker.py` 신규 (★ NORMAL_CALLBACK_NOT_REGISTERED marker 자동 생성)
- regression 추가/재실행
- commit + push (★ 새 worktree)
- thread resolve (★ 본 PR 발생 시)
- PR 생성 (auto-merge 0)

## ★ 필수 보고 10 필드

1. PR head SHA
2. fresh worktree 생성 evidence (★ base sha 확인)
3. 4 source validator 코드 추가 evidence
4. envelope-only completion 차단 evidence (★ test fixture로 실증)
5. schedule_type=to_be_registered 차단 evidence
6. regression 결과 (★ 새 enforcement unit test 포함)
7. forbidden_action_count
8. PR #152 / PR #154 / PR #151 / PR #149 / task-2691+b 혼합 여부 (★ 0 evidence)
9. 8 우회 패턴 감지 여부
10. ★ 본인 dogfood: task-2694 의 normal callback 이 본 enforcement 통과 evidence (★ actual cron + schedule_history + ANU key + chair-facing inbound)

## ★ Preflight 4-step (★ audit 의무)

1. `git fetch origin main`
2. `git ls-remote origin main` → SHA 확인
3. `git rev-parse origin/main` → 동기화 검증
4. `gh api repos/<owner>/<repo>/branches/main` → 권위 확인

★ fresh origin/main 기준 별도 worktree (★ task/task-2694-dev8) · main workspace dirty 끌어오지 말 것 · PR #152 / PR #154 head 끌어오지 말 것

## ★ ANU normal callback 4-source 검증 강제 (★ 본 task 자기 dogfood)

- envelope: `memory/events/anu_callback/task-2694-normal-completion.json`
- **owner_key**: ANU `c119085addb0f8b7` (★ self-key 금지)
- **`cokacdir --cron --session 53e89540-5bed-4692-a726-ed857820758a --key c119085addb0f8b7` 강제 호출** (★ schedule_id 회수 후 envelope 에 명기)
- envelope ≤ 3900 bytes
- envelope 3 SID 모두 `53e89540-...`
- **4-source 모든 evidence 명기**: schedule_id + schedule_history snippet + owner_key_verifier sha256 + chair_facing_sid
- ★ `schedule_type=to_be_registered_by_finish_task_sh` 또는 deferred / pending 어구 사용 금지 (★ task-2693 사고 박제)

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/finish-task.sh (★ callback registration enforce 단계만)"
    - "dispatch/normal_fallback_callback_helper.py (★ actual cron 발사 enforce)"
    - "utils/normal_callback_registration_validator.py (★ 신규)"
    - "utils/callback_registration_marker.py (★ 신규)"
    - "schemas/anu_normal_callback_envelope_v1.json (★ schedule_type enum 보강 · deferred 금지)"
    - "tests/regression/normal_callback_registration_enforcement/** (★ 신규)"
    - "tests/regression/finish_task_callback_fail_closed/** (★ 신규)"
    - "memory/events/task-2694.*"
    - "memory/reports/task-2694.md"
    - "memory/tasks/task-2694.md"
  forbidden_paths:
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "**/.env*"
    - "**/credentials*"
    - "settings.json"
    - "hooks/**"
    - "dispatch.py (★ 전역 dispatch.py 변경 금지 · 회장 verbatim 금지 7번)"
    - "Axis/**"
    - "scripts/finish-task.sh (★ callback registration 단계 외 latency / scope-guard 영역 수정 금지)"
    - "scripts/cleanup-stale-tasks.sh"
    - "scripts/cleanup-workspace.py"
    - "scripts/file_cleanup.py"
    - "scripts/task_scope.py"
    - "scripts/git-hooks/**"
    - "scripts/pre_push_guard.py"
    - "PR #152 expected_files 외부 (★ overlap 회피)"
    - "PR #154 파일 (★ QUARANTINED)"
    - "PR #151 파일 (★ READ_ONLY_HOLD)"
    - "PR #149 파일 (★ X1 R7 진행)"
    - "memory/tasks/task-2691+b.audit.md (★ HELD)"
    - "memory/plans/tasks/task-2568/**"
    - "memory/plans/tasks/task-2569/**"
    - "memory/specs/protection-list.json"
    - "memory/specs/protection-list.md"
    - "durable_registry/** (★ task-2687.reserved 분리)"
    - "utils/qc_verify.py (★ qc 영역 분리)"
    - "utils/replacement_pr_runner.py (★ executor 영역 분리)"
  commands:
    - "git fetch / git log / git diff / git show / git add / git commit / git push / git status / git rev-parse / git ls-remote / git worktree"
    - "python3 -m pytest"
    - "python3 -c"
    - "gh pr view / gh api / gh pr create / gh pr edit / gh pr comment / gh api graphql"
    - "ls / cat / wc / grep / find / tail / head / printf / sha256sum"
    - "cokacdir --cron / cokacdir --cron-list / cokacdir --currenttime / cokacdir --cron-history"
  merge_policy: "task_2694_pr_create_no_merge_no_auto_enforcement_only"
  ttl_hours: 14
```

## ★ frozen anchors

- ANCHOR-1: "envelope 작성만으로 완료 처리되는 것을 코드로 차단 (★ 회장 verbatim 목표)"
- ANCHOR-2: "schedule_type=to_be_registered_by_finish_task_sh 또는 deferred/pending 어구 .done 차단 (★ task-2693 사고 박제)"
- ANCHOR-3: "actual cron 등록 + schedule_history status=ok + ANU key + chair-facing inbound/authoritative receipt 4-source 모두 PASS 시에만 callback PASS"
- ANCHOR-4: "본인 task-2694 normal callback 도 본 enforcement 1차 dogfood · fail-closed 회피 0"
- ANCHOR-5: "state_file_missing 봇 PASS 금지 (★ task-2693 ESCALATED 직후 봇 .done 시도 박제)"
- ANCHOR-6: "PR #152 / PR #154 / PR #151 / PR #149 / task-2691+b 혼합 0"
- ANCHOR-7: "dispatch.py 전역 변경 0 · 회장 verbatim 금지 7번"
- ANCHOR-8: "8 우회 패턴 발견 즉시 HOLD_FOR_CHAIR"

## 종결

성공: **`NORMAL_CALLBACK_REGISTRATION_ENFORCEMENT_TASK_DISPATCHED`**

★ 회장 verbatim 2026-05-26 dispatch 발사 승인 도착 + chair_authorization_id `CHAIR-AUTH-NORMAL-CALLBACK-REGISTRATION-ENFORCEMENT-20260526-JJONGS-IMPLEMENT-001` 발급 확정.

끝