# Limited Runtime Pilot — Pilot Scope Spec **v2** (산출물 1/4)

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

> ★ v2는 **설계서**다. 채택이 pilot/dry-run 실행 승인이 아니다. 실제 실행은 회장 **별도 승인** 필요.
> 현재 ACTIVE=false·flags OFF·systemd disabled·real fire 0·canary 0 유지. **v1 대비 핵심 변경**:
> ① N=1↔코드 N=3 모순 제거 ② Phase 0/1/2 분리 ③ surface-only 성공증거 verdict 재정의.

---

## 0. v1 → v2 변경 요약
- **N=1 모순 제거**: fixture 1건으로는 `NOOP_N_EXCEEDED_AUTO_DISABLED`가 **발생하지 않음**(코드 N=3). 1차 pilot을
  **surface-only**로 재정의하고, N 경계 검증은 canonical이 아니라 **pytest/격리 회귀**에 위임.
- **단계 분리**: Phase 0(kill dry-run) / Phase 1(surface-only pilot) / Phase 2(real fire 1-shot, 별도 승인).
- **성공증거 재정의**: surface-only는 LIVE_PROCESSED ledger가 아니라 **driver verdict + callback_launch verdict +
  flag OFF 복귀** 중심.

## 1. 코드 사실 (모순 제거 근거)
- `LIMITED_MAX_PICKUPS_N = 3` (`dispatch/anu_pickup_driver.py:87`).
- `_count_active_window_pickups`는 `count >= 3`일 때만 N 초과 판정(:707 `NOOP_N_EXCEEDED_AUTO_DISABLED`).
- 회귀 `test_limited_activation_bounds_2775.py:232` = *"LIVE_PROCESSED 2줄(<3) → None 반환, flag 미생성"*.
- ∴ **fixture 1건(count=1) < 3 → auto-disable 안 됨.** "N=1 도달 후 auto-disabled 관측"은 코드상 불성립 →
  v2에서 폐기.

## 2. Pilot 목적 (v2)
limited bound gate(kill/N/T + epoch fail-closed)와 owner-proof·governor·callback gate가 **제한 운전에서 관측
가능하게 작동하고, 끝나면 안전하게 OFF로 복귀하는지**를 1회 확인한다. **N 경계를 canonical에서 터뜨리는 것이
목적이 아니다**(그건 pytest/회귀가 검증). 목적은 "안전장치가 깔려 있고, 제한 운전이 관측되고, OFF 복귀가 된다".

## 3. Phase 구조 (★v2 핵심)
**Phase 0 — kill switch pytest dry-run** (pilot 아님)
- canonical write 0 · real fire 0. 산출물 4 방식 A. kill fail-closed를 격리로 확인. 별도 승인.

**Phase 1 — surface-only limited pilot** (1차 pilot 후보)
- real fire **0**. driver path · owner-proof gate · governor 기록 · callback gate · observability · OFF 복귀 확인.
- **N auto-disable을 성공 필수조건으로 두지 않음.** fixture 1건은 N 미만이라 정상 처리 또는 의도된 PENDING.
- 별도 승인 + Phase 0 성공 후.

**Phase 2 — real fire 1-shot pilot** (별도 승인)
- callback `REAL_FIRED` **1회까지** 허용. 2회 이상 = 실패(governor가 막아야 함). Phase 1 성공 후 별도 승인.

**N-bound trip test** (필요 시 별도 Phase, Phase 1 아님)
- N 경계를 canonical에서 실제 관측하려면 N=3 기준 3건/사전 ledger 설계 필요 → 위험도 ↑, fixture 1건 원칙과
  충돌 → **Phase 1에 넣지 않고 독립 안건으로 분리**. 1차로는 pytest 회귀(test:223 "N 초과 시 flag 생성")로 충분.

## 4. 대상 task 범위 (Phase 1 기준)
- **신규 합성 fixture 1건만**. 실제 사업/코드 task 금지.
- 단일 terminal-state result.json 1건. owner-proof **로컬 canonical HEAD freshness** 통과 fixture
  (`git -C /home/jay/workspace rev-parse HEAD` 일치).
- 2건 이상 동시 투입 금지.

