|
| 1 | +// SPDX-License-Identifier: CC-BY-SA-4.0 |
| 2 | +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 3 | + |
| 4 | += BoJ category-leadership programme — beyond completion |
| 5 | +:toc: |
| 6 | +:toc-placement: preamble |
| 7 | +:icons: font |
| 8 | + |
| 9 | +*Date:* 2026-07-01 · |
| 10 | +*Companions:* `completion-plan-2026-07-01.adoc` (make what exists true and |
| 11 | +working) and `v1-critical-chain-2026-06-11.adoc` (gates G0–G6). This third |
| 12 | +document carries what neither of those does: the security/quality queues, the |
| 13 | +full maintenance taxonomy, the capability war against the wider MCP ecosystem, |
| 14 | +the network build-out, the spec, and the plan to make BoJ the standard others |
| 15 | +are measured against. · |
| 16 | +*Inputs:* four-auditor sweep (security-quality / capability-parity / |
| 17 | +estate-compliance / portfolio-network) over live GitHub queues, the current + |
| 18 | +upcoming MCP specifications, both repos, wikis, and the running network. |
| 19 | + |
| 20 | +== 0. The two findings that reframe everything |
| 21 | + |
| 22 | +1. *BoJ's protocol layer violates BoJ's own truthfulness doctrine.* The bridge |
| 23 | + declares `tools.listChanged` and `logging` capabilities it never delivers |
| 24 | + (`dispatcher.js:302-305`; the emit seam in `http-transport.js:155` is |
| 25 | + unwired; `notifications/message` is never sent). A server whose brand is a |
| 26 | + truthfulness CI gate must not overclaim in its own `initialize` handshake. |
| 27 | + Fix in hours (declare only what is delivered — dropping `logging` is |
| 28 | + forward-correct, the 2026-07-28 MCP release deprecates it) and then extend |
| 29 | + the truthfulness gate to probe the *protocol* surface, not just the |
| 30 | + catalogue. |
| 31 | +2. *The network is a library without a server.* `federation.zig` (3,181 lines) |
| 32 | + + `sdp.zig` (331 lines) + `Federation.idr` (164-line total model) have |
| 33 | + *zero consumers*. The `/umoja/peers` route is specified in openapi.yaml, |
| 34 | + gateway policies, entrypoint bootstrap, tests, and the wiki — and served by |
| 35 | + no process. The `adapter/zig` build target that `stapeln.toml`'s production |
| 36 | + pipeline compiles *does not exist in the repo*. All 4 fly.io seed nodes are |
| 37 | + NXDOMAIN (the v1-critical-chain "4 seed nodes live" claim is stale). One |
| 38 | + thin Zig REST server wiring the existing exports unblocks the entire |
| 39 | + stapeln/cerro-torre/Quadlet/seed story at once (~1–2 weeks). |
| 40 | + |
| 41 | +== 1. Ledger — every raised dimension, answered |
| 42 | + |
| 43 | +[cols="2,4,2",options="header"] |
| 44 | +|=== |
| 45 | +| Dimension raised | Verified state (2026-07-01) | Where it lands |
| 46 | + |
| 47 | +| GitHub security raisings |
| 48 | +| Dependabot: 0 open alerts both repos — but Scorecard's Vulnerabilities |
| 49 | + check is 0/10 with *12 known vulns* (RUSTSEC-2026-0190/-0185 + 10 Erlang |
| 50 | + EEF CVEs) that Dependabot is not surfacing (coverage gap, not cleanliness). |
| 51 | + Code-scanning: *219 open alerts* (boj-server) + *287* (cartridges), mostly |
| 52 | + Hypatia (`zig_ptr_cast` 121+128, structural drift, 40 banned-language in |
| 53 | + the registry). 11 `secret_detected` findings to eyeball (likely |
| 54 | + placeholders; GitLab-PAT-shaped string in `gitlab_api_mcp_ffi.zig` |
| 55 | + untriaged). Neither repo has ANY required status checks — every CI signal |
| 56 | + is advisory. Cartridges lacks `.well-known/security.txt`. |
| 57 | +| §2 programme A |
| 58 | + |
| 59 | +| GitHub quality raisings |
| 60 | +| SonarCloud gates green but: 18+7 vulnerabilities, 10+5 bugs, 289+289 code |
| 61 | + smells, *0.0% coverage reported* (test/proof results never fed to Sonar), |
| 62 | + 1,176 min debt. Scorecard 7.5 / 6.3 (Code-Review 0 structural for a solo |
| 63 | + estate — document, don't chase). |
| 64 | +| §2 programme A |
| 65 | + |
| 66 | +| The Glama annoyance |
| 67 | +| Improved since June: listing CLAIMED, License = Permissive (MPL-2.0) — the |
| 68 | + F is gone. Residual: Quality B (want A), Maintenance C, page still says |
| 69 | + "115+ cartridges"/"100+ tools" vs honest 125/68. Actions: re-sync after |
| 70 | + the honesty sweep, fix response-time/maintenance signals (issue triage |
| 71 | + cadence), republish 0.4.8. |
| 72 | +| §2 A + completion-plan Phase "Now" |
| 73 | + |
| 74 | +| Named-but-unaddressed issues |
| 75 | +| Fully mapped in completion-plan §"Issue map" (boj-server #197–#202, #87, |
| 76 | + #188, #214, #218, #262–264, #67; cartridges #36/#37/#41/#46/#47/#48/#57). |
| 77 | + #186 verified fixed, ready to close. Staged refile awaits O1. |
| 78 | +| completion plan |
| 79 | + |
| 80 | +| Corrective maintenance |
| 81 | +| = the completion plan + programme A (queues) — everything that makes |
| 82 | + current claims true. |
| 83 | +| completion plan, §2 A |
| 84 | + |
| 85 | +| Adaptive maintenance |
| 86 | +| *The big miss until now.* BoJ pins MCP `2024-11-05` — two published |
| 87 | + revisions behind (2025-06-18, 2025-11-25), and the *2026-07-28 release* |
| 88 | + (RC locked) ships a stateless core that removes `initialize`/sessions, |
| 89 | + makes `server/discover` + `.well-known` metadata mandatory, replaces |
| 90 | + sampling/elicitation with MRTR/Tasks, and deprecates `logging`. The |
| 91 | + session-centric transport just built in ADR-0013 PR1 is the architecture |
| 92 | + being deprecated. Also: no Origin-header validation on the HTTP transport |
| 93 | + (2025-11-25 MUST; DNS-rebinding exposure) — hours to fix, do first. |
| 94 | +| §3 programme B |
| 95 | + |
| 96 | +| Perfective maintenance / code optimisation |
| 97 | +| 289+289 Sonar smells, 1.1% dup, toolset gating absent (68 tools always |
| 98 | + shipped burns client context — GitHub MCP's toolsets saved ~23k tokens), |
| 99 | + `structuredContent` never returned despite every tool carrying |
| 100 | + `outputSchema` (mechanical win), coverage wiring, `.md`→`.adoc` backlog |
| 101 | + (grew 77→109). |
| 102 | +| §3 B + §5 E |
| 103 | + |
| 104 | +| Coordination cartridge development |
| 105 | +| 23 `coord_*` tools + 944-line Rust coord-tui + live loopback backend |
| 106 | + (127.0.0.1:7745) exist — but the coordination DSL charter (total-language, |
| 107 | + Idris2 verifying elaborator → frozen plan, algebraic effects, affine QTT |
| 108 | + resources, session types) exists *only in agent memory*, 0% built; today's |
| 109 | + coordination is exactly the unverified imperative layer the DSL was |
| 110 | + designed to replace. |
| 111 | +| §4 programme C (C-1) |
| 112 | + |
| 113 | +| NeSy + agentic server cartridges |
| 114 | +| agentic=5, nesy=2 cartridges; only local-coord has a live backend; |
| 115 | + boj-health-mcp is a shell (no mod.js/adapter/abi); 3 cartridges have zero |
| 116 | + `.idr` despite the "formally verified" pitch; stack-orchestrator-mcp is |
| 117 | + pure TS (breaks the tri-language architecture; also cartridges#46). |
| 118 | +| §4 C (C-2) |
| 119 | + |
| 120 | +| Cartridge portfolio gaps |
| 121 | +| 10 high-demand absences vs the mid-2026 ecosystem (respecting #87's |
| 122 | + deliberate exclusions): filesystem (THE reference server), fetch/scrape, |
| 123 | + Playwright (browser-mcp is Firefox-Marionette only), sandbox code-exec |
| 124 | + (ADR-0009 written, never built), email, calendar, SQLite + MySQL, workflow |
| 125 | + automation (n8n-class), Figma, Google Drive — *gdrive is being built in a |
| 126 | + live branch right now* (`feat/google-drive-mcp-cartridge`). |
| 127 | +| §4 C (C-3) |
| 128 | + |
| 129 | +| Tech debt |
| 130 | +| Deprecated `6a2/` layout in BOTH repos (26+18 file references; estate |
| 131 | + mandate: migrate on sight); boj-server still has `agent_instructions/` |
| 132 | + (mandate: `bot_directives`); cartridges root AI-manifest misnamed |
| 133 | + (`0.1-` at root); ReScript backlog #67; two mint paths (cartridge-minter |
| 134 | + vs Foundry). |
| 135 | +| §5 programme E |
| 136 | + |
| 137 | +| Documentation debt incl. wiki |
| 138 | +| boj-server wiki: 6 pages last touched 2026-03-28 — describes the |
| 139 | + pre-April architecture (removed components). `FUTURE_PLANS.adoc` is |
| 140 | + format-broken generic boilerplate. TEST-NEEDS/ROADMAP frozen at |
| 141 | + 2026-04-25. v1-chain's C3 `OPERATOR.adoc` + S1 operator covenant *do not |
| 142 | + exist*. Cartridges wiki OK (2026-06-01). |
| 143 | +| §5 E |
| 144 | + |
| 145 | +| RSR compliance + ultra-standards |
| 146 | +| *P0: cartridges' `STATE.a2ml` is verbatim rsr-template-repo boilerplate* |
| 147 | + ("project = rsr-template-repo, 95% complete") — machine-readable |
| 148 | + disinformation to every bot that reads it. boj-server STATE/ROADMAP claim |
| 149 | + "4 fly.io seeds live" (false — NXDOMAIN). Standards reusable pins lag head |
| 150 | + ~1 week and cartridges mixes two pin SHAs. CANONICAL-NAMES: clean. |
| 151 | +| §5 E |
| 152 | + |
| 153 | +| Network / SDP / stapeln / sharing |
| 154 | +| See §0(2). Containerisation itself is genuinely mature (hardened Quadlet, |
| 155 | + cerro-torre signing, svalinn/vordr verification, stapeln repo active) — |
| 156 | + all pointed at the missing binary. |
| 157 | +| §6 programme D |
| 158 | + |
| 159 | +| Proof / engineering / UX debt |
| 160 | +| Proofs: healthy core (105/105) + #197/#36/#37 as planned; add: 3 idr-less |
| 161 | + cartridges, orchestration TS exception needs an ADR. UX: coord-tui v0.2/3 |
| 162 | + roadmap open; tray + PanLL cut from v1 (ratify as O6/O7). |
| 163 | +| completion plan + §4 C |
| 164 | + |
| 165 | +| Enhance / compliance / effects |
| 166 | +| = programme F: the differentiators made legible (proof-carrying |
| 167 | + attestation, conformance suite, spec). |
| 168 | +| §7 programme F |
| 169 | + |
| 170 | +| Meet/exceed best-practice servers |
| 171 | +| Parity matrix vs GitHub MCP (the category leader) + spec surface: BoJ |
| 172 | + AHEAD on annotations+outputSchema (every tool), proofs, trust tiers, |
| 173 | + truthfulness gate, LSP/DAP/BSP surface; BEHIND on protocol revision, |
| 174 | + OAuth, toolsets/read-only mode, structuredContent, completions/templates/ |
| 175 | + subscriptions, remote-hosted option, Origin validation. |
| 176 | +| §3 B + §7 F |
| 177 | + |
| 178 | +| Finalised spec written up? |
| 179 | +| *No.* It exists as 16 ADRs + 42KB openapi.yaml + AUTH-DESIGN + cartridge |
| 180 | + spec dir + a DSL charter in agent memory. §7 F-1 consolidates into a |
| 181 | + versioned BoJ Specification. |
| 182 | +| §7 F |
| 183 | + |
| 184 | +| Plan to make it the new standard? |
| 185 | +| *Now yes* — §7: spec + conformance suite + proof-carrying attestation as |
| 186 | + a registered MCP extension + registry/JOSS/site visibility. |
| 187 | +| §7 F |
| 188 | +|=== |
| 189 | + |
| 190 | +== 2. Programme A — security & quality queue burn-down (corrective) |
| 191 | + |
| 192 | +*A-1 (P0, hours→day)* Patch the 12-vuln cluster: bump the two RUSTSEC crates |
| 193 | ++ Erlang/OTP baseline; verify Scorecard Vulnerabilities check recovers; find |
| 194 | +why Dependabot missed them (lockfile indexing) and fix that coverage gap. |
| 195 | +*A-2 (P0, hours)* Required status checks: the completion plan flips them ON |
| 196 | +for the registry after the Foundry pilot; add the missing half — boj-server |
| 197 | +itself (proofs, truthfulness, e2e, zig) — as an explicit owner-ratified |
| 198 | +ruleset change (O4). |
| 199 | +*A-3 (P1, hours)* Triage the 11 `secret_detected` (expect placeholders; the |
| 200 | +GitLab-PAT-shaped string first), then enable non-provider patterns + |
| 201 | +validity checks in GitHub secret scanning on both repos. |
| 202 | +*A-4 (P1, days)* Hypatia alert classes, not instances: one baseline decision |
| 203 | +for `zig_ptr_cast` (121+128), fix the 5 TokenPermissions + remaining |
| 204 | +timeout warnings, curate SD022/CSA001 meta-noise, resolve the registry's 40 |
| 205 | +`banned_language_file` before O2 canonicalisation imports the debt. |
| 206 | +*A-5 (P2, day)* Sonar: pull the 25 vulnerability issues, fix/won't-fix; wire |
| 207 | +proof-suite + ExUnit coverage into the scan so 0.0% stops libelling the |
| 208 | +best-tested repo in the estate; burn the top smells. |
| 209 | +*A-6 (P2, minutes)* `security.txt` for cartridges; review+merge Dependabot |
| 210 | +PR cartridges#67. |
| 211 | + |
| 212 | +== 3. Programme B — adaptive maintenance: the protocol war (the "meet" half) |
| 213 | + |
| 214 | +*B-1 (P0, hours)* Truthful capabilities: stop declaring `listChanged`/ |
| 215 | +`logging` until wired; extend truthfulness gate to the protocol handshake. |
| 216 | +*B-2 (P0, hours)* Origin-header validation → 403 (spec MUST, real vuln |
| 217 | +class); update ADR-0013 status (it still says "Proposed" with PR1 shipped). |
| 218 | +*B-3 (days)* Version negotiation + `MCP-Protocol-Version` header; declare |
| 219 | +2025-06-18 floor; adopt 2025-11-25 (JSON Schema 2020-12, icons, serverInfo |
| 220 | +description → surface the proof manifest there). |
| 221 | +*B-4 (days)* The mechanical wins: return `structuredContent` (schemas |
| 222 | +already exist); `completion/complete` for the 5 prompts' enum args; |
| 223 | +`boj://cartridge/{name}` resource template; SSE resumability |
| 224 | +(Last-Event-ID). |
| 225 | +*B-5 (days)* Toolset gating (`BOJ_TOOLSETS`, groupings already implicit in |
| 226 | +tool-name prefixes) + `BOJ_READ_ONLY` keyed off existing `readOnlyHint` — |
| 227 | +context-cost parity with GitHub MCP. |
| 228 | +*B-6 (weeks, after 2026-07-28 final)* Stateless core adoption: |
| 229 | +`server/discover` + `.well-known` metadata, `_meta`-carried context, Tasks |
| 230 | +for long-running work, MRTR replacing the never-built sampling/elicitation |
| 231 | +plans (rewrite ADR-0012 BEFORE implementing it). Note: statelessness makes |
| 232 | +Workers deployment (#87 item 14) and federation dramatically easier — do |
| 233 | +not build more session machinery in the meantime. |
| 234 | +*B-7 (weeks)* OAuth 2.1 resource-server metadata for exposed mode — the |
| 235 | +auth bar every remote-server leader now ships; folds into B1/AUTH-DESIGN. |
| 236 | + |
| 237 | +== 4. Programme C — cartridge portfolio + cross-cutting development |
| 238 | + |
| 239 | +*C-1 Coordination (the DSL).* First act (hours): land the charter from |
| 240 | +agent memory as `docs/decisions/0017-coordination-dsl.md` (or ADR number |
| 241 | +next free) so it survives. Phase-1 spike (1–2 weeks): elaborate ONLY the |
| 242 | +existing claim→lease→progress→commit handshake through an Idris2 |
| 243 | +elaborator to a frozen plan replayed by the existing Zig adapter — the |
| 244 | +live loopback backend becomes the first verified consumer. |
| 245 | +*C-2 NeSy/agentic/health hygiene (1–2 days):* boj-health-mcp gets a real |
| 246 | +dispatch surface or `available:false`; minimal `abi/*.idr` for the 3 |
| 247 | +proof-less cartridges; ADR recording (or ending) stack-orchestrator's TS |
| 248 | +exemption. |
| 249 | +*C-3 Portfolio waves (days each, via Foundry once Configure lands):* |
| 250 | +sequence by demand — filesystem, fetch, playwright, sqlite, email, sandbox |
| 251 | +(ADR-0009 already designed), calendar, gdrive (in flight on a live branch), |
| 252 | +figma, n8n-class automation. File as one tracked epic mirroring #87 so it |
| 253 | +fans in. Payments/CRM stay excluded (#87). |
| 254 | + |
| 255 | +== 5. Programme E — compliance, docs, wiki (perfective + estate) |
| 256 | + |
| 257 | +*E-1 (P0, ~half-day, one PR per repo)* The descriptiles migration: |
| 258 | +`.machine_readable/6a2/` → `descriptiles/` both repos + textual sweep |
| 259 | +(26+18 refs); `agent_instructions/` → `bot_directives/` (boj-server); |
| 260 | +root AI-manifest rename (cartridges); *rewrite cartridges' STATE.a2ml with |
| 261 | +real facts* and correct boj-server STATE/ROADMAP's dead-seed claims. |
| 262 | +*E-2 (half-day)* Docs pruning: delete/supersede FUTURE_PLANS.adoc, refresh |
| 263 | +ROADMAP "Current Status" + TEST-NEEDS stamps, archive April handover logs. |
| 264 | +*E-3 (1–2 days)* Write `docs/quickstarts/OPERATOR.adoc` + the operator |
| 265 | +covenant (v1-chain C3/S1) — blocked only on D-1 images for testability. |
| 266 | +*E-4 (half-day)* Wiki: refresh boj-server's 6 pages against current |
| 267 | +architecture or gut to a pointer page — owner pick (O10). |
| 268 | +*E-5 (hours)* Re-pin standards reusables to one current SHA in both repos; |
| 269 | +retire scorecard-enforcer.yml per estate decision. |
| 270 | +*E-6 (ongoing)* `.md`→`.adoc` conversion (109 files; skip README.md — it is |
| 271 | +deliberately Markdown for registries); CONTRIBUTING expansion (dogfood + |
| 272 | +truthfulness gate expectations). |
| 273 | + |
| 274 | +== 6. Programme D — the network (SDP/stapeln/sharing build-out) |
| 275 | + |
| 276 | +Ordered; each step unblocks the next: |
| 277 | + |
| 278 | +*D-1 (1–2 weeks, THE keystone)* Write the missing `adapter/zig` REST server |
| 279 | +linking `federation.zig` + `sdp.zig`: serve `/umoja/peers` + `/health`, |
| 280 | +satisfy `stapeln.toml`'s build target. Unblocks: cerro-torre signed builds, |
| 281 | +the hardened Quadlet operator path, `tests/federation_multinode.sh`, seed |
| 282 | +redeploy. |
| 283 | +*D-2 (~1 day)* Redeploy the 4 seeds (`container/fly/deploy-seeds.sh` + |
| 284 | +fly.toml files exist); resolve the hyperpolymath.dev DNS delegation or |
| 285 | +re-alias; correct the v1-chain doc's stale "seeds live" line. |
| 286 | +*D-3 (days)* Enforce catalogue-hash attestation on peer admission |
| 287 | +(`boj_federation_check_sync` exists, unused) — the "sharing with |
| 288 | +verification" moment. |
| 289 | +*D-4 (weeks, post-v1)* ADR-0010 DID + ML-KEM identity; request |
| 290 | +routing/load-sharing between nodes (currently only membership/gossip |
| 291 | +primitives exist). The v1 cut remains "constellation, not mesh" (O7) — but |
| 292 | +D-1..D-3 make the constellation REAL rather than aspirational. |
| 293 | + |
| 294 | +== 7. Programme F — the standard play (the "exceed" half) |
| 295 | + |
| 296 | +*F-1 The BoJ Specification v1 (1–2 weeks writing).* One versioned doc-set |
| 297 | +consolidating: protocol surface (bridge contract + transports + auth |
| 298 | +postures), the cartridge model (manifest schema, tri-language ABI, trust |
| 299 | +tiers, truthfulness semantics), the Foundry pipeline (mint→provision→ |
| 300 | +configure→harness with the no-dropped-proofs guarantee), the coordination |
| 301 | +DSL charter, and the federation/attestation model. Publish in-repo + |
| 302 | +rendered on the site. This answers "do we have our finalised spec" — today |
| 303 | +we do not; after F-1 we do. |
| 304 | +*F-2 ADR-0017: proof-carrying capability attestation (the moat).* Spec an |
| 305 | +MCP *extension* (reverse-DNS id `net.boj-server.attestation`, the |
| 306 | +2026-07-28 extensions framework is the sanctioned vehicle): a signed |
| 307 | +`.well-known` metadata document embedding hashes of the Idris2 proof |
| 308 | +artefacts + per-tool contracts cross-referenced to the ABI modules that |
| 309 | +prove them, so any client can verify offline that the declared capability |
| 310 | +surface is machine-checked. No other server can copy this without doing |
| 311 | +the proofs. This is what "nextgen MCP+LSP+++" concretely means. |
| 312 | +*F-3 Conformance suite ("BoJ-grade").* Generalise the truthfulness gate |
| 313 | +into a runnable benchmark any MCP server can be pointed at: does your |
| 314 | +server deliver every capability it declares? Publish it; score the |
| 315 | +leaders; BoJ passes by construction. Standards adoption follows the tool, |
| 316 | +not the whitepaper. |
| 317 | +*F-4 Visibility.* MCP Registry listing (#188) + `server.json`; Glama |
| 318 | +re-sync post-honesty-sweep; the JOSS paper (#87 item 12 — |
| 319 | +cross-cartridge composition proof is the publishable core); site refresh |
| 320 | +with generated counts; the Foundry screencast (v1-chain D4). |
| 321 | + |
| 322 | +== 8. New owner decisions (extends the completion plan's O1–O9) |
| 323 | + |
| 324 | +[cols="1,5,2",options="header"] |
| 325 | +|=== |
| 326 | +| # | Decision | Recommendation |
| 327 | +| O10 | Wiki: refresh vs gut-to-pointer (boj-server) | Gut to pointer; |
| 328 | + docs/ is canonical |
| 329 | +| O11 | `zig_ptr_cast` (249 alerts): baseline as FFI-idiomatic vs refactor | Baseline with |
| 330 | + a documented justification |
| 331 | +| O12 | Code-Review=0 Scorecard stance (solo estate, self-merged PRs) | Document in |
| 332 | + SECURITY.md, don't chase |
| 333 | +| O13 | MCP 2026-07-28 adoption timing (stateless core rewrite window) | Adopt within 4–6 |
| 334 | + weeks of final; freeze session-machinery work now |
| 335 | +| O14 | Portfolio wave order + whether filesystem/playwright jump the |
| 336 | + Foundry queue (hand-build vs wait for Configure) | Wait for Configure |
| 337 | + (weeks away at most); gdrive branch proceeds as-is |
| 338 | +|=== |
| 339 | + |
| 340 | +== 9. Sequencing across all three documents |
| 341 | + |
| 342 | +Hours-class P0s first (B-1 truthful capabilities, B-2 Origin, A-1 vulns, |
| 343 | +E-1 descriptiles+STATE truth) — none conflict with the completion plan's |
| 344 | +"Now" window and several are its prerequisites. Then the two keystones in |
| 345 | +parallel: Foundry Configure (completion plan) and D-1 adapter/zig (this |
| 346 | +doc). Then B-3..B-5 protocol parity + C-3 portfolio waves through the |
| 347 | +Foundry. F-1 spec writing can start immediately (it consolidates what |
| 348 | +exists); F-2/F-3 target the 2026-07-28 extensions framework. The firefight |
| 349 | +is won when F-3's conformance suite is public and BoJ is the only server |
| 350 | +that passes its own test — verified honesty as the category boundary. |
0 commit comments