# 증거 라벨

> Configured, Intended, Observed, Unknown 라벨과 테스트, 로그, ledger, self-report의 증거 강도를 운영 문서 규칙으로 정리합니다.

- Repository: local/master-ops-with-local-mogui-ADE-orchestrator

- Human docs: https://grok-wiki.com/public/docs/local-master-ops-with-local-mogui-ade-orches-0ac7093355f3
- Complete Markdown: https://grok-wiki.com/public/docs/local-master-ops-with-local-mogui-ade-orches-0ac7093355f3/llms-full.txt

## Source Files

- `local-mogui-ade-orchestrator:docs/public/concepts.md`
- `local-mogui-ade-orchestrator:docs/public/defense-inventory.md`
- `local-master-ops:docs/runbooks/error-and-logging.md`
- `local-master-ops:docs/observability/README.md`
- `local-master-ops:docs/blame/BLAME-2026-08-04-status-blind-reporting.md`

---

---
title: "증거 라벨"
description: "Configured, Intended, Observed, Unknown 라벨과 테스트, 로그, ledger, self-report의 증거 강도를 운영 문서 규칙으로 정리합니다."
---

공개 문서의 구현 상태는 `Configured`, `Intended`, `Observed`, `Unknown` 네 라벨로만 표시한다. 운영 저장소는 이 라벨을 `scripts/measure`, `dispatch-gate` JSONL ledger, `hook-fire-log.jsonl`, `event-log.jsonl`, blame/retro/travelog 기록에 적용하며, 에이전트 self-report만으로는 동작을 `Observed`로 승격하지 않는다.

## 라벨 기준

| 라벨 | 의미 | 허용되는 문장 |
| --- | --- | --- |
| `Configured` | 파일, 스크립트, hook, 설정, 정적 contract가 존재한다. | "`scripts/hooks/<name>.sh`가 있다", "`model-tier-policy.json`이 설정되어 있다" |
| `Intended` | 설계 계약이나 운영 규칙은 문서화되어 있지만 현재 문서가 live runtime 증거를 주장하지 않는다. | "민감 lane은 dedicated session으로 라우팅해야 한다" |
| `Observed` | git 상태, 로컬 실행, 로그, ledger, 프로세스 상태, probe가 self-report 밖에서 동작을 보였다. | "`check`가 `TIER_FANOUT_CAP`으로 deny했고 ledger에 기록됐다" |
| `Unknown` | 현재 증거가 동작을 증명하지 못하거나 public surface 밖에 있다. | "모든 worker 생성 경로가 gate를 통과하는지는 이 저장소만으로 알 수 없다" |

<Warning>
`Configured`는 작동 증거가 아니다. hook 파일이나 descriptor가 있어도 실제 세션에서 fire 되었는지, 모든 경로가 그 hook을 통과했는지는 별도 측정이 필요하다.
</Warning>

## 증거 강도

| 증거 | 기본 강도 | 라벨 판정 규칙 | 한계 |
| --- | --- | --- | --- |
| 로컬 테스트 | 중간 | 테스트 대상 unit에는 `Observed`를 줄 수 있다. | 운영 workspace가 그 unit을 실제 경로에 연결했다는 증거는 아니다. |
| `scripts/measure` 출력 | 높음 | 첫 줄 `exit=<status>`와 출력 본문을 함께 기록한 command 실행은 `Observed` 근거가 된다. | 명령이 질문에 맞는 instrument인지 별도 확인해야 한다. |
| Dispatch ledger | 높음 | `decision`, `reason`, `contract_sha`, `tier_policy_path`, `tier_policy_sha256`, model 검증 필드는 gate 판정의 `Observed` 근거다. | ledger append 실패나 우회 실행은 ledger 밖 행동을 증명하지 못한다. |
| Hook fire log | 중간 | hook이 특정 runtime/session kind에서 실행됐다는 근거다. | decision logic이 맞았는지는 증명하지 않는다. zero entry는 고장 증거가 아니라 측정 대상이다. |
| Event log | 중간 | `outcome`, `evidence`, `reason`, `command_class`, `target_scope`가 decision event를 구조화한다. | fail-open 로그이므로 append 성공 여부가 guard 판정을 바꾸지 않는다. raw command나 절대 경로는 기록하지 않는다. |
| Blame/retro/travelog | 보조 | 관측 공백, 판단, 실행 흔적을 분리해 사후 감사에 쓴다. | interpretive record다. primary artifact와 충돌하면 artifact가 우선한다. |
| Agent self-report | 낮음 | 독립 probe, 로그, ledger, artifact와 맞을 때만 보조 근거로 쓴다. | 단독으로 `Observed`를 만들 수 없다. |

