All notable changes to Bundle of Joy Server are documented here.
- README install section expanded to cover every major MCP client: Claude Code, Claude Desktop, Gemini CLI, GitHub Copilot (VS Code), Cursor, Cline, Windsurf, Continue.dev, Zed, plus a generic stdio template. Copy-paste-ready snippets for each client's config-file path.
- Runtime documentation corrected: clone-and-configure path now lists Deno
(preferred per CLAUDE.md policy), Bun, and Node as equally valid runtimes for
mcp-bridge/main.js. Spuriousnpm installstep removed —package.jsondeclares zero runtime dependencies, so no install is ever required.
- This is the release that publishes the AAA-tier tool descriptions to npm.
The description rewrite landed in
25887157/ad837abeafter 0.4.1 but was never npm-published; downstream MCP clients (and Glama's quality scoring) were running 0.4.1 with the older one-liner descriptions. Republishing as 0.4.7 ships the rich Purpose / Behavior / Returns / Errors / Usage text on every tool and the per-parameterdescriptionfields with patterns/enums.
k8s/networkpolicy.yaml— defence-in-depthNetworkPolicyrestricting BoJ pod ingress to pods labelledapp: http-capability-gateway. Stacks on top of the ClusterIP Service (#131) and Cowboy/Zig loopback binds (#130/#132): three independent layers must be violated before BoJ's back-side surface is reachable from anywhere other than HCG. Optional — Phase E acceptance does not require it; CNI plugins without NetworkPolicy enforcement (e.g. flannel without VXLAN) silently treat it as a no-op. Override pattern documented in the manifest header for non-HCG-fronted deployments. Closes #135. Refshyperpolymath/standards#100,#91.
-
HCG tier-2 rollout runbook refreshed (v0.1 → v0.2) in
docs/integration/hcg-tier2-rollout-runbook.mdto reflect the post-Phase-D state of the single-lane channel rooted athyperpolymath/standards#91. §1.1 (Phase D deliverables) ticks D-1/D-2/D-3 + D-4 bootstrap + the cross-repo D-1 load-profile (boj-server#168) with PR references; calls out the remaining owner-driven D-4 rebaseline +_statusflip as the single open item. §1.4 (BoJ-side prereqs) ticks the loopback bind layers (#130/#131/#132), the Phase CTrustPolicy.satisfies?/3clause (#106), the NetworkPolicy (#173), and the SSE-route policy coverage (#165). §1.5 (gateway-side prereqs) ticks the newcontainer/gateway-deploy.k9.ncl(http-capability-gateway#38) and records what's still placeholder until cerro-torre signing runs. Header banner replaces the stale Phase-D-scaffold-only note with current state. Refshyperpolymath/standards#100,#91. -
Repository documentation reorganised to match rsr-template-repo taxonomy. Root-level
.adocclutter eliminated; all docs now live underdocs/subdirectories clustered by purpose (quickstarts/,wikis/,architecture/,status/,developer/,governance/,decisions/,specification/,integration/,backend-assurance/,compliance/,practice/,proposals/,attribution/,accessibility/,papers/,examples/,glama/,outreach/,handover/,maintenance/). Each subdirectory has its ownREADME.adocindex. High-coupling root files (PROOF-NEEDS.md,TOPOLOGY.md,TEST-NEEDS.md) stay at root pending follow-up PR to update their 16/11/5 cross-references. -
README.mdmerged intoREADME.adocand dropped. Single canonical root README in AsciiDoc. Preserves the full 11-client MCP install matrix (Claude Code, Claude Desktop, Gemini CLI, Copilot, Cursor, Cline, Windsurf, Continue.dev, Zed, generic stdio) and collapsible cartridge tables via[%collapsible]blocks. -
All
docs/*.mdfiles converted to.adoc(format only; content preserved). Affected files:ARCHITECTURE.md→docs/architecture/README.adoc,DEVELOPERS.md→docs/developer/README.adoc,OPERATOR-QUICKSTART.md→docs/quickstarts/MAINTAINER.adoc,DEVELOPER-QUICKSTART.md→docs/quickstarts/DEV.adoc, and 8 others.docs/wikis/sources fully converted and expanded (Home, User-Guide, Operator-Guide, Developer-Guide, FAQ all in.adoc). -
docs/README.adocrewritten with reading-order-by-audience table, full directory taxonomy, standalone-docs table, and rationale for the three high-coupling deferred moves. -
New subdir index files:
docs/quickstarts/README.adoc,docs/wikis/README.adoc,docs/status/README.adoc— each explains its subdirectory's scope and contents. -
STATE.a2ml cartridge count corrected: was 112, actual is 125 (verified by
find cartridges -name cartridge.json | wc -l). Session log entry added documenting all 2026-05-26 work.
-
Cowboy listener now binds to
127.0.0.1by default (was: all interfaces). Configurable via theBOJ_BIND_IPenvironment variable; invalid values fail-fast at boot rather than silently falling back to0.0.0.0. This is the code-enforced expression of the ADR-0004 §1 invariant that BoJ's back-side bind is not externally routable in deployments fronted byhttp-capability-gateway(HCG tier-2). Phase E rollout-runbook §1.4 prerequisite #6. Legacy/standalone deployments that want all-interfaces exposure must now opt in explicitly (BOJ_BIND_IP=0.0.0.0orBOJ_BIND_IP=::). Refshyperpolymath/standards#100,#91. -
k8s Service for BoJ is now
type: ClusterIP(was:LoadBalancer). Per ADR-0004 §1 and the Phase E rollout-runbook §1.4 prereq #8, BoJ must not be externally addressable when fronted byhttp-capability-gateway(HCG tier-2). External clients reach HCG; HCG forwards to BoJ over the pod-network loopback. Legacy/standalone deployments that need BoJ exposed externally should overridetypein a kustomize/helm overlay rather than reverting the canonical manifest (see header comment ink8s/service.yaml). Addshyperpolymath.dev/exposure: "internal-only"andhyperpolymath.dev/external-via: "http-capability-gateway (tier-2)"annotations so the posture is discoverable fromkubectl describe. Refshyperpolymath/standards#100,#91. -
Container
APP_HOSTdefault is now127.0.0.1(was:"[::]"IPv6 all-interfaces). Tightens three sites that feed the Zig adapter binary's--hostflag:stapeln.toml [targets.production],container/entrypoint.sh, andcontainer/compose.prod.yaml. Same Phase E posture as the Cowboy bind change in the Elixir path: BoJ binds loopback by default when fronted byhttp-capability-gateway(HCG tier-2). Legacy/standalone deployments without HCG in front should overrideAPP_HOST=0.0.0.0(IPv4 all-interfaces) orAPP_HOST=::(IPv6 all-interfaces) in their deployment config. Phase E rollout-runbook §1.4 prereq #7. Refshyperpolymath/standards#100,#91.
-
ADR-0014 — cross-cartridge composition safety (RFC) — frames the unresolved research question that the per-cartridge ABI proofs do not compose automatically across
boj_cartridge_invoke. Defines composition safety as a two-level contract: a static Idris2 envelope (Boj.Composition.InvocationOfliftingIsUnbreakable+ProtocolMatch- per-cartridge
ArgsContractinto the inter-cartridge call) and a dynamic Nickelcompositionsblock in ADR-0007'spolicy-mcpPDP. First proof pair ispanic-attack-mcp → vordr-mcp(both cartridges exist on disk); the prompt-suggestedpanic-attack → sandbox → vordrchain is parked behind ADR-0009'ssandbox-mcpbuild-out.
- per-cartridge
-
README "Formal verification" section — surfaces the audited posture outside
PROOF-NEEDS.mdso external readers can see, without digging, that all P1/P2 obligations are closed with constructive proofs and that the remainingbelieve_meinvocations are principled assumptions over Idris2 primitives, not unproven debt. -
Streamable HTTP transport (ADR-0013, PR1 of 2) — MCP bridge now selects between stdio (default),
http, andbothviaBOJ_TRANSPORT. HTTP endpoints:POST /mcpfor JSON-RPC,GET /mcpfor the server-initiated SSE notifications stream,DELETE /mcpfor explicit session teardown,GET /healthzfor liveness. Sessions are server-issued UUIDs in theMcp-Session-Idheader; the manager expires idle sessions after 30 min and fans events out across attached SSE streams. Auth:none(loopback only — refuses non-loopback binds) orbearer(token list viaBOJ_HTTP_AUTH_TOKENS). The samehardeningGateruns on every request. Zero new deps — built onDeno.serveandnode:http. mTLS / OIDC auth and the Cloudflare Workers / Durable-Objects shim are owed in PR2. -
boj://capabilities/deploymentresource — reports per-deployment cartridge availability so clients can avoid invoking host-local-only cartridges (browser-mcp, container-mcp, local-coord-mcp, sandbox-mcp, ffmpeg-mcp) against a Worker / remote-HTTP deployment. -
k9iser-mcp cartridge — reference implementation of the
-iserregeneration-cartridge pattern (central K9 contract regeneration), mirroring ssg-mcp:cartridge.json,mod.js, Idris2 ABI, Zig FFI, panels. -
Unified transaction-gated adapter: one internal/loopback listener, protocol-routed REST + SSE + GraphQL + gRPC-compat → single dispatch → one Zig ABI. Replaces the ssg-era 3-parallel-port anti-pattern; the trust gate runs before every dispatch, mirroring the Idris2
exposureSatisfiedcontract (no gatekeeperless path). Internal-only behindhttp-capability-gatewayper ADR-0004. -
boj-rest SSE surface:
POST /cartridge/:name/sseon the same single Cowboy listener and trust-gated dispatch,text/event-stream.
- Doc reconciliation to ADR-0004:
elixir/README.adoc,mcp-bridge/api-clients.js, andOPERATOR-QUICKSTART.mdcorrected to the verified runtime + ADR-0004 tiered model (they previously and wrongly described it as "skeleton/501/pending rewrite").
-
Boj.SafeAPIKey.logSafeBoundedrebuilt for Idris2 0.8.0. The pre- existing proof did not type-check onmain; the 2026-05-18 audit's claim thatSafeAPIKeycarried constructive proofs closing BJ2-partial was a desk-read, not a build. Three independent defects: (1) removed the redundant localplusLteMonotonehelper (called now-gonelteTransitiveand used wrong arg order onplusLteMonotoneRight/Left; stdlib'sData.Nat.plusLteMonotonehas exactly the needed shape); (2) lifted both short and long paths out of thewith-block (the elaborator doesn't reducelength "***"at type level inside awith-block — goal stays asLTE (integerToNat (prim__cast_IntInteger (prim__strLength (if ...)))) 11with theif-arm unreduced); (3) right-associated the long-path proof to match++'s associativity (a ++ b ++ c = a ++ (b ++ c)). Plus two bound-name typos intoLogSafeShortEq/toLogSafeLongEq. All 12 safety modules now build green via per-moduleidris2 --check. No newbelieve_meaxioms. -
tests/aspect_tests.shgrep-count bash bug.Aspect — Thread Safety + ABI Contract + SPDXhad been red onmain, gating every PR withtests/aspect_tests.sh: line 77: [[: 0\n0: syntax error in expression. Root cause:grep -c 'pattern' file 2>/dev/null || echo "0".grep -calways prints the count (including0) and exits non-zero on no-match, so|| echo "0"also fires —has_exportends up"0\n0"and[[ "0\n0" -gt 0 ]]chokes on the newline in arithmetic context. Swapped|| echo "0"→|| trueon all four call-sites. -
Honest framing of the ABI axiom count.
src/abi/Boj/SafetyLemmas.idr's module docstring claimed "Three axiomaticbelieve_meprimitives" while five live in the file. Docstring now enumerates all five and tags each to its underlyingprim__*primitive.appendLengthSumandsubstrLengthBoundalso had(x y : T)multi-binder syntax that Idris2 0.8.0 rejects at parse time — comma-separated form(x, y : T)restores parsability. Types and proof terms unchanged. The 2026-05-18PROOF-NEEDS.mdaudit (5 axioms, all class (J) — irreducible over Idris2 primitives, principled assumptions not unproven debt) is now consistent with the source and surfaced via the new README "Formal verification" section. -
dogfood-gate.ymlfailed YAML validation at startup (0 s, no jobs) on every branch includingmain: an inlinepython3 -c "block placed Python source at column 1 inside arun: |block scalar, terminating the scalar early. Because Dogfood Gate is a required status check, this silently blocked every PR in the repo. The validator now lives in.github/scripts/validate-eclexiaiser.pyand is invoked from the workflow.
Verification (k9iser-mcp): Elixir suite 177/177 (incl. 2 SSE tests); Zig ffi 16/16 and unified adapter 5/5 (exposure-gate truth table mirroring the Idris2 contract);
idris2 --check K9iserMcp/SafeK9iser.idrpasses. http-capability-gateway production-wiring (ADR-0004 tier-2) and the iseriser-scaffold rollout remain out of scope and separately tracked.
- zig banned estate-wide (2026-04-10): Adapter layer language policy updated.
zig is no longer an accepted cartridge adapter language. Zig is the default
replacement for the adapter tier (
ffi/zig/remains; V adapter files were swept in commit c4674f8). Historical zig API interfaces have been moved todeveloper-ecosystem/v-ecosystem/v-api-interfaces/v-<name>/for potential donation to the V community — they are not HP infrastructure. - Cartridge manifests = Nickel (prior closed decision
boj-cartridge-manifest-format-dd.md): The authoritative cartridge manifest format is Nickel (.ncl). Current on-disk manifests arecartridge.json; migration to Nickel is tracked as future work (see open question in ADR-0002). - BoJ-only MCP rule (standing estate policy): All MCP access to hyperpolymath
services MUST route through BoJ. Standalone MCPs outside BoJ are not permitted.
Added explicit citation in
docs/FEDERATION.md. - Unified-zig-api stack alignment (planned): BoJ will consume
developer-ecosystem/zig-api/— the unified Idris2 ABI + Zig runtime + C adaptor- proven-backed path safety stack.
UNIFIED-ZIG-API-STACK.adocindeveloper-ecosystem/is the canonical reference. BoJ does not yet calllibzig_apiin code; alignment is tracked in ADR-0002 as future work. First estate consumers wired on 2026-04-17: lol-gateway (commits dbb475f/26b6b8c), aerie (e0b17f8), emergency-button/emergency-room (4bd070b), proven→zig-api path-safety wiring (6663956), gen-header CI drift check (0d6a814).
- proven-backed path safety stack.
- ADR-0002 added: Documents the decision to align BoJ with the unified-zig-api stack, with explicit status of current zig adapter retirement and Zig migration.
- Consolidated boj-server-mistral and boj-server-gemini into unified repo
- PanLL ReScript/TEA UI components (BojModel, BojEngine, Boj, BojModule)
- Gemini CLI extension support (gemini-extension.json, GEMINI.md)
- 9 architecture docs: Quantum Security, HSM Integration, Cartridge Marketplace, BoJ OS, Formal Verification, Type Safety, Zero Trust, SDP Architecture, Gossip Protocol
- Cartridge tools specification (Minter, Provisioner, Configurator, Panel Harness)
- Intentfile and Mustfile (contractile invariant declarations)
- Farm/fleet enrollment configs
- EXHIBIT-A (Ethical Use) and EXHIBIT-B (Quantum-Safe Provenance)
- Hypatia vulnerability-scanning and dependency-update rules
- Constant-time comparison in webhook HMAC verification (timing attack prevention)
- .mcp.json version aligned to 0.3.0
- package.json license corrected to MPL-2.0
- SPDX headers added to all new files
- boj-server-gemini repo (consolidated, deleted from GitHub)
- boj-server-mistral repo (consolidated, deleted locally)
- Thread-safety hardening:
std.Thread.Mutexon all 9 FFI modules (55 globals, ~120 exports) - 2 thread-safety seam checks (concurrent register+query, concurrent mount+unmount)
- panic-attack assail validation (1 expected weak point in QUIC crypto, 0 critical)
- Third-axis extensibility (backend/provider dimension) with extension.a2ml template
- MCP stdio bridge (
boj-server --mcp, JSON-RPC 2.0, all 18 cartridges as MCP tools) - Seam checks module (15 panic-attack-style integration contract tests)
- SLA monitoring (3-tier: community/standard/premium, percentile tracking, 11 tests)
- Community cartridge submissions (Ayo tier, review state machine, 11 tests)
- Auto-SDP perimeter (zero-trust, allow-list, auto-ban, 10 tests)
- 4-continent seed node configuration (EU-West, EU-Central, US-East, AP-South)
- QUIC-first transport (X25519+ChaCha20-Poly1305, backward compatible, 10 tests)
- Multi-node federation testing (11 tests, REST API peering)
- Coprocessor dispatch (Axiom.jl-style: detect→select→dispatch→fallback, 14 tests)
- Podman secure instance (quadlet + seccomp + read-only rootfs)
- docs/API-CONTRACT.md — stable API surface
- docs/GETTING-STARTED.md — clone→build→run→test→extend
- docs/EXTENSIBILITY.md — third axis and extension mechanism
- V 0.5.0 http.Server auto-bind broken → pre-bind with net.listen_tcp
- Duplicate linker symbols (loader includes catalogue transitively)
- Deadlock in coprocessor select_by_name (calls selectDevice directly under mutex)
- Core catalogue ABI (Idris2) with IsUnbreakable proof gate
- Core catalogue FFI (Zig) with C-ABI exports
- Dynamic loader with SHA-256 hash verification
- Guardian resource-aware failure tolerance (12 tests)
- zig triple adapter (REST 7700 + gRPC 7701 + GraphQL 7702)
- 18 cartridges: database, fleet, nesy, agent, cloud, container, k8s, git, secrets, queues, iac, observe, ssg, proof, lsp, dap, bsp, feedback
- All 18 cartridges with ABI + FFI + Adapter + .so shared library builds
- Umoja federation with QUIC+UDP gossip protocol (40 tests)
- VeriSimDB backing store integration (7 tests)
- PanLL BoJ panel (887 lines, 5 tabs)
- Containerfile (Chainguard base), compose.toml, vordr.toml
- CI pipeline (zig-test.yml)
- Configurable ports via environment variables