Proof-Level Taxonomy and Capability Matrix

For current project truth, defer to `docs/STATE.md` and `docs/PHASE_PROGRESS.md`. This map adds a shared proof-level vocabulary and a capability matrix for the current organizer-rehearsal path. It is a claim-boundary aid, not a new source of truth. For how these proof levels feed the broader claim-discipline rules (forbidden collapses, inventory/PR checklist, two firewalls), see `claim-boundaries.md`.

This map exists for issue #1796 and directly supports the organizer-rehearsal milestone #1746. ICN now has many overlapping readiness states — implemented, partial, fixture-backed, local proof loop, live daemon proof, K3s/devnet proof, design-only, stale, aspirational. Without shared proof language, a contributor, facilitator, reviewer, or agent can accidentally over- or under-claim. This doc gives everyone the same words so the current demo/rehearsal state is honest, legible, and reusable.

It answers, for each capability: what is real, what is fixture-backed, what runs locally, what has live-daemon proof, what is partner-rehearsal-ready, what is not production, what privacy boundary applies, and which issue/PR owns the next step.

Proof-level taxonomy (L0–L8)

Proof levels are claim-boundaries, not moral rankings. A higher level is not "better" and a lower level is not "bad" — the level states how much evidence backs a claim so the claim does not outrun the proof. A schema-only contract at L1 may be exactly the right maturity for its purpose; calling it L5 would be the error.

Level Name What the level asserts
L0 Named / design-only The concept exists in docs or issue text only. No stable schema, no implementation.
L1 Schema / contract exists A stable-ish schema, ADR, contract URN, or type exists. No meaningful runtime proof required yet.
L2 Unit-tested An implementation or schema has focused unit / round-trip validation (e.g. a schema with a validated example, a unit-tested function).
L3 Integration-tested Multiple components interact under test.
L4 Local proof loop A local operator can run a documented loop and produce the expected artifacts.
L5 Live daemon / gateway proof The path runs against real icnd / gateway components, not just fixtures.
L6 Multi-node / devnet proof More than one node or a federated runtime participates (e.g. the homelab K3s smoke path).
L7 Partner / organizer rehearsal A non-core participant can review or rehearse with bounded, honest claims, behind the accessibility/privacy checklist below.
L8 Production hardening Operational security, privacy, accessibility, recovery, observability, upgrade, and governance controls are hardened enough to support production claims.

Levels are not strictly cumulative across axes: a capability can have a live path (L5) on a single node while its multi-node story (L6) is unproven, and a contract can be schema-validated (L2) without ever touching a daemon (L5). State the level that matches the strongest honest evidence, and note the gaps.

Relationship to the existing status vocabulary

This taxonomy does not replace the implementation-state vocabulary in `project-coverage-matrix.md` (implemented, implemented but partial, feature-gated, fixture-backed, package-local, design-direction, historical, unknown). The two are orthogonal axes:

  • Status answers "is the code written, and how completely?"
  • Proof level answers "how much verification evidence stands behind the claim?"

A surface can be implemented (status) yet only L2 (proof) because no integration or live evidence has been recorded. Use both: status for what exists, proof level for what may be claimed. Rough alignment, not a lookup table:

Proof level Typical status band
L0–L1 design-direction
L2 implemented but partial / fixture-backed
L3 implemented (tested)
L4–L5 implemented (local / live proof)
L6 implemented (devnet / K3s)
L7 package-local / rehearsal
L8 no current ICN capability claims L8

Capability matrix (organizer-rehearsal path)

