This site is Hugo. Markdown goes in, HTML comes out, and one folder gets copied to a box running Caddy. Nothing runs on the server: no Node, no database, no process to keep alive. Projects and posts are kept apart on purpose. A project page is evergreen and gets revised as the project changes; a post is dated and does not get revised after it goes up.
That part was uneventful. The part I found interesting was how much went wrong while everything looked fine.
The build was silent the whole way through. A check script confirmed the site compiled with no warnings, emitted every file it was supposed to, and leaked no source files into the output. Four defects shipped past all of it.
A dead link in the footer of every page. A template referenced a configuration value that had
been removed. Go templates resolve a missing key to an empty string rather than failing, so the
footer rendered <a href> — a link pointing nowhere, on every page of the site. The same missing
value wrote the literal text <no value> into llms.txt.
Every paragraph gap doubled. I made the prose container a CSS grid so image galleries could escape the text measure and use the full page width. Margins do not collapse inside a grid container. Each paragraph’s bottom margin stopped merging with the next one’s top margin and started stacking on it instead: 34 pixels where 17 was intended, on every page with more than one paragraph. The page still rendered, and nothing in the build had an opinion about it.
An RSS feed advertising five undated pages. Hugo’s default home feed takes every regular page, and project pages carry no date. The feed listed all five above the only real post, each stamped 1 January 0001. It returned HTTP 200 and was well-formed XML.
Fixes that existed but nobody could see. I had turned asset fingerprinting off for tidier URLs, which gave the stylesheet a permanent address. Every CSS change after that served from cache. The file on disk was right and the page in the browser was wrong, which is a confusing state to debug when you are the one who broke it.
The check script tested what I pointed it at: exit codes, file existence, no stray source files. It could not tell me the footer link went nowhere, or that the feed was announcing undated pages to anyone who subscribed. Finding those meant reading the generated files and looking at the rendered page.
The empty-href check is in the script now, along with a few others cheap enough to keep. The rest
is a lesson I keep relearning in different clothes: a passing check tells you the thing you
measured did not change. It does not tell you it was ever right.