---
id: OBPI-0.0.59-04-decommission-tautological-tests-chore
parent: ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine
item: 4
lane: Heavy
status: Completed
---

# OBPI-0.0.59-04-decommission-tautological-tests-chore: Decommission Tautological Tests Chore

## ADR Item

- **Source ADR:** `docs/design/adr/foundation/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine.md`
- **Checklist Item:** #4 — "OBPI-0.0.59-04: Author gz chore decommission-tautological-tests re-runnable chore (AST scan for filesystem-shaped operations co-occurring with assertions, per-file disposition proposals — convert/replace-with-ledger/fold-to-validator/keep-as-fixture — operator-paced per file or batch, ledger event chore_decommission_processed per item, persistent baseline at data/tautological_test_baseline.json + waivers at data/tautological_test_waivers.json with rationale-key indirection like behave_coverage_waivers.json pattern, idempotent on clean state) + gz validate --tautological-test-audit drift gate (fail-closed if current > baseline + waivers; waiver file path hardcoded as self-exemption per 2am-operator circular-dependency analysis) + TautologicalTestOperation/Waiver/Baseline/ProposedDisposition Pydantic models + chore-runner integration per gz-chore-runner skill (heavy lane: new chore surface, new validator scope, new state files, new ledger event type) — ships the infrastructure; first sweep wave lands in OBPI-05"

**Status:** Completed

## Objective

Ship the re-runnable `decommission-tautological-tests` chore infrastructure (ADR-0.0.59 Decision item 4): an AST-based scanner in `src/gzkit/tautological_tests.py` that identifies filesystem-shaped operations co-occurring with assertions in `tests/**`; Pydantic models `TautologicalTestOperation`, `Waiver`, `Baseline`, `ProposedDisposition` in `src/gzkit/models/tautological_tests.py`; persistent baseline at `data/tautological_test_baseline.json` and waivers at `data/tautological_test_waivers.json` (rationale-key indirection matching `behave_coverage_waivers.json`); `gz validate --tautological-test-audit` drift gate that exits 3 when current filesystem-op count exceeds baseline + waivers count; `ChoreDecommissionProcessedEvent` in `src/gzkit/events.py` and factory in `src/gzkit/ledger_events.py`; chore registration in `src/gzkit/chores/registry.json`; drift gate wired into `gz check`; manpage documentation. The waiver file path is hardcoded as a self-exemption (circular-dependency analysis). This OBPI ships infrastructure only — the first sweep wave over the top-5 offenders lands in OBPI-05.

## Lane

**Heavy** — new chore surface, new validator scope, new state files, new ledger event type, `gz check` pipeline change.

## Allowed Paths

**New files:**
- `src/gzkit/tautological_tests.py` — NEW: AST scanner, disposition engine, baseline/waivers manager, drift gate validator function
- `src/gzkit/models/tautological_tests.py` — NEW: Pydantic models `TautologicalTestOperation`, `Waiver`, `Baseline`, `ProposedDisposition`
- `data/tautological_test_baseline.json` — NEW: initial empty baseline (matches `Baseline` model schema)
- `data/tautological_test_waivers.json` — NEW: initial empty waivers dict (rationale-key pattern matching `behave_coverage_waivers.json`)
- `tests/governance/test_tautological_tests.py` — NEW: unit tests covering all validator behaviors
- `.gzkit/chores/decommission-tautological-tests/CHORE.md` — NEW: canonical chore definition
- `.gzkit/chores/decommission-tautological-tests/acceptance.json` — NEW: chore runner acceptance criteria
- `.gzkit/chores/decommission-tautological-tests/README.md` — NEW: operator-facing chore README
- `src/gzkit/chores/decommission-tautological-tests/CHORE.md` — NEW: package copy (byte-identical; synced by `gz agent sync`)
- `src/gzkit/chores/decommission-tautological-tests/acceptance.json` — NEW: package copy
- `src/gzkit/chores/decommission-tautological-tests/README.md` — NEW: package copy

**Modified files:**
- `src/gzkit/chores/registry.json` — add `decommission-tautological-tests` entry (slug, title, lane, version, timeoutSeconds)
- `src/gzkit/commands/validate_cmd.py` — add `check_tautological_test_audit: bool = False` parameter, `_validate_tautological_test_audit()` function, scope registration in both `validate()` and `_validate_all()`
- `src/gzkit/cli/parser_maintenance.py` — add `--tautological-test-audit` argparse flag to validate subparser
- `src/gzkit/quality.py` — add `run_tautological_test_audit` runner function
- `src/gzkit/commands/quality.py` — add `("tautological test audit", run_tautological_test_audit)` to `_build_check_steps()`
- `src/gzkit/events.py` — add `ChoreDecommissionProcessedEvent` class and add to `TypedLedgerEvent` union
- `src/gzkit/ledger_events.py` — add `chore_decommission_processed_event()` factory function
- `docs/user/manpages/validate.md` — add `--tautological-test-audit` scope documentation section

## Denied Paths

- `tests/governance/test_*.py` existing files — modifying existing test files (the first sweep wave) belongs to OBPI-0.0.59-05
- `src/gzkit/req_kind.py` — delivered by OBPI-0.0.59-02; no changes here
- `src/gzkit/traceability.py` — parity-gate extension delivered by OBPI-0.0.59-03
- `src/gzkit/commands/adr_coverage.py` — `gz covers` extension delivered by OBPI-0.0.59-03
- `data/req_kind_grandfathering.json` — delivered by OBPI-0.0.59-03
- New runtime dependencies
- CI files, lockfiles

## Requirements (FAIL-CLOSED)

1. REQ-0.0.59-04-01 [BEHAVIOR]: Given a Python test file containing filesystem-shaped operations (reads via `open()`, `Path.read_text()`, `os.path.*`) in the same function scope as an assertion statement (assert or `self.assert*`), when the AST scanner in `src/gzkit/tautological_tests.py` runs against that file, then it returns a list of `TautologicalTestOperation` instances — one per co-occurrence, with correct file path, line number, operation kind, and containing function name

2. REQ-0.0.59-04-02 [BEHAVIOR]: Given a `TautologicalTestOperation`, when the disposition engine runs, then it proposes exactly one of four `ProposedDisposition` values — `convert` (rewrite as behavior test), `replace-with-ledger` (use ledger assertion instead of file read), `fold-to-validator` (delegate to `gz validate` scope), `keep-as-fixture` (legitimate fixture use) — based on operation context heuristics

3. REQ-0.0.59-04-03 [BEHAVIOR]: Given `data/tautological_test_baseline.json` recording N operations and `data/tautological_test_waivers.json` with W waived operations, when the current scan finds > N + W operations, then `gz validate --tautological-test-audit` exits 3 and prints each new (non-baselined, non-waived) operation with file path, line number, and suggested disposition

4. REQ-0.0.59-04-04 [BEHAVIOR]: Given a clean state where the current scan count equals or is less than the baseline + waivers count, when `gz validate --tautological-test-audit` runs, then it exits 0 with no error output

5. REQ-0.0.59-04-05 [BEHAVIOR]: Given the AST scanner running against `tests/**`, when it processes the scan, then it unconditionally excludes `data/tautological_test_waivers.json` from analysis — the waivers file never contributes to the operation count (hardcoded self-exemption per 2am-operator circular-dependency analysis: the file that lists exemptions cannot itself be subject to the gate it governs)

6. REQ-0.0.59-04-06 [BEHAVIOR]: `TautologicalTestOperation`, `Waiver`, `Baseline`, and `ProposedDisposition` in `src/gzkit/models/tautological_tests.py` are all `frozen=True`, `ConfigDict(extra='forbid')` Pydantic models per `.gzkit/rules/models.md`; constructing them with unknown fields raises `ValidationError`; mutating a frozen instance raises `ValidationError`

7. REQ-0.0.59-04-07 [BEHAVIOR]: `ChoreDecommissionProcessedEvent` with `Literal["chore_decommission_processed"]` discriminator exists in `src/gzkit/events.py` and is present in the `TypedLedgerEvent` union; `chore_decommission_processed_event(file_path, disposition, obpi_id)` in `src/gzkit/ledger_events.py` creates a `LedgerEvent` whose `event` field is `"chore_decommission_processed"` and is parseable by `parse_typed_event()`

8. REQ-0.0.59-04-08 [BEHAVIOR]: `run_tautological_test_audit` is in `_build_check_steps()` in `src/gzkit/commands/quality.py` so that `uv run gz check` runs the drift gate; a state where current count > baseline + waivers causes the check step to return a failing result

