GPT-5.4 mini writes Doozer's business copy. Decided 2026-08-22 by an 11-niche counterbalanced bake-off in which the more expensive model fabricated a verifiable fact on a live page.
Decision: business_website content generation runs on gpt-5.4-mini.
Eleven real businesses, one per niche, each regenerated by both candidates against identical source data. Counterbalanced: a regeneration feeds the previous copy back into the prompt, so whichever model runs second sees the other's work. Five businesses saw Sonnet first, six saw GPT first, cancelling the order effect. Every cost read per-call from ai_generation_history, never estimated from a price sheet.
| claude-sonnet-4-6 | gpt-5.4-mini | |
|---|---|---|
| per site | $0.03400 | $0.00748 |
| per 100 sites | $3.40 | $0.75 |
| seconds | 28.7 | 6.5 |
| output tokens | 1,335 | 973 |
Cheaper and faster on every single business, low variance in both arms.
Cost did not. $2.65 per hundred sites does not justify changing the voice of the network.
Writing for Thessen Services, a plumber with no website on file and no cached source, Sonnet opened: "Permit files across three county offices carry the record." The strings permit and county appear zero times in that business's entire stored record. The sentence is fluent, specific, checkable, and invented. Given identical inputs, gpt-5.4-mini opened with the verified street address, and across all eleven specimens it stayed inside known facts.
A wrong fact is worse than a missing one. That is the platform's whole premise for fact-guard and the geo-anchor rule, and it settled a decision the cost data alone would not have.
One observed fabrication in eleven pairs is not a measured hallucination rate. It was enough to act on because the failure mode is severe and the cheaper model carried no offsetting cost, not because eleven samples prove a rate.
What we gave up: Sonnet writes better headlines and ~27% more copy. A split where the cheap model writes the body and a stronger one writes the headline is worth testing.
dz aimodelreg repoint=business_website model=<id> live=1 swaps the writer; dz aimodelreg sync=1 live=1 refreshes the priced catalog. Before switching to any more verbose model, check its output length against the pipeline's max-tokens cap — Sonnet 5 blew past 2,048 tokens, the JSON truncated, and it silently blanked two live pages before _regenContentIsSubstantive() existed to catch it.
Case study (all 22 generations readable side by side): https://claude.ai/code/artifact/a9ac8ae5-3bc9-477f-b731-b99950afe488
Related: [[magellan-and-feeds]], [[the-doozer-score]], [[fact-guard]].