From 1d021db5ac16b76f2f6a1e0a2cdcdcae5d5e96ba Mon Sep 17 00:00:00 2001 From: Matthew Jackson <1085847+MattJackson@users.noreply.github.com> Date: Tue, 13 Oct 2026 21:51:14 -0700 Subject: [PATCH] structure-lint roster: `decisions` is a kind-only plane key, so a vanished door row is PLANE-ROOT-MISSING The fifth plane (#48) is located only by its door row (`plane-decisions` on the plane-door axis) and was on neither roster list. So taking that axis off its row dropped the plane from structure-lint's plane roster with no finding, the silent-off-roster case the roster exists to refuse. - xtask/src/planes.rs PLANE_KEYS_KIND_ONLY = ["mcp", "decisions"], and its shell twin scripts/plane-keys.sh PLANE_KEYS_KIND_ONLY="mcp decisions" (pinned equal by xtask/tests/infra.rs). - RED: structure_lint selftest plants `plane-decisions = ""` in place of its plane-door axis and requires PLANE-ROOT-MISSING naming `decisions`. With decisions off the list the plane leaves the roster and the case fails. The shell list also feeds the report-only meters plane-grep-gate.sh and plane-noun-gate.sh. No CI step or xtask gate runs them. --- scripts/plane-keys.sh | 6 ++++- xtask/src/gates/structure_lint/selftest.rs | 26 ++++++++++++++++++++++ xtask/src/planes.rs | 6 ++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/scripts/plane-keys.sh b/scripts/plane-keys.sh index b23da7c73b..acbdd99308 100644 --- a/scripts/plane-keys.sh +++ b/scripts/plane-keys.sh @@ -58,7 +58,11 @@ PLANE_KEYS="llm a2a voice" # its plane-kind crate `crates/busbar-plane-` (P3 DEL-MCP, ARCHITECT 2026-10-05: `mcp`). Never a # `crates/busbar-` 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. diff --git a/xtask/src/gates/structure_lint/selftest.rs b/xtask/src/gates/structure_lint/selftest.rs index 98f7c3dbea..ae3f0a9bf6 100644 --- a/xtask/src/gates/structure_lint/selftest.rs +++ b/xtask/src/gates/structure_lint/selftest.rs @@ -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 diff --git a/xtask/src/planes.rs b/xtask/src/planes.rs index 0b1b37e89f..32451e5bae 100644 --- a/xtask/src/planes.rs +++ b/xtask/src/planes.rs @@ -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.