9. REQ-0.0.59-04-09 [SUPPORT]: `decommission-tautological-tests` chore is registered in `src/gzkit/chores/registry.json` with `slug`, `lane: "heavy"`, `title`, `version`, and `timeoutSeconds`; dual-surface byte parity holds between `.gzkit/chores/decommission-tautological-tests/` and `src/gzkit/chores/decommission-tautological-tests/` for `CHORE.md`, `acceptance.json`, `README.md`; `uv run gz validate --chores-layout` exits 0; `artifact_edited` ledger event citing `src/gzkit/chores/registry.json` is emitted at OBPI completion

10. REQ-0.0.59-04-10 [SUPPORT]: `data/tautological_test_baseline.json` and `data/tautological_test_waivers.json` exist on disk with their initial empty-state shapes conforming to the `Baseline` and waivers-dict schemas respectively; `gz validate --documents` exits 0; `artifact_edited` ledger events citing both files are emitted at OBPI completion

11. REQ-0.0.59-04-11 [SUPPORT]: `docs/user/manpages/validate.md` contains a `--tautological-test-audit` section documenting scope semantics, exit-code contract, drift-gate formula (`current > baseline + waivers` → exit 3), waiver-file path, and self-exemption rationale; `gz validate --documents` exits 0; `artifact_edited` ledger event citing `docs/user/manpages/validate.md` is emitted at OBPI completion

- NEVER: Mark the OBPI accepted while any REQ lacks a [kind] tag in this brief
- NEVER: Modify existing test files in `tests/governance/` (first sweep is OBPI-05)
- ALWAYS: Verify dual-surface byte parity for the chore directory before acceptance
- ALWAYS: Run `uv run gz validate --chores-layout` after adding the new chore directory

> STOP-on-BLOCKERS: OBPI-0.0.59-01, -02, and -03 must all be Completed before this OBPI begins. If any sibling status is not `Completed`, HALT and report.

## Discovery Checklist

