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

상태명: `LIMITED_RUNTIME_PILOT_DESIGN_PACKET_APPROVED_ACTIVE_FALSE`
운영 상태: `AUTOMATION_SAFETY_SUBSTRATE_MERGED_READY_FOR_LIMITED_PILOT_DECISION_ACTIVE_FALSE`
작성: 2026-06-27 (KST) · 작성자: 아누 · 회장 승인: 2026-06-27 (설계서 작성까지만)
근거 코드: PR #255 merge `189f1f0d` 이후 main 기준

> ★ 이 문서는 **설계서**다. 본 문서 채택이 pilot 실행 승인이 아니다. 실제 pilot 실행은 4개 산출물 검토
> 후 회장 **별도 승인** 필요. 현재 ACTIVE=false·flags OFF·systemd disabled·real fire 0·canary 0 유지.

---

## 1. Pilot 목적
limited runtime bound gate(kill/N/T 3경계 + epoch fail-closed)가 **실제 1회 제한 운전에서 의도대로 작동하는지**
관측 가능한 증거와 함께 확인한다. 구체적으로:
- driver가 activation 상태에서 **N=1 도달 즉시 auto-disabled** 되는지(상시 가동으로 흘러가지 않는지),
- T 만료·kill switch가 **fail-closed**로 수렴하는지,
- governor가 폭주(중복/연쇄 spawn)를 막는지,
- 전 과정이 디스크 증거로 **사후 검증 가능**한지.
→ 목적은 "자동화를 켜는 것"이 아니라 **"안전장치가 실제로 당겨지는지 1회 확인"**이다.

## 2. Pilot 대상 task 범위 (엄격 한정)
- **신규 합성 fixture 1건만** 대상으로 한다. 실제 사업/코드 작업 task를 pilot 대상으로 쓰지 않는다.
- 대상 = canonical inbox에 놓인 **단일 terminal-state result.json (MERGE_READY 또는 동등 terminal)** 1건.
- owner-proof가 **로컬 canonical HEAD freshness**를 통과하는 fixture여야 한다
  (`_default_head_probe` = `git -C /home/jay/workspace rev-parse HEAD`, head_sha 일치 필수).
- **2개 이상 result.json 동시 투입 금지** (single-flight·N 경계 관측을 흐리지 않기 위해).

## 3. N 제한 (실발사 누계 상한)
- 코드 상수: `LIMITED_MAX_PICKUPS_N = 3` (`dispatch/anu_pickup_driver.py:87`).
- **pilot 한정으로 N=1을 목표**로 한다(상수 변경이 아니라, fixture를 1건만 투입해 1회 발사 후 종료 관측).
- 카운트 소스: `memory/events/p0b_processed_ledger.jsonl`의 `outcome == LIVE_PROCESSED` 행
  (`_count_active_window_pickups` `dispatch/anu_pickup_driver.py:544-612`).
- N 도달 시 verdict `NOOP_N_EXCEEDED_AUTO_DISABLED` + `p0b_driver_enabled` → "disabled" 원자적 write.

## 4. T 제한 (활성 시간창)
- 코드 상수: `LIMITED_WINDOW_MINUTES_T = 120` (`dispatch/anu_pickup_driver.py:88`).
- **pilot 한정으로 T ≤ 10분**을 목표로 한다. 방법: activation epoch 마커
  (`memory/state/p0b_activation_epoch`)를 pilot 시작 시각으로 설정하고, **10분 내 종료 또는 T 만료 관측 중 먼저
  도달하는 것으로 닫는다**. (상수 120분 자체는 코드 변경 없이 두되, pilot 운영창을 10분으로 외부 제한.)
- T 만료 시 verdict `NOOP_T_EXPIRED_AUTO_DISABLED` + auto-disabled.
- ★ N(=1)이 T(=10분)보다 먼저 도달하는 것이 정상 시나리오. T는 안전 상한.

## 5. backlog 0 원칙
- pilot 시작 전 canonical inbox에 **미처리 result.json이 fixture 1건 외 0건**임을 확인한다.
- `memory/events/p0b_processed_ledger.jsonl` 부재 또는 pilot fixture와 무관한 LIVE_PROCESSED 행 0 확인.
- 기존 backlog(미소비 result.json, stale envelope)가 있으면 **pilot 시작 금지** → 별도 정리 안건으로 분리.

## 6. stale backlog consumption 금지
- pilot driver는 **pilot fixture 1건 외 어떤 기존/과거 result.json도 소비하지 않는다**.
- 과거 inbox 잔여물(이전 task의 result.json, .failure-envelope 등)을 pilot이 건드리면 즉시 STOP.
- epoch-scope 카운팅(`processed_at >= activation_epoch`만 count)이 이를 코드로 보장하지만, pilot 운영에서도
  **inbox 사전 청소(또는 격리)**를 선행한다.

