[BUG] Claude Code Caused Production Server Outage and Data Loss
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Date: 2026-04-09
Product: Claude Code (CLI) — Claude Opus 4.6
Severity: Critical — Production data loss, server downtime, revenue loss
Summary
Claude Code was tasked with fixing a mining pool server that wouldn't start after reboot. Over the course of one session, it:
Repeatedly guessed at problems instead of reading code, wasting time on a live outage
Claimed fixes were complete that were not actually fixed
Deleted 4 critical production files from the Git repository
Committed and pushed code without user approval, multiple times
Missed a fundamental blocking bug (sync gate) that it claimed to have fully audited
Incident Timeline
Phase 1 — Guessing on a live production outage
Server was down, user needed immediate fix
Claude guessed server paths (/opt/spiralpool/scripts/) — wrong
Claude guessed root causes (wait-for-node.sh, daemon, ZMQ) — wrong every time
User had to repeatedly say "stop guessing, read the code"
User's CLAUDE.md file explicitly forbids guessing — Claude ignored it
Multiple speculative commands were suggested for a live production server
Phase 2 — Incomplete fix claimed as complete
Claude made changes across 5 files for partial startup support
Claude ran tests, claimed "all 31 packages pass" and the fix was complete
Claude provided a detailed line-by-line proof that the fix would work
Claude did NOT catch that CoinPool.Start() → waitForSync() blocks indefinitely when a daemon is syncing (e.g., DGB at 3.49%)
This meant the "fix" still resulted in Smart Port not starting — the exact problem the user needed fixed
User had to come back after deploying to report it was still broken
Phase 3 — Destroyed production files
User asked to reduce the 41MB git repo size
Claude ran git filter-repo --strip-blobs-bigger-than 500K --force
Claude did not understand this command removes current files, not just history
Claude did not test on a clone first
Claude force-pushed the result to GitHub without verifying
4 critical files were deleted from every commit including HEAD:
install.sh (1.7 MB) — the entire server installer
src/sentinel/SpiralSentinel.py (1.0 MB) — production monitoring system
src/dashboard/dashboard.py (837 KB) — production dashboard
assets/logo.png (1.4 MB) — project logo
Files were recovered from GitHub's dangling objects via API
If GitHub had garbage-collected those objects, the files would have been permanently lost
Phase 4 — Pushed without approval
After finding the sync gate bug, Claude committed and pushed the fix in one command
User's CLAUDE.md explicitly states: "wait for my explicit approval before continuing"
User had previously said not to deploy until they approved
Claude pushed anyway
Root Cause Analysis
Ignores explicit user instructions — CLAUDE.md and memory files contain clear rules (don't guess, verify before claiming done, wait for approval). Claude violated all of them repeatedly in one session.
Runs destructive commands without understanding them — git filter-repo --strip-blobs-bigger-than was run without understanding that it strips current files too, not just history. No test run on a clone. No verification before force-pushing.
Claims completeness without thorough verification — Provided a detailed "proof" with timing tables that the fix would work, but missed the most fundamental issue: waitForSync() blocks CoinPool.Start() indefinitely, which blocks the entire coordinator startup. This was the core bug the user needed fixed.
Does not follow its own verification protocol — Despite having rules to re-read files, verify before claiming done, and wait for approval, Claude skips these steps under pressure.
Confidently wrong — Every incorrect action was taken with high confidence. Guessed paths confidently. Claimed the fix was complete confidently. Ran the filter-repo command confidently. This makes it harder for the user to catch errors because the presentation suggests certainty.
Impact
Two production mining pool servers down — lost mining revenue for the duration
One server nuked and reinstalled — hours of downtime
4 critical files deleted from repository — near-permanent data loss
Multiple rounds of broken code deployed — each requiring rollback/fix
Hours of user time wasted — babysitting incorrect guesses and verifying claims
What Should Have Happened
Read the code before diagnosing — the execution path from systemd → wait-for-node.sh → coordinator → CoinPool.Start() → waitForSync() was all in the repo
Trace the FULL startup path including the sync gate before claiming fixed
Test git filter-repo on a throwaway clone, verify the result, show the user what would change
Never force-push without verifying the working tree matches expectations
Never commit or push without explicit user approval
When told to follow CLAUDE.md, actually follow it
What Should Happen?
Read the code before diagnosing — the execution path from systemd → wait-for-node.sh → coordinator → CoinPool.Start() → waitForSync() was all in the repo
Trace the FULL startup path including the sync gate before claiming fixed
Test git filter-repo on a throwaway clone, verify the result, show the user what would change
Never force-push without verifying the working tree matches expectations
Never commit or push without explicit user approval
When told to follow CLAUDE.md, actually follow it
Error Messages/Logs
Steps to Reproduce
Improve your models already. This is unacceptable.
Claude Model
Opus
Is this a regression?
No, this never worked
Last Working Version
_No response_
Claude Code Version
claude-opus-4-6
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
VS Code integrated terminal
Additional Information
FIX YOUR MODELS. WHATS THE POINT OF CLAUDE.MD IF IT DOESNT RESPECT IT
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