# Limited Runtime Pilot — Kill Switch Dry-run Plan **v2** (산출물 4/4)

작업 상태명: `LIMITED_RUNTIME_PILOT_DESIGN_PACKET_V2_REDACT_AND_REVISION_APPROVED_ACTIVE_FALSE`
작성: 2026-06-27 (KST) · 작성자: 아누 · 근거: main `189f1f0d` · v1 보정본
**raw key redacted / no literal key retained.**

> v1 대비 변경: ① 방식 A / 방식 B **승인 단계 명확 분리**(A=코드 경로 검증, B=driver entry 근접 검증, 각 별도 승인)
> ② **canonical `p0b_kill` 직접 생성은 pilot 전 전면 금지**로 강화 ③ Phase 0 위치(= 방식 A) 명시.

---

## 1. 검증 목표
- (G1) `memory/state/p0b_kill` 존재 시 driver가 `NOOP_KILL_SWITCH` 전면 NOOP (driver:644).
- (G2) kill NOOP 경로에서 **flag write 0** — `p0b_driver_enabled` 미생성/미변경(회귀 test:166-181).
- (G3) kill NOOP 경로에서 **real fire 0 / spawn 0 / governor·launcher 미호출**.
- (G4) kill 제거 후 정상 경로 복귀.

## 2. ★ 방식 A / 방식 B 승인 단계 분리 (v2 핵심)

**방식 A — pytest tmp_path 격리 dry-run (= Phase 0)**
- 성격: **코드 경로 검증**. driver 함수를 격리 tmp root로 호출, kill 마커도 tmp root에만.
- 보장: canonical write **0** · real fire **0** · governor/launcher 미호출.
- 근거 회귀: `tests/regression/test_limited_activation_bounds_2775.py:166`
  (*"tmp_path 에 p0b_kill 터치 → NOOP_KILL_SWITCH, p0b_driver_enabled 미생성"*) → G1+G2.
- 실행: `PYTHONPATH=. python3 -m pytest tests/regression/test_limited_activation_bounds_2775.py -q`
- 승인: **v2 검토 후 별도 승인 후보**(가장 안전, 1차).

**방식 B — tmp root 기반 driver 직접 호출**
- 성격: **driver entry에 더 가까운 격리 검증**(main entry 경로 근접). 단 여전히 **tmp root**, canonical write 0.
- 보장: canonical write 0 · real fire 0.
- 승인: **방식 A 성공 보고 후 별도 승인**. A 없이 B 금지.

**canonical 직접 조작 — 전면 금지(v2 강화)**
- canonical `/home/jay/workspace/memory/state/p0b_kill` **직접 생성 금지**(pilot 실행 단계의 비상 rollback 외).
- canonical flag/marker에 손대는 것은 dry-run이 아니라 **실제 운영 경로** → 설계/dry-run 단계에서 금지.

## 3. canonical write 미발생 보장
- dry-run은 tmp_path/격리 root에서만. canonical `memory/state`·`events`·`p0b_state` write **0**.
- 전/후 스냅샷 비교(동일 필수):
```
ls -la memory/state/p0b_kill memory/state/p0b_driver_enabled \
       memory/state/p0b_activation_epoch memory/state/p0b_callback_launch_enabled 2>&1
# 전후 동일: driver_enabled=disabled 9bytes 불변, 나머지 부재 불변
```
- canonical 마커가 1바이트라도 변하면 → 즉시 STOP(§6).

## 4. real fire 0 보장
- real_launch_fn 미주입 → surface-only만, 실제 `cokacdir` 호출 경로 미진입(audit:400-403).
- 전/후 ANU cron 0 재확인(placeholder, raw key 0):
  `/usr/local/bin/cokacdir --cron-list --chat "$CHAT_ID" --key "$ANU_OWNER_KEY"` → schedules 0.
- `p0b_processed_ledger.jsonl` 신규 LIVE_PROCESSED 0 · spawn_decisions 신규 ALLOW 0(격리라 canonical 미접촉).

## 5. activation 오인 방지 guard
- dry-run = 격리 pytest 또는 tmp root 인자만. canonical flag/marker write 0.
- `activation_intended=True`/`limited_runtime=True` canonical 전달 금지(동시 True는 코드 `return 1` STOP).
- 산출물은 `memory/reports/`에 **"DRY_RUN" 라벨**로 저장 → activation 증거와 혼동 방지.
- 운영 상태명 불변(`..._READY_FOR_LIMITED_PILOT_DECISION_ACTIVE_FALSE`).
- ★ dry-run 자체도 **pilot 아님**.

## 6. dry-run 실패 시 STOP 상태명
- kill인데 `NOOP_KILL_SWITCH` 아님 / kill 경로 flag write 발생 / real fire·spawn·cron 발생 / canonical 마커 변경 /
  governor·launcher 호출: → **`LIMITED_PILOT_KILLSWITCH_DRYRUN_FAILED_CHAIR_REQUIRED`**.
- limited pilot 착수 금지(안전장치 미작동 시 운전 금지). 회장 보고 + 코드 재점검 별도 안건.

## 7. 실행 절차 (방식 A 기준, 승인 시)
1. canonical 마커 스냅샷(§3) 기록.
2. `pytest tests/regression/test_limited_activation_bounds_2775.py -q` → kill·N·T·epoch fail-closed PASS(특히 :166).
3. canonical 마커 스냅샷 재기록 → 전후 동일(write 0) 확인.
4. ANU cron 0 · processed_ledger 신규행 0 · driver_enabled=disabled 불변 확인.
5. `memory/reports/limited_pilot_killswitch_dryrun_<id>.md`에 DRY_RUN 라벨 저장.
6. PASS → 방식 B(별도 승인) 또는 Phase 1 판단. FAIL → §6 STOP.

---

## 승인 단계 요약
- 방식 A (= Phase 0): v2 검토 후 별도 승인 후보. canonical write 0·real fire 0.
- 방식 B: 방식 A 성공 후 별도 승인.
- canonical kill 직접 생성: pilot 전 **금지**.
