Repository navigation
v1.91.274.0 feat(design-html,design-review): run gstack-design-lint; copy tier at its lines; waivers replace craft_exceptions (hallmark phase 2) - #3507
Conversation
…nt-node; content-realism ids at ask The copy tier holds its own patterns (from lib/design-craft.ts) and reads visible text, script bodies, inline handlers and parsed tags, so payloads, commented markup and script text no longer count. A text-less body that loads a script reports empty-mount-node. placeholder-name, placeholder-brand, lorem, round-number and needs-proof move to ask so a page-specific waiver answers them (Garry 2026-10-26, option a). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ace craft_exceptions; remove gstack-design-craft /design-html Step 4 and /design-review's craft audit call the lint and read its exit code. A waiver comment in the page replaces --accepted and finalized.json craft_exceptions (supersedes #3422's persisted exceptions). bin/gstack-design-craft, lib/design-craft.ts and its test are removed; the handoff tests move to test/design-craft-resolvers.test.ts. The slop-gate paid case and its touchfiles follow the lint. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
😎 This pull request was merged. |
…ed in NOTICE.md Names the removed lib/design-craft.ts and test/design-craft.test.ts so pregate selects a lane for the deletions (PREGATE_NO_LANE at 17635b6). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
- /design-review files only craft-gate lint lines on a saved page, whose linked CSS the lint cannot load (false missing-focus-visible blocks) - missing-aria-current counts route links in one pass (unclosed navs were superlinear); inline-handler tells report at the value's line; a shell with no <body> tag is an empty mount node - /design-html says the copy tier reads HTML only, and that a supplied figure may also need an invented-proof waiver - tests pin the five content-realism ids at ask and a waived copy tell Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ANGELOG via mergeChangelogs) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…e merged tree's measured sizes design-review skeleton 137735, union 144802, ratio 1.3681 (all lower); design-html skeleton 55834, union 78626 (caps unchanged, comments updated). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
E2E Evals: ✅ PASS125 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $32.24 rule/judge cost | reconcile exit: 0 Profile: pr / mode Full gate restored by:
Rule and judge shards
Fail-closed reconciliationSliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry. Dispatched narrow screen (gstack-ship-queue ready --screen) of merge commit |
…ain-fae701fcd1c7-a1934a1498ec-7d5f35 slot 1) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
What changed
Before: /design-html ran
gstack-design-craft, which counted tells without positions and kept accepted exceptions in finalized.json via--accepted. After: it runsgstack-design-lint --renderand reads the exit code; a waiver comment in the page answers a tell the user confirmed.The same fixture (
test/fixtures/design-lint/slopped.html). Before:marketing-buzzword 5, no line. After: each tell at its line with what matched; the five content-realism ids read ask.gstack-design-lint <page> --renderafter the Slop Gate: exit 2 fixes everyblocksline, 1 fixes or waives eachask, 0 listspolishas notes. A missingLINT_SUMMARY, arenderline orrender=skippedis said plainly and the static lines stand.<!-- gstack-lint-disable <rule-id>: <reason about this page, 24+ chars> -->), written only for what the user supplied or confirmed.--acceptedand finalized.json'scraft_exceptionsare gone; this supersedes v1.91.230.0 feat(design-shotgun,design-html): archetype handoff and persisted craft exceptions (GSTA-92 phase 2) #3422's persisted craft exceptions.placeholder-name,placeholder-brand,lorem,round-number,needs-proofmove from blocks to ask so a waiver can answer them. /design-review still files a waivedneeds-prooforlorem.empty-mount-nodesends it to the saved DOM.lib/design-lint/rules/copy.ts): its own patterns, each tell at its line.bin/gstack-design-craft,lib/design-craft.tsandtest/design-craft.test.tsare removed; their cases live intest/design-lint.test.ts, the archetype handoff tests intest/design-craft-resolvers.test.ts.empty-mount-node(ask, page only): a text-less body (a<noscript>notice aside) that loads a script.From the craft-exception follow-up (GSTA-92)
Carried into the fold: real shell detection with the "empty mount node" wording; the four checker limits #3433 listed (script payloads counted as code, single-quoted handlers missed, presence rules matching script text, commented-out markup scanned) are fixed by reading parsed tags, script bodies and visible text; the provenance item survives as "waive only what the user supplied or confirmed".
Dropped by design: content-matched exceptions and exception provenance fields in finalized.json (there is no exception record any more; the waiver sits beside the content it answers), and the
transition-alllegacy id mapping (no record to read).Why
Phase 1 (#3459) shipped the lint with the craft ids, but the skills still called the old checker, so a /design-html run got counts without lines and a second exception format. Garry chose option (a) for the one contract gap: content-realism ids at ask, answered in the page.
Approvals
Source: gstack-approvals record for garrytan/gsta92-hallmark-p2 (display only; not an approval citation).
Summary
lib/design-lint/rules/copy.tsreports each content and ship-floor tell at its line;empty-mount-nodeis new; the five content-realism ids read ask.gstack-design-lint; in-page waivers replacecraft_exceptionsand--accepted;bin/gstack-design-craft,lib/design-craft.tsandtest/design-craft.test.tsare removed.craft) lines, since its linked CSS is gone;missing-aria-currentcounts in one pass; the inline-handler line points at the value; a page with no<body>is read from after</head>.docs/design-lint.mdforward references say "a later phase".mergeChangelogs(the PR's [Unreleased] entry above main's sections, nothing hand-resolved), NOTICE.md auto-merged. d63573a re-pins the design-review parity guard to the merged tree's measurement (skeleton 137,735 bytes, ratio 144,802 / 105,842 = 1.3681); the design-html caps are unchanged, with updated comments.Test Coverage
New paths have tests:
test/design-lint.test.tscarries the moved checker cases plus each copy tell at its line, the five ids at ask and a waived copy tell;test/design-lint-eighth-cycle.test.tsadds thearia-currentperf case;test/design-craft-resolvers.test.tsnames the removed files and the NOTICE.md credit. Regression proof for the review fixes: the new tests failed in a scratch worktree before the fix and pass after it.Tests ran: remote free tier 18929 (632 files, 0 failed) at d63573a, tree c1b9792ebf9f
Tests ran: Free Tests (pull_request) run 40473121745 success at d63573a
Tests ran: Windows Free Tests (pull_request) run 40473121049 success at d63573a
Pre-Landing Review
Pass 1 (at 8c021d1): 16 findings, 1 blocking: a saved live page has lost its linked CSS, so the craft audit would file false
missing-focus-visibleblocks. It and 7 others were fixed in b5c44b9. Pass 2 (8c021d1..b5c44b9): testing and maintainability clean; one informational adversarial note (below).REVIEW_LOOP: passes=2 blocking_found=1 deferred=0 noted=4 fixed=8 scope=frozen
Re-READY at d63573a: /ship Step 1's carry check carried the receipt from ef6a163 (product patch-id unchanged; base merge + test-only change + release metadata), so no new review pass ran. A delta read of
git diff ef6a16324 d63573a75restricted to this PR's files (CHANGELOG.md, NOTICE.md, test/helpers/carve-guards.ts, test/helpers/touchfiles-data.ts) found main's own entries plus the re-pin and nothing at the blocking floor.Outside review: GPT pass (openai/gpt-6.1-sol) on 8c021d1 found one P3 (inline-handler line), fixed. A resumed pass ran on Claude, not a second model family; Codex is not installed, so cross-family coverage is the GPT pass only.
Review notes
Below the blocking floor (advisory, informational, test-gap or wording items); recorded here and not fixed in this PR.
lib/design-lint/waivers.ts:140A page waiver is keyed by rule id, so one waiver for a supplied Nexus or 50% also waives every later invented brand or round number on the page; the count-bounded craft_exceptions it replaced flagged new hits.lib/design-lint/rules/ids.ts:158lorem and needs-proof are waivable in /design-html after the move to ask.design-html/sections/craft.md.tmpl:66A render blocks line for a page that did not render is told to be treated as not measured, beside 'fix every blocks line'.lib/design-lint/rules/copy.ts:60An unclosed <script>'s body is read as visible text.test/design-lint.test.ts:275100vh followed by a 100dvh fallback now blocks under vh-height in /design-html (the deleted checker accepted it); no test pins either semantics.bin/gstack-design-lint:53An empty .html exits 1 with only overflow-x-unclipped instead of 'nothing checked'; /design-review would file a finding on a zero-byte saved DOM.test/design-lint-eighth-cycle.test.ts:4Header still names the craft check's lazy scans.lib/aside-render.ts:474On Linux without gstack browse built, --render can pick /usr/bin/browse (xdg-open).lib/design-lint/rules/copy.ts:147With no<body>and no</head>, the head closes at</html>, so a page with visible text is flaggedempty-mount-node(ask).Exploratory QA
4 functional probes of
bin/gstack-design-lintat 8c021d1, all pass: copy tells at their lines (ask), a waiver comment answers its tell, a script shell reportsempty-mount-node.--render(browser measurement) was not exercised; skill prose behaviour is covered by the paid cases.Design Review
No frontend files changed — design review skipped.
Eval Results
design-html-slop-gate(behavior, 3 trials) at b5c44b9: PASS 3/3, $0.33 + $0.35 + $0.35. An earlier panel at 17635b6 (PASS 3/3, $1.21) was superseded by the lint and prose changes.design-review-detector-shimPASS 1/1 $0.13;design-review-detector-shim-domPASS 1/1 $0.21;design-review-plugin-handoffPASS 1/1 $0.14.design-review-fix: not run (infra). Its describe block skips without Aside on this Linux machine; missing coverage, not a pass.Commits after b5c44b9 touch only CHANGELOG.md and docs/design-lint.md, the main merge and the carve-guards re-pin. These are reused evidence at d63573a:
bun run eval:select --base ef6a16324 --profile fullselects none of the five design cases (the merge changed no design-html or design-review template, lint, catalog or design resolver; its only resolver change is scripts/resolvers/review-army.ts, outside their touchfiles). No paid case ran for this re-READY ($0 new spend).gstack-ship-queue ready --pr 3507 --screen, policy narrow, on GitHub's refs/pull/3507/merge cdeb0a3): run 40475952044 GREEN. Rule 112/112, behavior 1/1, judge 24/24, nothing quarantined, skipped or INFRA; $32.89 known, plus 32 of 139 trials with unknown cost. Screens are pre-approved spend (CREW.md rule 5). NOTICE.md, an unknown paid-case dependency, restored the full PR selection.Greptile Review
No Greptile comments.
Issues
Refs #3422
TODOS
No TODO items completed in this PR.
Documentation
Status: current (carried). The Step 14.5 audit
doc3507bran at b9be5b4 and correcteddocs/design-lint.md(ef6a163). Since then this PR's doc files are unchanged; the main merge brought main's own NOTICE.md entries (decision-trail, worktree-audit, pr-wait ports) and its own docs, which main's release audited.gstack-ship-receipt docs-caps --base main: none declared.The audit record as written at b9be5b4:
Scope. Audit
doc3507b(edit mode) ongarrytan/gsta92-hallmark-p2atb9be5b4d7against basec2e01e4ba: 22 committed files across 5 commits, with nothing staged, unstaged or untracked, as the candidate records. I swept the repository for references to the deleted surfaces (gstack-design-craft,lib/design-craft.ts,craft_exceptions,--accepted,CRAFT_*) and to the new ones (gstack-design-lint,empty-mount-node, waivers). I readdocs/design-lint.mdandNOTICE.mdin full. I read the changed template hunks, the related sections ofdocs/skills.mdanddocs/PROJECT_STRUCTURE.md, and the new CHANGELOG entry. I checked the doc's copy-tier claims againstlib/design-lint/rules/copy.ts. The banned-terms check found no list.Documentation health:
docs/design-lint.md Updated (three "Phase 2" forward references now say "a later phase". This PR deleted the intro sentence that defined Phase 2, and the CHANGELOG labels this release "hallmark phase 2", yet the release ships none of the three items: DESIGN.md token roles, catalog
detect: lintreconciliation and--before/--kept. Grep confirmed none exist inlib/orbin/.test/design-lint.test.ts: 58 tests pass, none fail after the edit.)NOTICE.md Current (the Elaya entry names
lib/design-lint/rules/copy.ts; no stale craft paths remain)design-html/SKILL.md.tmpl Current (the Step 4 line names
gstack-design-lint --render;craft_exceptionsis gone from finalized.json)design-html/sections/craft.md.tmpl Current (lint output, exit codes and the waiver form match docs/design-lint.md)
design-review/sections/craft-audit.md.tmpl Current (the blocks/ask/waived handling,
empty-mount-nodeand the saved-page CSS limit match the doc and the code)docs/skills.md Current (no stale craft-check text)
docs/PROJECT_STRUCTURE.md Current (no
gstack-design-craftentry;gstack-design-lintis listed)README.md Current (no design-lint or craft-check surface)
ARCHITECTURE.md Current (its resolver rows name
scripts/resolvers/design-craft.ts, which still exists)CHANGELOG.md Not edited (ship-owned; Step 5 skipped)
TODOS.md Not edited (ship-owned; Step 7 skipped)
Documentation coverage:
[entity] [reference] [how-to] [tutorial] [explanation]
/design-html Step 4 design lint ✅ docs/design-lint.md ✅ design-html craft section ❌ ✅ CHANGELOG
empty-mount-node ✅ docs/design-lint.md ✅ design-review craft audit ❌ ✅ docs/design-lint.md
in-page waivers (replace craft_exceptions/--accepted) ✅ docs/design-lint.md ✅ design-html craft section ❌ ✅ CHANGELOG
copy tier at its line ✅ docs/design-lint.md ❌ ❌ ✅ docs/design-lint.md
Debt (reported, not filled):
docs/skills.md/design-html section describes the impeccable Slop gate but not the always-on design lint pass. That is a common gap;/document-generateor the author could add it.docs/design-lint.mdis reachable only throughCLAUDE.md→docs/PROJECT_STRUCTURE.md. README anddocs/skills.mddo not link it. This predates the PR.Diagram drift: none. No ASCII or Mermaid diagram names the deleted checker.
Test plan
gstack-pregate --stage tests --remote --spend-cap 2 --timeout 2700 --allow-repo-commandsat d63573a (tree c1b9792ebf9f): 632 files, 18929 tests, 0 failed, $0.06; requires-remote lanes cleared with the pull_request runs below;gstack-pregate verifyokgen:skill-docs --host all --dry-runall FRESH, design-lint suites 88 tests pass, guard suites 211 tests pass