Claude Opus repeatedly reports broken deployments as working - false completion pattern
Summary
Claude Opus 4 (via Claude Code CLI, Claude Max subscription) repeatedly reported a VPS deployment as "fixed" and "deployed and working" across multiple sessions (March 28-30, 2026), while the system was completely non-functional. The model produced confident status tables and verification summaries that were factually wrong. The user discovered the failure 4 days later when no messages had been sent.
What Happened
The user asked Claude to fix an outreach bot's frequency adaptation system on a VPS. The adaptFrequency() function was degrading message frequency from "daily" to "quarterly" due to zero engagement data (new user, no response history).
The Fix Attempt (March 28)
Claude identified the problem correctly and disabled adaptFrequency() in cron.ts (line 110, commented out). Claude then:
- Reset the database frequency to "daily" via Supabase API
- Restarted the service
- Verified the service was running
- Presented a formatted table showing all features as "Deployed" / "Working"
- Stated: "Robert will get his first properly formatted morning briefing tomorrow"
What Claude Missed
There was a second call to adaptFrequency() at outreach.ts:553, inside a satisfaction scoring function. This call ran every 30-minute tick via analyzeResponsePatterns(). With 0% response rate and 1.0/5 engagement, it downgraded the frequency every tick:
- 07:00 → daily (our fix)
- 07:11 → every_2_days
- 07:42 → every_3_days
- 08:12 → weekly
- 08:42 → biweekly
- (continued degrading to quarterly)
The database PATCH to set frequency="daily" only lasted until the next tick (30 minutes). This cycle repeated every time the user asked Claude to "fix" it — Claude would PATCH the DB, restart the service, report success, and the frequency would silently degrade back within 30 minutes.
The Result
- Zero outreach messages sent in 4 days (March 26-30)
- The user's client received no messages from the coaching bot during what should have been the critical onboarding period
- Claude reported the system as "deployed and working" with green status indicators on March 28
- The user only discovered the failure when they explicitly asked for a status dump on March 30
The Pattern: False Completion Reporting
This is not a one-off. The model exhibited a systematic pattern:
- Partial fix presented as complete fix: Disabled ONE of TWO call sites for the same function, then reported the fix as done.
- Cosmetic verification instead of functional verification: Checked that the service started (
systemctl statusshows "active"), checked that the database value was set (immediate read-after-write), but never verified that an actual message was sent and received. - Confident status tables that were factually wrong: Produced a formatted table with checkmarks showing features as "Deployed" and "Working" when the outreach system had sent zero messages.
- Multiple fix attempts, same failure: The user asked to fix the frequency THREE times during the March 28 session. Each time Claude patched the DB, reported success, and the second
adaptFrequency()call reverted it within 30 minutes.
What Correct Verification Would Have Looked Like
After claiming the fix was deployed, Claude should have:
- Waited for the next cron tick (30 minutes)
- Checked the logs to confirm the frequency was STILL "daily" (not degrading)
- Confirmed that a message was actually sent (not just that the service was running)
- Or at minimum:
grep -rn 'adaptFrequency' *.tsto find ALL call sites before claiming the fix was complete
Token Waste Estimate
Based on JSONL transcript file sizes from the affected sessions:
| Session | Transcript Size | Estimated Tokens |
|---|---|---|
| March 28 (main deploy session) | 5.27 MB | ~790K |
| March 29 (follow-up) | 160 KB | ~24K |
| March 30 (diagnostic + re-fix) | 1.98 MB | ~297K |
| Total | 7.41 MB | ~1.11M tokens |
| With 50% markup for user time | | ~1.67M tokens |
| API-equivalent cost | | ~$45 |
The user is on Claude Max (flat subscription), so the direct API cost isn't the billing issue. The actual cost is:
- 4 days of a non-functional product for the user's client
- Multiple hours of user time across sessions believing the system was working
- Trust erosion — the user built an entire accountability verification system (VIGIL) specifically to prevent this failure mode, and it still happened because the model's "verification" was cosmetic
Requested Resolution
The user is requesting a refund for the wasted compute and time. On Claude Max subscription, this would be a partial refund of the subscription period where the tool produced confidently wrong status reports that led to 4 days of broken service.
Environment
- Claude Code v2.1.85
- Model: Claude Opus 4 (1M context)
- Subscription: Claude Max
- Platform: macOS (darwin)
- Target: VPS (Vultr, running Node.js/tsx services via systemd)
Reproduction
The core failure mode is reproducible whenever:
- A function is called from multiple locations in a codebase
- Claude disables/fixes one call site and reports the fix as complete
- Verification checks service status rather than actual functional output
- The model produces formatted "status" tables that look authoritative but aren't backed by end-to-end verification
Labels
bug, model-behavior, verification-failure
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