On this page

Wire has one promise: it fails loud, never silent. A build that cannot produce good output refuses to ship. A command that hits a wall tells you exactly which wall and exactly what to type next.

This batch of fixes is about that promise breaking in two directions. In some places Wire was too quiet, swallowing a real failure and pretending it succeeded. In others Wire cried wolf, blocking a build over output it generated itself. Both are betrayals of the same contract. We fixed six of them.

Failures that were too quiet

Three bugs let Wire fail without telling you.

A dead API key used to fall back silently. If your ANTHROPIC_API_KEY was wrong or expired, Wire caught the 401 and quietly switched to the Claude CLI backend. You thought you were running on the API. You were not. Now an invalid key stops the run with a message that names the problem and gives you both fixes: repair the key, or unset it on purpose to use the CLI. No more guessing which backend actually ran your content.

A hung CLI call used to wait forever. The Claude CLI subprocess had no timeout. On a large prompt it could sit for ten minutes producing nothing, and you had no signal whether it was working or dead. Now the call times out loud, tells you how long it waited and how big the prompt was, and points you at WIRE_CLI_TIMEOUT to raise the ceiling or at the API backend to skip the subprocess entirely. An empty result is now a hard error too, not a fake success. A call that burns your time and returns nothing should say so.

Deduplicate used to crash mid-merge. When you merged two pages that shared search keywords, Wire tried to move both pages' Search Console history onto the survivor and hit a database collision. The command died partway through. Now Wire merges the overlapping history properly: impressions and clicks add up, position is averaged by weight, and the duplicate rows are cleaned out. Merging cannibalized pages no longer corrupts your analytics.

Alarms that cried wolf

The other half is worse in a way, because a false alarm trains you to ignore real ones. Three checks were firing on perfectly good pages.

WebP images got flagged for missing dimensions. Wire auto-injects width and height on your images so the page does not jump around as it loads. It read PNG, JPEG, and GIF headers, but not WebP, the format most image-optimized sites actually use. So every WebP image silently missed its dimensions and then tripped the lint rule whose own hint promised Wire would handle it. Wire now parses the WebP container directly and injects the size like any other format.

Wire blocked builds over its own pages. Wire auto-generates a few pages that never appear in your content folder: the news listing at /news/, the search page, and the optional bot directory. The build guard that checks every Google-indexed URL has a real page did not know about them. So once Google indexed your news page, Wire refused to build, demanding a redirect for a page it created itself. The guard now counts Wire's own output as real. (If you saw this on your own site, you do not need a redirect for /news/. It is a real page.)

Author pages got flagged as thin. Wire warns when a page is all headings and no substance, the shape of AI filler. Author bios trip this by design: short bursts of text next to a timeline, some stats, a few badges. The check already knew to skip FAQ pages for the same reason. It now skips author and profile pages too, so your byline does not get nagged for being concise.

What you do

Upgrade, and the false alarms stop while the real errors get sharper.

python -m wire.chief update
python -m wire.build

If you run from a clone instead, pip install -e . and rebuild. Nothing here changes your content or your config. The quiet failures now speak up, and the three checks that were wrong now stay silent on the pages they were wrong about.

The throughline is the same one Wire was built on. Loud where it matters, quiet where it does not, and honest about the difference. For the full command set see the workflow guide, and for credential and timeout settings see the configuration reference. The work is tracked across issues #418 through #423 if you want the details.