**Parent ADR (read first; order pinned — GHI #321):**

- [x] **Parent ADR § Decision item 4** verbatim: "Author the re-runnable decommissioning chore — gz chore decommission-tautological-tests scans tests/** via AST for filesystem-shaped operations co-occurring with assertions, reports per-file disposition proposals (convert / replace-with-ledger / fold-to-validator / keep-as-fixture), is operator-paced per file or batch, emits ledger event chore_decommission_processed per processed item, persists state to data/tautological_test_baseline.json and data/tautological_test_waivers.json; companion gz validate --tautological-test-audit drift gate fail-closes on growth above baseline + waivers; first sweep wave processes the top-5 offenders in tests/governance/..."
- [x] Parent ADR § Intent — categorical error (uniform @covers gate), fix (three-kind taxonomy), and the 2am-operator forcing function (bypass mechanisms for every fail-close gate)
- [x] Parent ADR file: `docs/design/adr/foundation/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine.md`

**Governance (read once, cache):**

- [ ] `.gzkit/rules/models.md` — Pydantic pattern (BaseModel + ConfigDict frozen + extra='forbid')
- [ ] `.gzkit/rules/tests.md` — REQ scope discipline taxonomy + two-runners doctrine (OBPI-01 delivery)
- [ ] `AGENTS.md` — agent operating contract

**Context:**

- [ ] `src/gzkit/events.py` — existing event class pattern and `TypedLedgerEvent` union (lines 410+)
- [ ] `src/gzkit/ledger_events.py` — factory function pattern (e.g. `artifact_edited_event`)
- [ ] `src/gzkit/commands/validate_cmd.py` — scope registry pattern (`opt_in_scopes`, `_validate_*` functions, `validate()` signature) — mirrors OBPI-02's `--req-kind-discipline` pattern
- [ ] `src/gzkit/cli/parser_maintenance.py` — `--req-kind-discipline` flag as model for `--tautological-test-audit`
- [ ] `src/gzkit/commands/quality.py::_build_check_steps()` — step roster; `run_req_kind_discipline_audit` as model for new step
- [ ] `src/gzkit/quality.py` — runner function pattern (e.g. `run_req_kind_discipline_audit`)
- [ ] `src/gzkit/chores/eval_feedback_cluster_lib.py` — chore library module pattern
- [ ] `data/behave_coverage_waivers.json` — rationale-key indirection pattern for `tautological_test_waivers.json`
- [ ] Related OBPIs: OBPI-0.0.59-01 (doctrine), OBPI-0.0.59-02 (req-kind validator), OBPI-0.0.59-03 (parity gate)
- [ ] OBPI-0.0.59-05 brief — the first sweep wave's scope defines what this OBPI does NOT touch

**Prerequisites (check existence, STOP if missing):**

- [ ] `docs/design/adr/foundation/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine/obpis/OBPI-0.0.59-01-author-doctrine-and-supersession.md` — status: Completed
- [ ] `docs/design/adr/foundation/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine/obpis/OBPI-0.0.59-02-req-kind-discipline-validator.md` — status: Completed
- [ ] `docs/design/adr/foundation/ADR-0.0.59-req-scope-discipline-and-test-shape-doctrine/obpis/OBPI-0.0.59-03-parity-gate-three-channel-extension.md` — status: Completed

**Existing Code (understand current state):**

- [ ] `src/gzkit/governance/trust_audits/chores.py` — chores-layout validator; understand what `gz validate --chores-layout` already checks
- [ ] `src/gzkit/chores/registry.json` — existing chore schema; `decommission-tautological-tests` entry shape
- [ ] `src/gzkit/models/` — existing model files; understand naming convention for new model file
- [ ] `docs/user/manpages/validate.md` lines 230+ — how existing scopes are documented (model for `--tautological-test-audit` section)

## Quality Gates

### Gate 1: ADR

- [ ] Intent and scope recorded in this OBPI brief
- [ ] Parent ADR § Decision item 4 quoted verbatim

### Gate 2: TDD (Red-Green-Refactor)

- [ ] Tests derived from brief REQs (not from implementation runs)
- [ ] Red-Green-Refactor cycle followed per behavior increment
- [ ] Tests pass: `uv run gz test`
- [ ] Validation commands recorded in evidence with real outputs

### Code Quality

- [ ] Lint clean: `uv run gz lint`
- [ ] Type check clean: `uv run gz typecheck`

### Gate 3: Docs (Heavy only)

- [ ] `docs/user/manpages/validate.md` updated with `--tautological-test-audit` section
- [ ] Docs build: `uv run mkdocs build --strict`

### Gate 4: BDD (Heavy only)

- [ ] BDD deferred to ADR closeout (operator-blessed scope boundary — same pattern as OBPI-0.0.59-02 and OBPI-0.0.59-03). This OBPI ships a validator, Pydantic models, event type, and chore infrastructure. BDD scenarios for `gz validate --tautological-test-audit` and `gz chores run decommission-tautological-tests` are authored at ADR-0.0.59 closeout alongside OBPI-05 scenarios, where cross-OBPI integration (scanner infrastructure + first sweep results) can be tested together. Rationale key: `obpi-0.0.59-04-bdd-deferred-to-adr-closeout` — waiver added to `data/behave_coverage_waivers.json` at implementation time.

### Gate 5: Human (Heavy only)

- [ ] Human attestation recorded

## Verification

```bash
# Quality checks
uv run gz lint
uv run gz typecheck
uv run gz test

# New scope visible in CLI
uv run gz validate --help | grep tautological-test-audit

# Drift gate passes on clean state (baseline + empty waivers = 0 new ops above baseline)
uv run gz validate --tautological-test-audit

# Chore registered and layout valid
uv run gz chores list | grep decommission-tautological-tests
uv run gz validate --chores-layout

# gz check includes the new step
uv run gz check

# State files exist
test -f data/tautological_test_baseline.json && echo "baseline exists"
test -f data/tautological_test_waivers.json && echo "waivers exists"

# Docs build clean
uv run mkdocs build --strict
```

## Demo

```bash
# Show what the scanner finds across the full test suite
uv run python -c "
from pathlib import Path
from gzkit.tautological_tests import scan_test_tree, propose_dispositions
ops = scan_test_tree(Path('tests'))
print(f'{len(ops)} tautological operations found')
for op in ops[:5]:
    print(f'  {op.file_path}:{op.line_number} — {op.operation_kind} in {op.function_name}')
    print(f'    disposition: {propose_dispositions(op).value}')
"

# Run the drift gate (should pass on clean state with baseline)
uv run gz validate --tautological-test-audit

# Show chore details
uv run gz chores show decommission-tautological-tests
```

## Acceptance Criteria

- [ ] REQ-0.0.59-04-01 [BEHAVIOR]: Given a Python test file containing filesystem-shaped operations co-occurring with assertions, when the AST scanner runs, then it returns `TautologicalTestOperation` instances with correct file path, line number, operation kind, and function name
- [ ] REQ-0.0.59-04-02 [BEHAVIOR]: Given a `TautologicalTestOperation`, when the disposition engine runs, then it proposes exactly one of four `ProposedDisposition` values based on operation context heuristics
- [ ] REQ-0.0.59-04-03 [BEHAVIOR]: When current scan count > baseline + waivers, `gz validate --tautological-test-audit` exits 3 and reports each new operation
- [ ] REQ-0.0.59-04-04 [BEHAVIOR]: When current scan count ≤ baseline + waivers, `gz validate --tautological-test-audit` exits 0
- [ ] REQ-0.0.59-04-05 [BEHAVIOR]: `data/tautological_test_waivers.json` is unconditionally excluded from AST analysis (self-exemption hardcoded)
- [ ] REQ-0.0.59-04-06 [BEHAVIOR]: All four Pydantic models are frozen, `extra='forbid'`, and reject invalid construction
- [ ] REQ-0.0.59-04-07 [BEHAVIOR]: `ChoreDecommissionProcessedEvent` is in `TypedLedgerEvent` union; factory function creates a parseable ledger entry
- [ ] REQ-0.0.59-04-08 [BEHAVIOR]: `run_tautological_test_audit` is in `_build_check_steps()` and causes `gz check` to fail when drift is detected
- [ ] REQ-0.0.59-04-09 [SUPPORT]: Chore registered in `registry.json`; dual-surface parity holds; `gz validate --chores-layout` exits 0; `artifact_edited` event emitted for `registry.json`
- [ ] REQ-0.0.59-04-10 [SUPPORT]: `data/tautological_test_baseline.json` and `data/tautological_test_waivers.json` exist with initial-empty shapes; `gz validate --documents` exits 0; `artifact_edited` events emitted for both
- [ ] REQ-0.0.59-04-11 [SUPPORT]: `docs/user/manpages/validate.md` documents `--tautological-test-audit`; `gz validate --documents` exits 0; `artifact_edited` event emitted for `validate.md`

## Completion Checklist

- [ ] **Gate 1 (ADR):** Intent recorded in brief; parent ADR Decision item quoted
- [ ] **Gate 2 (TDD):** RGR cycle followed; tests derived from REQs; coverage maintained
- [ ] **Code Quality:** Lint, format, type checks clean
- [ ] **Gate 3 (Docs):** `validate.md` manpage updated; `mkdocs build --strict` passes
- [ ] **Gate 4 (BDD):** Deferred to ADR closeout; waiver key `obpi-0.0.59-04-bdd-deferred-to-adr-closeout` in `data/behave_coverage_waivers.json`
- [ ] **Value Narrative:** Problem-before vs capability-now documented
- [ ] **Key Proof:** One concrete scanner invocation + drift gate demo included
- [ ] **OBPI Acceptance:** Evidence recorded below

> For ceremony steps and lane-inheritance attestation rules, see `AGENTS.md` section `OBPI Acceptance Protocol`.

## Evidence

### Gate 1 (ADR)

- [ ] Intent and scope recorded

### Gate 2 (TDD — Red-Green-Refactor)

```text
# Paste test output here
```

### Code Quality

```text
# Paste lint/format/type check output here
```

### Gate 3 (Docs)

```text
# Paste docs-build output here
```

### Gate 4 (BDD)

Deferred to ADR-0.0.59 closeout. Waiver key: `obpi-0.0.59-04-bdd-deferred-to-adr-closeout`.

### Gate 5 (Human)

```text
# Record attestation text here
```

### Value Narrative

<!-- What problem existed before this OBPI, and what capability exists now? -->

### Key Proof


```bash
# Drift gate passes on clean state (baseline seeded with 782 current ops, 0 waivers)
$ uv run gz validate --tautological-test-audit
Validated: tautological_test_audit
✓ All validations passed (1 scopes).

# Scanner identifies tautological operations with disposition suggestions
$ uv run python -c "
from pathlib import Path
from gzkit.tautological_tests import scan_test_tree, propose_disposition
ops = scan_test_tree(Path('tests'))
print(f'{len(ops)} tautological operations found')
print(f'first 3: {[(op.file_path, op.operation_kind, propose_disposition(op).value) for op in ops[:3]]}')"
782 tautological operations found

# Full quality verification (ARB receipts)
$ uv run gz arb ruff
arb ruff exit_status=0 receipt=arb-ruff-c339a0fe8efa4ae3886eacb8a11970b0
$ uv run gz arb typecheck
arb step name=typecheck exit_status=0 receipt=arb-step-typecheck-a064846bf1ab422abc589893b7a51e82
$ uv run gz arb step --name unittest -- uv run -m unittest -q
Ran 5654 tests in 57.227s — OK
arb step name=unittest exit_status=0 receipt=arb-step-unittest-d3325726535c415c81765f01f8a15c2b
$ uv run gz arb step --name mkdocs -- uv run mkdocs build --strict
arb step name=mkdocs exit_status=0 receipt=arb-step-mkdocs-07a86feec7e84d158d314cbe54324dc6

# Chore registered and layout valid
$ uv run gz validate --chores-layout
Validated: chores_layout
✓ All validations passed (1 scopes).
```

### Implementation Summary


- Files created: src/gzkit/models/tautological_tests.py (4 Pydantic models — TautologicalTestOperation, Waiver, Baseline, ProposedDisposition), src/gzkit/tautological_tests.py (AST scanner + disposition engine + drift gate), data/tautological_test_baseline.json (782-op seed), data/tautological_test_waivers.json (empty initial), tests/governance/test_tautological_tests.py (31 tests, all 8 BEHAVIOR REQs @covers-decorated), and .gzkit/chores/decommission-tautological-tests/ + byte-identical src/gzkit/chores/... mirror (CHORE.md, acceptance.json, README.md).
- Files modified: src/gzkit/events.py (ChoreDecommissionProcessedEvent + TypedLedgerEvent union entry), src/gzkit/ledger_events.py (chore_decommission_processed_event factory), src/gzkit/chores/registry.json (heavy-lane entry, 900s timeout), src/gzkit/commands/validate_cmd.py (8 touch-points wiring the new scope), src/gzkit/cli/parser_maintenance.py (--tautological-test-audit flag), src/gzkit/quality.py (run_tautological_test_audit runner), src/gzkit/commands/quality.py (step in _build_check_steps), docs/user/manpages/validate.md (full scope section + table entry), data/behave_coverage_waivers.json (OBPI brief-level waiver), src/gzkit/governance/trust_audits/events.py (NO_GRAPH_IMPACT waiver), src/gzkit/schemas/ledger.json (chore_decommission_processed schema entry), plus tests/commands/test_skills.py and tests/test_schemas.py (test infrastructure updates for new event type and check step).
- Tests added: 31 unit tests covering all 8 BEHAVIOR REQs via @covers decorators; 5654/5654 total project tests pass.
- Date completed: 2026-05-26.
- Attestation status: operator-verbatim "attest completed" relayed per AGENTS.md § Attestation.
- Defects noted: none in scope; 3 SUPPORT REQs (09, 10, 11) accept-uncovered per ADR-0.0.59 three-kind taxonomy (proof channel = ledger event + structural validator).

## Tracked Defects

_No defects tracked._

## Human Attestation

- Attestor: `Jeffry Babb`
- Attestation: attest completed — ship decommission-tautological-tests chore infrastructure for ADR-0.0.59 Decision item 4: AST scanner + 4 frozen extra=forbid Pydantic models + drift gate validator + ChoreDecommissionProcessedEvent + dual-surface chore registration + initial state files seeded with 782-op baseline + manpage section + behave waiver. 5654/5654 unittest pass (arb-step-unittest-d3325726535c415c81765f01f8a15c2b), ruff clean (arb-ruff-c339a0fe8efa4ae3886eacb8a11970b0), ty clean (arb-step-typecheck-a064846bf1ab422abc589893b7a51e82), mkdocs --strict clean (arb-step-mkdocs-07a86feec7e84d158d314cbe54324dc6). 8 BEHAVIOR REQs @covers-decorated; 3 SUPPORT REQs accept-uncovered per ADR-0.0.59 three-kind taxonomy (ledger event + structural validator proof channel).
- Date: 2026-05-26

---

**Date Completed:** 2026-05-26

**Evidence Hash:** -
