Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 5 additions & 1 deletion scripts/plane-keys.sh
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ PLANE_KEYS="llm a2a voice"
# its plane-kind crate `crates/busbar-plane-<key>` (P3 DEL-MCP, ARCHITECT 2026-10-05: `mcp`). Never a
# `crates/busbar-<key>` root; STILL a plane noun, so a needle gate that bans the other planes' keys
# keeps banning it (`plane_noun_keys_other`). Leaving PLANE_KEYS must not let the word in.
PLANE_KEYS_KIND_ONLY="mcp"
# `decisions` (#48) never had a legacy-engine crate: one plane-kind crate, located by its door row
# alone, so it is kind-only from birth and on this list so a vanished door row is PLANE-ROOT-MISSING
# (xtask/src/planes.rs, the twin, pinned equal by xtask/tests/infra.rs). As a needle it reaches only
# the report-only meters that source this list (plane-grep-gate.sh, plane-noun-gate.sh).
PLANE_KEYS_KIND_ONLY="mcp decisions"

# The protocol subset: every plane key except `llm`. Derived from PLANE_KEYS so adding a plane in
# one place flows here automatically.
Expand Down
26 changes: 26 additions & 0 deletions xtask/src/gates/structure_lint/selftest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,32 @@ pub fn run<'a>(gate: &'a StructureLintGate, cx: &'a Ctx) -> Report<'a> {
),
}

// THE FIFTH PLANE IS ON THE ROSTER TOO (#48). `decisions` is located by its door row alone and
// was on neither roster list, so taking the `plane-door` axis off `plane-decisions` dropped the
// plane from the roster with no finding. It is kind-only (`planes::PLANE_KEYS_KIND_ONLY`): the
// same plant must be PLANE-ROOT-MISSING naming it.
match cx.read(&manifest_rel) {
Ok(text) if text.contains("plane-decisions = \"plane-door\"") => {
let mut ov = Overlay::new();
ov.set(
&manifest_rel,
text.replace("plane-decisions = \"plane-door\"", "plane-decisions = \"\""),
);
report.push(tree_case(
cx,
gate,
"the decisions plane whose door row left the manifest is refused, not silently off the roster",
&[roots::ROW_PLANE_ROOTS],
ov,
&["PLANE-ROOT-MISSING", "decisions"],
));
}
_ => report.note_infra_failure(
"structure-lint selftest: the manifest carries no `plane-decisions = \"plane-door\"` row, \
so the decisions plane-root case has nothing to plant against",
),
}

// A PLANE THE OLD CONSTANT NEVER NAMED (item 224). `PLANES` was `["mcp", "a2a"]`, so a second
// home for voice could not be reported: the row "every plane resolves to exactly one home" was
// true of the two planes it had been given. A second declaration of voice, in a directory named
Expand Down
6 changes: 5 additions & 1 deletion xtask/src/planes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ pub const PLANE_KEYS: [&str; 3] = ["llm", "a2a", "voice"];
/// `scripts/plane-keys.sh`'s `PLANE_KEYS_KIND_ONLY`. A roster that must notice a plane VANISHING
/// (structure-lint's plane-roots row) reads these beside [`PLANE_KEYS`]: leaving the legacy roster
/// must not take a plane off the roster that refuses an unlocatable plane.
pub const PLANE_KEYS_KIND_ONLY: [&str; 1] = ["mcp"];
///
/// `decisions` (#48, the fifth plane) has never had a legacy-engine crate: it is one plane-kind
/// crate, `busbar-plane-decisions`, located by its door row alone (`plane-decisions`, FLIP-DECISIONS).
/// Off this list, a door row that vanished took it off structure-lint's roster with no finding.
pub const PLANE_KEYS_KIND_ONLY: [&str; 2] = ["mcp", "decisions"];

/// The default ownership grammar. Overridable for a fixture tree, the way
/// `PLANE_ROOTS_GRAMMAR` is in the shell.
Expand Down