Skip to content

Commit baac0f0

Browse files
feat(catalog): configurable cartridges root + canonical schema + category field sweep (#158)
## Summary Three changes that prepare boj-server to consume cartridges from the new [`hyperpolymath/boj-server-cartridges`](https://github.com/hyperpolymath/boj-server-cartridges) repository on demand instead of bundling them in-tree: ### 1. Configurable cartridges root `elixir/lib/boj_rest/application.ex` gains a fallback chain: ``` Application env (:boj_rest, :cartridges_root) → BOJ_CARTRIDGES_PATH environment variable → default "./cartridges" (preserves historical bundled behaviour) ``` Operators wanting on-demand fetch set `BOJ_CARTRIDGES_PATH` to their local cache (e.g. `~/.boj/cartridges/`) and arrange for tray to populate it. No runtime change unless the env var is set. ### 2. Canonical schema mirror `schemas/cartridge-v1.json` is replaced with a vendored copy of the canonical schema filed as [standards#200](hyperpolymath/standards#200) — which expands the original `-mcp`-only `name` regex to admit the full BoJ server-role taxonomy: `(mcp|lsp|dap|bsp|debug|format|lint|build|nesy|agentic|fleet)`, and adds `category`, `states`, `source` fields. `schemas/SCHEMA-MIRROR.md` documents the mirror discipline + the pending SHA-pinning ceremony (executes once standards#200 merges). ### 3. `category` field sweep on 125 cartridge manifests The new schema makes `category` required. Mechanical sweep assigns: - `"category": "template"` (1: gossamer-mcp) - `"category": "cross-cutting"` (11: agent-mcp, claude-agents-power-mcp, claude-ai-mcp, local-coord-mcp, model-router-mcp, nesy-mcp, ml-mcp, fleet-mcp, boj-health, dap-mcp, bsp-mcp) - `"category": "domain"` (113) Matches the taxonomy ratified in [boj-server-cartridges ADR-001](https://github.com/hyperpolymath/boj-server-cartridges/blob/main/docs/decisions/ADR-001-taxonomy.adoc). ## Deferred to follow-up PRs - tray → boj-server-cartridges on-demand fetch wiring (tray has the cartridge-source subscription concept already in `tray/src/main.rs` / `server.rs`; needs default registry configured). - `BojRest.Catalog` reload-without-restart. - Strict SHA-pin of local schema mirror to a specific standards commit + sha256 (pending standards#200 merge). ## Test plan - [x] All 125 cartridge manifests gain `category` field at correct value - [x] Schema admits all 11 canonical role suffixes - [x] `BOJ_CARTRIDGES_PATH=/foo bin/boj-server` would read from `/foo` (manual trace) - [x] Default behaviour unchanged when neither Application env nor BOJ_CARTRIDGES_PATH set - [ ] CI green - [ ] Validate all 125 manifests against the new schema (follow-up; tooling TBD) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent a8e69c3 commit baac0f0

128 files changed

Lines changed: 1433 additions & 181 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cartridges/007-mcp/cartridge.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
"graceful_degrade": true
3434
},
3535
"copyright": "Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>",
36-
"description": "007 agent meta-language cartridge exposes the full oo7 CLI surface (parse/run/trace/build/test/lint/verify/contractile verbs/canonical-proof-suite/groove/self-assess) plus on-enter and on-exit lifecycle hooks that register the session as a coord peer, load the 6a2 methodology pack (STATE, META, ECOSYSTEM, AGENTIC, NEUROSYM, PLAYBOOK), and perform drift checks on exit.",
36+
"description": "007 agent meta-language cartridge \u2014 exposes the full oo7 CLI surface (parse/run/trace/build/test/lint/verify/contractile verbs/canonical-proof-suite/groove/self-assess) plus on-enter and on-exit lifecycle hooks that register the session as a coord peer, load the 6a2 methodology pack (STATE, META, ECOSYSTEM, AGENTIC, NEUROSYM, PLAYBOOK), and perform drift checks on exit.",
3737
"domain": "dezig",
38+
"category": "domain",
3839
"federation": "none",
3940
"memory_autolift": {
4041
"base_tags": [
@@ -58,7 +59,7 @@
5859
"tier": "Ayo",
5960
"tools": [
6061
{
61-
"description": "Lifecycle hook invoke when entering the 007-lang context. Registers this session as a coord peer (graceful degrade if local-coord-mcp is down), loads the 6a2 methodology pack (STATE, META, ECOSYSTEM, AGENTIC, NEUROSYM, PLAYBOOK), runs the memory auto-lift using repo-derived tags, and returns a structured A2ML payload with peer_id, session_token, methodology digests, and memory hits. Idempotent: calling twice returns the same peer_id/token.",
62+
"description": "Lifecycle hook \u2014 invoke when entering the 007-lang context. Registers this session as a coord peer (graceful degrade if local-coord-mcp is down), loads the 6a2 methodology pack (STATE, META, ECOSYSTEM, AGENTIC, NEUROSYM, PLAYBOOK), runs the memory auto-lift using repo-derived tags, and returns a structured A2ML payload with peer_id, session_token, methodology digests, and memory hits. Idempotent: calling twice returns the same peer_id/token.",
6263
"inputSchema": {
6364
"properties": {
6465
"session_hint": {
@@ -72,7 +73,7 @@
7273
"name": "oo7_on_enter"
7374
},
7475
{
75-
"description": "Lifecycle hook invoke before leaving the 007-lang context. Updates STATE.a2ml's last-session fields, runs a drift check (open claims? uncommitted contractile edits? stale 6a2 files?), releases any coord task claims held by this peer, and deregisters from local-coord-mcp. Returns A2ML summary with drift findings. Safe to call even if on_enter was never invoked.",
76+
"description": "Lifecycle hook \u2014 invoke before leaving the 007-lang context. Updates STATE.a2ml's last-session fields, runs a drift check (open claims? uncommitted contractile edits? stale 6a2 files?), releases any coord task claims held by this peer, and deregisters from local-coord-mcp. Returns A2ML summary with drift findings. Safe to call even if on_enter was never invoked.",
7677
"inputSchema": {
7778
"properties": {
7879
"reason": {
@@ -556,7 +557,7 @@
556557
"name": "oo7_dust_status_local"
557558
},
558559
{
559-
"description": "Revert all source changes to last commit. DESTRUCTIVE the adapter rejects this tool unless the caller holds a Tier-3 master approval. Wraps `just dust-source-rollback`.",
560+
"description": "Revert all source changes to last commit. DESTRUCTIVE \u2014 the adapter rejects this tool unless the caller holds a Tier-3 master approval. Wraps `just dust-source-rollback`.",
560561
"inputSchema": {
561562
"properties": {},
562563
"required": [],
@@ -565,7 +566,7 @@
565566
"name": "oo7_dust_source_rollback"
566567
},
567568
{
568-
"description": "Verify OpenSSF Best Practices prerequisites fails if required files are missing. Wraps `just verify`.",
569+
"description": "Verify OpenSSF Best Practices prerequisites \u2014 fails if required files are missing. Wraps `just verify`.",
569570
"inputSchema": {
570571
"properties": {},
571572
"required": [],
@@ -574,7 +575,7 @@
574575
"name": "oo7_verify"
575576
},
576577
{
577-
"description": "Verify the Harvard architecture invariant data expressions must not contain control flow. Wraps `just verify-harvard`.",
578+
"description": "Verify the Harvard architecture invariant \u2014 data expressions must not contain control flow. Wraps `just verify-harvard`.",
578579
"inputSchema": {
579580
"properties": {},
580581
"required": [],

cartridges/academic-workflow-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "1.0.0",
77
"description": "Academic workflow \u2014 Zotero integration, citations, paper review",
88
"domain": "Research",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"auth": {
1112
"method": "none"

cartridges/aerie-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.1.0",
77
"description": "Aerie environment lifecycle manager",
88
"domain": "infrastructure",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",

cartridges/affinescript-mcp/cartridge.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.1.0",
77
"description": "AffineScript language cartridge -- type checking, parsing, formatting, linting, compiling, hover/goto-def/completion queries, error explanation, stdlib browsing, and syntax reference for the AffineScript language (substructural type system with affine/linear types, algebraic effects)",
88
"domain": "Languages",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",
@@ -195,7 +196,7 @@
195196
},
196197
{
197198
"name": "affinescript_hover",
198-
"description": "Return type and symbol information for the symbol at a cursor position in AffineScript source code. Runs the full pipeline (parse resolve typecheck) and returns JSON hover info.",
199+
"description": "Return type and symbol information for the symbol at a cursor position in AffineScript source code. Runs the full pipeline (parse \u2192 resolve \u2192 typecheck) and returns JSON hover info.",
199200
"inputSchema": {
200201
"type": "object",
201202
"properties": {

cartridges/agent-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.1.0",
77
"description": "OODA loop agent session enforcer",
88
"domain": "ai",
9+
"category": "cross-cutting",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",

cartridges/airtable-mcp/cartridge.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.2.0",
77
"description": "Airtable cartridge -- base listing, table schema retrieval, record search, record creation, record update, field listing, view browsing, webhook management, comment access, and revision history via the Airtable REST API",
88
"domain": "Productivity",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",
@@ -149,7 +150,7 @@
149150
},
150151
{
151152
"name": "airtable_update_record",
152-
"description": "Update an existing record's field values (PATCH only specified fields are updated)",
153+
"description": "Update an existing record's field values (PATCH \u2014 only specified fields are updated)",
153154
"inputSchema": {
154155
"type": "object",
155156
"properties": {

cartridges/arango-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.1.0",
77
"description": "ArangoDB multi-model database gateway. AQL queries, document operations, graph traversals, and collection management.",
88
"domain": "Database",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",

cartridges/aws-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "0.1.0",
77
"description": "AWS cloud gateway. Session-based authentication with per-region slots, throttle management, and multi-service action routing.",
88
"domain": "Cloud",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"protocols": [
1112
"MCP",

cartridges/bofig-mcp/cartridge.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"version": "1.0.0",
77
"description": "Bofig Cartridge \u2014 Evidence graph query tools for investigative workflows",
88
"domain": "Research",
9+
"category": "domain",
910
"tier": "Ayo",
1011
"auth": {
1112
"method": "none"

cartridges/boj-health/cartridge.json

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
"name": "boj-health",
66
"version": "0.1.0",
77
"status": "ffi_only",
8-
"description": "BoJ server self-health cartridge status, ping, and uptime queries. Self-contained Zig FFI (.so) reference implementation: no external services required.",
8+
"description": "BoJ server self-health cartridge \u2014 status, ping, and uptime queries. Self-contained Zig FFI (.so) reference implementation: no external services required.",
99
"domain": "infrastructure",
10+
"category": "cross-cutting",
1011
"tier": "Ayo",
11-
"protocols": ["MCP"],
12+
"protocols": [
13+
"MCP"
14+
],
1215
"auth": {
1316
"method": "none",
1417
"env_var": null,
@@ -21,7 +24,13 @@
2124
"ffi": {
2225
"so_path": "ffi/zig-out/lib/libboj_health.so",
2326
"abi_version": "ADR-0006",
24-
"symbols": ["boj_cartridge_init", "boj_cartridge_deinit", "boj_cartridge_name", "boj_cartridge_version", "boj_cartridge_invoke"]
27+
"symbols": [
28+
"boj_cartridge_init",
29+
"boj_cartridge_deinit",
30+
"boj_cartridge_name",
31+
"boj_cartridge_version",
32+
"boj_cartridge_invoke"
33+
]
2534
},
2635
"tools": [
2736
{
@@ -34,7 +43,7 @@
3443
},
3544
{
3645
"name": "boj_health_ping",
37-
"description": "Ping the BoJ health cartridge always returns pong",
46+
"description": "Ping the BoJ health cartridge \u2014 always returns pong",
3847
"inputSchema": {
3948
"type": "object",
4049
"properties": {}

0 commit comments

Comments
 (0)