# 방어 인벤토리

> 디스패치 게이트, 모델 신원 프로브, placement·empty-seat·duplicate, redaction, revival, progressive onboarding 가드 표.

- Repository: local/mogui-ADE-orchestrator

- Human docs: https://grok-wiki.com/public/docs/local-mogui-ade-orchestrator-97afe791d5ac
- Complete Markdown: https://grok-wiki.com/public/docs/local-mogui-ade-orchestrator-97afe791d5ac/llms-full.txt

## Source Files

- `docs/public/defense-inventory.md`
- `src/master_runtime/core/dispatch_gate.py`
- `src/master_runtime/core/succession.py`
- `scripts/model-identity-probe`
- `scripts/model-drift-audit`
- `scripts/redaction-scan.sh`
- `master-ops/docs/MASTER-OPERATIONS.md`

---

---
title: "방어 인벤토리"
description: "디스패치 게이트, 모델 신원 프로브, placement·empty-seat·duplicate, redaction, revival, progressive onboarding 가드 표."
---

런타임이 이미 비용을 치른 실패 모드를 막는 가드는 `scripts/dispatch-gate`, `scripts/master-succeed`, `scripts/model-identity-probe`, `scripts/model-drift-audit`, `scripts/redaction-scan.sh`, `scripts/redaction-inventory`, 그리고 `master-ops/ONBOARDING.md` 라우터에 고정되어 있다. 표의 각 행은 트리에 존재하는 경로와 측정 가능한 판정(exit 코드·`ReasonCode`·ledger 필드)을 가지며, 열 수 없는 경로의 주장은 인벤토리에 넣지 않는다.

<Info>
이 페이지는 개념 카탈로그가 아니라 **게이트 표**다. 플래그·스키마 전량은 [dispatch-gate 레퍼런스](/dispatch-gate-reference), [master-succeed 레퍼런스](/succession-cli-reference), [Redaction gates](/redaction-gates)를 본다.
</Info>

## 가드 표

| 가드 | 막는 것 | 위치 | 증명 측정 | 깨질 때 |
| --- | --- | --- | --- | --- |
| 티어 × fan-out 디스패치 게이트 | 캡된 티어의 무음 비용 폭증; 오너 승인 없는 top-tier | `scripts/dispatch-gate`, `src/master_runtime/core/dispatch_gate.py`, `master-ops/model-tier-policy.json`; top 승인은 `master-ops/scripts/dispatch --top-approved` | `check` → `GateDecision` + 안정 reason (`TIER_FANOUT_CAP`). 정책 v2+는 rolling window 누적 agent 캡. 출하 정책에서 top은 uncapped이며 launcher가 `--top-approved "<reason>"` 없으면 거부. dry-run은 `--no-record` | 정책 불가독·malformed·경로 없음 → `TIER_POLICY_UNAVAILABLE` deny; `master-ops/scripts/dispatch` 우회 시 top 질문 없음 |
| Ledger된 게이트 판정 | 정책 근거 없는 “게이트가 허용했다” | 동일 게이트 `--ledger` JSONL; `dispatch-gate report` | 각 판정에 policy path, `tier_policy_sha256`, 소비 tier. `report`가 span에 복수 policy 행을 보이면 단일 정책으로 판단된 것이 아님 | ledger 경로 쓰기 불가 또는 저장소 밖 경로 |
| 세션 transcript 모델 신원 | 선언 모델·TUI status line 신뢰 | `scripts/model-identity-probe`, `scripts/model-drift-audit`; charter §5·§9 | probe는 assistant 모델 필드를 JSONL에서 읽음 (`--transcript`). exit 2 = drift/undecidable; expected 없이 exit 0은 무주장 INFO. drift-audit은 전 턴 transition 보고, exit 2 = undecidable. status line은 증거가 아님 | transcript 형식·위치·권한 변경 → `MODEL-PROBE DRIFT:` + exit 2 |
| `register` 시점 모델 검증 | `check` 선언만 맞고 실실행이 다른 경우 | `scripts/dispatch-gate register --model-probe-cmd` | ledger `model_declared`, `model_measured`, `model_verified`. `MODEL_TIER_ESCALATION` deny; `MODEL_UNVERIFIED` / `MODEL_PROBE_FAILED`는 warn 후 register (모델 보고 불가 runtime이 게이트를 끄지 않도록) | probe 실패·빈 출력·nonzero → `MODEL_PROBE_FAILED` 기록(무음 아님) |
| 마스터 spawn placement | 잘못된 worktree에 마스터 착석 | `scripts/master-succeed spawn --expected-placement` | 요청 vs 실제, 실제 vs 독립 expected 비교; 불일치 exit **26** `SPAWN_PLACEMENT_MISMATCH`. three-set: host selector, workspace root cwd, expected namespace session artifact | expected 인자 오류·workspace 밖 프로세스·artifact 미측정 → exit 26, 진행 없음 |
| Empty-seat (founding) | 재진입·중단 설치로 같은 seat에 두 번째 마스터 | `master-ops/onboarding/09-spawn.md` | `orca terminal list --worktree <selector> --json`이 seat 단말 **0개**. leftover seat-check/이전 마스터는 hard stop | list 실패·malformed JSON·selector 미해석 → 점유 검증 불가, spawn 거부 |
| 런타임 duplicate master | succession/resume 후 이중 마스터 | `scripts/master-succeed check-duplicates` (`detect_duplicate_instances`) | marker 스캔, `--self-handle` 제외; 비어 있지 않으면 finding(소프트 경고 아님) | handle/marker 누락 또는 Orca introspection 불가 → `SuccessionError` exit 2 |
| 범위 명시한 redaction scan | generic만 스캔하고 초록불 | `scripts/redaction-scan.sh`; org 규칙 `REDACTION_EXTRA_PATTERNS`; 강제 `REDACTION_REQUIRE_EXTRA=1` | coverage 출력(files/rules). exit 0 clean, 1 findings, 2 cannot decide. `REDACTION_REQUIRE_EXTRA=1`이면 빈/누락 extra → exit 2(generic-only 스캔 금지) | require 모드에서 extra 없음/비어 있음 → exit 2 |
| Redaction inventory (역검사) | 트리에 있는데 규칙이 안 잡는 토큰 | `scripts/redaction-inventory` | exit 0 후보 없음, 1 후보 발견(정상 finding, secret 판정 아님), 2 cannot decide | 규칙 파싱 실패·git 범위 불가 → exit 2 |
| Revival (frozen session) | 다른 기기에서 retired 마스터 재개 | `master-ops/docs/runbooks/succession-boot-card.md` | retirement 완료 = process·pane·tty 세 소멸 측정. boot 시 lineage session id로 프로세스 argv 스캔 | lineage id 미기록·다른 머신·process introspection 불가 → 탐지 불가(degrade, 가짜 pass 아님) |
| Progressive onboarding load | 전체 가이드 일괄 로드로 overload/improvisation | `master-ops/ONBOARDING.md` + `master-ops/onboarding/*.md` | 라우터: 턴당 step 파일 1개, Verify 통과 전 next 금지. 모든 host/model 강제 | 라우터 우회·경로 추측·Verify 없이 다음 파일 로드(코드가 읽기 순서를 강제하지는 않음) |

