Skip to content

Commit f914ee2

Browse files
fix: repair allTake proof break; MPL-2.0 licensing; Markdown README; reconcile counts (125/68/0.4.7) (#256)
## Summary Three independent fixes — split for review — that lift BoJ's Glama grades and repair a **real proof break** that was sitting in `main`. ### 1. `fix(abi)` — duplicate `allTake` proof (`daf8129a`) `src/abi/Boj/SafetyLemmas.idr` defined `allTake` twice (a merge artifact; both clauses prove the identical proposition, differing only in implicit-arg order), so the core `boj.ipkg` failed to type-check. Removed the redundant copy. **Proof gate: `PASS=104 FAIL=1` → `PASS=105 FAIL=0`**; trusted base unchanged (5 sanctioned class-(J) axioms). ### 2. `chore(license,packaging)` — MPL-2.0, Markdown README, npm hygiene (`04cdf2fa`) - Restore `MPL-2.0` in `package.json` (the published `0.4.7` is already MPL; the working-tree `AGPL-3.0-or-later` was a regression) and switch 6 sub-manifests AGPL→MPL (`elixir/mix.exs`, `coord-tui`/`tray` `Cargo.toml`, three `tools/*` packages). `cartridges/idaptik-admin-mcp` intentionally left AGPL. - Rewrite `README.md` as real GitHub-Flavored Markdown — it was AsciiDoc markup in a `.md` file, which renders garbled on GitHub/npm/Glama. - Add a `files` whitelist (npm tarball ~10.5 MB → ~0.9 MB); fix the `main.js` shebang (`deno run` → `node`) so `npx` runs; add `.gitattributes` linguist overrides so the repo stops being detected as "Zig". ### 3. `docs(metadata)` — reconcile counts to one source of truth (`14a43ee6`) **125 cartridges** (= `cartridge.json` count = live `boj_menu`), **68 tools** (45 `boj_*` + 23 `coord_*`), **v0.4.7**. Completed the smithery `tools:` table 18 → 68 (generated from the live `tools/list`); replaced the inflated "1041 Tools" with the honest 68; synced versions. Dated `2026-04-30` measurement snapshots, ADRs, and code line-counts were left untouched on purpose. ## Verification - `scripts/check-trusted-base.sh` ✓ (5 axioms) · `idris2 --check Boj/SafetyLemmas.idr` ✓ - `scripts/typecheck-proofs.sh` → `PASS=105 FAIL=0` - JS: dispatch 15/15, http_transport 26/26, path_claims 11/11 · `boot_smoke` ✓ on node/bun/deno (68 tools) ## Notes - Docs are tagged `MPL-2.0` to satisfy the repo's current single-licence pre-commit hook. Moving prose to **CC-BY-SA-4.0** needs a hook + `.reuse/dep5` change (tracked as a follow-up). - A pre-existing, unrelated `elixir/boj-rest.service` working-tree change was deliberately excluded from these commits. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent a9384db commit f914ee2

31 files changed

Lines changed: 213 additions & 67 deletions

File tree

.gitattributes

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,12 @@ Containerfile text eol=lf
5858
# Lock files
5959
Cargo.lock text eol=lf -diff
6060
flake.lock text eol=lf -diff
61+
62+
# GitHub Linguist — surface the JS/Deno MCP bridge (mcp-bridge/) as the
63+
# primary language instead of the bulky Zig FFI / generated cartridge code.
64+
cartridges/** linguist-vendored
65+
ffi/** linguist-vendored
66+
generated/** linguist-generated
67+
*.adoc linguist-documentation
68+
docs/** linguist-documentation
69+
proofs/** linguist-documentation

.github/settings.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
repository:
1313
name: "boj-server"
14-
description: "BoJ (Bundle of Joy) — unified MCP server consolidating GitHub, GitLab, Cloudflare, browser automation, and 50+ open-source cartridges"
14+
description: "BoJ (Bundle of Joy) — unified MCP server consolidating GitHub, GitLab, Cloudflare, browser automation, and 125 open-source cartridges"
1515
homepage: "https://github.com/hyperpolymath/boj-server"
1616
private: false
1717
has_issues: true

.machine_readable/contractiles/intend/Intentfile.a2ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ LLM/SLM agents: understand what this repo IS and IS NOT before acting.
1818
BoJ (Bundle of Joy) is a unified MCP server that consolidates all hyperpolymath
1919
tooling into a single endpoint. It provides Claude Code integration for GitHub,
2020
GitLab, Cloudflare, Vercel, Verpex, Gmail, Calendar, browser automation, research,
21-
ML, and 50+ open-source cartridges. It implements a three-class architecture:
21+
ML, and 125 open-source cartridges. It implements a three-class architecture:
2222
- Class 1 (Simple Track): zero-infrastructure CLI/curl workflows
2323
- Class 2 (Orchestrator Track): HMAC-SHA256 webhooks and real-time MQTT/WS
2424
- Class 3 (Multiplier Track): Elixir/BEAM mass concurrency

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ abstract: >-
1818
gateway. Each cartridge — covering databases, container runtimes, git forges,
1919
Kubernetes, observability, secrets, IaC, cloud providers, and multi-instance
2020
AI coordination — is a formally verified Idris2 ABI + Zig FFI + Deno/JS
21-
adapter triple. The server exposes 115 cartridges through a unified stdio
21+
adapter triple. The server exposes 125 cartridges through a unified stdio
2222
MCP surface plus a local REST API on port 7700. A local-coord-mcp cartridge
2323
provides loopback peer discovery, typed envelopes, claim/heartbeat/watchdog,
2424
and master/journeyman/apprentice supervision for multi-agent AI workflows.
@@ -34,5 +34,5 @@ keywords:
3434
- multi-agent
3535
- ai-coordination
3636
license: MPL-2.0
37-
version: 0.4.6
37+
version: 0.4.7
3838
date-released: "2026-04-27"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<!--
2-
SPDX-License-Identifier: CC-BY-SA-4.0
2+
SPDX-License-Identifier: MPL-2.0
33
SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
44
-->
55

6-
[![OpenSSF Best Practices](https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity)](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/boj-server) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/hyperpolymath/boj-server/badge)](https://scorecard.dev/viewer/?uri=github.com/hyperpolymath/boj-server) [![License: MPL-2.0](https://img.shields.io/badge/License-MPL_2.0--3.0--or--later-blue.svg)](LICENSE)
6+
[![OpenSSF Best Practices](https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity)](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/boj-server) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/hyperpolymath/boj-server/badge)](https://scorecard.dev/viewer/?uri=github.com/hyperpolymath/boj-server) [![License: MPL-2.0](https://img.shields.io/badge/License-MPL_2.0-blue.svg)](LICENSE)
77
[![Glama MCP Server](https://glama.ai/mcp/servers/hyperpolymath/boj-server/badge)](https://glama.ai/mcp/servers/hyperpolymath/boj-server) [![Green Hosting](https://api.thegreenwebfoundation.org/greencheckimage/boj-server.net)](https://www.thegreenwebfoundation.org/green-web-check/?url=boj-server.net) [![Software Heritage](https://archive.softwareheritage.org/badge/origin/https://github.com/hyperpolymath/boj-server/)](https://archive.softwareheritage.org/browse/origin/?origin_url=https://github.com/hyperpolymath/boj-server)
88

99
BoJ (Bundle of Joy) is a unified MCP server that consolidates all

ai-plugin.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
"schema_version": "v1",
33
"name_for_human": "Bundle of Joy Server",
44
"name_for_model": "boj_server",
5-
"description_for_human": "Cartridge-based DevOps toolkit with 115 formally verified domain cartridges spanning database, cloud, git, Kubernetes, containers, observability, secrets, IaC, ML, browser automation, communications, and research.",
6-
"description_for_model": "A cartridge-based MCP server exposing 115 DevOps domain cartridges via a unified REST API. Each cartridge has a formally verified Idris2 ABI, Zig FFI bridge, and Deno/JS adapter. Domains include: database (VeriSimDB, PostgreSQL, Redis, DuckDB, MongoDB, Neo4j, ClickHouse, Turso, Supabase, Neon, ArangoDB), cloud providers (AWS, GCP, Cloudflare, Vercel, Verpex, DigitalOcean, Hetzner, Fly.io, Railway, Render, Linode), git forges (GitHub, GitLab), Kubernetes, containers, observability, secrets/vault, IaC, ML/AI (HuggingFace), browser automation (Firefox), communications (Gmail, Calendar), queues, SSG, research (academic papers), and language tooling. Use boj_menu to discover available cartridges, boj_cartridge_info to inspect a cartridge, and boj_cartridge_invoke to call operations.",
5+
"description_for_human": "Cartridge-based DevOps toolkit with 125 formally verified domain cartridges spanning database, cloud, git, Kubernetes, containers, observability, secrets, IaC, ML, browser automation, communications, and research.",
6+
"description_for_model": "A cartridge-based MCP server exposing 125 DevOps domain cartridges via a unified REST API. Each cartridge has a formally verified Idris2 ABI, Zig FFI bridge, and Deno/JS adapter. Domains include: database (VeriSimDB, PostgreSQL, Redis, DuckDB, MongoDB, Neo4j, ClickHouse, Turso, Supabase, Neon, ArangoDB), cloud providers (AWS, GCP, Cloudflare, Vercel, Verpex, DigitalOcean, Hetzner, Fly.io, Railway, Render, Linode), git forges (GitHub, GitLab), Kubernetes, containers, observability, secrets/vault, IaC, ML/AI (HuggingFace), browser automation (Firefox), communications (Gmail, Calendar), queues, SSG, research (academic papers), and language tooling. Use boj_menu to discover available cartridges, boj_cartridge_info to inspect a cartridge, and boj_cartridge_invoke to call operations.",
77
"auth": {
88
"type": "none"
99
},

coord-tui/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version = "0.1.0"
66
edition = "2021"
77
authors = ["Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>"]
88
description = "Rapid-setup TUI for BoJ local-coord-mcp (AI multi-instance coordination)"
9-
license = "AGPL-3.0-or-later"
9+
license = "MPL-2.0"
1010

1111
# Architecture note: pure functions (state transitions, key dispatch) are
1212
# deliberately isolated so SPARK/Ada formal modules can replace them later

docs/EXPLAINME.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ This is the Model-Controller-Processor pattern: cartridges are pluggable service
1919

2020
**Location**: `elixir/lib/boj_rest/catalog.ex` (Elixir GenServer cartridge discovery and initialization)
2121

22-
**How verified**: `BojRest.Catalog` scans `cartridges/*/cartridge.json` at startup, reads tool schemas from each, and stores them in an ETS table. It validates `name`, `version`, `tools` required fields and prevents duplicate names. 115 cartridges are auto-discovered. This enables the "unified endpoint" claim: a single REST server exposes the union of all cartridges' tools without hardcoding each one.
22+
**How verified**: `BojRest.Catalog` scans `cartridges/*/cartridge.json` at startup, reads tool schemas from each, and stores them in an ETS table. It validates `name`, `version`, `tools` required fields and prevents duplicate names. 125 cartridges are auto-discovered. This enables the "unified endpoint" claim: a single REST server exposes the union of all cartridges' tools without hardcoding each one.
2323

2424
**Caveat**: Auto-discovery is runtime dynamic; there is no compile-time verification that all cartridge schemas are valid JSON Schema. A malformed `cartridge.json` is silently skipped at startup. The authoritative manifest format is Nickel (closed decision `boj-cartridge-manifest-format-dd.md`); migration from JSON is future work.
2525

@@ -42,15 +42,15 @@ This is the Model-Controller-Processor pattern: cartridges are pluggable service
4242
| gossamer, burble, ephapax, hypatia, verisimdb, typed-wasm — universal ABI/FFI pattern across the estate
4343

4444
| *Pluggable cartridge architecture*
45-
| 115 cartridge directories (`cartridges/*/`), each with `abi/`, `ffi/`, `mod.js` structure; auto-discovered at startup via manifest scan
45+
| 125 cartridge directories (`cartridges/*/`), each with `abi/`, `ffi/`, `mod.js` structure; auto-discovered at startup via manifest scan
4646
| echidna (prover orchestration as cartridges), hypatia (rule composition), gitbot-fleet (bot cartridges per service)
4747

4848
| *PanLL ReScript workspace layer*
4949
| `panll/` — ReScript/TEA panel framework, autowiring constraint solver, 108 panels for UI
5050
| idaptik (game UI panels), gossamer-powered SPAs, PanLL monorepo panels estate-wide
5151

5252
| *panic-attack security gate*
53-
| Pre-commit `panic-attack assail` enforces PA001-PA025 across all 115 cartridges; security module tests cover injection, unicode bypass, SSRF
53+
| Pre-commit `panic-attack assail` enforces PA001-PA025 across all 125 cartridges; security module tests cover injection, unicode bypass, SSRF
5454
| Every RSR repo in the estate; panicbot wraps it in CI
5555

5656
| *Elixir/BEAM + Deno runtime*
@@ -70,7 +70,7 @@ This is the Model-Controller-Processor pattern: cartridges are pluggable service
7070
| `elixir/lib/boj_rest/js_worker.ex` | GenServer wrapping a single Deno port; newline-delimited JSON protocol
7171
| `elixir/lib/boj_rest/node_key.ex` | X25519 keypair persistence; ChaCha20-Poly1305 credential decryption
7272
| `elixir/priv/js_pool_worker.js` | Deno-side pool worker; module cache, env isolation per request
73-
| `cartridges/*/` | 115 cartridge directories, each with abi/, ffi/, mod.js structure
73+
| `cartridges/*/` | 125 cartridge directories, each with abi/, ffi/, mod.js structure
7474
| `src/abi/Boj/` | Idris2 ABI definitions (Protocol, Domain, Catalogue, Safety, etc.)
7575
| `panll/` | ReScript/TEA panel framework for UI workspace layer
7676
|===

docs/developer/llm-warmup-dev.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ elixir/ Elixir/BEAM REST server
8383
test/ 50 ExUnit tests (catalog, router, crypto, JS dispatch)
8484
config/ config.exs / test.exs
8585
86-
cartridges/ 115 cartridge directories
86+
cartridges/ 125 cartridge directories
8787
database-mcp/ Example cartridge
8888
abi/database-mcp.ipkg Idris2 ABI
8989
abi/Database/Mcp.idr Idris2 source
@@ -134,7 +134,7 @@ panll/src/ PanLL panel (ReScript/TEA)
134134
----
135135
just build # Build all Zig FFI layers (catalogue + cartridges)
136136
just build-release # Optimized build (-Doptimize=ReleaseFast)
137-
just run # Start Elixir/BEAM server (REST 7700, auto-discovers 115 cartridges)
137+
just run # Start Elixir/BEAM server (REST 7700, auto-discovers 125 cartridges)
138138
just serve # Server + Cloudflare tunnel
139139
just test # Elixir ExUnit test suite (mix test)
140140
just test-smoke # Quick: typecheck core ABI + ExUnit smoke
@@ -229,7 +229,7 @@ POST /cartridge/{name}/invoke: { "tool": "...", "args": {...}, "credential_envel
229229

230230
== Cartridge Matrix
231231

232-
115 cartridges organized in a 2D matrix (Protocol x Domain).
232+
125 cartridges organized in a 2D matrix (Protocol x Domain).
233233
Each has: `abi/` (Idris2), `ffi/` (Zig), `mod.js` (Deno adapter).
234234
View status: `just matrix`
235235

docs/developer/llm-warmup-user.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ and many more.
8383
| Elixir REST server (Catalog, Router, JsWorkerPool)
8484

8585
| `cartridges/`
86-
| 115 cartridge directories
86+
| 125 cartridge directories
8787

8888
|===
8989

0 commit comments

Comments
 (0)