fix: recover from mass file corruption incident (2026-02-15)

INCIDENT SUMMARY:
A catastrophic corruption event affected the working directory, with null
bytes (0x00) overwriting content in dozens of files including:
- package.json (corrupted)
- tailwind.config.ts (corrupted)
- All modified tracked files
- Untracked directories (components/ui/, node_modules/, .next/)

ROOT CAUSE:
Unknown - files were filled with null bytes, destroying their content.

RECOVERY PROCESS:
1. Discovered corruption when npm run dev failed with EJSONPARSE
2. Checked git diff --stat - showed many files as "binary"
3. Found dangling stash commits (0d80ad9, a1a33cf) containing our work
4. Restored tracked files from stash: git checkout a1a33cf -- .
5. Removed corrupted untracked directories (node_modules, .next, components/ui)
6. Reinstalled dependencies: npm install
7. Reinitialized shadcn/ui: npx shadcn@latest init
8. Reinstalled shadcn components: npx shadcn@latest add button card ...
9. Recreated earthy-dark tokens (bb-ui2.1) - lost in shadcn init overwrite
10. Verified all closed bb-ui2 beads still had their deliverables

DATA PRESERVED:
- All tracked source code (recovered from git stash)
- .beads/issues.jsonl (recovered from stash)
- All bead history and metadata

DATA LOST:
- Uncommitted changes to untracked files
- Earthy-dark tokens (recreated from bead spec)
- components/ui/ (regenerated from shadcn)

LESSONS LEARNED:
1. Commit work frequently - untracked changes are not protected
2. Git stash captures tracked files only
3. shadcn init overwrites globals.css - preserve tokens separately
4. Dangling commits can save the day

VERIFICATION POST-RECOVERY:
- npm run typecheck: PASS
- npm run lint: PASS
- npm run test: PASS
- All bb-ui2 closed bead deliverables present

CLOSES: bb-silver-castle (triage bead for this incident)
This commit is contained in:
zenchantlive 2026-02-15 21:19:58 -08:00
parent 173937c1f3
commit a2b0909724
2 changed files with 1544 additions and 75 deletions

View file

@ -12,13 +12,24 @@
"test": "node --test tests/bootstrap.test.mjs && node --import tsx --test tests/components/sessions/sessions-header.test.ts && node --import tsx --test tests/components/sessions/agent-station-logic.test.ts && node --import tsx --test tests/lib/parser.test.ts && node --import tsx --test tests/lib/pathing.test.ts"
},
"dependencies": {
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-tooltip": "^1.2.8",
"@xyflow/react": "^12.10.0",
"chokidar": "^5.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dagre": "^0.8.5",
"framer-motion": "^11.18.2",
"lucide-react": "^0.564.0",
"next": "15.5.7",
"react": "19.2.1",
"react-dom": "19.2.1"
"react-dom": "19.2.1",
"tailwind-merge": "^3.4.1",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@playwright/test": "^1.58.2",
@ -35,4 +46,4 @@
"tsx": "^4.21.0",
"typescript": "^5.7.2"
}
}
}