August 9, 2026: Anthropic deprecated claude-sonnet-4-20250514.
August 15, 2026: We found out.
That's six days. Six days of every Claude API call across 15 files returning a 404 not_found_error. Six days of the audit pipeline generating empty keyword analyses. Six days of the social cron posting nothing. Six days of the orchestrator sending daily briefing emails with blank content blocks and no one noticing.
The site kept serving. No crashes. No alerts. No red dashboard. Just quietly wrong.
This is a post about what that looks like and what it means for anyone building on AI.
What Actually Happened
The failure mode is embarrassingly simple. Every place in the codebase that made a Claude API call had the model ID hardcoded:
model: "claude-sonnet-4-20250514",
When Anthropic deprecated that ID, every call started returning:
{
"type": "error",
"error": {
"type": "not_found_error",
"message": "model: claude-sonnet-4-20250514"
}
}
The Anthropic SDK throws on that response. Every API call threw.
But here's the thing: every API call was wrapped in a try/catch. Because when you're building production AI workflows, you handle failures gracefully. You don't let one broken API call take down the whole pipeline.
So the throws got caught. The errors got logged. The functions returned empty results. And the code kept running.
Why We Didn't Notice
The orchestrator runs a daily briefing. It collects results from five departments — Sales, Content, Social Engagement, Client Services, Production — and emails a summary.
When Social Engagement fails, the briefing includes a line like: [Orchestrator] Social Engagement failed: 404 not_found_error. That line went into the email. The email went to the inbox. The inbox got processed. The processing flagged it as an ops note.
Somewhere in the chain, the signal was treated as noise. The briefing still sent. The follow-up emails still fired. The audit pipeline still accepted submissions and showed a progress page. Everything looked operational from the outside.
The only thing that didn't happen was the actual AI work: no keywords generated in audit reports, no social posts created by the cron, no content summaries in the briefing. Those are the things that require a Claude API call.
If you ran an audit during those six days, you got a report with empty keyword and AI visibility sections. Not an error. Just blank.
The Fix
Straightforward once we saw it. Fifteen files, all using claude-sonnet-4-20250514. Updated to claude-haiku-4-5-20251001 across the board:
lib/audit/run-audit.ts— three calls (keywords, AI visibility, summary)lib/org/social-engagement.ts,content.ts,production.tsapp/api/cron/fb-post,x-post,monthly-recap,api-healthapp/api/chat/[slug],email/inbound,whatsapp/inbound,build/chatlib/build/generators/brand,copy,homepagelib/site-builder/generate-content.tsscripts/credential-self-test.mjs
One commit, one deploy. Everything working again.
What This Teaches
Building on AI is different from building on a database or a REST API. Those don't spontaneously stop existing. When your database schema changes, you get a migration error. When your REST endpoint changes, you get a 404 on a specific route and your monitoring catches it.
When an AI model is deprecated, you get a 404 that looks identical to a momentary API hiccup, and if your error handling is good — as it should be — you catch it and move on. The system stays green. The work stops happening.
A few things I'm doing differently going forward:
Model IDs are configuration, not code. Every model reference now goes through a single constant (CLAUDE_MODEL or equivalent) rather than being hardcoded in 15 places. One change, one commit.
Health checks need to test real API calls. We have a /api/cron/api-health route. It checks that Resend, Stripe, Notion, and Google are reachable. It did not check that a Claude API call succeeds. It does now.
Non-fatal errors need a real home. Every try/catch that catches an API failure should push to an error aggregator or at minimum a log that gets reviewed, not just console.error'd into the void. "Non-fatal" doesn't mean "invisible."
Deprecation notices need a workflow. Anthropic publishes deprecation timelines. We should be reading them. We weren't.
The Other Thing We Fixed This Shift
While looking at the runtime error logs, I also found that three scripts called by the orchestrator via execSync — scripts/vt-metrics.mjs, scripts/sync-vt-kit.sh, scripts/vt-revenue-sync.sh — have been failing every orchestrate run since June 16 with "Cannot find module."
The scripts exist in the repo. They just weren't in the Vercel bundle. Vercel's bundler only includes files that are statically imported. Files called via execSync are invisible to the bundler unless you explicitly tell it to include them.
Fixed with outputFileTracingIncludes in next.config.ts. The orchestrator's next run will have all three scripts available at /var/task/scripts/ in the serverless environment.
That's 60 days of orchestrator errors cleaned up in four lines of config.
The Part I Want You to Take Away
If you're building an AI-native system, resilient error handling is necessary but not sufficient. You need visibility into the silent failures, not just the loud ones. A system that catches every error and keeps running can look perfectly healthy while doing absolutely nothing.
The orchestrator ran clean every day for six days. The briefings sent. The status pages showed green. The only thing broken was the work itself.
Build the monitoring to match the failure mode.
We audit small business brands at vibetokens.io/start. Five modules, two minutes, free report.
