# Limited Runtime Pilot — ON/OFF & Rollback Spec (산출물 2/4)

상태명: `LIMITED_RUNTIME_PILOT_DESIGN_PACKET_APPROVED_ACTIVE_FALSE`
작성: 2026-06-27 (KST) · 작성자: 아누 · 근거: main `189f1f0d`

> ★ 설계서. 실제 ON 조작은 회장 별도 승인 후. 현재 전 flag OFF·systemd disabled.
> 모든 flag 경로/마커는 코드 상수에서 확인됨 (출처 라인 명시).

---

## A. flag / 마커 인벤토리 (코드 출처)
| 항목 | 경로 | 의미 | 코드 출처 |
|---|---|---|---|
| driver 게이트 | `memory/state/p0b_driver_enabled` | "enabled"/"disabled" 첫 줄 | driver:53(governor)·`read_activation`/`is_activated` driver:400-412 |
| callback 발사 게이트 | `memory/state/p0b_callback_launch_enabled` | callback real fire 최종 게이트 | audit:48 |
| 활성 epoch 마커 | `memory/state/p0b_activation_epoch` | N/T 윈도우 기준 시각(unix) | driver:83 |
| kill switch | `memory/state/p0b_kill` | 존재 시 즉시 전면 NOOP | driver:86 |

(표는 인벤토리 가독용. 본문 판정은 아래 텍스트 기준.)

## B. 켜는 flag (pilot 시 ON 대상) — 최소 집합
pilot은 **가능한 한 적게** 켠다. 시나리오별:

**시나리오 A — surface-only (real fire 0, 가장 안전 / 1차 권장)**
- `p0b_driver_enabled` = "enabled" (driver 게이트만)
- `p0b_activation_epoch` = pilot 시작 unix timestamp
- `p0b_callback_launch_enabled` = **켜지 않음** → callback은 `LAUNCH_NOOP_DISABLED` 또는 surface-only
- real_launch_fn **미주입** → real fire 0
- → N/T/kill 경계·governor·auto-disabled 회로를 **real fire 없이** 전부 관측 가능.

**시나리오 B — real fire 1회 (산출물 1 §7, 회장이 §결정2에서 명시 승인 시에만)**
- 위 A + `p0b_callback_launch_enabled` = "enabled"
- real_launch_fn 주입 + activation_intent/canary_only gate 충족
- → `REAL_FIRED` 1회까지 관측. **2회차는 governor가 막아야 함**.

## C. 절대 켜면 안 되는 것 (금지 집합)
- `activation_intended=True`를 **`limited_runtime=True`와 동시** 전달 — 코드상 `return 1` fail-closed STOP
  (충돌 가드, +10). pilot은 `limited_runtime` 단독.
- recurring cron 등록 (one-shot only).
- systemd `enable` (부팅 지속) — 아래 D 참조.
- N=3 상수 상향, T=120 상수 상향 등 **코드/상수 변경**.
- 2건 이상 result.json 동시 투입(single-flight·N 관측 오염).
- 기존 backlog/ stale result.json 소비 허용.

## D. systemd start ↔ enable 구분 (★중요)
- `systemctl --user start <unit>` = **일시 1회 가동**. 재부팅·재로그인 시 자동 시작 안 됨.
- `systemctl --user enable <unit>` = **부팅 지속 등록**. → **pilot 절대 금지**.
- pilot 권장: **systemd 자체를 쓰지 않고 driver를 수동 1회 트리거**(가장 통제적). 필요 시에만 `start`,
  **절대 `enable` 금지**. 현재 `anu-pickup.path` = inactive + disabled (확인됨) — 이 상태를 enable로 바꾸지 않는다.
- pilot에서 일시 start를 썼다면 종료 시 반드시 `stop` + `is-enabled == disabled` 재확인.

## E. pilot 종료 후 OFF 복귀 순서 (성공/실패/중단 공통, 순서 고정)
1. (real fire 시나리오면) `p0b_callback_launch_enabled` 제거 → callback 게이트 OFF.
2. `p0b_driver_enabled` = "disabled" 확인. auto-disabled 됐으면 그대로, 아니면 **강제 write**.
3. `p0b_activation_epoch` 마커 제거.
4. (kill 마커 사용했으면) `p0b_kill` 제거.
5. (systemd start 했으면) `systemctl --user stop <unit>` + `is-active==inactive`·`is-enabled==disabled` 확인.
6. ANU cron 0 확인 (`cokacdir --cron-list` → 0). recurring 잔존 0.
7. closeout 증거 수집(산출물 3) 후 보고.

## F. 수동 rollback 경로 (운영자가 즉시 끄는 길)
- 가장 빠른 정지: **kill switch 생성** → `touch memory/state/p0b_kill`. 다음 driver 평가 시 즉시
  `NOOP_KILL_SWITCH` 전면 NOOP (driver:644). flag write도 안 함(kill 우선).
- 그다음 E의 복귀 순서 실행.
- 수동 rollback은 "driver가 아직 안 멈췄을 때" 운영자가 강제로 거는 경로.

## G. 자동 kill switch / auto-disabled 경로 (코드가 스스로 끄는 길)
- N 도달 → `NOOP_N_EXCEEDED_AUTO_DISABLED` → `p0b_driver_enabled`="disabled" 자동 (driver:707-710).
- T 만료 → `NOOP_T_EXPIRED_AUTO_DISABLED` → 자동 disabled (driver:724-731).
- epoch 부재/손상(active 상태인데) → `NOOP_ACTIVE_EPOCH_MISSING/INVALID_AUTO_DISABLED` fail-closed.
- kill 마커 존재 → `NOOP_KILL_SWITCH` 전면 NOOP.
- ★ auto-disabled는 "driver가 1회 더 평가될 때" 작동한다 → pilot은 driver를 **종료 후에도 1회 재평가**해
  disabled 전환을 디스크로 확인하는 단계를 둔다.

## H. rollback 확인 명령 (디스크 사실 기준)
```
# flag OFF 확인
cat memory/state/p0b_driver_enabled            # → "disabled"
test ! -e memory/state/p0b_callback_launch_enabled && echo "callback OFF"
test ! -e memory/state/p0b_activation_epoch && echo "epoch cleared"
test ! -e memory/state/p0b_kill && echo "kill cleared"
# systemd
systemctl --user is-active anu-pickup.path     # → inactive
systemctl --user is-enabled anu-pickup.path    # → disabled
# cron 0
/usr/local/bin/cokacdir --cron-list --chat "$CHAT_ID" --key "$ANU_OWNER_KEY"   # schedules 0  (raw key redacted — no literal key retained)
# 마지막 driver verdict (auto-disabled 확인)
tail -1 memory/p0b_state/driver_runs.jsonl     # verdict=NOOP_*_AUTO_DISABLED, activation=disabled
```

## I. rollback 실패 시 STOP 상태명
- flag가 disabled로 안 돌아감 / systemd가 안 멈춤 / cron 잔존 / driver가 계속 ALLOW:
  → **`LIMITED_PILOT_ROLLBACK_FAILED_CHAIR_REQUIRED`**.
- 이 경우: 즉시 kill switch(`p0b_kill` touch)로 전면 차단 시도 → 그래도 안 멈추면 회장 즉시 보고(에스컬레이션).
- rollback 실패는 **pilot 안전모델의 근본 결함** 신호 → activation 논의 전면 보류.

---

## 이 문서 기준 회장 결정 필요 항목
1. 시나리오 A(surface-only, real fire 0)로 1차 pilot 할지 / B(real fire 1회)까지 갈지.
2. systemd 일시 start를 쓸지 / driver 수동 1회 트리거만 할지.
3. rollback 실패 STOP 상태명 채택(`LIMITED_PILOT_ROLLBACK_FAILED_CHAIR_REQUIRED`).
