---
task_id: task-2698
type: plan
scope: task
created: 2026-05-27
updated: 2026-05-27
status: completed
---

# 계획서: task-2698

**task**: task-2698
**목표**: PR #156(artifact 오염 동결)을 대체하는 runtime-only fresh PR open — origin/main 기준 fresh worktree 에서 코드만 재추출, artifact 0, PR #155 enforce 보존, 4 medium Gemini 반영.
**승인**: 회장 verbatim 2026-05-27 / chair_authorization_id `CHAIR-AUTH-PR156-REPLACEMENT-RUNTIME-ONLY-FRESH-PR-20260527-JJONGS-IMPLEMENT-001`
**근거**: `memory/tasks/task-2698.md`

---

## 목표

PR #156 의 runtime code 10파일만 origin/main(a2a20f94) 기준 fresh worktree 에서 재추출 →
artifact 0 인 clean runtime-only PR open. 완료 산출물 = `PR156_REPLACEMENT_RUNTIME_ONLY_PR_READY`.

## 범위

### 포함
- dispatch/normal_fallback_callback_helper.py (session propagation 함수 + 4 medium · PR#155 enforce 보존)
- dispatch/prompt.py (--session argv inline)
- schemas/anu_normal_callback_envelope_v1.json (3 SID 필드)
- scripts/finish-task.sh (session env 전파 · NORMAL-CALLBACK-ENFORCE 블록 보존)
- tests/regression/callback_session_propagation/** (5 테스트 + conftest)

### 제외 (다음 페이즈 이후)
- merge (★ MERGE_READY 도달해도 회장 결재 대기 — no_merge)
- artifact/report/memory/plans/envelope 를 PR head 에 commit
- PR #156/#152 branch 재사용·rebase
- dispatch.py / settings.json / hooks / Axis runtime 변경

## 위임 계획

- 4 medium 코드 수정: **쿠쿨칸(백엔드)** — helper 폴백 일관화 + 테스트 3건 표준 import 전환
- 독립 검증: **마아트(횡단)** — regression/scope/artifact0/PR#155 preserve 재검증 (전체 PASS)
- 테스터 역할: 팀장(이참나) 통합 검증으로 대체 (regression 64 passed)

## 검증 기준

- artifact 0: `git diff --name-only origin/main | grep memory/` → 0건 ✓
- regression: `pytest callback_session_propagation + normal_callback_registration_enforcement + finish_task_callback_fail_closed` → 64 passed ✓
- schema: jsonschema Draft7 meta-validation → PASS, 3 SID 필드 ✓
- PR#155 preserve: EnforceResult/assert_/NORMAL-CALLBACK-ENFORCE 앵커 보존 ✓
- PR open: #157 (base main, head task/task-2698-dev7) ✓
