Skip to content

ci(mcp): trigger image builds on the dependency closure, not just own crate - #72

Merged
BestNathan merged 1 commit into
mainfrom
ci/mcp-images-dep-closure
Aug 30, 2026
Merged

BestNathan merged 1 commit into
mainfrom
ci/mcp-images-dep-closure

Conversation

@BestNathan

Copy link
Copy Markdown
Owner

Problem

build-mcp-images filtered on crates/vol-mcp-servers/** only — but vol-mcp-servers depends on 14 other workspace crates:

# crates/vol-mcp-servers/Cargo.toml:37
vol-llm-sandbox = { path = "../vol-llm-sandbox", features = ["ssh"] }

build-vol-agent-server uses crates/**, so it catches dependency changes. build-mcp-images did not. A fix in a shared crate therefore shipped to agent-server and silently did not rebuild the MCP images, leaving them linked against old code until someone happened to touch crates/vol-mcp-servers/.

This just happened

PR #70's SandboxManager::default() fix:

Deployment Image
agent-server ×4 cp-5fd87dd / dp-5fd87dd ✅ rebuilt
cli-tools-mcp 6c07707 ❌ never triggered

build-mcp-images did not run for 5fd87dd3 at all.

Harmless in that instance — default() is only called by vol-agent-server's SandboxHandler; cli-tools-mcp uses preload() / acquire_by_name() / build_inline(). But the same gap would silently drop a change to preload(), which cli-tools-mcp calls at startup. That's a known pending follow-up, so this needed fixing first.

(The reason #69 looked fine is that it also modified crates/vol-mcp-servers/, coincidentally matching the filter.)

Fix

Listed the full local dependency closure — 15 crates — rather than widening to crates/**:

md-frontmatter          vol-llm-observability
vol-llm-agent           vol-llm-provider
vol-llm-cli-tool        vol-llm-sandbox
vol-llm-context         vol-llm-skill
vol-llm-core            vol-llm-tool
vol-llm-mcp             vol-llm-tracing
vol-llm-memory          vol-mcp-servers
                        vol-session

This keeps 22 crates excluded — vol-agent-server, vol-llm-runtime, vol-llm-tui, vol-llm-ui, ppt-agent, vol-llm-wiki, vol-llm-yaml-agent, vol-llm-agents, vol-llm-fs, vol-llm-task, vol-llm-agent-protocol, vol-llm-agent-tool, and all nine vol-llm-tools-builtin/* subcrates — so MCP images do not rebuild on unrelated work.

The list is computed from cargo metadata, not hand-written, and the regenerating command is recorded in a comment directly above it.

Verification

  • YAML parses; 23 path entries total
  • The documented regenerate command was run, and its output diffed byte-identical against the committed list
  • All 15 crate directories confirmed to exist on disk
  • Audited every other workflow for the same bug: only build-vol-agent-server filters on crates, and it uses crates/**

Why build-vol-agent-server is left alone

Its closure is 30 of 37 local crates — only the TUI, web UI, ppt-agent, wiki, yaml-agent, agents and mcp-servers fall outside. Enumerating that would add maintenance drift for almost no saved builds.

The asymmetry that matters: agent-server's filter errs toward over-building, which is safe. The MCP filter erred toward under-building, which ships stale binaries.

Note

Path-filter changes only take effect for pushes after this merges, so this PR's own CI will not exercise the new filter. The first real check is the next change to a dependency crate — at which point build-mcp-images should appear in the run list for that SHA.

🤖 Generated with Claude Code

… crate

build-mcp-images filtered on `crates/vol-mcp-servers/**` only, but
vol-mcp-servers depends on 14 other workspace crates — including
vol-llm-sandbox, which cli-tools-mcp calls for preload()/acquire_by_name().
So a fix in a dependency rebuilt vol-agent-server (its filter is `crates/**`)
but silently did NOT rebuild the MCP images, leaving them linked against the
old code until someone happened to touch crates/vol-mcp-servers/.

This just bit PR #70: the SandboxManager::default() fix shipped to all four
agent-server deployments as cp-5fd87dd / dp-5fd87dd, while cli-tools-mcp
stayed on 6c07707. Harmless in that instance — default() is only called by
vol-agent-server's SandboxHandler, not by cli-tools-mcp — but the same gap
would silently drop a change to preload(), which cli-tools-mcp calls at
startup.

Fixed by listing vol-mcp-servers' full local dependency closure (15 crates)
rather than widening to `crates/**`. That keeps 22 crates excluded —
vol-agent-server, vol-llm-runtime, the TUI, the web UI, ppt-agent and all the
vol-llm-tools-builtin/* subcrates no longer trigger MCP rebuilds.

The list is computed from `cargo metadata`, not hand-written, and the
regenerating command is recorded in a comment above it; verified the command
reproduces the committed list exactly.

build-vol-agent-server is deliberately left on `crates/**`: its closure is 30
of 37 local crates, so enumerating it would add maintenance drift for almost
no saved builds. Its bias is toward over-building, which is safe; the MCP
filter's bias was toward under-building, which is not.

Co-Authored-By: Claude <noreply@anthropic.com>
@BestNathan
BestNathan merged commit 6d8b75b into main Aug 30, 2026
6 checks passed
@BestNathan
BestNathan deleted the ci/mcp-images-dep-closure branch August 30, 2026 02:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant