Skip to content

feat(checks): the detector becomes a gate, and our own page had to pass it - #75

Merged
Tradebaas merged 3 commits into
mainfrom
feat/detector-becomes-a-gate
Aug 7, 2026
Merged

feat(checks): the detector becomes a gate, and our own page had to pass it#75
Tradebaas merged 3 commits into
mainfrom
feat/detector-becomes-a-gate

Conversation

@Tradebaas

Copy link
Copy Markdown
Owner

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 --install no longer passes
--no-hooks, so the install wires the Claude manifest into .claude/settings.local.json (now
ignored 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 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. This repo's
own workflow gets a design job on Node 22 that scans the published page.

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, 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 to
that one file with its reason on the entry: three cramped-padding hits proven a false positive
with a five-line fixture, and flat-type-hierarchy on the owner's call with the measurement in the
reason. Two more waivers from the same run predate them, both owner-confirmed: Inter as the body
face, and the tool marquee.

Verified by

  • Both directions in real CI, not reasoned about. A gradient headline on index.html turned
    the design job red (run 31212639013, throwaway branch since deleted); the fixed page is green
    (run 31213510003), with gate, drill and trace green beside it.
  • The gate watched failing on this repo, not only in fixtures: commenting the detector stage
    out makes node checks/check.mjs report stack-gates, and restoring it clears the run.
  • Five new fixtures in checks/check-stack.test.mjs cover 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.
  • The edit hook was exercised on a real payload and reported both tells in a probe file; it
    also fired on the live edits in this session.
  • The page was rendered and looked at after the eyebrow change, with animations settled, not
    only re-scanned.
  • Measured, not assumed: both detector engines were called directly on the same file with and
    without project config, to rule out config and design-system context as the cause of the gap.
  • Not verified here: whether upstream intends the two engines to differ. Our side reads the
    stricter one in CI and says so in stack, so the hook's silence is never taken for the gate's
    verdict.

🤖 Generated with Claude Code

…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
@Tradebaas
Tradebaas merged commit fdc304a into main Aug 7, 2026
8 checks passed
@Tradebaas
Tradebaas deleted the feat/detector-becomes-a-gate branch August 7, 2026 20:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant