Skip to content

feat(checks): the design method installs, and the gates say whether it is here - #71

Open
Tradebaas wants to merge 1 commit into
mainfrom
feat/impeccable-install-route-and-declaration
Open

feat(checks): the design method installs, and the gates say whether it is here#71
Tradebaas wants to merge 1 commit into
mainfrom
feat/impeccable-install-route-and-declaration

Conversation

@Tradebaas

Copy link
Copy Markdown
Owner

What changed and why

Spec 011 is signed by the owner (2026-08-05) and set to building. This is ticket 01, its tracer:
the narrow path from "impeccable is the methodology for making design" to "every gate still
holds", run on this repo, which has a frontend of its own, rather than on a fixture.

node checks/design-method.mjs --install is the route. It reads impeccable's Node floor out of
the package that states it, refuses before writing anything when the floor is not met, installs
the Claude build, and then repairs decision 0002: upstream deliberately deletes a .claude/skills
symlink pointing at another provider's skills directory, so the route moves the payload to
.agents/skills/impeccable and relinks. Rerunning it is a no-op.

The payload is gitignored like a dependency, so a clone starts without it and the files cannot
tell you it is missing. enforcement.mjs therefore reports a fourth signal beside hooks, CI and
adapter hooks, in both states, and the board shows it in both languages.

What the gates measure became a declaration instead of an accident. checks/config.json holds one
thirdParty list, each entry a path and its reason; the gates that judge this project's own
writing skip those paths, and every other gate, the secret scan included, still reads every line.
config-invariants bounds the list the same way it bounds the exclusion lists next to it.

Two of this repo's own gates shaped the diff: code-file-cap refused to let check.mjs pass its
500-line cap, so config-invariants moved into checks/check-config.mjs with its own suite (the
registry still holds 22 gates: one moved, none multiplied), and that move exposed that
code-file-cap read the exclusion list itself rather than the runner's one reader.

Two documentation corrections ride along, both because the code is the fact: the spec's Node floor
said 22.18 where the package says 22.12, and criterion 3 named a narrower set of exempt gates than
the change actually needs.

Verified by

  • The install run for real, twice, on this repo: first run installs and repairs the symlink,
    second run refreshes through the symlink and leaves it standing. ls -la .claude/ confirms the
    link; node checks/design-method.mjs reports impeccable 4.0.4.
  • node checks/check.mjs: OK with the payload installed, and the enforcement line reads
    "hooks armed, CI armed, adapter hooks armed, design method armed". Before the declaration the
    same run produced 818 findings across five gates, which is what the declaration is for.
  • All ten suites green: 182 self-tests across five gate suites (70 runner, 35 code, 24 config, 48
    trace, 5 stack), plus progress, links, cockpit-path, cockpit and drill.
    node checks/drill.mjs --require-walk PASSED.
  • The gates card rendered in both languages, showing "4 of the 4 gates on this machine are armed"
    and the new row.
  • git check-ignore on six paths: the payload is ignored, and .impeccable/config.json,
    design.json and critique/ stay tracked as impeccable's README requires.
  • Measured rather than assumed: the 40 markdown files impeccable ships hold zero broken asserted
    links today, so leaving them out of the document map is precaution and readability (97 documents
    instead of 137), not a repair. Stated as such in the ticket.
  • Not verified here: the failure path with npm unreachable was reasoned about, not forced. Spec
    criterion 2 exercises it for real during verify of the whole spec.

…t is here

Spec 011 is signed, and this is its tracer: the narrow path from "impeccable is the methodology
now" to "every gate still holds", run on this repo rather than on a fixture, because this repo
has a frontend of its own.

The route is one command, checks/design-method.mjs --install. It reads the Node floor out of
impeccable's own engines.node instead of a number typed here, so an upstream bump cannot leave a
stale requirement behind, and it refuses before writing anything when the floor is not met. Then
it installs the Claude build and repairs decision 0002: upstream deliberately deletes a
.claude/skills symlink that points at another provider's skills directory, calling it a legacy
install artifact, so the route moves the payload to .agents/skills/impeccable and relinks. A
second run is a no-op, and skills-symlink is the net if a future release changes this again.

The payload is gitignored like the dependency it is, which means a clone starts without it and
nothing in the files can tell that it should be there. So enforcement.mjs gains a fourth signal
beside hooks, CI and adapter hooks: installed with its version, or not installed with the command
that fixes it. The board says the same thing in both languages.

What the gates measure is now a declaration rather than an accident. checks/config.json holds one
thirdParty list, each entry a path and its reason, and the gates that judge this project's own
writing skip those paths: prose style, the denylist, the agent-file cap, the code-file cap, the
deferral contract, zombie code, the skills registry and its count, and the document map. Every
other gate still reads every line, the secret scan included. The declaration is bounded by
config-invariants exactly like the exclusion lists beside it: it states its reason, it may not
reach checks/ or docs/standards/, and fixtures prove both directions, because an exemption nobody
can show to be bounded is a hole.

Two of this repo's own gates shaped the change. code-file-cap refused to let check.mjs grow past
its 500-line cap, so config-invariants moved into checks/check-config.mjs with its own suite, the
same split PR #69 made for the same reason; the registry still holds 22 gates, since a gate moved
rather than multiplied. And the move exposed that code-file-cap read the exclusion list itself
instead of the runner's one reader, so the two could have drifted apart without anyone noticing.

The spec's Node floor said 22.18, read from a summary rather than from the source; the package
says 22.12. Criterion 3 named a narrower set of exempt gates than the code needs. Both are
corrected here, because the code is the fact.

Traces-to: SC-8
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