diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b57725..f2ca61b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +## v0.221.1 — the undo-copy prune stopped running because another fix made its guard reachable (2026-08-23, R-361 follow-on) +**MinAgent: 0.129.0** (unchanged — no new agent coupling) + +**This version was BUILT, BAKED and VOUCHED on 2026-08-23 and had no CHANGELOG entry of its own until +now (R-385).** Its fix was written inside the v0.221.0 entry instead, so the record named a version +that was not the one running. Nothing is wrong with the image; the record was. The reasoning below is +moved here verbatim from that entry — it is not new text, and v0.221.0 no longer claims it. + +**One change made another unreachable, and only the live box showed it.** Excluding the undo copies +from `db_dumps` made that list STABLE across restores — which is correct — and that made +`CaptureRecoveryUnit`'s already-current early return start firing where it never had. The undo-copy +prune sat *after* that return, so the cap silently stopped applying: **four copies on disk against a +cap of three, counted on `demo-hp` minutes after the change.** The prune now runs above the check, +where it belongs — it is housekeeping on the dump directory and has nothing to do with whether the +manifest needs rewriting. + +**Why it is safe above the check:** pruning cannot disturb `dbDumps`, which after v0.221.0 no longer +contains those names. + +**Test:** `TestR361_UndoCapHoldsWhenTheUnitIsAlreadyCurrent` +(`internal/backup/r361_canonical_dump_test.go:245`). **Red-proof:** move the prune call back below the +already-current early return — the cap fails at 5 copies against a cap of 3. + +**Shipped as commit `810b18a`.** + ## v0.221.0 — taking the undo copy destroyed the app's own database backup (2026-08-22, R-361) **MinAgent: 0.129.0** (unchanged — no new agent coupling) @@ -31,14 +56,6 @@ consumer exists. Excluding them also makes that compare stable, since the copies every restore and prune. **The files are neither deleted nor hidden** — their visibility is a recorded design decision and it stands. -**One change made another unreachable, and only the live box showed it.** Excluding the undo copies -from `db_dumps` made that list STABLE across restores — which is correct — and that made -`CaptureRecoveryUnit`'s already-current early return start firing where it never had. The undo-copy -prune sat *after* that return, so the cap silently stopped applying: **four copies on disk against a -cap of three, counted on `demo-hp` minutes after the change.** The prune now runs above the check, -where it belongs — it is housekeeping on the dump directory and has nothing to do with whether the -manifest needs rewriting. - **Tests:** `internal/backup/r361_canonical_dump_test.go`, additions to `internal/appbackup/r381_undo_naming_test.go`, `cmd/controller/r361_classifier_control_test.go`. Test count 1485 → 1493.