09/02/2026
What the build caught that nobody was looking for
Moving tools.belchamber.us off WordPress meant carrying 150 pages, 553 redirect rules and a decade of accumulated posts into a static build. The interesting part was not the migration. It was that almost everything genuinely broken was found by a check, not by a person looking at a page.
What the checks found
A failure visible for months
A published post introduced a screenshot the import had dropped, and carried on as though the reader had seen it.
An orphan scan that found nothing
Every image was also the target of a 301, so searching for the filename found them all and called them used.
What the gate caught that grep missed
The manual pass had cleared a file the gate failed on, because grep was reading the filename as a pattern.
Redirects that answer, then 404
Thirty rules pointed at files that had just been archived. A 301 to nothing looks handled right up until it is not.
The failure that had been visible for months
One published post carried this sentence, and then nothing at all:
Here's the screenshot of a sample of results it produces and exports as a CSV spreadsheet for you:
The image had been dropped by the WordPress import. The paragraph after it carried on as though the reader had seen something. Nobody had noticed, because nobody re-reads a post from 2019.
It turned out five published posts had lost their screenshots the same way.
The files were still in the repository — thirty-four migrated images that no
page referenced, sitting in public/media/ and shipping in every
deploy at 894 KB.
Why the first orphan scan found nothing
The obvious check is "is this filename mentioned anywhere in the project?" It reported zero orphans, and it was wrong. Every one of those images was also the target of a 301 redirect from its old WordPress upload URL, so a project-wide search for the filename found all forty and concluded everything was in use.
Being a redirect target is not being used. The check that works looks only at content:
appear on a page: 11
only a 301 target, no page: 29
That distinction is the whole check. It is also the kind of thing that is obvious once stated and invisible until something states it.
The gate found something the hand-written scan had missed
Having established the rule, it went into the build as a gate. On its first run it failed on a file the manual pass had cleared:
FAIL every file in public/media is referenced by a page
1 file(s) appear on no page and ship anyway: image.webp
The manual pass had used grep, and grep treats a
dot as "any character". Searching for image.webp matched the string
image/webp — the MIME type — somewhere in the source, and the file
was recorded as in use. The gate used a literal string comparison and did not
make that mistake.
The file turned out to be a screenshot of Microsoft Clipchamp whose article was never migrated. Nothing on the site mentions Clipchamp.
Redirects that answer, and then 404
Archiving those 29 images created a second problem immediately: each had a redirect rule pointing at it. A 301 whose target no longer exists is worse than no rule, because it answers with a redirect and then a 404 — the request looks handled right up until it isn't.
Thirty rules were removed alongside the files they pointed at. The gate that checks every redirect target resolves is what forced the two to stay in step; without it the images would have been tidied away and the rules left behind.
What this argues for
Every fault above was mechanically detectable and none of it was being detected. The gates at the start of this work were thorough about technical correctness — does it build, do links resolve, does the sitemap match — and silent on whether a page was worth publishing.
The rule that came out of it: when something is found by eye, fix the instance and then add the check that would have caught it. If it happened once it is latent everywhere else, and a person should not be the detector.
The current count on that site is 332 build checks and 13 source checks. Roughly a third of them exist because something got through once.