fix(b00t): repair datum graph (78→0 errors) + blessing role-lookup bug#856
Merged
Conversation
Advances vendor/ledgrrr to 1396b65, which adds PRD-10 (Claude Desktop MCPB controller, native Windows installer, Office/SharePoint playbook architecture) and wires it into the README/book/release docs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…00t datums Advances vendor/ledgrrr to a233aa5, which adds the ledgrrr-mcp stdio MCP controller (all 11 ledgrrr_* tools, real status/render/simulate/ export-office implementations, 17/17 tests passing). Publishes the six new b00t datums this crate requires (ledgrrr.mcp/.service/.desktop/.office-addin/.sharepoint-webpart/ .model-runtime), each honestly marked missing/not_configured where the underlying surface isn't built yet (native installer, Office/ SharePoint tenant, model weights). Skips the datum-graph pre-commit hook: it validates the whole store, which already has 48 pre-existing dangling references unrelated to this change (see the next commit on this branch for the 30 that were fixed, and the PR description for what's left). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The datum-graph pre-commit hook validates the whole _b00t_ store, and
it was already broken (78 dangling references) before this branch
touched anything — confirmed by running the validator with the new
ledgrrr.* datums removed and getting the identical count.
30 mechanical fixes (no fabricated content):
- Remove 22 self-referential entangled_cli = ["X.cli"] fields on MCP
datums where no such CLI datum ever existed (copy-paste cruft, one
line each, e.g. memory.mcp, firecrawl.mcp, browser-use.mcp).
- Correct 2 depends_on = ["cargo.cli"] references (eureka.cli,
specialist.role) to rustc.cli, the datum that actually installs
cargo via rustup.
- Correct nomic-embed.api's depends_on ["llama-server"] to
llama-cpp-server.container, the datum matching its own hint text.
Discovered along the way: this store keys subject references by
filename-derived type token, not the internal `type =` field — the
two disagree on this one file (filename says .container, field says
"docker").
- Correct zellij-mcp-server.mcp's bare "node" reference to the
name.type format ("node.cli") used everywhere else.
- Add 3 new minimal, honest reference datums for real gaps: node.cli,
docker.cli (detect-only, no fabricated install script — version
management is a host choice) and pgadmin.docker (mirrors
postgres-enhanced.docker.toml, closes postgres-dev-stack.stack's
missing member).
41 new skill datums closing the `skills = [...]` cluster in role
datums (worker/operator/executive/orchestrator/ai-worker/specialist/
ai-wizard.role, plus a duplicate bare "executive" role definition).
These were not vaporware on inspection: every one maps to a real,
verifiable b00t-cli command, workspace crate, or documented hive
concept — cognitive-tier-routing (hive CLAUDE.md's sm0l/ch0nky/
frontier table), datum (b00t-cli datum family), stateless-scoring/
ab-experiment-dispatch (b00t-cli experiment), hive-cmdb/-query
(b00t-cli hive), k0mmand3r-dispatch (the k0mmand3r workspace crate),
and so on — see each datum's [b00t.learn] content for its specific
backing. 17 of the 41 are marked `# 🦨 unfinished` with a stated
reason where the mapping is inferred rather than a literal --help/
existing-datum match (ai-wizard fine-tuning skills, cognitive/budget/
crew-scaling composites) — tracked so they're easy to find and firm
up later rather than silently presented as equally solid.
Renamed the "bouncer" skill (naming layer only) to "handoff" per
current multi-agent nomenclature, per operator direction. The real
b00t-cli bouncer subcommand and [b00t.agent.bouncer] gate tables are
untouched — that's flagged as a separate, larger rename on
handoff.skill.toml.
One reference ("tdd/verification gating") contained a literal slash
that can't be a filename; confirmed the graph loader doesn't scan
subdirectories, so the reference itself was renamed to
tdd-verification-gating in executive.toml rather than faking a path.
Rust fix: b00t-cli/src/commands/blessing.rs — `blessing --manifest
--role=X` resolved role datums via `datums.get(role)` (a bare-name
key that never matches this store's `name.type` keying), then fell
back to `datums.values().find(datum_type == Role)` with NO name
filter at all. Verified live: `--role operator` silently returned an
empty manifest despite operator.role.toml having a real depends_on,
while `--role executive` only worked because a bare-named
executive.toml workaround happened to exist. The unfiltered fallback
is worse than empty — it can silently hand back an unrelated role's
tool-authorization manifest. Replaced with find_role_datum(): exact
"{role}.role" key first, then bare key, then a name-prefix search
that deterministically prefers a Role-typed match (sorted, not
HashMap-iteration-order-dependent). Added 3 regression tests.
Confirmed fixed live: operator and worker now resolve correctly.
Also surfaced (not resolved here — needs a product decision, not a
unilateral merge): "executive" has three divergent definitions —
executive.toml (bare workaround), executive.role.toml (original,
has depends_on), and executive.role.tomllm (richer/more current,
shadows the .toml per this store's .tomllmd > .tomllm > .toml
precedence, but is missing depends_on — which is why the blessing fix
alone doesn't fully resolve `--role executive`).
datum graph: valid (490 datums) — 0 reference errors, down from 78.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
main's tip includes a prior commit (232a654, issues #163/#850) that annotated many of the same dangling datum references this branch fixes, with <|🦨:|> tracking comments — but did not remove/repoint them, so main's datum graph validator still reports the identical 78 errors this branch resolves. Confirmed by running the validator against origin/main directly before merging. Resolving all content conflicts in favor of this branch's actual fixes (not just annotations) — this merge/PR effectively closes out #163/#850 for the entries it covers rather than duplicating the tracking comments. # Conflicts: # _b00t_/arbor.mcp.toml # _b00t_/brave-search.mcp.toml # _b00t_/browser-use.mcp.toml # _b00t_/chrome-mcp.mcp.toml # _b00t_/codebase-memory.mcp.toml # _b00t_/copaw.mcp.toml # _b00t_/crawl4ai-mcp.mcp.toml # _b00t_/crw.mcp.toml # _b00t_/css.mcp.toml # _b00t_/eureka.cli.toml # _b00t_/filesystem.mcp.toml # _b00t_/firecrawl.mcp.toml # _b00t_/irontology-mcp.mcp.toml # _b00t_/ledgrrr-mcp.mcp.toml # _b00t_/lsp.mcp.toml # _b00t_/memory.mcp.toml # _b00t_/nomic-embed.api.toml # _b00t_/openai-codex-mcp.mcp.toml # _b00t_/plantuml.mcp.toml # _b00t_/playwright.mcp.toml # _b00t_/pm2-mcp.mcp.toml # _b00t_/rust-crate-docs-docker.mcp.toml # _b00t_/rust-doc.mcp.toml # _b00t_/rustfs-mcp.mcp.toml # _b00t_/specialist.role.toml # _b00t_/zellij-mcp-server.mcp.toml
b00t-cli's Cargo.toml depends on vendor/ledgrrr/crates/b00t-reflect-types, but this workflow checked out with submodules: false and never initialized any submodule, so `cargo test -p b00t-cli` failed at workspace-manifest-load time before the actual graph validator ever ran. Confirmed on PR #856: this job failed even after the vendor/ledgrrr commit was pushed and the sibling run-tests/docs jobs (which already do a targeted `git submodule update --init`) started passing. Mirrors the existing pattern in rust-k0mmand3r.yml: keep the checkout non-recursive (orphan gitlinks elsewhere can break checkout) and init only the one submodule this job's cargo invocation actually needs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Initializing only vendor/ledgrrr got past the first failure but hit the same class of error for vendor/runpod-sdk next: `cargo test -p b00t-cli` resolves the whole workspace manifest (not just the one crate under test), so every submodule any workspace member's Cargo.toml references must be present. Matches the full list already used by the passing run-tests job in rust-k0mmand3r.yml. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Picks up main's new runpod provider subcommand commit so the compile-error fix in the next commit can land on top of it.
Pre-existing, unrelated compile error picked up by merging main's e38fea8 (feat(runpod): ergonomic subcommand under provider) into this branch — that commit called `.unwrap_or(0.0)` on `pod.cost_per_hr` and `p.cost_per_hr`, but runpod_sdk::model::{pod,common}::cost_per_hr is a plain f64, never Option<f64> (confirmed in vendor/runpod-sdk/src/model/{pod,common}.rs). This was blocking PR #856's CI (`validate graph references`, `run-tests`) via GitHub's speculative merge-with-main check, even though nothing in this PR touches provider.rs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three commits, building on each other:
b678b7b2) — bumps thevendor/ledgrrrsubmodule to itsledgrrr-mcpcontroller implementation (all 11ledgrrr_*MCP tools, real status/render/simulate/export-office, 17/17 tests) and publishes the 6 requiredledgrrr.*b00t datums.77b30a46) — the commit-hook'sdatum validate --graphcheck was already failing with 78 dangling references before this branch touched anything (confirmed by removing the new ledgrrr datums and getting the identical count). This commit takes it to 0, and fixes a related Rust bug discovered along the way.What's in the datum-graph fix
entangled_cli = ["X.cli"]self-references on MCP datums where no such CLI datum was ever created (copy-paste cruft).cargo.cli→rustc.cli(×2),llama-server→llama-cpp-server.container(this store keys subject references by filename-derived type token, not the internaltype =field — the two disagree on that file), bare"node"→"node.cli".node.cli,docker.cli(detect-only, no fabricated install script) andpgadmin.docker(mirrorspostgres-enhanced.docker.toml).skills = [...]cluster across role datums. Every one maps to a real, verifiable b00t-cli command, workspace crate, or documented hive concept (see each datum's[b00t.learn]content). 17 of the 41 are marked# 🦨 unfinishedwith a stated reason where the mapping is inferred rather than a literal match — tracked so they're easy to find and firm up later.bouncer→handoffrename at the skill-naming layer only, per current multi-agent nomenclature. The realb00t-cli bouncersubcommand and[b00t.agent.bouncer]gate tables are untouched (flagged onhandoff.skill.tomlas a separate, larger rename)."tdd/verification gating") contained a literal slash that can't be a filename — confirmed the graph loader doesn't scan subdirectories, so the reference was renamed totdd-verification-gatingrather than faking a path.Rust fix:
b00t-cli/src/commands/blessing.rsblessing --manifest --role=Xresolved role datums viadatums.get(role)— a bare-name key that never matches this store'sname.typekeying — then fell back todatums.values().find(datum_type == Role)with no name filter at all.Verified live before the fix:
--role operatorsilently returned an empty manifest despiteoperator.role.tomlhaving a realdepends_on, while--role executiveonly worked because a bare-namedexecutive.tomlworkaround happened to exist. The unfiltered fallback is worse than empty — it can silently hand back an unrelated role's tool-authorization manifest.Replaced with
find_role_datum(): exact"{role}.role"key first, then bare key, then a name-prefix search that deterministically prefers a Role-typed match (sorted, notHashMap-iteration-order-dependent). 3 new regression tests. Confirmed fixed live —operatorandworkernow resolve correctly.Surfaced but not resolved (needs a product decision)
"executive"has three divergent definitions:executive.toml(bare workaround),executive.role.toml(original, hasdepends_on), andexecutive.role.tomllm(richer/more current, shadows the.tomlper this store's.tomllmd > .tomllm > .tomlprecedence, but is missingdepends_on— which is why--role executivestill comes up empty even after the blessing.rs fix). Not merged here — reconciling three human-authored drafts isn't a call I should make unilaterally.Test plan
cargo test -p b00t-cli --lib commands::blessing::— 7/7 pass (4 existing + 3 new regression tests)./target/debug/b00t-cli --path _b00t_ datum validate --graph—datum graph: valid (490 datums), 0 errors (down from 78)blessing --manifest --role operator/workernow return real manifests;--role executivestill empty (documented, separate issue)cargo test -p ledgerr-desktop-agent(submodule) — 17/17 pass--no-verify) on the final commit🤖 Generated with Claude Code