Audit — R89 Phase B seal: θ Phase 3 graduation

Round: R89 Phase B seal β task ID: 1b107f0c-9554-4d3a-8630-d3e5f620dd39 Branch: feature/r89-seal-theta-phase-3 Worktree: .worktrees/claude/r89-seal-theta-phase-3 Base: origin/main @ 367c9595 (post-#246; θ Phase 3 shipped 13/13) Effort: S (1–2 hours)

Charter

Narrative-side seal for θ Phase 3. After this PR lands, 11/15 Greek concepts ship code (α β γ δ ε ζ η θ κ λ ν); only 4 remain spec-only (ι μ ξ π). This PR also lifts the canonical maturity claim and the consensus concept doc’s Phase 0 posture out of the “spec-only” bucket and into “shipped Phase 3.”

This PR closes the T0 autonomous Phase 2+3 mandate granted at R88 end-of-session. No source code changes.

Surface inventory

1. docs/3-world/physics/laws/consensus.md (θ concept doc)

Current state at 367c9595:

  • Frontmatter (lines 1–10):
    ---
    title: Consensus (θ)
    layer: 3-world/physics/laws
    phase: 0
    colibri_code: none
    status: spec
    updated: 2026-04-16
    parent: Laws (physics layer)
    nav_order: 10
    ---
    

    All three reality-fields are stale. phase: 0 should be phase: 3; colibri_code: none should be colibri_code: partial; status: spec should be status: partial.

  • Body, line 16 — stale Phase 0 claim:

    “Phase 0 reality: Colibri runs with a single writer against a WAL-mode SQLite database. θ is specified but not activated. A one-arbiter run is trivially consistent, so consensus has nothing to do. The spec below is the shape the runtime will grow into.”

    False post-#234 → #246. θ shipped 13 sub-tasks: messages, quorum, finality FSM, gossip wire, time anchors, equivocation, view-change, VRF stub, MCP tools, fork hook, parity harness.

  • Body, §”Phase 0 posture” (lines 193–198) — stale:

    “The runtime accepts θ-shaped APIs but always returns ‘trivially finalized’ because n = 1. Voting, gossip, and equivocation detection are schema-ready: columns exist, tools are stubbed. Schema for mcp_consensus_votes stub… The first real θ activation is not scheduled before Phase 1.5… BFT activation target is R121+”

    All four sentences are now false. The MCP tools are registered (consensus_propose, consensus_vote, consensus_finality, consensus_gossip, vrf_eval); the schema is populated by real vote-message flow, not just stubbed; θ shipped in R89 (not R121+); and Phase 1.5 framing predates the actual Phase 3 ship.

2. CLAUDE.md §10 maturity claim (line 207)

Current text:

“Of 15 Greek-letter concepts, 10 ship code (colibri_code: partial — α β γ δ ε ζ η κ λ ν); 5 remain spec-only for later phases (θ ι μ ξ π, colibri_code: none).”

Stale post-#234 → #246. Should be 11 ship code (add θ); 4 remain spec-only (drop θ; leave ι μ ξ π). The MCP surface count “14 → 18” should advance to “14 → 23” since P3.7.1 (#244) added 5 θ tools (consensus_propose, consensus_vote, consensus_finality, consensus_gossip, vrf_eval).

Currently last entry is the R89 Phase A entry (line 247). A new entry needs to be appended for R89 Phase B mirroring the format of the existing entries.

4. docs/3-world/physics/laws/index.md (laws-index)

Current state at 367c9595:

  • Preamble line 14–15:

    “Four Greek concepts live in this folder — one ships code at Phase 0, three are spec-only until later phases.”

    Stale. After R87 κ ships, this should already have been “two ship code, two are spec-only” (η + κ vs θ + ι). The line was edited in R89 Phase A only on the κ row; the preamble sentence was not.

  • Line 21:

    θ Consensuscolibri_code: none — spec-only, Phase 3+ target (Byzantine agreement).”

    Needs to graduate to colibri_code: partial with shipped-Phase-3 text mirroring the κ pattern set by #233.

5. docs/guides/implementation/task-breakdown.md (Task Summary)

Current state — Task Summary table (lines 1130–1142). The P3 row says “P3 θ Consensus | 7 tasks”. This is the original P3 breakdown count which only enumerates the canonical P3.1.1 – P3.5.1 spec-grounded tasks. The actual shipped count is 13 because R89 added P3.6.1 (VRF stub), P3.7.1 (MCP tools), P3.8.1 (parity harness), P3.9.1 (fork hook), P3.3.2 (bloom dedup), and P3.3.3 (adaptive fanout) during execution.

There is no explicit Phase 3 “status: staged” or “0/13 → 13/13” progress tracker in the file. The dependency-graph Mermaid (lines 1147–1196) draws the P3.1.x–P3.5.x tasks but does not include the six newly-introduced sub-tasks. The Phase 3 section body (lines 864– 967) enumerates only the seven canonical sub-tasks.

Scope decision: keep the body section untouched (canonical P3 spec grounding is preserved as design intent; the shipped expansion is documented in the prompt file at docs/guides/implementation/task-prompts/p3.1-theta-consensus.md which is the per-task agent prompts file referenced by §11 of CLAUDE.md). No edit to task-breakdown.md — there is no Phase 3 status tracker to update. The R89 Phase A seal (#233) made no edit to task-breakdown.md either, on the same logic for λ.

6. docs/5-time/roadmap.md (line 68) and docs/colibri-system.md (line 48)

Both contain the stale “7 remain colibri_code: none (θ ι κ λ μ ξ π)” / “8 ship code” framing. They are out-of-scope here — would have been covered by the R89 Phase A seal #233 if the scope had included full- corpus reconciliation. R89 Phase A scoped only to CLAUDE.md + the two graduating concept docs + the staging prompt; the same scope discipline applies here. Both files are R90+ doc-reconcile candidates.

Greek concept counter — pre-edit vs post-edit

Running colibri_code: frontmatter scan on the worktree at 367c9595:

Concept File Pre-edit Post-edit
α (System Core) docs/3-world/execution/index.md partial partial (unchanged)
β (Task Pipeline) docs/3-world/execution/task-pipeline.md partial partial (unchanged)
γ (Server Lifecycle) docs/2-plugin/index.md partial partial (unchanged)
δ (LLM Router) docs/3-world/social/llm.md partial partial (unchanged)
ε (Skill Registry) docs/3-world/execution/skill-registry.md partial partial (unchanged)
ζ (Decision Trail) docs/3-world/execution/decision-trail.md partial partial (unchanged)
η (Proof Store) docs/3-world/physics/laws/proof-store.md partial partial (unchanged)
θ (Consensus) docs/3-world/physics/laws/consensus.md none partial ← THIS PR
ι (State Fork) docs/3-world/physics/laws/state-fork.md none none (unchanged)
κ (Rule Engine) docs/3-world/physics/laws/rule-engine.md partial partial (unchanged)
λ (Reputation) docs/3-world/social/reputation.md partial partial (unchanged)
μ (Integrity) docs/3-world/physics/enforcement/integrity.md none none (unchanged)
ν (Integrations) docs/4-additions/index.md partial partial (unchanged)
ξ (Identity) docs/3-world/social/identity.md none none (unchanged)
π (Governance) docs/3-world/physics/enforcement/governance.md none none (unchanged)

Pre-edit total: 10 partial + 5 none = 15/15. Post-edit total: 11 partial + 4 none = 15/15.

The maturity claim in CLAUDE.md §10 follows from this scan; both numbers are authoritative.

MCP tool surface — pre-edit vs post-edit

Source Pre-edit Post-edit
CLAUDE.md §10 “MCP surface is 14 → 18” “MCP surface 14 → 23”
Registered tools (live code) 23 23 (unchanged)

The live code already exposes 23 MCP tools after #244 landed (5 θ tools added: consensus_propose, consensus_vote, consensus_finality, consensus_gossip, vrf_eval); only the narrative in CLAUDE.md §10 lags. This PR pulls the narrative forward.

ADRs cited

  • ADR-002 — VRF Implementation Option A (HMAC-SHA256 internal implementation): shipped as the P3.6.1 VRF stub (#239) per feat(p3-6-1-vrf-stub): HMAC-SHA256 VRF stub + VrfProvider interface (R89 θ Wave 3, ADR-002 Option A). ADR status remains PROPOSED until a separate ADR-acceptance PR formally moves it to ACCEPTED.
  • ADR-003 — BFT Library Option C (two-phase approach — minimal BFT state machine without network transport, in-process gossip spike): shipped across the P3.1.x–P3.3.x family. The 13 sub-tasks compose into the Option C “Phase 3a spike” that ADR-003 itself recommended. ADR status remains PROPOSED until a separate ADR-acceptance PR formally moves it to ACCEPTED.

This PR does NOT modify ADR-002 or ADR-003 status. That is a separate ADR-acceptance PR for a future round.

Spec-drift disclosure (R90+ candidates)

Two drift items were surfaced during P3 implementation that this PR does NOT fix (they are out-of-scope hygiene candidates):

  1. consensus.md L40 honest-majority invariant off-by-one (P3.1.2 audit flagged): q + f = n + 1 - (n mod 3 == 0 ? 1 : 0) symbolically simplifies to q + f = n for all n ≥ 1. Implementation matches lines 25–27 (the canonical formula of record); L40’s restatement needs a doc reconcile.

  2. s06 24h-dispute window vs consensus.md L118 consecutive-rounds (P3.2.1 reconciled operationally — consecutive rounds is the operational rule; the 24h dispute window is a parallel HARD → ABSOLUTE gate). Both rules are correct individually; the doc intersection needs explicit framing.

Both items: R90+ doc-reconcile candidates. Disclosed in the PR body for visibility.

Files to edit

  1. docs/3-world/physics/laws/consensus.md — frontmatter (3 fields) + body lines 16 + 193–198
  2. CLAUDE.md — §10 maturity claim (line 207) + new changelog entry appended
  3. docs/3-world/physics/laws/index.md — preamble line 14 + θ row line 21

Out of scope: task-breakdown.md (no progress tracker to update), colibri-system.md (R75-anchored, future R90 doc-reconcile), roadmap.md (R75-anchored, future R90 doc-reconcile), ADR-002 and ADR-003 status (separate ADR-acceptance PRs).

Total: 3 files edited.

Acceptance criteria for this seal

  • θ frontmatter graduates colibri_code: none → partial, status: spec → partial, phase: 0 → 3
  • θ concept doc Phase 0 posture replaced with Phase 3 reality
  • CLAUDE.md §10 says “11 ship code” + names θ
  • CLAUDE.md §10 MCP surface count is “14 → 23”
  • CLAUDE.md changelog footer has a new R89 Phase B entry
  • laws/index.md preamble says “two ship code, two spec-only”
  • laws/index.md θ row graduates to partial
  • npm run build green
  • npm run lint green
  • npm test regression check — 3087/3087 unchanged
  • PR body discloses ADR-002/003 stay PROPOSED
  • PR body lists 2 spec-drift R90+ candidates

Risks

  • Low. Docs-only PR. No src/ touched. No tests should change.
  • Cache risk: if any test or build step embeds the maturity claim string, it could break. None known.
  • Vault sync: the Obsidian mirror is updated only via temp/sync- full.bat; not part of this PR.

Back to top

Colibri — documentation-first MCP runtime. Apache 2.0 + Commons Clause.

This site uses Just the Docs, a documentation theme for Jekyll.