## 명령 출력 규칙

명령 결과를 사실로 보고할 때는 `scripts/measure` 형태가 기본이다.

```bash
scripts/measure git ls-remote --heads origin
```

유효한 측정은 첫 줄에 종료 코드를 둔다.

```text
exit=0
<command output>
```

빈 출력도 상태와 함께 읽는다.

```text
exit=1
(no output)
```

```text
exit=0
(no output)
```

두 출력은 같은 뜻이 아니다. 실패한 명령의 빈 출력은 "대상 없음"이 아니라 "측정 실패"다. 종료 코드를 보지 못했거나 명령이 필요한 질문과 다른 것을 측정했다면 `Unknown`으로 보고한다.

## Ledger 판정 규칙

`dispatch-gate check`는 dispatch 전 contract, runtime, model, fan-out, estimated input size, completion channel, tier policy를 판정한다. 기록되는 decision은 append-only JSONL이다.

주요 필드:

| 필드 | 의미 |
| --- | --- |
| `decision` | `ALLOW` 또는 `DENY` |
| `reason` | `OK`, `NO_MODEL`, `CONTRACT_UNREADABLE`, `TIER_POLICY_UNAVAILABLE`, `TIER_FANOUT_CAP` 같은 안정 reason code |
| `contract_sha` | dispatch contract 내용 hash |
| `completion_channel` | `orchestration` 또는 `sentinel-log` |
| `model` | check 시점의 declared model |
| `tier` | tier policy가 계산한 model tier |
| `tier_policy_path` | 판정에 사용한 policy 경로 |
| `tier_policy_sha256` | 판정에 사용한 policy 내용 digest |
| `warnings` | deny는 아니지만 조용히 통과시키면 안 되는 상태 |

`register`는 worker가 생긴 뒤 job id를 독립 probe로 확인하고 model 증거를 추가한다.

| 필드 | 의미 |
| --- | --- |
| `job_id` | 등록 대상 worker/job 식별자 |
| `model_declared` | dispatch 시 선언한 model |
| `model_measured` | transcript probe 등으로 측정한 model |
| `model_verified` | declared와 measured가 모두 있고 probe 실패가 없을 때 `true` |
| `warnings` | `MODEL_UNVERIFIED`, `MODEL_PROBE_FAILED`, `MODEL_MISMATCH` 등 |

<Note>
`MODEL_UNVERIFIED`와 `MODEL_PROBE_FAILED`는 조용한 성공이 아니다. 일부 runtime에서 model 보고가 불가능하면 register는 계속될 수 있지만, 문서에서는 해당 model 실행을 `Observed`로 쓰지 않는다.
</Note>

## 로그 판정 규칙

`~/.mogui/hook-fire-log.jsonl`과 `~/.mogui/event-log.jsonl`은 다른 질문에 답한다.

| 로그 | 답하는 질문 | 대표 필드 |
| --- | --- | --- |
| `hook-fire-log.jsonl` | hook이 언제, 어디서, 어떤 runtime/session kind에서 fire 되었는가 | `ts`, `hook`, `event`, `cwd`, `runtime_hint`, `session_kind` |
| `event-log.jsonl` | guard나 decision emitter가 어떤 분류와 결과를 냈는가 | `ts`, `level`, `event`, `component`, `outcome`, `evidence`, `reason`, `command_class`, `target_scope`, `tool_kind` |

