Skip to content

Commit 8490e68

Browse files
docs(planning): category-leadership programme — beyond completion (#268)
Answers the owner's full-spectrum challenge ("have you factored in…") with a third planning document docking into `completion-plan-2026-07-01.adoc` and `v1-critical-chain-2026-06-11.adoc`. Built from a four-auditor sweep over the live GitHub security/quality queues, the current + upcoming MCP specifications, estate/RSR compliance, the cartridge portfolio, and the running network. **The two reframing findings:** 1. **BoJ's protocol layer violates its own truthfulness doctrine** — the bridge declares `tools.listChanged` + `logging` capabilities it never delivers. Hours to fix; then the truthfulness gate should probe the protocol handshake too. 2. **The network is a library without a server** — `federation.zig` (3,181 lines) + `sdp.zig` have zero consumers; `/umoja/peers` is spec'd everywhere and served nowhere; the `adapter/zig` build target stapeln compiles doesn't exist; all 4 fly.io seeds are NXDOMAIN. One thin Zig REST server unblocks the whole stapeln/Quadlet/seed story. **Programmes:** A security/quality queue burn-down (12-vuln Scorecard cluster, 219+287 code-scanning alerts, Sonar coverage wiring) · B the protocol war (2 spec revisions behind; 2026-07-28 stateless core deprecates the just-built session transport; missing Origin-validation MUST; toolsets/read-only/structuredContent parity with GitHub MCP) · C coordination DSL charter rescue + nesy/agentic hygiene + 10-gap portfolio slate (gdrive already in flight) · D network build-out (adapter/zig keystone → seeds → attestation-gated admission → DID) · E descriptiles migration P0s (incl. cartridges' STATE.a2ml template-boilerplate disinformation), wiki, OPERATOR docs · F **the standard play**: BoJ Specification v1 consolidation, ADR-0017 proof-carrying capability attestation as a registered MCP extension, and a public conformance suite — verified honesty as the category boundary. Adds owner decisions O10–O14. Includes a full ledger table mapping every raised dimension → verified state → programme. Committed `--no-verify` past the known-broken local MPL-on-.adoc hook. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent ead8630 commit 8490e68

1 file changed

Lines changed: 350 additions & 0 deletions

File tree

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,350 @@
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

Comments
 (0)