Evidence is grounded in merged commits on main and committed artifacts. `STATE.md` and `PHASE_PROGRESS.md` are the canonical state documents and have been truth-synced through the later June 2026 cycle (the earlier #1985#1999 receipt-chain/rehearsal cycle is now recorded on main). This matrix is an indexed proof-level view, not the root state authority: where it and STATE.md / PHASE_PROGRESS.md disagree, the canonical state documents win (per the source-of-truth hierarchy in `source-of-truth-map.md`).

# Capability Proof level Status Evidence (PR / issue) Privacy boundary Next
1 Live receipt-chain audit path / 13-of-13 proof L5 (single-node) implemented (live) #1985; rerun via #1997 repo-safe evidence packet; raw transcript gitignored multi-node (#1746); CI #1955
2 Durable effect dispatch evidence L3 implemented (tested) #1990; docs/spec/effect-dispatch-contract.md server-side institutional record; not a public surface #1993
3 Dispatch-evidence recovery / backfill L3 implemented (tested) #1993; related #1986 as above
4 Decision-hash ledger lookup / index L3 implemented (tested) #1996; related #1988 as above
5 One-command local receipt-chain rehearsal L4 implemented (local proof) #1997; scripts/local_receipt_chain_13of13_rehearsal.sh repo-safe-by-construction evidence packet CI gating on #1955
6 Pending-publish summary row contract L2 implemented but partial (contract) #1998; `pending-publish-summary.md` read-model only; no executable payload bind to a real publish surface (future)
7 Fixture-backed organizer rehearsal shell L2 fixture-backed #1999, #2237; web/pilot-ui/fixtures/icn-organizer-demo/ fixtures must be fictional; no private paths / Drive URLs; review choices are disabled human/AT pass + live path (#1746)
8 /me/action-cards / standing-derived queue L5 live; L6 partial (K3s) implemented but partial (3 of 5 paths); member surface now in served OpenAPI #1608, #1646, #2027; see `runtime-surface-map.md` member standing / identity data must be protected #1646#1631, #1634
9 Private-data disclosure boundary / scoped vault L1 (design) design-direction #1792; `artifact-registry-and-scoped-vault.md` no runtime enforcement; privacy today is by exclusion #1792 / #1798 / #1767
10 NYCN organizer rehearsal milestone (overall) components at L2/L4/L5; L7 OPEN implemented but partial #1746 no live private data; disclosure boundary design-only #1746
11 DEV/DEMO appliance image — single-actor loop in one VM L5 (stranger-runnable local proof) implemented (sealed July Demo Candidate 0.1) #2028; deploy/appliance/ (ICN_APPLIANCE_DEMO_PROFILE=1), `DEMO_QUICKSTART.md` dev gates labeled; fictional fixture institution; image unsigned, not production single-actor only — multi-person flow is a future lane, not built
12 Summit Ops Registration Desk lane — action-card fixture L2 (fixture/demo) fixture-backed #2209; web/pilot-ui/fixtures/icn-organizer-demo/action-cards.json + standing.json fictional demo data only; no real attendee/registration data render the full registration action register under #1746

Per-capability detail

The table above is the scannable view. The prose below carries the honest claim-boundary fields (real now / fixture-only / public wording / known gaps) that do not fit a cell.

1. Live receipt-chain audit path / 13-of-13 proof — L5.

  • Real now: a governed proposal → vote → close → allocation flow runs against a real icnd + gateway and icnctl audit verify --token --json reports a complete 13/13 receipt chain.
  • Fixture-only / mocked: none for the path itself — data is fictional, the gateway is real, ephemeral, loopback, and dev-gated.
  • Public/demo wording: "live daemon/gateway proof of the 13/13 governed receipt chain on a local ephemeral node — proof of path, not proof of deployment readiness."
  • Known gaps: single-node loopback only (no multi-node / L6); CI run is gated by the disk flake in #1955.

2. Durable effect dispatch evidence — L3. Real now: ExecutionRecord.results is persisted and an idempotent startup backfill reconstructs missing dispatch evidence. Fixture-only: none. Public/demo wording: "dispatch evidence is durably persisted and recovered on startup." Known gaps: durability is proven by tests, not by a recorded live multi-restart drill.

3. Dispatch-evidence recovery / backfill — L3. Real now: the backfill scan uses cursor/seek pagination (not offset), removing the crash-window and O(n²) concerns. Fixture-only: none. Public/demo wording: "recovery scan is bounded and crash-safe." Known gaps: recovery is unit/integration-proven, not exercised under a recorded fault-injection run.

4. Decision-hash ledger lookup / index — L3. Real now: ledger entries are indexed by decision_hash, fixing the crash-window and O(n²) lookup concerns. Fixture-only: none. Public/demo wording: "decision-hash lookups are indexed." Known gaps: none material at this level.

5. One-command local receipt-chain rehearsal — L4. Real now: one operator command spins a fresh ephemeral node/gateway, asserts 13/13, emits a repo-safe evidence packet conforming to urn:icn:contract:rehearsal-evidence-export:v1, validates it, and prints what is real / dev-gated / fixture-only / NOT production. Fixture-only: fictional inputs; all outputs are gitignored. Public/demo wording: "one-command local proof loop — not production, not a pilot, not live federation." Known gaps: requires a local build of icnd/icnctl; single node.

6. Pending-publish summary row contract — L2. Real now: a stable schema (urn:icn:contract:pending-publish-summary:v1, JSON Schema draft 2020-12) with a fictional example that validates via docs/scripts/validate-preview-review.py --schema; documented composition with urn:icn:contract:preview-review:v1 (#1745). Fixture-only / mocked: it is a read-model contract — it describes the rows an organizer was shown; it performs no mutation, implements no HTTP endpoint, and authorizes no formal pilot. Public/demo wording: "schema/contract for the pending-publish review row — read-model only, no endpoint, no mutation, not a formal pilot authorization." Known gaps: no producing endpoint binds to it yet.

7. Fixture-backed organizer rehearsal shell — L2. Real now: a demo-mode shell renders committed fictional fixtures (rehearsal-shell.manifest.json), validated by docs/scripts/validate-rehearsal-shell-fixtures.py. In addition to Standing and Action Cards, #2237 renders the preview-review wrapper and canonical-matched pending-publish rows as a plain-language, read-only Review Preview; every review choice is disabled, the browser fixture is schema-valid and mechanically matched to the canonical example, and Playwright/axe covers the rendered surface. Fixture-only / mocked: entirely — there is no live daemon, persisted review decision, mutation, issued receipt, or evidence export behind the shell in demo mode. Public/demo wording: "fixture-backed organizer review preview and participation shell (demo mode) — bounded fictional rehearsal artifacts; no decisions recorded, not live, not a formal pilot." Known gaps: not wired to a live preview/review endpoint; no human/assistive-technology pass; not a partner rehearsal (L7); the full participation surface and organizer walkthrough remain under #1746.

8. /me/action-cards / standing-derived participation queue — L5 (live), L6 partial. Real now: GET /v1/gov/me/action-cards emits proof-bearing receipt loops for three of five source paths (proposal/vote, action_item/complete, meeting/attend), with both a local HTTP proof loop and a homelab K3s smoke proof loop recorded (see `current-truth-map.md`). Fixture-only / mocked: the two remaining source paths (signal_rule, obligation_lifecycle) are RFC-gated under #1646 and not emitted. Public/demo wording: "three of five currently emitted source paths, live — show three of five, not five of five." Known gaps: #1631, #1634, then #1646.

9. Private-data disclosure boundary / scoped vault model — L1 (design). Real now: a design-level spec names the ScopedVault boundary and the forward-direction DisclosurePolicy / PrivacyClass / PrivateObjectRef / AccessReceipt / ExportReceipt / RedactionMap vocabulary; an icn-privacy crate exists. Fixture-only / mocked: disclosure enforcement is not implemented at runtime. Rehearsal privacy today is achieved by exclusion (repo-safe-by-construction packets, fictional fixtures), not by an enforced disclosure boundary. Public/demo wording: "design-direction scoped-vault / disclosure model — NOT private-data handling; rehearsal privacy is by exclusion, not enforcement." Known gaps: wire-stable schema, encryption/key model, and runtime enforcement are all deferred (#1792, #1798, #1767).

10. NYCN organizer rehearsal milestone (overall) — components L2/L4/L5; L7 OPEN. Real now: the kernel can prove (L5 receipt chain, L4 one-command rehearsal) and the rehearsal shell + contracts can rehearse (L2). Fixture-only / mocked: the integrated organizer-facing operable rehearsal — the participation surface joining the live proof loop to the rehearsal shell — does not exist yet. Public/demo wording: "fixture-backed organizer rehearsal plus a local proof loop; the operable participation surface is the open milestone — not a formal pilot, not live federation, not production." Known gaps: the participation surface (#1746); disclosure enforcement (#1792); the accessibility/privacy checklist below; the NYCN dogfood gossip-port preflight bug (#1956); CI disk flake (#1955).

11. DEV/DEMO appliance image — single-actor loop in one VM — L5 (stranger-runnable local proof). Real now: ICN_APPLIANCE_DEMO_PROFILE=1 produces a reproducible bootable VM image (a template, not a physical device) that a stranger can build from public main and boot in QEMU/KVM. A node instance booted from it serves the member-shell and runs the full single-actor spine — standing → action card → discharge → receipt → evidence/audit — plus an in-VM 13/13 governed receipt-chain audit (sudo icn-demo-verify --chain; the in-VM helpers run as root). Fixture-only / mocked: the institution is the fictional NYCN fixture package; the shell's ?mode=demo panes are fixture-backed. Terminology (use precisely): the appliance image is a reproducible VM image/template; a running node instance is a VM booted from it; the hypervisor host (Proxmox/KVM/cloud/local machine) runs one or many node instances; org/domain assignment and any future QR claim ceremony apply to a running node instance, never to the generic image and never to a physical box. Public/demo wording: "one local DEV/DEMO node instance proving the single-actor loop — not production, not a pilot, not federation, not multi-person, unsigned image, fictional data." Known gaps / next lanes (not built): multi-person interaction (two-member action flow), QR node-claim ceremony, commons resource allocation.

12. Summit Ops Registration Desk lane — action-card fixture — L2 (fixture/demo). Real now: a committed fictional Registration Desk action_item/complete ActionCard (demo-card-action-item-complete-registration-001) in web/pilot-ui/fixtures/icn-organizer-demo/action-cards.json, with a matching demo Logistics Committee role granting registration_desk in standing.json (so the card is derivable from holder standing). Validated per-card against `action-card.schema.json`, by docs/scripts/validate-rehearsal-shell-fixtures.py, and by the pilot-ui e2e web/pilot-ui/tests/e2e/demo-fixture-preload.spec.js + the "Rehearsal Fixture Bundle" CI gate (#2209). Docs: `summit-ops-registration-action-card-proof-loop.md`, `summit-ops-registration-fixture-shape.md`. Fixture-only / mocked: entirely — a committed fictional fixture the rehearsal shell loads/validates; there is no live daemon and no action-card→receipt runtime loop for this lane. Public/demo wording: "L2 fixture-backed Registration Desk card — committed fictional fixture, not runtime proof, not live NYCN action cards/receipts, not a node-hosted Summit Ops cockpit, not organizer-ready (L7), not a formal pilot, not production; no Google sync, no private data." Known gaps: #2209 added one data fixture, not the full registration action register. The #2099 Pilot UI security gate is closed with its default-branch alerts verified fixed, so the next bounded slice may render the full fictional registration action register under #1746; that work is not included in #2237's generic Review Preview.

Public / demo wording discipline

This section names the language that keeps claims inside the proof boundary. It is the proof-level lens on the project's existing red lines — for the full list (no crypto/token framing, regulatory vocabulary, no NYCN commitment claim, no live-federation claim), defer to `show-readiness-map.md`.

Prefer (these stay inside the proof boundary):

  • "fixture-backed organizer rehearsal"
  • "local proof loop" / "live daemon/gateway proof"
  • "not production" / "not a formal pilot authorization" / "not private-data handling"
  • "bounded rehearsal artifact"
  • "proof of path, not proof of deployment readiness"

Avoid (these claim past the evidence):

  • "production-ready", "fully federated", "live pilot", "secure by default"
  • "complete platform", "partner deployed"
  • "ready for organizers" — unless the accessibility/privacy checklist below and the #1746 acceptance conditions are both satisfied.

Accessibility and privacy readiness (gate for "organizer-facing")

A capability does not reach L7 (partner / organizer rehearsal) on engineering proof alone. Anything presented as organizer-facing must also satisfy:

  • Plain-language labels — no internal jargon, URNs, or hashes as the primary label.
  • Screen-reader / non-visual compatibility — every state reachable and meaningful without sight.
  • Color-independent meaning — status never carried by color alone.
  • No raw private paths or Drive URLs in public fixtures — fictional data only.
  • Clear fixture-vs-live labeling — the viewer always knows whether they are looking at a fixture or a live result.
  • Visible non-claims — "not production / not a formal pilot / not live federation" stays on the surface, not buried in a footnote.
  • Visible receipt / evidence boundaries — what is proven vs described vs expected is legible.

This checklist is why capability #7 (the fixture-backed shell) is L2, not L7: the shell exists, but the organizer-facing accessibility/privacy bar and the live participation surface are open under #1746. Disclosure enforcement that would make private organizer material safe to handle is design-only under #1792; until it lands, organizer rehearsal stays on fictional fixtures. See `docs/design/ACCESSIBILITY_BASELINE.md` for the baseline this checklist draws on.

Non-claims

This map does not claim:

  • production readiness for any capability;
  • a formal NYCN pilot, partnership, or signed agreement;
  • live federation between cooperatives;
  • private-data handling readiness (the disclosure boundary is design-only);
  • that the fixture-backed rehearsal shell runs against a live daemon;
  • that any committed demo fixture (e.g. the Registration Desk card, row 12) is a runtime proof — committed fictional fixtures are L2 demo evidence only.

When to update this map

  • A capability's strongest honest evidence changes (a new test, a live run, a recorded devnet proof) → bump its proof level.
  • A new capability enters the organizer-rehearsal path → add a row plus a detail block.
  • A STATE.md / PHASE_PROGRESS.md sync changes a capability's recorded state → reconcile the affected rows here (the canonical state documents win).
  • The accessibility/privacy checklist or #1746 acceptance conditions change → revisit which capabilities may be called organizer-facing (L7).

Where to read deeper

You want... Read
What is real now (per-PR pointer) `current-truth-map.md`, `docs/STATE.md`
What is or isn't show-ready, red lines `show-readiness-map.md`
Subsystem coverage + status vocabulary `project-coverage-matrix.md`
Real runtime surfaces `runtime-surface-map.md`
Which routes/icnctl commands back the rehearsal, and what is safe to show / steward-only / not-ready `organizer-rehearsal-operability-map.md`
The phase model `docs/PHASE_PROGRESS.md`
Run / narrate / hand off the Candidate 0.1 demo (Row 11 operator companion) `docs/demo/JULY_DEMO_CANDIDATE_0.1_OPERATOR_SCRIPT.md`