`event-log`는 값 없는 metadata만 기록한다. raw command, credential, absolute path는 기록하지 않고 command name이나 target classification만 남긴다. 로그 append 실패는 guard decision을 바꾸면 안 된다.

## Self-report 처리

Worker나 master의 완료 보고는 acceptance 입력일 뿐이다. 문서화할 때는 다음 순서로 판정한다.

<Steps>
<Step title="보고 내용을 원자 claim으로 나눈다">
"worker가 완료했다", "model X로 실행했다", "테스트가 통과했다", "PR이 merge 가능하다"를 한 문장으로 묶지 않는다.
</Step>

<Step title="각 claim의 primary artifact를 찾는다">
테스트 claim은 test output, dispatch claim은 ledger, hook claim은 fire log, model claim은 transcript probe, filesystem claim은 git/process/path 측정으로 확인한다.
</Step>

<Step title="증거가 없으면 강등한다">
artifact가 없거나 instrument가 다른 질문에 답하면 `Unknown`이다. 운영 규칙만 있으면 `Intended`, 파일만 있으면 `Configured`다.
</Step>

<Step title="시점 차이를 표시한다">
서로 다른 시점의 측정을 비교해 원인을 쓰지 않는다. 같은 턴 또는 명시된 timestamp로 재측정하기 전에는 "차이 있음"까지만 기록한다.
</Step>
</Steps>

## 문서 작성 규칙

운영 문서에서 claim을 쓸 때는 가장 강한 라벨 하나만 붙인다. 문장 안에서 라벨을 섞어야 하면 claim을 분리한다.

| 잘못된 문장 | 수정 |
| --- | --- |
| "dispatch gate가 모든 worker 생성을 막는다." | "`dispatch-gate check/register`와 JSONL ledger는 구현되어 있고 테스트된다. 모든 workspace worker 생성 경로가 이를 통과하는지는 workspace wiring 증거가 필요하다." |
| "hook이 설치되어 있으므로 보호가 활성이다." | "hook 파일은 `Configured`다. fire log entry가 있으면 해당 session kind에서 fire 된 것은 `Observed`다." |
| "테스트가 통과했으므로 운영에서 동작한다." | "테스트 대상 unit은 local execution에서 `Observed`다. 운영 라우팅은 별도 증거가 필요하다." |
| "worker가 완료했다고 했으므로 완료다." | "worker self-report를 받았다. acceptance artifact 또는 completion channel probe 전까지 완료 여부는 `Unknown`이다." |

## 실패 시 표현

`exit 2`, undecidable probe, malformed log, missing transcript, unreadable policy는 실패가 아니라 "판정 불가"일 수 있다. 이 경우 초록불로 쓰지 않는다.

권장 표현:

```text
model probe: undecidable
label: Unknown
reason: transcript substrate unavailable; no measured model
next check: rerun with scoped transcript glob or record MODEL_PROBE_FAILED in dispatch ledger
```

```text
redaction scan: exit=2
label: Unknown
reason: required organization rules missing
next check: provide REDACTION_EXTRA_PATTERNS or remove the release claim
```

## Related pages

<CardGroup>
  <Card title="방어 인벤토리" href="/defense-inventory">
    gate, ledger, model probe, redaction scan의 방어 표면과 failure mode를 확인한다.
  </Card>
  <Card title="작업자 위임" href="/dispatch-workers">
    `dispatch-gate check`, worker dispatch, `register`, completion evidence 흐름을 확인한다.
  </Card>
  <Card title="모델 식별과 drift 감사" href="/model-identity">
    declared model과 measured model을 분리하고 undecidable 상태를 처리한다.
  </Card>
  <Card title="문제 해결" href="/troubleshooting">
    undecidable, unverified, missing hook entry, redaction cannot decide 상태를 증상별로 처리한다.
  </Card>
</CardGroup>