## 7. real fire 허용 범위
- **정확히 1회 real fire만 허용**한다(N=1 fixture → callback 1회).
- real fire 경로 = `launch_callback_for_closeout`에 `real_launch_fn` 주입 + gate(activation_intent + canary_only)
  충족 시에만 (`dispatch/anu_callback_launch_audit.py:409-425`). verdict `REAL_FIRED`.
- 2회 이상 real fire 시도 = 폭주 신호 → governor BLOCK(single-flight/rate/dedup)이 차단해야 하며, 차단이 안 되면
  pilot 실패로 즉시 STOP·rollback.
- ★ real fire 0으로 끝나는 시나리오(surface-only `LAUNCH_ENFORCED`)도 **유효한 관측**이다 — gate가 막은 것이지
  실패가 아니다. real_launch_fn 미주입이면 real fire 0이 정상.

## 8. recurring 금지
- pilot은 **one-shot**이다. recurring cron 등록 절대 금지.
- systemd timer/path의 **enable(부팅 지속) 금지**. (일시 start ↔ enable 구분은 산출물 2 참조.)
- driver를 loop로 상시 폴링 가동하지 않는다. 1회 수동 트리거 → 종료.

## 9. canary 여부
- 본 pilot은 **canary가 아니다**(별도 canary 트랙과 혼동 금지). `activation_intended=True`(canary 경로)는
  paths 필요(`CANARY_PATHS_REQUIRED` fail-closed)하므로, pilot은 **`limited_runtime=True` 경로**로만 운전한다.
- `activation_intended`와 `limited_runtime` **동시 True 금지**(코드상 `return 1` fail-closed STOP,
  `dispatch/anu_pickup_driver.py` +10 충돌 가드). pilot은 limited_runtime 단독.

## 10. 성공 / 실패 / 중단 기준
**성공(`LIMITED_PILOT_1SHOT_SUCCESS_OBSERVED_ACTIVE_FALSE_RESTORED`)** — 다음 전부:
- N=1 도달 후 `NOOP_N_EXCEEDED_AUTO_DISABLED` (또는 의도된 surface-only 종료) 관측,
- `p0b_driver_enabled` → "disabled" 자동 복귀 디스크 확인,
- governor 폭주 0(duplicate/recursive spawn 0, spawn_decisions에 의도 외 ALLOW 0),
- self-key 0 (`SELF_KEY_REFUSED`/quarantine 0건 또는 의도된 차단만),
- real fire ≤ 1 (의도된 1회 또는 gate에 막힌 0회),
- pilot 종료 후 모든 flag OFF·systemd inactive·kill 마커 정리 확인.

**실패(`LIMITED_PILOT_FAILED_ROLLBACK_REQUIRED`)** — 하나라도:
- N 도달에도 driver가 disabled 안 됨(상시 가동 지속),
- real fire 2회 이상 또는 의도 외 spawn,
- governor가 폭주를 못 막음, self-key/owner-proof 위조 통과,
- auto-disabled 실패 → kill switch로도 안 멈춤.

**중단(`LIMITED_PILOT_ABORTED_BY_GUARD`)** — pilot 중 예상외 상태(backlog 소비, epoch 손상, canonical write
이상, 관측 증거 누락) 발견 시 즉시 STOP → 산출물 2의 rollback 순서 실행.

## 11. Pilot 완료 후 무조건 OFF 복귀 원칙
- 성공/실패/중단 무관 **종료 시 반드시**: `p0b_driver_enabled`="disabled" 확인(또는 강제), `p0b_callback_launch_enabled`
  제거/OFF, `p0b_activation_epoch` 제거, systemd 일시 start면 stop, kill 마커 사용했으면 정리.
- 복귀 확인 명령·순서·실패 시 STOP 상태명은 **산출물 2 (ON/OFF & Rollback Spec)**에 정의.
- closeout 증거(jsonl·flag·report)는 **산출물 3 (Observability Audit)**의 수집 목록대로 아카이브 후 보존.

---

## Pilot을 실제 승인하려면 필요한 회장 결정 (이 문서 기준)
1. N=1 / T≤10분 / fixture 1건 범위 **확정 여부**.
2. real fire를 **1회 실제 발사**까지 갈지, 아니면 **surface-only(real fire 0)로만** 관측할지.
3. systemd를 쓸지(일시 start) / driver 수동 1회 트리거만 할지.
4. pilot 성공/실패 상태명 채택.
→ 위 4개는 산출물 2~4 검토와 함께 별도 승인 안건.
