Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8e6c6dd
busbar-plane-mcp leaves the busbar repo for GetBusbar/busbar-plane-mc…
MattJackson Oct 13, 2026
fb41a10
busbar-plane-decisions tests: the sibling planes a plane may not name…
MattJackson Oct 13, 2026
1379f7c
the base layer, read by every gate that asks the tree a directory or …
MattJackson Oct 13, 2026
24aba9c
Merge origin/predev (5c99befcfa) into lane-p5-extract-plane-mcp: Carg…
MattJackson Oct 13, 2026
8ece3a2
P5: busbar-plane-decisions leaves for GetBusbar/busbar-plane-decision…
MattJackson Oct 14, 2026
f995796
busbar-contract: the YAML readers sit behind a `yaml` feature; busbar…
MattJackson Oct 14, 2026
7b30159
capability_equality: the plane-crate enumeration resolves through the…
MattJackson Oct 14, 2026
2f84388
Merge lane-p5-extract-plane-mcp (7b30159ccc, #838's E0308 fix) into l…
MattJackson Oct 14, 2026
3c19565
Merge remote-tracking branch 'origin/lane-p5-extract-plane-decisions'…
MattJackson Oct 14, 2026
ccc0eff
ceiling-census: the kind census counts a pinned plane from its checko…
MattJackson Oct 14, 2026
e7c440e
Merge lane-p5-extract-plane-mcp (ccc0eff11f, #838's ceiling-census fi…
MattJackson Oct 14, 2026
41bff8a
Merge remote-tracking branch 'origin/lane-p5-extract-plane-mcp' into …
MattJackson Oct 14, 2026
19224cc
Merge remote-tracking branch 'origin/lane-p5-extract-plane-decisions'…
MattJackson Oct 14, 2026
06eb72f
construction tree: the base scan carries the BASE layer's sources und…
MattJackson Oct 14, 2026
8bbd820
Merge lane-p5-extract-plane-mcp (06eb72f5a6, #838: the construction b…
MattJackson Oct 14, 2026
147d7ed
Merge remote-tracking branch 'origin/lane-p5-extract-plane-mcp' into …
MattJackson Oct 14, 2026
d57b4b7
P5 mcp extraction: the pinned plane stays in the plane population, it…
MattJackson Oct 14, 2026
adb97fc
Merge branch 'lane-p5-extract-plane-mcp' into lane-p5-extract-plane-d…
MattJackson Oct 14, 2026
aa92844
docs/architecture.md: the decisions plane lives in its own repository…
MattJackson Oct 14, 2026
e365ce5
Merge branch 'lane-p5-extract-plane-decisions' into lane-contract-yam…
MattJackson Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/plugin-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,17 @@ jobs:
printf '%s\n' "$red" | grep -q "crossing(s), pinned" \
|| { printf '%s\n' "$red" >&2; echo "::error::RED: the moved count failed for another reason than the exact comparator"; exit 1; }
echo "conformance: the published suite ran green; the moved count was refused"
- name: "busbar's plane gates over this plane's source (plane-purity, structure-lint, config-schema): no row that passes over busbar's pinned plane fails over this change"
# ARCHITECT row 106 (A): a plane that left busbar is read by busbar's gates from its pinned
# checkout; here the same gates, at this repo's busbar pin, read THIS change in its place
# (BUSBAR_PLANE_SOURCE), so the plane is judged where its source changes.
if: ${{ !cancelled() && inputs.plugin_kind == 'plane' && steps.crates.outputs.present == 'true' }}
working-directory: busbar
env:
CRATE: ${{ inputs.plugin_crate }}
run: |
set -euo pipefail
"$PLUGIN_GATES" plugin-gates plane "$GITHUB_WORKSPACE/busbar" "$GITHUB_WORKSPACE/plugin" "${CRATE%-plugin}"
- name: cargo deny (the rendered deny.toml; busbar's .github/fleet/deps.toml at the pin)
if: ${{ !cancelled() && steps.crates.outputs.present == 'true' }}
working-directory: plugin
Expand Down
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 8 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ members = [
"crates/busbar-kernel-wal",
"crates/busbar-kernel-audit",
"crates/busbar-plane-llm",
"crates/busbar-plane-mcp",
"crates/busbar-plane-a2a",
"crates/busbar-plane-streaming",
"crates/busbar-plane-decisions",
"crates/plugin-loader",
"crates/busbar-transport-stdio",
"crates/busbar-transport-webrtc",
Expand Down Expand Up @@ -112,6 +110,14 @@ busbar-hook-ranking = { git = "https://github.com/GetBusbar/busbar-hook-ranking"
# double (`busbar_kernel::test_support::store_double`), and the root's `linked_store_double` tests
# prove the double states what this door states.
busbar-store-memory = { git = "https://github.com/GetBusbar/busbar-store-memory", rev = "848851e63ac7a454eb3d5daf9e11d739c48d738b" }
# THE MCP PLANE (kind: plane), pulled at a pinned rev: the logic crate the root links as the mcp plane's
# door row (`plane-mcp-door`, `busbar_plane_mcp::tool_door::door`) and installs in every build's tests.
# Its dropped-in cdylib twin (`busbar-plane-mcp-plugin`) and its gates live in that repo's plugin CI.
busbar-plane-mcp = { git = "https://github.com/GetBusbar/busbar-plane-mcp", rev = "a5e2ae355c138d8a57a4012225bf441c79bb84bd" }
# THE DECISIONS PLANE (kind: plane), pulled at a pinned rev: the logic crate the root links as the
# decisions plane's door row (`plane-decisions`, `busbar_plane_decisions::plane_door::door`). Its
# dropped-in cdylib twin (`busbar-plane-decisions-plugin`) and its gates live in that repo's plugin CI.
busbar-plane-decisions = { git = "https://github.com/GetBusbar/busbar-plane-decisions", rev = "d78c070da407c53d7235145fb76d69ed41b7046b" }
# ── A2A, from the a2aproject's OWN crates ──────────────────────────────────────────────────────
# THE OBVIOUS NAME IS THE WRONG ONE. `a2a-rs` on crates.io is `emillindfors/a2a-rs` (MIT, v0.5.0) —
# a different author entirely. The a2aproject family is the `a2a-*-lf` / `a2a-pb` set, all
Expand Down
12 changes: 10 additions & 2 deletions crates/busbar-contract/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,11 @@ crate-type = ["cdylib"]
[dependencies]
serde = { workspace = true }
serde_json = { workspace = true }
# The section-map split (`section`) reads a plane's section as YAML values, in insertion order.
serde_yaml = { workspace = true }
# The section-map split (`section::split_section`) and the door plane's provider list
# (`plane_calls::dialect_facts`) read a plane's section as YAML values, in insertion order. Optional,
# behind the `yaml` feature: the host and planes turn it on, so a plugin of another kind (store,
# secret, auth, hook, export, transport) links no YAML parser and carries no RUSTSEC-2024-0449.
serde_yaml = { workspace = true, optional = true }
indexmap = { workspace = true }
async-trait = { workspace = true }
futures = { workspace = true }
Expand Down Expand Up @@ -150,6 +153,11 @@ hyper = { workspace = true }
dispatch = []
runtime = []

# THE YAML READERS (`section::split_section`, `plane_calls::dialect_facts`). OFF by default. On in
# `busbar-kernel` (the host reads every plane section) and in every plane crate; every other
# workspace crate that calls them reaches this feature through its `busbar-kernel` edge.
yaml = ["dep:serde_yaml"]

# The TEST-ONLY seal (#65). `plugin::TestKernelSeal` is the one implementor of the now-SEALED
# `plugin::KernelSeal` that exists for fixtures rather than for the kernel, and it exists at all
# because a PLANE crate may not name `caps` (section 1.2) and so cannot mint a real token for its
Expand Down
4 changes: 4 additions & 0 deletions crates/busbar-contract/src/plane_calls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,10 @@ pub struct DialectFacts {
/// the order first referenced, with the `protocol` and `error_map` `lookup` resolves it to (a name
/// `lookup` does not know is skipped: the configuration's `resolve` refused it). An empty
/// `error_map` is absent.
///
/// Behind the `yaml` feature: the section it reads is a YAML value, and only the host and door
/// planes build this list.
#[cfg(feature = "yaml")]
pub fn dialect_facts(
section: &serde_yaml::Value,
lookup: impl Fn(&str) -> Option<(String, std::collections::BTreeMap<String, String>)>,
Expand Down
13 changes: 10 additions & 3 deletions crates/busbar-contract/src/section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
//! which are lifted out first as the all-plane `hooks:` attach (a LIST, so ADDITIVE) and the
//! all-plane `upstream_credentials:` default (a SCALAR, so OVERRIDE).
//!
//! [`split_section`] owns the ORDER and every SENTENCE, and a plane supplies the only three things
//! that differ: the WORDS for its section (the section key and the noun an operator reads back, both
//! off the plane's own declaration), the TYPE one registration parses into, and its own VALUE RULES.
//! `split_section` (behind the `yaml` feature) owns the ORDER and every SENTENCE, and a plane
//! supplies the only three things that differ: the WORDS for its section (the section key and the
//! noun an operator reads back, both off the plane's own declaration), the TYPE one registration
//! parses into, and its own VALUE RULES.
//!
//! No statics, no I/O and no registry: words and a deserializer in, a split section out. A plane
//! reads its section through this without naming the kernel or another plane.

// The section split alone reads YAML values; see the `yaml` feature in Cargo.toml.
#[cfg(feature = "yaml")]
use serde::Deserialize as _;

/// THE TWO WORDS RESERVED AT EVERY PLANE SECTION'S TOP LEVEL: the all-plane `hooks:` attach list and
Expand Down Expand Up @@ -193,6 +196,10 @@ pub struct Section<T> {
///
/// The deserializer's error carrying the refusal sentence: a reserved word used as a registration
/// name, a malformed reserved knob, a registration that does not parse, or one `validate` refuses.
///
/// Behind the `yaml` feature: only the host (`busbar-kernel`) and planes read a section, so a
/// plugin of another kind does not link a YAML parser.
#[cfg(feature = "yaml")]
pub fn split_section<'de, D, T>(
deserializer: D,
section: &'static str,
Expand Down
11 changes: 11 additions & 0 deletions crates/busbar-core-admin/src/tests/planeverbs_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,18 @@ fn shipped_plane_keys() -> Vec<String> {
.map(str::to_string)
})
.collect();
// A PLANE THAT LEFT FOR ITS OWN REPO is still a plane this tree links: the root pins it as a
// `git` row of `[workspace.dependencies]` (`busbar-plane-<key> = { git = …, rev = … }`), and
// its key is banned exactly as when its crate lived here (ARCHITECT row 106 (A)).
let root_manifest = std::fs::read_to_string(crates_dir.join("../Cargo.toml"))
.expect("the workspace's root Cargo.toml is readable");
keys.extend(root_manifest.lines().filter_map(|l| {
let (name, spec) = l.trim().split_once('=')?;
let key = name.trim().strip_prefix("busbar-plane-")?;
(spec.contains("git =") && !key.ends_with("-plugin")).then(|| key.to_string())
}));
keys.sort();
keys.dedup();
// A derivation that found nothing would make both ratchets below pass on any source at all.
assert!(
keys.len() >= 2,
Expand Down
4 changes: 3 additions & 1 deletion crates/busbar-kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ bumpalo = { workspace = true }
# stays on the admin surface; only the neutral scope model lives here, so a non-admin core
# consumer (router, the chain-verification module, config, config_validate) never has to name
# "admin" to check a scope.
busbar-contract = { path = "../busbar-contract" }
# `yaml`: the host reads every plane's section (`plane::config`, `plane::door`) through the contract's
# YAML readers; this edge is the one that turns them on for the workspace.
busbar-contract = { path = "../busbar-contract", features = ["yaml"] }
# (The HOT-lane plugin/plane ABI the kernel hosts — the `#[repr(C)] PlaneHostVtable` and its POD types
# — is `busbar_contract::abi::hot` since the #84 merge; consumed HOST-side by `src/plane_host`.)
# THE ONE NETWORK JUDGE (#36: "the upstream leg — walk + swrr weighting + pre-dial guard; trust
Expand Down
17 changes: 5 additions & 12 deletions crates/busbar-kernel/src/config_validate/secret_refs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,18 +400,11 @@ pub(crate) const SECRET_BEARING_TYPES: &[(&str, SecretBearing)] = &[
("AuthChainEntry", SecretBearing::Walked),
("IdentityProviderCfg", SecretBearing::Walked),
("BrowserLoginCfg", SecretBearing::Walked),
// `tools.<name>.token_exchange.subject_token` — busbar's OWN token, the SUBJECT of an RFC 8693
// exchange, never the caller's.
(
"TokenExchangeCfg",
SecretBearing::DoorDeclared(
"the `tools:` door's section: its Statement declares \
`settings.*.token_exchange.subject_token` (and `settings.*.env.*` for a stdio child's \
referenced environment), and the folded row's section enumerates every reference at \
those paths",
),
),
// That plane's LEASED outbound delegation credential. Reached from `RootCfg` through
// The `tools:` door's own credential type (`tools.<name>.token_exchange.subject_token`) left
// this tree with its plane (the pinned plugin repo, #39): its references are read at the door's
// declared `settings.*.token_exchange.subject_token` / `settings.*.env.*` paths through the
// `DoorSection` row below, so no type of it is listed here.
// The `agents:` plane's LEASED outbound delegation credential. Reached from `RootCfg` through
// `agent_defs -> agents.<name>.upstream_credential`.
("OutboundCredential", SecretBearing::Walked),
// That plane's OUTBOUND CLIENT CERTIFICATE — busbar's own end of a mutual handshake with a
Expand Down
11 changes: 11 additions & 0 deletions crates/busbar-kernel/src/trust/tests/genericity_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,17 @@ fn the_lifecycle_names_no_plane_in_its_code() {
rest.split('-').next().map(str::to_string)
})
.collect();
// A PLANE THAT LEFT FOR ITS OWN REPO is still a plane this tree links: the root pins it as a
// `git` row of `[workspace.dependencies]` (`busbar-plane-<key> = { git = …, rev = … }`), and
// its key is banned exactly as when its crate lived here (ARCHITECT row 106 (A)).
let root_manifest = std::fs::read_to_string(crates_dir.join("../Cargo.toml"))
.expect("the workspace's root Cargo.toml is readable");
plane_keys.extend(root_manifest.lines().filter_map(|l| {
let (name, spec) = l.trim().split_once('=')?;
let rest = name.trim().strip_prefix("busbar-plane-")?;
(spec.contains("git =") && !rest.ends_with("-plugin"))
.then(|| rest.split('-').next().map(str::to_string))?
}));
plane_keys.sort();
plane_keys.dedup();
assert!(
Expand Down
83 changes: 0 additions & 83 deletions crates/busbar-plane-decisions/Cargo.toml

This file was deleted.

8 changes: 0 additions & 8 deletions crates/busbar-plane-decisions/examples/decisions_door.rs

This file was deleted.

Loading