## 디스패치 게이트

### 표면

```console
$ scripts/dispatch-gate --ledger <path> check \
    --runtime <name> --model <id> --contract <path> \
    --agents N --est-chars N --completion-channel orchestration
$ scripts/dispatch-gate register \
    --job-id <id> --probe-cmd '<cmd>' \
    [--declared-model <id>] [--model-probe-cmd '<cmd>']
$ scripts/dispatch-gate report
```

`master-ops/scripts/dispatch`는 check → task-create → inject → register 파이프라인을 묶고, top-tier는 게이트 ledger 전에 `--top-approved`를 강제한다.

### 정책 (`master-ops/model-tier-policy.json`)

| 키 | 출하 값 / 의미 |
| --- | --- |
| `version` | `2` — tier + fan-out |
| `tiers.top` / `tiers.efficient` | 모델 id 집합(casefold 멤버십) |
| `fanout_caps` | 티어별 윈도우 누적 agent 상한; **키 없음 = uncapped** |
| `window_seconds` | 출하 `86400` (코드 기본 `DEFAULT_TIER_WINDOW_SECONDS`와 동일) |
| 출하 `fanout_caps` | `"unknown": 8` only — top cap 제거(2026-08-05 owner directive) |

Top-tier 사용은 숫자 캡이 아니라 `scripts/dispatch --top-approved "<reason>"` 오너 질문이다. reason은 run log에 인쇄된다.

### 문자 예산 기본값

| 한도 | 기본 |
| --- | --- |
| single dispatch | `500_000` chars |
| batch dispatch | `1_000_000` chars |
| duplicate window (ledger 관련) | `30 * 60` seconds |

### 주요 `ReasonCode`

