test(pipeline): gate how much design copy reaches rendered HTML #117

Merged
peterswimm merged 1 commit from feat/pipeline-gates into main 2026-09-10 19:47:22 +00:00
Owner

The check that caught the most real bugs this cycle — and the one I kept running by hand. Three failures it found that nothing else did:

  • the Contact form rendered as a card, so every field label silently vanished
  • the ritual demo dropped its steps and its history rows
  • a heading's inline <span> was reordered, so the sentence read wrong

None of these break a build. The page renders, the layout looks right, and the words are missing.

It measures rendered HTML, not the pattern

Block attributes live inside the block comment, so grepping the pattern finds copy that never reaches a reader — and wish-form renders labels its attributes never carry, so the pattern under-reports too. Each block's real render.php runs through the existing render_pattern.php harness.

Signal, not noise

Normalisation compares words, not typography — curly quotes, em dashes and entities are not copy differences. Decorative affixes are stripped for the same reason: a link reading Open discussions → renders the arrow as a separate aria-hidden span. Counting that as a miss buried the real ones — four such false positives were hiding one genuine drop.

Floors are a ratchet

Raise them as coverage improves; never lower one to make a red build green — that is the bug leaving through the door it came in.

page measured floor
landing 100.0% 98
rituals 100.0% 98
spelwork 99.0% 97
news 100.0% 95
contact 95.2% 90

Floors sit ~2 text nodes under measured: an ordinary copy edit doesn't flap the build, a dropped section (which takes many nodes with it) is caught at once.

Verified red: removing the _contact_form matcher — the original bug — drops contact to 85.7% and fails the gate.

It actually runs

New CI job checks out both repos and installs php-cli. The design sources live here, the blocks' render.php lives in Toilville_Rituals, and neither repo's CI had both. It fails rather than skips on a missing prerequisite, for the same reason as the other gates in #116.

Two genuine misses remain

Both structural — the blocks cannot express what the design asks. spelwork is missing "Talk to a human" (the CTA band has room for one button, the design has two) and contact is missing "Work email" (the label is hard-coded). Fixed in toilville_rituals#375; the client side follows once that lands.

https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78

The check that caught the most real bugs this cycle — and the one I kept running by hand. Three failures it found that nothing else did: - the Contact form rendered as a **card**, so every field label silently vanished - the ritual demo dropped its steps and its history rows - a heading's inline `<span>` was reordered, so the sentence read wrong None of these break a build. The page renders, the layout looks right, and the words are missing. ### It measures rendered HTML, not the pattern Block attributes live *inside* the block comment, so grepping the pattern finds copy that never reaches a reader — and `wish-form` renders labels its attributes never carry, so the pattern **under**-reports too. Each block's real `render.php` runs through the existing `render_pattern.php` harness. ### Signal, not noise Normalisation compares words, not typography — curly quotes, em dashes and entities are not copy differences. Decorative affixes are stripped for the same reason: a link reading `Open discussions →` renders the arrow as a separate `aria-hidden` span. Counting that as a miss buried the real ones — **four such false positives were hiding one genuine drop**. ### Floors are a ratchet Raise them as coverage improves; **never lower one to make a red build green** — that is the bug leaving through the door it came in. | page | measured | floor | |---|---|---| | landing | 100.0% | 98 | | rituals | 100.0% | 98 | | spelwork | 99.0% | 97 | | news | 100.0% | 95 | | contact | 95.2% | 90 | Floors sit ~2 text nodes under measured: an ordinary copy edit doesn't flap the build, a dropped *section* (which takes many nodes with it) is caught at once. **Verified red:** removing the `_contact_form` matcher — the original bug — drops contact to 85.7% and fails the gate. ### It actually runs New CI job checks out **both** repos and installs `php-cli`. The design sources live here, the blocks' `render.php` lives in Toilville_Rituals, and neither repo's CI had both. It **fails rather than skips** on a missing prerequisite, for the same reason as the other gates in #116. ### Two genuine misses remain Both structural — the blocks cannot express what the design asks. `spelwork` is missing "Talk to a human" (the CTA band has room for one button, the design has two) and `contact` is missing "Work email" (the label is hard-coded). Fixed in toilville_rituals#375; the client side follows once that lands. https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
test(pipeline): gate how much design copy reaches rendered HTML
Some checks failed
PR policy check / policy-gate (pull_request) Failing after 0s
Security Scans / Trivy filesystem scan (pull_request) Successful in 15m1s
Security Scans / Gitleaks secret scan (pull_request) Successful in 14m56s
Test Generator / test (pull_request) Failing after 16m57s
Test Generator / lint-workflows (pull_request) Successful in 4m10s
Test Generator / lint-prose (pull_request) Successful in 3m50s
Copy coverage / Design copy reaching rendered HTML (pull_request) Failing after 4m16s
UDG dist drift gate / dist/ matches dtcg + udg sources (pull_request) Successful in 4m1s
5a5982270d
The check that caught the most real bugs this cycle, and the one I kept running
by hand. Three failures it found that nothing else did:

  * the Contact form rendered as a *card* — every field label silently gone
  * the ritual demo dropped its steps and its history rows
  * a heading's inline span was reordered, so the sentence read wrong

None of these break a build. The page renders, the layout looks right, and the
words are missing.

It measures RENDERED HTML, not the pattern. Block attributes live inside the
block comment, so grepping the pattern finds copy that never reaches a reader;
and wish-form renders labels its attributes never carry, so the pattern
under-reports too. Each block's real render.php runs via the existing
render_pattern.php harness.

Normalisation compares words, not typography: curly quotes, em dashes and
entities are not copy differences. Decorative affixes are stripped for the same
reason — a link reading "Open discussions →" renders the arrow as a separate
aria-hidden span, and counting that as a miss buried the real ones. Four such
false positives were hiding one genuine drop.

Floors are a RATCHET, not a target: raise them as coverage improves, never lower
one to make a red build green. Measured today — landing 100.0, rituals 100.0,
spelwork 99.0, news 100.0, contact 95.2 — with floors ~2 text nodes under, so an
ordinary copy edit doesn't flap while a dropped section is caught at once.

Verified red: removing the _contact_form matcher (the original bug) drops
contact to 85.7% and fails the gate.

Runs in CI via a new job that checks out BOTH repos and installs php-cli — the
design sources live here, the blocks' render.php lives in Toilville_Rituals, and
neither repo's CI had both. It fails rather than skips on a missing
prerequisite.

Two genuine misses remain, both structural — the blocks cannot express what the
design asks. Fixes are in toilville_rituals#375; the client side follows once
that lands.

Claude-Session: https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
peterswimm deleted branch feat/pipeline-gates 2026-09-10 19:47:22 +00:00
Sign in to join this conversation.
No description provided.