Public: anyone can read this; the crew can change it.
Backups leave the platform: one last copy of the 36 GB Forgejo dump, the lanes retired one by one, and a restore that never touches it #9060
Check · Review · Land · Live done — Landed and live in production.
I wrote the plan for #8949 as docs only. None of the four "Done when" items is finished, because each needs the owner, the box, or the lane config. I did not run any tests, `tsc` or the gate, since no code changed. I also did not call `keep_plan`; it isn't among my tools.
shipped production is serving it deploy 96492c1
I wrote the plan for #8949 as docs only. None of the four "Done when" items is finished, because each needs the owner, the box, or the lane config. I did not run any tests, tsc or the gate, since no code changed. I also did not call keep_plan; it isn't among my tools.
What changed
docs/features/backup-truth.mdhas a new "Leaving the platform (#8949)" section.
- Forgejo dump: I recommend keeping one last copy, because Migrate does not carry issues, pull history, users, LFS or packages. The copy goes to B2 under its own prefix, plus one on the owner's disk, with its SHA-256 written on the issue. The forgejo-dump CronJob and its volume are retired only after the owner has restored a repository from the copy. The owner's answer is marked pending, and the dump stays where it is until then.
- Lanes: a table with a line per lane saying what it backs up and who reads it after spin-down, or that it is retired. primary and mirror are filled in. A retired lane is removed from FORGE_BACKUP_LANES in the same step, so the backup tile doesn't go red for a lane nobody keeps.
- Restore drill: the steps for restoring onto the box from the B2 mirror alone, with the platform's network blocked. They end with checks on /healthz, the repository count and the backup tile.
docs/RESTORE.mdanddocs/SNAPSHOT.mdeach link to that section.
What is not done
- Owner decision on the dump: not made.
- Lane rows: the
backup/<name>rows are blank.FORGE_BACKUP_LANESis kept in the forge's configuration, not in the repository. Someone with access fills them in from the Resilience dialog or the MCPbackupstool (verdict.lanes). - Restore drill: not run. It needs the box (the
boxissue), and I can't run it from the sandbox. - Backup tile: nothing here touches it, so it is unaffected.
I turned nothing off.
To try it, read the new section in docs/features/backup-truth.md.
🤖 Generated with Claude Code
Docs only: no code, no secrets, no new surface, nothing turned off, README untouched, and the how-to is in docs/features as required. It honestly says the dump decision, lane rows and drill are not done, so the issue stays open. Nit for a later touch: step 3 of the dump plan has a garbled parenthetical (FORGE_BACKUP_LANES not needed since nothing reads it daily) that should say plainly the B2 dump prefix is not a lane. The SNAPSHOT.md link is plain text where RESTORE.md uses a markdown link.
I merged main into the branch and pushed it. The merge conflict was in docs/RESTORE.md, and I kept both sides there. Main added "The drill on the box", which describes scripts/restore-drill.ts. My one-line link to the platform-unreachable restore steps in backup-truth.md now sits after it.
I ran the tests after the push, not before. The 12 test files that cover the change pass (167 tests, 0 failures). I did not run the full suite, bun x tsc --noEmit or bun scripts/gate.ts, since only docs changed.
The PR is still docs only. The owner's decision on the Forgejo dump, the lane rows and the restore drill itself remain open, as in the earlier description.
Docs only, README untouched, honest that the owner decision, lane rows and drill are not done. No code, so no security surface. Three things to fix in one round, then it is fine as a plan:
- Dump step 3 (backup-truth.md) has a garbled parenthetical: say plainly that the B2 dump prefix is not a lane, so it is not in FORGE_BACKUP_LANES and not read daily.
- The platform-free drill duplicates the card by line number ("lines 3-6", "line 7"), which drifts. Main now has
scripts/restore-drill.ts(RESTORE.md, 'The drill on the box'): make step 2 runbun scripts/restore-drill.ts <empty-data-dir>with the B2 S3_* values, and name its exit codes as the pass condition. Keep only the firewall/B2-only part as new. - The SNAPSHOT.md pointer is plain text; make it a markdown link like RESTORE.md. docs/PLATFORM.md:54 row 6 already names #8949; point it at the new section too so the door is reachable.
Boxes: none is met by this head. 1 needs the owner's written answer (the plan says 'pending'); 2 has the backup/<name> rows blank; 3 the drill is not run; 4 is untouched by a docs change but nothing was shown, so it stays open.
I made all three fixes and pushed them to the branch. This round is docs only, and I didn't run any tests.
- Dump step 3: it now says the B2 dump prefix is not a lane, so it is not in
FORGE_BACKUP_LANESand the tile does not read it. A second copy goes to the owner's disk. - Platform-free drill: step 2 now runs
bun scripts/restore-drill.ts <empty-data-dir>with the B2S3_*values and the passphrase exported. It links to RESTORE.md, "The drill on the box". The card line numbers are gone.
- Pass condition: the drill exits 0 when it restored, booted, answered / and the counts matched. Exit 1 means a step failed or a count differed.
- New part: only the firewall, B2-only part remains.
- Tile check: I dropped the old repository-count check, since the drill's counts now cover it. The backup-tile check remains as step 3.
- Pointers: the
SNAPSHOT.mdline is now a markdown link.PLATFORM.mdrow 6 links to the new section.
I agree with the four open boxes, and none is met. The owner's written answer on the dump is still pending, and the backup/<name> lane rows are still blank. The restore drill hasn't been run, and nothing here shows the backup tile staying green.
Approved as a docs-only plan. Earlier asks are met: dump step 3 now says plainly that the B2 dump prefix is not a lane and the tile does not read it; the platform-free drill runs the real scripts/restore-drill.ts with exit-code semantics and no stale line numbers; the SNAPSHOT.md and PLATFORM.md pointers are markdown links. README is untouched, the how-to sits in docs/features, nothing is turned off, and it says honestly what is not done. No code, so no phone, keyboard or JS-off surface changed. Next, two things: (1) get the owner's written answer on the dump into the issue and replace the _pending_ line; (2) fill the backup/<name> rows from the Resilience dialog once someone with the lane config can, then run the drill on the box (#8945). Non-blocking: none further.
Left #8949 open: 4 unticked items remain (Decide with the owner: does the dump's content come into the forge through the migrate flow (Forgejo repositories) so the dump is redundant, or is one copy kept in B2 / on the owner's disk. Written here.; Each lane in FORGE_BACKUP_LANES has a line: what it backs up, who reads it after spin-down, or retired.; A restore drill from the bucket onto the box (the box issue) with the platform unreachable from it.; …).
I wrote the plan for #8949 as docs only. None of the four "Done when" items is finished, because each needs the owner, the box, or the lane config. I did not run any tests,
tscor the gate, since no code changed. I also did not callkeep_plan; it isn't among my tools.What changed
docs/features/backup-truth.mdhas a new "Leaving the platform (#8949)" section.- Forgejo dump: I recommend keeping one last copy, because Migrate does not carry issues, pull history, users, LFS or packages. The copy goes to B2 under its own prefix, plus one on the owner's disk, with its SHA-256 written on the issue. The
forgejo-dumpCronJob and its volume are retired only after the owner has restored a repository from the copy. The owner's answer is marked pending, and the dump stays where it is until then. - Lanes: a table with a line per lane saying what it backs up and who reads it after spin-down, or that it is retired.primaryandmirrorare filled in. A retired lane is removed fromFORGE_BACKUP_LANESin the same step, so the backup tile doesn't go red for a lane nobody keeps. - Restore drill: the steps for restoring onto the box from the B2 mirror alone, with the platform's network blocked. They end with checks on/healthz, the repository count and the backup tile.docs/RESTORE.mdanddocs/SNAPSHOT.mdeach link to that section.What is not done
backup/<name>rows are blank.FORGE_BACKUP_LANESis kept in the forge's configuration, not in the repository. Someone with access fills them in from the Resilience dialog or the MCPbackupstool (verdict.lanes).boxissue), and I can't run it from the sandbox.I turned nothing off.
To try it, read the new section in
docs/features/backup-truth.md.🤖 Generated with Claude Code
Closes #8949