# FRESH RUNTIME-ONLY PR 전략 (★ PR #152 session propagation · 회장 verbatim 2026-05-27 "fresh PR 재추출 준비")

- 작성: 2026-05-27 KST · ANU 본 chair-facing session
- 상태: **전략 준비 (★ dispatch 아님 · chair_authorization_id 발급 + executor 지정 대기)**
- 근거: `PR156_RUNTIME_CODE_VALID_BUT_ARTIFACT_CONTAMINATED` + [[feedback_runtime_code_artifact_separation_doctrine_260527]]

## 0. 왜 fresh re-extract 인가

PR #156 runtime code 는 건전(dd09f520 clean green). 그러나 artifact commit 1d02bfd6 이 head 에 섞여:
- taskctl-state-guard B-3 scope 실패
- Gemini review head drift (dd09f520 ≠ 1d02bfd6)
- watcher report stale

→ PR #156 억지 수정/push 금지 (★ same-PR post-review push doctrine). **artifact 0 인 fresh runtime-only PR 로 재추출**.

## 1. 목표 산출물 (★ runtime code ONLY)

PR #156 의 **코드 파일만** fresh worktree(origin/main 최신) 에서 재적용:
- `dispatch/normal_fallback_callback_helper.py` (session propagation 함수: is_valid_session_id / resolve_chair_facing_sid / classify_session_propagation)
- `dispatch/prompt.py` (--session argv inline)
- `schemas/anu_normal_callback_envelope_v1.json` (3 SID 필드)
- `scripts/finish-task.sh` (session propagation 단계)
- `tests/regression/callback_session_propagation/` (6 test 파일)

## 2. 절대 제외 (★ artifact 0 · 회장 verbatim 금지 대상)

PR head diff 에 **절대 포함 금지**:
- `memory/` (tasks/reports/events/plans/anu_callback 전부)
- `reports/`
- `plans/` (checklist/context-notes/plan docs)
- `anu_callback/` / envelope json
- 완료 보고서 / 3docs

→ 이 artifact 들은 **별도 흐름 또는 merge 후 lifecycle 로 분리** (★ PR head 에 commit 0).

## 3. 4 medium Gemini 수정 동시 반영 (★ auto-remediation 6조건 충족분)

fresh PR 에 다음 4 medium 반영 (★ PR #156 unresolved 4 thread):
1. `helper.py` L88 — explicit="" vs invalid-uuid 폴백 동작 일관화
2. `test_classifier_enum.py` L41 — `_load_real` 제거 → 표준 import
3. `test_helper_session_argv.py` L38 — `_load_real`/importlib 제거 → 표준 import
4. `test_prompt_inline.py` L51 — AST parse+exec 제거 → 표준 import

→ fresh PR 은 처음부터 medium 반영된 상태로 open → Gemini fresh review 가 clean 통과 목표.

## 4. 불변식 (★ 회장 verbatim)

- **PR #155 enforcement 절대 보존**: `EnforceResult` / `assert_normal_callback_actually_registered` + finish-task.sh L1005/L1014/L1019/L1026 wiring 훼손 0
- **same-PR post-review push 0**: Gemini review 도착 후 어떤 commit/push/amend 도 금지. 추가 변경 필요 시 Option A replacement
- **Gemini fresh review 기준 최신 head 고정**: PR open → Gemini review → 그 head 동결 (artifact 추가로 drift 금지)
- **runtime code clean green 상태만 watcher 대상**

## 5. CI scope guard 대비 (★ taskctl-state-guard B-3 재발 방지)

- fresh PR diff = runtime code only → B-3 task scope 가 expected_files 와 정합
- expected_files 선언에 5 코드 파일 정확 명시 (capability snapshot 정합)
- artifact 미포함으로 scope 확장 0 → B-3 PASS 기대

## 6. dispatch 전 회장 결정 대기 항목 (★ ANU 미승인 위임 금지)

1. **chair_authorization_id** verbatim 발급 (★ 코드 구현 task 필수)
2. **executor 지정**: dev7 (PR #156 작성자 — 동일 컨텍스트 장점 vs 작성자 재투입 제한 [[feedback_resolver_reinjection_limit_260513]]) / 또는 dev1·dev3 (제외: dev2 PROBATION / dev4·dev5·dev6 quarantine·self-key)
3. **artifact 분리 방식 확정**: (a) merge 후 별도 lifecycle commit / (b) 별도 artifact-only PR / (c) memory/ 직접 (PR 외)
4. PR #156 처리: contamination 동결 유지 vs close (★ fresh PR open 후)

## 7. spawn verification + callback (★ 기존 doctrine 유지)

- dispatch.py status:ok 단독 신뢰 0 → fire+5분 4 신호 (worktree/state/process or schedule_history/task md sha256)
- callback = ANU key c119085addb0f8b7 + --session 53e89540-5bed-4692-a726-ed857820758a + 4-source 검증
- ★ 단, 완료 callback envelope/보고서는 **PR head 에 commit 0** (artifact 분리 doctrine)

## 8. forbidden_action_count

**0** (★ 본 packet = 전략 준비 read-only · dispatch 0 · code 0 · merge 0)

## 9. 권고

회장님 결정 4항목(§6) 확정 시 task-2696+1 (또는 신규 task ID) 로 fresh runtime-only PR dispatch. 그 전까지 PR #156 동결.

끝
