# ★★★ runtime code PR ↔ artifact/report PR 혼합 절대 금지 (★ 회장 verbatim 2026-05-27 · PR #156 artifact contamination 사고 박제)

- 분류: feedback (operational doctrine · 시스템 전역)
- 트리거: PR #156 (task-2696 session propagation) `PR156_RUNTIME_CODE_VALID_BUT_ARTIFACT_CONTAMINATED`
- 회장 verbatim 2026-05-27

## 0. 사고 재분류 (★ 회장 verbatim)

PR #156 은 **"session propagation 코드 실패"가 아니다**. **"same-PR artifact push 로 인한 stale/drift contamination"** 사건이다.

- dd09f520 시점 watcher 판단(11/11 SUCCESS)은 **당시 기준 실제 truth 였음** (★ ANU live 분석 확인: dd09f520 taskctl-state-guard SUCCESS x2)
- stale 직접 원인 = **dev7 의 후속 artifact commit 1d02bfd6** (memory/ 6개 · 코드 0 · watcher fire 8분 후 push)
- 기능 코드(helper/prompt/finish-task/session propagation)는 **건전**
- 실패 원인 = **runtime code 와 artifact(memory/reports/envelope/plans) 혼합 push** → diff scope 확장 → taskctl-state-guard B-3 scope misfire + Gemini head drift

## 1. doctrine (★ 회장 verbatim)

**runtime code PR 과 artifact/report PR 을 절대 혼합하지 않는다.**

PR head 에 들어가면 안 되는 금지 대상 (★ 회장 verbatim 6):
- `memory/`
- `reports/`
- `plans/`
- `anu_callback/`
- `envelope/`
- `checklist` / `context-notes` / `plan` docs

이유: watcher freshness / Gemini freshness / scope guard 안정성. artifact 가 runtime code PR head 에 섞이면 ①taskctl-state-guard B-3 scope 확장 실패 ②Gemini review head drift ③watcher report stale 화.

## 2. 새 fresh PR 원칙 (★ 회장 verbatim)

- runtime / session propagation **code only**
- artifact **0**
- report / envelope / 3docs **0**
- same-PR **post-review push 0**
- PR #155 enforcement **절대 보존**
- Gemini fresh review 기준 **최신 head 고정**

→ 새 fresh PR 에서는 **"runtime code clean green 상태"만 watcher 대상**으로 사용.
→ **artifact 생성은 별도 흐름 또는 merge 후 lifecycle 로 분리.**

## 3. ANU 운영 원칙 추가 (★ 회장 verbatim)

> **"텍스트 completion/report 생성"은 기능 완료 증거가 아니다.**

watcher freshness 와 scope stability 를 깨뜨릴 수 있으므로 **runtime path 와 lifecycle artifact path 를 분리**한다.

- runtime path = 코드 변경 PR (helper/prompt/schema/finish-task/tests) → watcher/merge 대상
- lifecycle artifact path = 보고서/3docs/envelope/callback → 별도 흐름 또는 merge 후

## 4. watcher freshness truth contract 강화 (★ 회장 verbatim · 기존 packet 확장)

callback 직전 **반드시 live recheck** 수행. hard gate 4 (★ 1개라도 발생 시 `STALE_WATCHER_REPORT_INVALIDATED` + `CHAIR_REQUIRED`):
1. **head drift** (watcher_target_head != live_head)
2. **Gemini head mismatch** (Gemini review head != live head)
3. **CI mismatch** (watcher CI snapshot != live CI)
4. **unresolved mismatch** (watcher unresolved count != live unresolved)

상세: [[watcher-freshness-truth-contract-packet-260527]] (HG1~HG4 + 본 doctrine §4 로 unresolved mismatch gate 추가)

## 5. forbidden (★ 회장 verbatim · PR #156 현재)

- PR #156 same-PR 추가 push
- artifact 재추가
- stale watcher 재사용
- dispatch.py 전역 수정
- merge 강행
- PR #156 억지 수정

## 6. 현재 우선순위 (★ 회장 verbatim)

1. PR #156 억지 수정/추가 push 금지 (★ contamination 된 채 동결)
2. fresh runtime-only PR 전략 준비
3. artifact contamination doctrine 시스템 전역 박제 (★ 본 파일)
4. callback/session continuity 핵심 코드만 유지

## 7. 연결

- 직전 사고 동류: [[feedback_same_pr_push_after_gemini_doctrine_enforcement_260511]] (same-PR push after Gemini)
- scope guard 오판 동류: [[feedback_pr_subtask_worktree_isolation_260513]] · [[finish_task_shared_branch_gate_misfire_260521]]
- PR #156 분석: `memory/events/pr156-direct-live-readonly-analysis-260527.json`
- PR #155 enforce (보존 대상): [[project_callback_governance_stack_production_verified_260523]]

끝
