feat(checks): the detector becomes a gate, and our own page had to pass it - #75
Merged
Conversation
…e payload This framework had 22 gates and not one of them looked at what an interface renders. The design method ships a deterministic detector, no model and no key, so it is wired where the rest of the mechanical floor already lives: a CI stage of its own, and an edit hook that reports while the code is being written. The hook comes with the payload. `design-method.mjs --install` no longer passes --no-hooks, so the install wires the Claude manifest into the gitignored .claude/settings.local.json, guarded by upstream so a clone without the payload is a no-op rather than an error. That file is now ignored by this repo too rather than only by one machine's global ignore, because it names a path inside the gitignored payload and a shared copy would point every clone at a file it does not have. The CI stage is the other half, and it is `stack`'s to wire, beside the ecosystem's typecheck and tests. Section 3 carries the stage, the runner note (the method's engines.node can sit above the one the rest of CI uses), the refusal to fall back to green, and what the standards file must say about waivers: the narrowest exception that fits, with its reason, through the method's own command, because a finding nobody examined is not a false positive. stack-gates grew a second half on the same evidence rule as the first. .impeccable/config.json is the tracked declaration that this project judges an interface with the method, since the payload itself is gitignored and a clone's disk cannot answer that question. When it is there, a workflow has to actually run the detector: a commented stage fails, exactly like the commented stack gates next to it. Both directions are fixtures, and the gate was watched failing on this repo by commenting its own stage out. Traces-to: SC-8
… engine Wiring the detector into CI turned it on our own landing page, and the CI engine is stricter than the one bundled with the installed payload: nine findings where the local hook reported none. That gap is now a measured fact rather than a surprise, and the fix for it is to run the same command locally that CI runs. Three of the nine were real and are fixed. The hero eyebrow was a tracked-caps pill above the h1, which is the tell every AI landing page shares and which the method names on sight; it says the same words quietly now, sentence case and no pill, and that cleared the all-caps finding with it. The theme sheet's title jumped from h2 to h4 with no h3 between, which breaks the document outline a screen reader navigates by. Four declarations sat at 11.5px, below the 12px floor for body text, and now sit at 12.5px with the rest of the small type. Four are waived in .impeccable/config.json, each scoped to this one file with its reason on the entry. Three are cramped-padding on the stat strip, and they are a measured false positive: the cells whose padding-left is zero are exactly the cells whose border-left is zero, and the static engine merges those selectors into one element that is flush against a border it does not have, which a five-line fixture reproduces on its own. The fourth is flat-type-hierarchy, waived on the owner's call with the measurement in the reason: the rule wants roughly 1.25x between every step, a 12.5/14/16 fixture still fires, and this page is dense UI whose labels, chips and captions would flatten into body text under a two-step ramp. Traces-to: SC-8
… found The ticket carries its own evidence: the two CI runs that proved the job red and green, the measured gap between the published CLI and the payload's bundled detector, which three findings were fixed on the page and which four are waived with what reason, and why .impeccable/config.json is the signal a fresh clone can still read. The two surfaces left out of the scan are named rather than implied: the UI showcase mimics other libraries on purpose, and the cockpit renders on demand instead of being published. STATE carries the same facts in one paragraph, the suite count moves to 187, and the older ticket 03 entry moves to the August archive to keep the handoff inside its budget. Traces-to: SC-8
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
Groundwork had 22 gates and not one of them looked at what an interface renders. Ticket 05 of spec
011 wires the design method's deterministic detector into the mechanical floor, in both places the
spec asked for.
The edit hook rides with the payload.
checks/design-method.mjs --installno longer passes--no-hooks, so the install wires the Claude manifest into.claude/settings.local.json(nowignored by this repo, not only by one machine's global ignore), guarded by upstream so a clone
without the payload is a no-op rather than an error.
The CI half is
stack's to wire, beside the ecosystem's typecheck and tests. Section 3 carriesthe stage, the runner note (the method's
engines.nodecan sit above the one the rest of CI uses),the refusal to fall back to green, and what the standards file must say about waivers. This repo's
own workflow gets a
designjob on Node 22 that scans the published page.stack-gatesgrew a second half on the same evidence rule as the first..impeccable/config.jsonis the tracked declaration that this project judges an interface with themethod, because the payload is gitignored and a clone's disk cannot answer that question. While it
is there, a workflow has to actually run the detector; a commented stage fails, exactly like the
commented stack gates next to it.
Then the gate turned on our own landing page, and it had findings. The published CLI is
stricter than the detector bundled with the installed payload: nine findings against none on the
same file, same version. Three were real and are fixed (a tracked-caps pill above the h1, a heading
skipping h2 to h4, 11.5px body text). Four are waived in
.impeccable/config.json, each scoped tothat one file with its reason on the entry: three
cramped-paddinghits proven a false positivewith a five-line fixture, and
flat-type-hierarchyon the owner's call with the measurement in thereason. Two more waivers from the same run predate them, both owner-confirmed: Inter as the body
face, and the tool marquee.
Verified by
index.htmlturnedthe
designjob red (run 31212639013, throwaway branch since deleted); the fixed page is green(run 31213510003), with
gate,drillandtracegreen beside it.out makes
node checks/check.mjsreportstack-gates, and restoring it clears the run.checks/check-stack.test.mjscover the design half in both directions,including the commented-stage case and a copy with no design method at all. Suites: 187 across
the five gate suites (10 stack), and the five node:test suites exit 0.
also fired on the live edits in this session.
only re-scanned.
without project config, to rule out config and design-system context as the cause of the gap.
stricter one in CI and says so in
stack, so the hook's silence is never taken for the gate'sverdict.
🤖 Generated with Claude Code