feat(checks): a project with a stack says whether its own gates are armed - #69
Merged
Merged
Conversation
…rmed Nothing in checks/ knows anything about a product's code. The gates next door prove documents, budgets, traces and secrets, and every one of them stays green on a repo whose TypeScript does not compile. The tools that do know are the ecosystem's own, and the skill stack wires them into CI at the moment the stack is chosen: typecheck, lint, tests, build, audit, replacing the commented placeholder stage the workflow ships with. Until that happens there is a window nobody was watching. enforcement.mjs reports CI as armed the moment any workflow file exists, so a project can choose a stack, write its standards file, pass all 21 Groundwork gates, read "CI armed" in its own report, and have not one line of its own code checked by anything. That is the same family as the two defects fixed on 2026-08-01: a gate that is off without anyone deciding it should be. The new gate fires on exactly that window: a standards file that is not the cross-stack floor, plus a workflow that still carries commented-out stack gates. It asserts one mechanical thing, that the placeholders were dealt with, and deliberately not which tools were wired. Naming the blessed commands per ecosystem is an allowance list, and an allowance list is the thing that rots; proving the wired gates actually bite stays where stack section 3 already puts it, at introduce a violation and watch it fail. Three cases stay quiet on purpose and each has a test: a fresh copy that has not picked a stack, GLOBAL.md on its own, and a project whose CI lives on another host, which stack section 3 explicitly allows and enforcement.mjs already reports on. It lands in its own file because adding it to check.mjs took that file to 527 lines against its own 500-line cap. Splitting by responsibility is what PR #61 did for the same reason, so the suite mirrors the source here too: check-stack.mjs and check-stack.test.mjs, composed into the one registry like the code and trace families beside them. The registry is the source of the explainer's gate count, which moves 21 to 22 and was caught by its own gate rather than by me. Traces-to: SC-5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed and why
Nothing in
checks/knows anything about a product's code. The gates prove documents, budgets,traces and secrets, and every one of them stays green on a repo whose TypeScript does not
compile. The tools that do know are the ecosystem's own, and
stacksection 3 wires them intoCI when the stack is chosen, replacing the commented placeholder stage the workflow ships with.
Until that happens there was a window nobody watched.
enforcement.mjsreports CI as armed themoment any workflow file exists, so a project could choose a stack, write its standards file,
pass all 21 Groundwork gates, read "CI armed" in its own report, and have not one line of its
own code checked by anything. Same family as the two defects fixed earlier today: a gate that
is off without anyone deciding it should be.
The new
stack-gatesgate fires on exactly that window: a standards file that is not thecross-stack floor, plus a workflow still carrying commented-out stack gates.
What it deliberately does not do is name the tools it expects. A list of blessed commands
per ecosystem is an allowance list, and this repo has already reasoned once that an allowance
list is the thing that rots. So the mechanical half is "the placeholders were dealt with", and
proving the wired gates actually bite stays where
stacksection 3 puts it: introduce aviolation, watch it fail, revert. That limit is written into the module, not left implied.
Three cases stay quiet on purpose, each with its own test: a fresh copy that has not picked a
stack (otherwise every new project starts on a red gate),
GLOBAL.mdon its own, and a projectwhose CI lives on another host, which
stackallows andenforcement.mjsalready reports on.It lands in its own file because adding it to
check.mjstook that file to 527 lines againstits own 500-line cap. Splitting by responsibility is what PR #61 did for the same reason, so the
suite mirrors the source:
check-stack.mjs+check-stack.test.mjs, composed into the oneregistry beside the code and trace families.
ci.ymland the drill's suite list gain the newsuite; the drill's comment said "the five suites" while listing seven, corrected in passing.
Verified by
expectFailproves the gate fires on the window. Then thegate body was temporarily replaced with
return;and the suite went red(
expected check "stack-gates" to fail, got: []), proving the test catches a dead gate, andrestored.
progress 25, links 19, cockpit-path 11, cockpit 21, drill 11.
node checks/check.mjsgreen, after two gates of this repo turned red on the change andwere fixed at the cause, not weakened:
code-file-capat 527 lines (fixed by the split) andexplainer-statsat 21 vs 22 gates (fixed on the page). Both were caught by the gates ratherthan by me.
node checks/drill.mjs --require-walkPASSED, now reporting 8 suites in the copy. Itfailed twice first, correctly: the new files were untracked, and then staged but uncommitted,
and the drill archives a commit. That is the drill proving a file that does not ship does not
reach a copy.
so a fixture with an escape sequence in the stack filename was run through the gate: the name
is quoted and the control characters are gone, inheriting
forTerminalfrom the sharedfail.Not verifiable here: the gate has never run on a real product, because Groundwork has no stack.
That is the same N=1 limit the gate itself is about, and it is why the five fixture cases carry
the proof instead.