# LAYER_5_COKACDIR_SESSION_WRAPPER_WIRING_DESIGN_PACKET (★ read-only · 회장 verbatim 후속 결정 2)

- 작성 시각: 2026-05-26T20:45 KST
- 작성자: ANU 본 chair-facing session (`53e89540-5bed-4692-a726-ed857820758a`)
- 모드: **read-only design only** (★ 코드 수정 0 · 실제 적용 task-2694 완료 후 별도 chair signature)
- 회장 verbatim 결정 2: "wrapper / helper / dispatch prompt 수준에서 --session 전달 wiring 가능성을 별도 packet 으로 설계"
- chair_authorization_id: (★ 회장 verbatim 후속 결정 2 설계 자동 진행 승인)

## 0. 변경 금지 영역 verbatim

- `/usr/local/bin/cokacdir` 외부 CLI 자체 변경 0
- dispatch.py 전역 변경 0 (★ helper / finish-task.sh callback 단계 한정만)
- live settings.json 변경 0
- hooks live 변경 0
- Axis runtime 변경 0
- durable registry 즉시 활성화 0 (★ task-2687.reserved 유지)

## 1. baseline 코드 evidence (★ origin/main 319170b9 기준)

### 1.1 dispatch/__init__.py L2883-2898 (★ 현재 cokacdir --cron 호출 site)

```python
cmd = [
    "cokacdir",
    "--cron", prompt,
    "--at", get_dispatch_time(_dispatch_delay),
    "--chat", CHAT_ID,
    "--key", key,
    "--once",
]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
```

★ **`--session` argv 가 cokacdir --cron 호출에 포함되지 않음**. 즉, dispatch.py 가 봇 spawn cron 등록 시 chair_facing_sid 정보를 cokacdir 에 전달하지 않는다.

### 1.2 dispatch.py 의 --session 다른 용도

- L4298 argparse: `--session` = "아누 세션 ID (followup 을 현재 대화에서 실행)"
- L3287 session_id 함수 param = "followup 이 동일 대화에서 실행"

★ 즉, dispatch.py `--session` flag 은 followup 용 / **봇 spawn cokacdir --cron 에는 SID propagation wiring 0**.

### 1.3 finish-task.sh L1149

callback / cokacdir / cron 호출 0건 (★ 직전 packet 의 핵심 발견).

### 1.4 PR #152 추가분 — dispatch/normal_fallback_callback_helper.py (251 lines)

helper 함수 `build_anu_owned_callback_request()` 존재 / actual cron 발사 wiring 검증 필요 (★ task-2694 가 enforce 추가 예정).

---

## 2. wrapper wiring 후보 5 옵션 (★ 회장 verbatim 허용 범위 내)

### 옵션 A — dispatch.py cokacdir --cron 호출에 --session 추가
- 위치: `dispatch/__init__.py` L2883-2898 (4 call sites)
- 변경: cmd 에 `"--session", chair_facing_sid` 추가
- 전제: cokacdir CLI 가 `--session` 인식 (★ 현재 unknown)
- **회장 verbatim 평가: 금지** (★ "dispatch.py 전역 변경 금지" 해당 · 전역 dispatch 시점에 SID 주입은 전역 변경)

