# task-2686 — CALLBACK_SESSION_PROPAGATION_WIRING_FIX (★ 발행 준비 · 회장 verbatim 발사 대기)

- Level: Lv.3 (★ helper + dispatch + finish-task + schema 결선 / 코드 변경 있음 · live infra 변경 0)
- 담당: **dev1 헤르메스** 또는 **dev8 라** (★ idle 봇 1택 · 회장 verbatim 선정 대기)
- 제외: dev4 비슈누 · dev5 마르둑 (★ 최근 self-key 사고 봇 제외)
- chair_authorization_id: **`CHAIR-AUTH-CALLBACK-SESSION-PROPAGATION-WIRING-20260526-JJONGS-IMPLEMENT-001`**
- 완료 상태: **`CALLBACK_SESSION_PROPAGATION_WIRING_FIX_IMPLEMENTED`**

## 배경

8 일간 8 incidents (`SESSION_PROPAGATION_GAP_SUBCLASS_OF_SESSION_DISCONTINUITY` · AUTHORITATIVE 3건 모두 chair-facing inbound 0) 반복 후 회장 verbatim 2026-05-26 결정.

- 단일 RCA: `memory/events/task-2684-callback-session-routing-gap-rca-260526.json`
- 단일 spec: `memory/specs/system_callback_session_routing_modular_wiring_gap_analysis_260526.md`
- 단일 doctrine: `memory/feedback_callback_session_continuity_doctrine_260526.md`

## 회장 verbatim 범위 7

1. helper `--session` argv 자동 추가 (★ `dispatch/normal_fallback_callback_helper.py:build_anu_owned_callback_request`)
2. dispatch prompt 에 `chair_facing_session_id` 전달 (★ dispatch.py / team_prompts.py)
3. normal callback cron 등록 시 `--session <CHAIR_FACING_SID>` 사용 (★ argv 자동)
4. `scripts/finish-task.sh` / callback helper 경로에서 session id 누락 방지 (★ env var `ANU_CHAIR_FACING_SID` propagation)
5. callback envelope schema 에 3 field 추가:
   - `chair_facing_session_id`
   - `collector_session_id`
   - `delivery_session_id`
6. mismatch 시 `AUTHORITATIVE_BUT_SESSION_DISCONTINUITY` 분류 강제 (★ classifier 로직)
7. regression 추가 (★ helper argv `--session` 포함 / envelope schema 3 field / classifier 4 enum)

## 회장 verbatim 금지 7

1. live settings.json 변경 0
2. hooks live 변경 0
3. Axis runtime 변경 0
4. PR merge 0
5. auto-merge 0
6. HARNESS_ENFORCED 전체 선언 0
7. task-2680 / PR #149 / PR #150 과 혼합 0

## 코딩 4 원칙 적용

1. Think Before Coding — chair_facing_session_id 가 cokacdir `--session` 옵션과 매핑되는지 확인 후 진행
2. Simplicity First — 환경변수 + argv 옵션만으로 결선 (★ 새 자료구조 최소)
3. Surgical Changes — helper + dispatch prompt + finish-task.sh 3개 경로만 (★ schema 1건 추가)
4. Goal-Driven Execution — 목표: 다음 callback fire 시 chair-facing 세션 resume 보장 (★ 검증: regression fixture 로 spawn 시뮬레이션)

## 허용 paths

```yaml
allowed_resources:
  paths:
    - "dispatch/normal_fallback_callback_helper.py"
    - "dispatch/__init__.py (★ helper import wiring 만)"
    - "dispatch/prompt.py (★ chair_facing_session_id inline)"
    - "scripts/finish-task.sh (★ ANU_CHAIR_FACING_SID env var propagation)"
    - "schemas/anu_normal_callback_envelope_v1.json (★ 3 field 추가)"
    - "tests/regression/callback_session_propagation/**"
    - "memory/events/task-2686.*"
    - "memory/reports/task-2686.md"
    - "memory/tasks/task-2686.md"
    - "INDEX.md"
  forbidden_paths:
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "**/.env*"
    - "**/credentials*"
    - "settings.json"
    - "hooks/**"
    - "dispatch.py (★ root 파일 · 본 task 미적용)"
    - "Axis/**"
    - "utils/anu_codex_micro_refinement_loop.py (★ task-2662 영역)"
    - "utils/callback_authority_4source_validator.py (★ task-2680 PR #151 영역)"
    - "utils/pr_watcher_terminal_state_classifier.py (★ PR #150 머지 영역)"
  commands:
    - "git log"
    - "git diff"
    - "git show"
    - "git add"
    - "git commit"
    - "python3 -m pytest"
    - "python3 -c"
    - "python3 -m json.tool"
    - "ls"
    - "cat"
    - "wc"
    - "grep"
    - "find"
    - "tail"
    - "head"
    - "printf"
    - "cokacdir --currenttime"
    - "cokacdir --cron-history"
  merge_policy: "wiring_fix_pr_only_no_auto_merge"
  ttl_hours: 72
```

## 완료 7 보고 필드

1. helper argv `--session` 포함 unit test (★ regression fixture 인용)
2. dispatch prompt sid 자동 inline 검증 (★ template snapshot)
3. finish-task.sh env var propagation 검증 (★ shell -x trace)
4. envelope schema 3 field 추가 (★ JSON schema diff)
5. classifier `AUTHORITATIVE_BUT_SESSION_DISCONTINUITY` enum 추가 (★ classifier 로직)
6. regression 통과 (★ count 명시)
7. forbidden_action_count 0 + code_change scope 4 파일 (★ git diff stat)

## expected_files (~6)

- `dispatch/normal_fallback_callback_helper.py` (★ build_anu_owned_callback_request 수정)
- `dispatch/prompt.py` (★ chair_facing_session_id inline)
- `scripts/finish-task.sh` (★ ANU_CHAIR_FACING_SID env propagation)
- `schemas/anu_normal_callback_envelope_v1.json` (★ 3 field 추가)
- `tests/regression/callback_session_propagation/test_*.py` (★ regression 추가)
- `memory/events/task-2686.callback-session-propagation-wiring-result-260526.json`
- `memory/events/task-2686.done`
- `memory/reports/task-2686.md`

## ANU normal callback (★ self-key 금지 + session propagation 적용)

- envelope: `memory/events/anu_callback/task-2686-normal-completion.json`
- owner key: ANU `c119085addb0f8b7` (★ self-key 금지)
- **★ --session 옵션 `--session 53e89540-5bed-4692-a726-ed857820758a` 포함 강제** (★ 본 task 자체가 dogfood)
- absolute fire timestamp: now+30s
- envelope ≤ 3900 bytes hard limit
- envelope 3 field: chair_facing_session_id / collector_session_id / delivery_session_id 명시

## frozen anchors

- ANCHOR-1: "chair_facing_session_id 는 collector_key 와 별개 routing field · 혼합 금지"
- ANCHOR-2: "key authority ≠ session continuity"
- ANCHOR-3: "live settings.json / hooks live / Axis runtime 변경 0"
- ANCHOR-4: "task-2680 / PR #149 / PR #150 산출물 충돌 0"
- ANCHOR-5: "본 task 의 ANU callback 도 --session 옵션 dogfood 적용"

## 종결

성공: **`CALLBACK_SESSION_PROPAGATION_WIRING_FIX_IMPLEMENTED`**

★ **본 task md 는 발행 준비만 완료. 실제 dispatch 발사는 회장 verbatim 발사 명령 (executor 봇 지정 + dispatch.py 호출 승인) 대기.**

끝