## 5. N / T 제한 (v2)
- N: 코드 N=3 **불변**(상수 변경 금지). Phase 1은 fixture 1건이라 N 미발동이 정상. N 검증은 pytest 위임.
- T: 코드 `LIMITED_WINDOW_MINUTES_T=120` 불변. Phase 1 운영창은 외부로 **≤10분** 제한(짧게 열고 닫음).
  T 만료(`NOOP_T_EXPIRED_AUTO_DISABLED`)는 안전 상한이지 Phase 1 성공 필수조건 아님.

## 6. backlog 0 / stale consumption 금지
- Phase 1 시작 전 inbox에 fixture 1건 외 0건. `p0b_processed_ledger.jsonl` 신규/무관 LIVE_PROCESSED 0 확인.
- 과거 result.json·.failure-envelope 소비 0(epoch-scope가 코드로 보장 + inbox 사전 청소/격리 선행).

## 7. real fire 허용 범위 (v2 — Phase로 명확화)
- Phase 0·1: **real fire 0**(real_launch_fn 미주입 또는 callback flag OFF). 흔들림 없음.
- Phase 2: **정확히 1회**만, 별도 승인 시. 2회+ = 실패.
- ★ Phase 1에서 real fire 0은 "미달"이 아니라 **설계상 정상 종료**다.

## 8. recurring / canary 금지
- one-shot only. recurring cron 0. systemd enable 0. canary 아님(`activation_intended`/`limited_runtime` 동시
  True 금지 — 코드 `return 1` STOP). Phase 1·2는 `limited_runtime` 단독.

## 9. surface-only 성공 증거 (★v2 재정의 — 코드 verdict 기준)
real fire 0이면 성공을 callback ledger로 못 본다. **코드 흐름(검증 완료)**:
- pickup이 owner-proof gate 통과 + processed move 성공 → driver verdict `LIVE_PROCESSED`(:2182/2195), 그 안
  `callback_launch_verdict` = `LAUNCH_ENFORCED`(surface-only, real fire 0) 또는 `NOOP_DISABLED`(callback flag OFF).
- owner-proof 미통과 → `LIVE_PENDING_OWNER_PROOF`(:113) = fire 0·inbox 잔존·ledger 미append (이것도 의도된 결과).
- ∴ surface-only 성공 신호 = **다음 전부**:
  1. driver_runs verdict = `LIVE_PROCESSED`(완료) 또는 의도된 `LIVE_PENDING_OWNER_PROOF`(gate 차단 시연),
  2. callback_launch_audit verdict ∈ {`LAUNCH_ENFORCED`(surface), `NOOP_DISABLED`} — **`REAL_FIRED` 0건**,
  3. real fire 0 (cron 0, REAL_FIRED 0),
  4. duplicate 0 (spawn_decisions에 의도 외 DEDUP_HIT/중복 ALLOW 0),
  5. self-key 0 (`SELF_KEY_REFUSED`/quarantine 의도 외 0),
  6. governor 의도 외 ALLOW 0,
  7. `p0b_driver_enabled` = "disabled" 복귀,
  8. callback/epoch/kill 마커 OFF(부재),
  9. systemd inactive·disabled, cron 0.

## 10. 성공 / 실패 / 중단 기준 (Phase 1)
- **성공** `LIMITED_PILOT_PHASE1_SURFACE_ONLY_SUCCESS_OBSERVED_ACTIVE_FALSE_RESTORED`: §9의 9개 신호 전부 충족.
- **실패** `LIMITED_PILOT_PHASE1_FAILED_ROLLBACK_REQUIRED`: real fire 발생 / 의도 외 spawn / governor 폭주 미차단 /
  self-key·owner-proof 위조 통과 / driver가 OFF 복귀 안 함.
- **중단** `LIMITED_PILOT_ABORTED_BY_GUARD`: backlog 소비·epoch 손상·canonical 이상·증거 누락 발견 시 즉시 STOP
  → 산출물 2 rollback 순서.

## 11. closeout 필수 (v2 — 격상, 산출물 3 연동)
- Phase 1 종료 시 산출물 3 §closeout archive **필수 조건**(권장 아님). archive 미완 = closeout 미완 = pilot 미종결.
- 종료 후 driver **1회 재평가**로 auto-disabled/flag OFF를 디스크 확인(산출물 2 연동).

---

## 회장 결정 필요 (v2 기준)
1. Phase 1 surface-only 채택 여부 / Phase 2(real fire 1회) 별도 안건 확인.
2. Phase 0(kill dry-run A) 먼저 1회 승인할지.
3. Phase 1 성공/실패 상태명 채택.
4. systemd 미사용(driver 수동 트리거) 확정.