### 옵션 B — helper 가 cokacdir --cron 호출 시 --session 전달
- 위치: `dispatch/normal_fallback_callback_helper.py` (PR #152 251줄)
- 변경: helper 의 actual cron 발사 코드에 `["cokacdir", "--cron", ..., "--session", chair_facing_sid, "--key", "c119085addb0f8b7"]` argv 추가
- 전제: cokacdir CLI 가 --session 옵션 인식 (★ silent ignore 여도 안전)
- **회장 verbatim 평가: 허용** (★ "helper / finish-task.sh callback 단계 한정"과 일치 · PR #152 expected_files 내부)
- 단점: cokacdir 가 --session 미지원 시 collector spawn env 에 SID 인계 불가 → 옵션 E 보강 필요

### 옵션 C — dispatch prompt 에 CHAIR_FACING_SESSION_ID env 명시
- 위치: dispatch.py prompt template 영역 (★ 봇에게 전달되는 prompt 의 env 변수 list)
- 변경: prompt 에 `CHAIR_FACING_SESSION_ID=53e89540-...` env 명시 추가 (★ 현재 ANU_KEY / CHAT_ID / WORKSPACE_ROOT 와 동일 패턴)
- 봇 finish-task.sh 호출 시 env 전달 → helper 가 env 읽고 --session argv 작성
- **회장 verbatim 평가: 부분 허용** (★ "dispatch prompt 수준" 명시 일치 · prompt template 만 변경)
- 장점: cokacdir 미변경 + 봇이 env 로 SID 명시적 인지 + helper / finish-task.sh 양쪽 동일 source 참조

### 옵션 D — file-based registry (★ task-2687.reserved durable registry)
- 위치: `memory/state/chair-facing-session-registry.json` 신규
- 변경: dispatch.py 가 봇 spawn 시 task_id ↔ chair_facing_sid 매핑 file write / helper / collector entrypoint 가 file read
- **회장 verbatim 평가: 현재 시점 금지** (★ "durable registry task-2687.reserved 상태 유지. 지금 즉시 구현하지 않는다")
- 활성화 조건: task-2694 dogfood PASS + PR #152 재평가 후 회장 verbatim

### 옵션 E — collector entrypoint 가 receipt 파일에 chair_facing_sid 기록
- 위치: `utils/normal_completion_callback_collector_entrypoint.py`
- 변경: collector spawn 시 chair_facing_sid env/argv 읽고 receipt 파일 `memory/events/anu_callback/<tid>-normal-completion.received.json` 에 명기
- 전제: collector spawn 시 env/argv 가 전달되어야 함 (★ 옵션 B 또는 C 와 chain)
- **회장 verbatim 평가: 허용** (★ collector entrypoint 는 utils/ 영역 · live settings/hooks/Axis 외)

---

## 3. 권장 wiring 조합 (★ 회장 verbatim 후 task-2694 완료 후 chair signature 발급 시 적용)

### Phase 1 권장 — 옵션 C + 옵션 B + 옵션 E 조합

**SID propagation chain**:
```
[dispatch.py prompt] (★ 옵션 C)
  → env CHAIR_FACING_SESSION_ID=53e89540-...
  → 봇 session env 노출
    ↓
[bot session]
  → bot 작업 진행
    ↓
[scripts/finish-task.sh callback 단계] (★ task-2694 가 신규 추가)
  → helper 호출 시 env 전달
    ↓
[dispatch/normal_fallback_callback_helper.py] (★ 옵션 B · PR #152 + task-2694 enforce)
  → cokacdir --cron --session $CHAIR_FACING_SESSION_ID --key c119085addb0f8b7 호출
  → schedule_id 회수
  → envelope 에 chair_facing_session_id 3 SID 모두 동일 값 작성
    ↓
[cokacdir --cron fire]
  → ANU collector spawn (★ cokacdir 가 --session 지원 시 spawn env 에 SID 인계 / 미지원 시 옵션 E 로 보강)
    ↓
[utils/normal_completion_callback_collector_entrypoint.py] (★ 옵션 E)
  → collector startup
  → env CHAIR_FACING_SESSION_ID 읽음 (★ spawn env / cokacdir 인계 안 되면 envelope 에서 read)
  → receipt 파일 작성 `memory/events/anu_callback/<tid>-normal-completion.received.json`
    {
      "chair_facing_session_id": "...",
      "collector_spawn_session_id": "...",
      "session_match": chair_facing_session_id == collector_spawn_session_id
    }
```

### Phase 2 권장 — 옵션 D durable registry 활성화 (★ task-2687.reserved release condition 도달 시)

- file-based registry 로 task_id ↔ chair_facing_sid ↔ schedule_id ↔ owner_key 4-tuple 영구 매핑
- collector entrypoint 가 spawn 시 registry 조회로 chair_facing_sid 재확보 (★ env 인계 실패 시 fallback)

---

## 4. 각 옵션의 sid propagation chain matrix

| 옵션 | 변경 파일 | 변경 위치 | 누가 SID 작성 | 누가 SID 읽음 | cokacdir 변경 | 회장 verbatim 평가 |
|---|---|---|---|---|---|---|
| A | dispatch/__init__.py | L2883-2898 cmd | dispatch | cokacdir | 인식 필요 | 금지 (dispatch.py 전역 변경) |
| B | dispatch/normal_fallback_callback_helper.py | actual cron 발사 code | helper | cokacdir | 인식 필요 (★ 미인식 시 silent ignore) | 허용 |
| C | dispatch.py prompt template | prompt 영역 | dispatch | bot env | 미변경 | 부분 허용 (prompt template) |
| D | memory/state/chair-facing-session-registry.json 신규 | new file | dispatch + helper + collector | helper + collector | 미변경 | 현재 금지 (★ task-2687.reserved) |
| E | utils/normal_completion_callback_collector_entrypoint.py | collector startup | collector | receipt | 미변경 | 허용 |

---

## 5. dogfood 평가 hooks (★ task-2694 자기 검증과 통합)

본 wrapper wiring 이 적용되었을 때 task-2694 dogfood 10 조건 + 8 evidence 가 다음과 같이 충족:

- evidence 6 (receipt 파일 작성): 옵션 E 가 충족
- evidence 7 (chair_facing_sid 일치): 옵션 C + B + E chain 이 충족
- evidence 8 (envelope schedule_type ≠ deferred): 옵션 B 가 helper 에서 actual cron 발사 후 schedule_id 명기로 충족

→ 본 wrapper wiring 이 활성화되면 SESSION_DISCONTINUITY 사고 (task-2684 패턴) 재발 방지 wiring 완성.

---

## 6. 적용 순서 (★ 회장 verbatim 후속)

1. **현재 (★ 2026-05-26)**: 본 packet 작성 완료 / task-2694 callback inbound 대기
2. **task-2694 dogfood PASS 후**: PR #152 재평가 + unresolved thread 1건 처리
3. **PR #152 재평가 완료 후 별도 chair signature**: 본 packet 의 옵션 C + B + E 조합 적용 task 발의 (★ task-2695 예정)
4. **task-2695 PASS + 운영 안정화 후**: 옵션 D durable registry (task-2687.reserved) 활성화 결정

---

## 7. cokacdir CLI 의 --session 지원 여부 검증 필요 (★ read-only · 회장 verbatim 변경 금지 영역 외 query)

본 packet 적용 전 검증할 1 항목 (★ read-only 가능):
- `cokacdir --help` 출력에서 `--session` flag 명시 여부 확인

→ ANU 가 read-only 로 확인 가능. 본 packet 의 옵션 B 또는 A 가능성 여부 baseline.

```bash
cokacdir --help 2>&1 | grep -E "session|SID"
```

★ 결과는 cokacdir CLI 자체 변경 0 / 단지 정보 수집.

## 8. ANU 본 세션 자동 진행 규칙 적용

- 본 packet 작성 = read-only 자동 진행 (★ marker 누적만)
- task-2694 callback inbound 도착 시 즉시 본 packet 작성 중단 + dogfood 10 평가 진입
- 12 즉시 보고 trigger 외 자동 진행 (★ 회장 야간 보고 규칙)
- 본 packet 적용 / 실 wiring 변경은 task-2694 PASS + 별도 chair signature 후 (★ 회장 verbatim)

끝
