01Reading what WordPress refused to render
The service card grids lived in `[interective_banner]` shortcodes that the REST API returned as literal text — WordPress only expanded them through the theme's frontend. Two things made them hard to catch: the source misspells the tag as "interective", so any sensible pattern misses it, and the attribute values are wrapped in HTML-encoded smart quotes rather than straight ones. My parser normalises the entities first, then reads title, description, image id and a pipe-delimited url structure, and discards the presentation attributes because the new design system owns styling. One detail paid off twice: `bgclr` was `#7f0096` across every banner, which is how I confirmed the brand purple as a measured value rather than a guess.
02Contrast as a pass/fail gate, not a design opinion
`scripts/contrast.ts` computes WCAG relative luminance for thirteen token pairings and exits non-zero on any failure. That includes composited values, since `--fg-soft` renders as foreground at 64% alpha over the canvas and has to be measured as what it actually paints. The palette hinges on one token: `--link` resolves to the dark purple on light surfaces and the bright tint on dark ones, because a vivid accent that reads beautifully on a dark section almost always fails on light and will pass a glance on a good monitor. Run today it reports 13 of 13. It is a standalone script I run by hand — nothing in the build invokes it yet.
03A scroll reveal that fails visible
The earlier attempt gated content visibility on its JavaScript bundle, which on a slow phone means a blank page. Here I make `.reveal` `opacity: 1` by default and opt into hiding with an `html.js` class set by a pre-paint inline script, so every failure mode ends with content on screen. The script throwing removes the class. A missing IntersectionObserver reveals immediately. A MutationObserver rescans late DOM, and a seven-second sweep force-reveals anything the observer missed. The component itself is a server component: a div with a class and two custom properties, zero JavaScript per element on a forty-card page.
04Unresolved copy ships as a counted marker, never as prose
Anything I could not trace to the source site goes into the real component as a `[CONFIRM]` marker and gets counted by `npm run confirm`. Seven of eight client logos stay as filenames with empty alt, because naming them would mean inventing client relationships. I leave 198 images with no alt text uncaptioned, because invented alt text that reads as real is worse than a visible hole. The FAQ ships without FAQPage JSON-LD because the source is one HTML blob, and marking up a guessed question-and-answer mapping is a structured-data violation. My copy deck refuses a number outright: "dozens of countries" is kept deliberately unquantified, with a comment in `site.ts` saying not to turn it into a figure.
05An audit that caught the generated content leaking
Because the 26 page compositions were machine-authored, I diffed them back against each page's own source body: every string sentence-split, normalised and matched by exact containment then fuzzy windowing, across all 26 pages rather than a sample. The honest finding is that body copy traces near-verbatim while the structural labels the block system needed do not — roughly a quarter of label slots are authored, and the audit counts them instead of pretending otherwise. It also found the real blocker: ten internal reviewer notes left inside rendered content fields on eight pages, one of them inside a `buttonHref`, which would have published as visible body copy and a broken anchor. My fix script moves those notes into a non-rendered `_confirms` array so the finding survives without shipping, and repoints the CTA hrefs aimed at routes that do not exist. Verified now: zero notes in rendered blocks, sixteen parked.