A Brigade station used to be opaque until you installed it. You ran brigade add memory or brigade add guard, and only then could you see what the tool actually exposed to an agent. 0.19.0 makes a station say what it can feed before it lands.
Stations declare their surfaces
Managed station tools now advertise machine-readable surfaces: live doctor JSON, bounded markdown briefs, summary JSON, and verify commands, for whichever of those each tool supports. brigade stations list --json carries those surfaces, so a profile can show what a station will feed into automation before you commit to installing it.
brigade add <path> grew a manifest path too. Point it at a local directory with a station.json and it reports the install command and the machine surfaces the station declares. It will not run a manifest’s install command unless you pass --install, so discovery stays read-only by default. Installing a built-in station by name works exactly as before.
brigade run budgets its briefs
brigade run has attached context briefs for a while: the GraphTrail code-graph brief landed in 0.18.0. 0.19.0 puts a budget around them. Code-graph and upstream-drift impact briefs are ranked by task type, clipped when they run long, and recorded in run.json with the attached brief names, their sizes, and a truncation flag. So you can see after the fact exactly what context the workers got and what got cut to fit.
There is a new brief in that budget: a fail-open upstream-drift impact brief. When a repo has a GraphTrail database and pending upstream-drift state, the brief stitches drift-report excerpts together with graphtrail impact output, so a worker sees the likely blast radius of a change before it starts editing.
The refactor that found four bugs
The three largest modules got broken into packages. repos_cmd went from 6,417 lines to 8 files. tools_cmd, 6,079 to 18. phases_cmd, 5,621 to 7. Each sits behind a facade that keeps the full external surface and the monkeypatch semantics the tests rely on, and no source file now runs past 2,000 lines.
That let the mypy override list drop from 45 entries to 21. Ratcheting the types down flushed out four latent defects that were sitting in the untyped dark: a friction-show crash on malformed JSON, a notifications tuple-shape crash, a fleet-health check reading from the wrong module, and a research runner that returned an object where its callers expected text. All four are fixed in this release.
Smaller adds
brigade memory care scannow validatesevidence:frontmatter, checking receipt-like paths and MiseLedger evidence refs and reportingmissing-evidence-refissues with reference counts.brigade pantry expiry-alertreports near-expiry Agent Pantry sessions and plans anagent-notifymessage by default. It only sends when you pass--send.brigade outcome rebuild-status,fork, anddiffadd a drift oracle for outcome receipts: rebuildstatus.jsonfrom the records, or compare alternate reconciliation configs, without touching live state.- Agent Pantry health now prefers
agentpantry doctor --json, falls back to the old status JSON, and reads the newinventory --markdownbrief for near-expiry summaries.
Upgrade
Nothing in 0.19.0 breaks the 0.18.x surface, so it is a straight upgrade:
pipx upgrade brigade-cli
The full changelog lives in the repo.