| 코드 | 역할 |
| --- | --- |
| `OK` | 허용 |
| `TIER_FANOUT_CAP` | 윈도우 누적이 캡 초과 |
| `TIER_POLICY_UNAVAILABLE` | 정책 로드 실패 → deny |
| `TIER_UNKNOWN_MODEL` / `TIER_POLICY` | 미등록 모델 또는 정책 위반 |
| `BUDGET_EXCEEDED` | est chars 한도 |
| `NO_COMPLETION_CHANNEL` / `NO_MODEL` | 요청 검증 실패 |
| `CONTRACT_UNREADABLE` / `PATH_OUTSIDE_KNOWN_ROOTS` | 계약 경로 |
| `MODEL_TIER_ESCALATION` | 측정 모델이 선언보다 더 엄격한 티어로 상향 |
| `MODEL_MISMATCH` | 불일치(상향 아님) — 경고 경로 |
| `MODEL_UNVERIFIED` / `MODEL_PROBE_FAILED` | 측정 불가/probe 실패 — 경고 후 register 가능 |

<Warning>
`MODEL_UNVERIFIED`와 `MODEL_PROBE_FAILED`는 **deny가 아니다**. 모델 보고 수단이 없는 runtime이 게이트를 꺼 버리지 않도록 warn+register다. 상향 측정만 `MODEL_TIER_ESCALATION`으로 막는다.
</Warning>

### Ledger 필드 (모델 검증)

`register` 경로는 최소한 다음을 남긴다.

- `model_declared`
- `model_measured`
- `model_verified`
- `tier_policy_sha256` (정책 path digest)

`--no-record` check는 ledger 행과 ticket을 남기지 않아 검사 자체가 예산/캡을 소비하지 않는다. override로 통과한 ALLOW도 윈도우 카운트에 포함된다(refund 없음).

## 모델 신원 프로브

선언·TUI status line은 측정이 아니다. 측정은 session transcript JSONL의 assistant 모델 필드다.

### `scripts/model-identity-probe`

| 항목 | 내용 |
| --- | --- |
| 입력 | `--transcript` 또는 runtime config `transcript_glob` / env |
| expected | `--expect` 또는 `MODEL_IDENTITY_EXPECT` |
| exit 0 | 전부 expected 일치, 또는 expected 없음(INFO, 무주장) |
| exit 2 | drift, unreadable, unconfigured, invalid limit |

출력 접두사: `MODEL-PROBE OK`, `MODEL-PROBE INFO`, `MODEL-PROBE DRIFT:`.

### `scripts/model-drift-audit`

| 항목 | 내용 |
| --- | --- |
| 역할 | transcript 전 assistant 턴 transition 보고 |
| exit 0 | transition 없음(및 expected 일치 시) |
| exit 1 | transition 또는 expected 불일치 |
| exit 2 | undecidable (transcript 없음/0 assistant turns) |

Succession audit는 최근 N턴 probe만으로 과거 drift를 닫지 않는다. boot card는 전 구간 walk에 drift-audit을 요구한다.

## Placement · empty-seat · duplicate

### Placement (`spawn`)

`spawn_successor(..., expected_placement=...)` 흐름:

1. `orca terminal create --worktree <selector> ... --json`
2. 응답 `worktreeId` vs 요청 selector — 불일치 → `SPAWN_WORKTREE_MISMATCH` (22), 생성 단말 close
3. `expected_placement` 제공 시 `worktreeId` vs expected — 불일치 → **`SPAWN_PLACEMENT_MISMATCH` (26)**
4. handle liveness: create 이전 snapshot에 없던 live handle이어야 함

절차 three-set(런북): host selector, process cwd under workspace root, session artifact in expected namespace.

### Empty-seat (founding only)

`master-ops/onboarding/09-spawn.md`: spawn 전 `orca terminal list --worktree <selector> --json`이 **0 terminals**. seat-check leftover 또는 중단된 이전 마스터가 있으면 보고 후 중단.

Reverify/Upgrade 모드는 라우터에서 spawn 자체를 차단한다(두 번째 마스터는 convenience가 아니라 incident).

### Duplicate (runtime)

```console
$ scripts/master-succeed check-duplicates --session-marker <marker> --self-handle <handle>
```

`detect_duplicate_instances`는 동일 marker 세션에서 `self_handle`을 제외한 나머지를 반환한다. 비어 있지 않으면 finding.

## Redaction

### `scripts/redaction-scan.sh`

| 환경 변수 | 효과 |
| --- | --- |
| `REDACTION_EXTRA_PATTERNS` | org 규칙 파일 경로 |
| `REDACTION_REQUIRE_EXTRA=1` | extra 없음/비어 있음 → exit **2** (generic-only 초록불 금지) |

엔진은 `gitleaks` + `config/gitleaks.toml`. 스캔 끝 줄에 mode, files, org-rules 수를 인쇄한다.

| exit | 의미 |
| --- | --- |
| 0 | clean |
| 1 | findings |
| 2 | cannot decide (gitleaks 없음, require-extra 위반, engine error 등) |

### `scripts/redaction-inventory`

scan의 역: 규칙이 커버하지 않는 후보 토큰. 후보 = secret 판정이 아니다. exit 1은 정상 finding.

## Revival

`retire_predecessor` / boot card 규칙:

- `CLOSED` = pane·process·tty **세 소멸 측정**. close 명령 반환값은 증거가 아님
- `CLOSED_PARTIAL` = pane 없음 + 일부 probe skip — full pass로 읽지 않음
- 동결 세션은 폰/원격에서도 resume 가능. 실측: 모바일 resume으로 retired 마스터 4개 동시 부활
- boot 및 오너 신고 시: `docs/lineage/MASTER-LINEAGE.md`의 session id를 프로세스 argv에서 스캔 → 활동 회수 → terminate → tty hangup → 재확인

## Progressive onboarding

`master-ops/ONBOARDING.md`는 라우터다. 전 설치 동안 로드를 유지하는 파일은 라우터뿐이며 step 파일은 턴당 하나다.

| 규칙 | 내용 |
| --- | --- |
| 로드 | `onboarding/<step>.md` 1개/턴; 일괄 읽기 금지 |
| 진행 | 현재 step **Verify** 통과 전 next 파일 금지 |
| 모드 | Founding `00`→`10`; Reverify/Upgrade는 단일 파일, **spawn 차단** |
| 강제 범위 | 모든 host·모든 model (강한 모델도 monolith 면제 없음) |

코드가 agent 읽기 순서를 기계적으로 강제하지는 않는다. 위반은 절차·컨트롤 플로우 실패이며, control-flow 테스트는 파일 inventory만 핀한다.

## 기판(substrate)과 안정성

| 종류 | 예 | 변경 시 |
| --- | --- | --- |
| 계약 표면 | 이 repo 스크립트·exit 코드, `git`, 문서화된 `orca terminal list` / `orca status` | 이 저장소 변경 필요 |
| vendor-internal | host session 파일 layout/위치/이름 | 가드 degrade |

Degrade 원칙: **가짜 pass 금지**.

- model probe → `MODEL-PROBE DRIFT:` + exit 2
- dispatch register → `MODEL_PROBE_FAILED` ledger 경고
- revival scan 불가 → 탐지 불가 상태로 기록; “깨끗함”으로 치환하지 않음

실측 예(2026-08-03): 신규 grok worker 첫 `register`에서 session 파일 미존재 → `MODEL_PROBE_FAILED`, ledger에 unverified 기록.

```text
[contracted]  scripts/*  git  orca CLI (documented)
      | fail-closed / recorded reasons
      v
[vendor]     session JSONL paths, host tty/process layout
      | unreachable → exit 2 / MODEL_PROBE_FAILED / skip scan
      v
  never "green without scope"
```

## 인벤토리에 넣지 않는 것

선호 설정, optional skills, 위험한 동작을 게이트하지 않는 도구. “실패할 수 없는 게이트”와 “실행되지 않는 측정”은 방어가 아니다.

## 운영 신호 요약

| 증상 | 가드 신호 |
| --- | --- |
| fan-out 거부 | `TIER_FANOUT_CAP` |
| 정책 파일 깨짐 | `TIER_POLICY_UNAVAILABLE` |
| top 승인 없음 | `scripts/dispatch` 거부 (`--top-approved` 요구) |
| 모델 drift | probe exit 2 / `MODEL-PROBE DRIFT:` |
| register 미검증 | ledger `MODEL_PROBE_FAILED` / `MODEL_UNVERIFIED` |
| 티어 상향 측정 | `MODEL_TIER_ESCALATION` deny |
| 잘못된 master seat | spawn exit **26** |
| seat 점유 | founding list non-empty hard stop |
| redaction 범위 불명 | require-extra → exit 2 |
| revival 의심 | lineage session id in process argv |

## Next

<CardGroup>
  <Card title="Supervised dispatch" href="/supervised-dispatch">
    check → dispatch → register, 계약 해시·ledger, model probe
  </Card>
  <Card title="dispatch-gate 레퍼런스" href="/dispatch-gate-reference">
    플래그, ledger 스키마, reason code, 티켓 TTL
  </Card>
  <Card title="Clean succession" href="/succession">
    placement spawn, retire, revival, lineage 필드
  </Card>
  <Card title="master-succeed 레퍼런스" href="/succession-cli-reference">
    spawn/retire/check-duplicates 옵션과 exit 코드
  </Card>
  <Card title="Redaction gates" href="/redaction-gates">
    redaction-scan 범위, REDACTION_REQUIRE_EXTRA, inventory
  </Card>
  <Card title="프로그레시브 온보딩" href="/onboarding">
    ONBOARDING 라우터, 1 step/turn, Verify, founding spawn
  </Card>
  <Card title="Troubleshooting" href="/troubleshooting">
    placement mismatch, MODEL_PROBE_FAILED, seat 중복, revival
  </Card>
</CardGroup>
