## 何を見つけたか 復元前バックアップの名前は `pre-restore-<時刻>`(秒まで)である。同じ秒に同名の世代が既にあると、`_backup_before_restore` → `_create_full` が #458 で入った「世代の作り直し」の経路を通り、その世代を今のボリュームの全体で作り直す(設計 F3 のとおり)。 - 復元する世代そのものが、ちょうどその秒の名前を持つ `pre-restore-*` だったとき、復元元が展開の前に今のボリュームの中身へ置き換わる - 同じ秒に復元を 2 回打つと、1 回目の復元前バックアップ(1 回目の復元の前の状態)が 2 回目の前の状態で上書きされる ## どこで見つけたか `lib/devbase/snapshot/manager.py` の `_backup_before_restore`(スプリント m8b の main で 599 行付近)。スプリント PR #472 の cross-review(codex、major / データ保全)。 ## なぜこの変更の範囲外なのか #458 の承認済みの設計は F3(同じ秒に重なった復元前バックアップを、作り直しとして作る)を決めており、テストもその振る舞いを縛っている。変えるには設計の決定を変えることになるため、承認ゲート 2 で利用者が「設計どおり残し、起票」と決めた(2026-10-13、#472 のコメント)。根拠: Value 2(MVV 版 1) ## 直さないと何が起きるか 人の操作では、作ったその秒のうちに復元を打つことはほぼ無く、起きる見込みは小さい。スクリプトから復元を続けて打つと、復元前バックアップが 1 つ失われ得る。 ## 案 既存の世代と重なったら、末尾に通し番号を付けた別の名前(`pre-restore-<時刻>-2` など)で作り、既存の世代を作り直さない。設計 F3 と確定仕様(`docs/specifications/snapshot-series.md`)を合わせて直す。 ## 由来 issue #458(PR #472) ## 受け入れ条件 2026-10-13 スプリント m8c(04)で着手。設計 PR は作らず、課題の「案」で進める(設計 F3 を変え、確定仕様を同じ実装 PR で直す)。 - [ ] 1. 復元前バックアップの名前 `pre-restore-<時刻>` が既にある世代と重なったら、既存の世代を作り直さず、末尾に通し番号を付けた名前(`pre-restore-<時刻>-2`、それも重なれば `-3` …)で新しい世代を作る。既存の世代のファイル(`full.tar.zst`・`snapshot.snar`・`incr-*.tar.zst`・`meta.yml`)と `snapshot.yml` のエントリは 1 バイトも変わらない - [ ] 2. 復元する世代がちょうど同じ秒の `pre-restore-<時刻>` であっても、展開するのは復元を打つ前のその世代の中身である(今のボリュームの中身で置き換わらない) - [ ] 3. 同じ秒に復元を 2 回打つと、復元前バックアップが 2 つ残る(1 回目の前の状態と 2 回目の前の状態) - [ ] 4. 重ならないときの名前・作り方・失敗の扱い(警告を出し、その呼び出しで作ったディレクトリだけを消して控え無しで続ける)は今と同じ - [ ] 5. 通し番号を付けた名前は名前の形の検証(`_safe_snap_dir`)を通り、系列・保持の規則(`pre-restore-*` の扱い)で他の `pre-restore-*` と同じに扱われる - [ ] 6. 既存のテスト `test_pre_restore_backup_rebuilds_an_existing_generation`(F3 を縛るもの)を新しい振る舞いへ書き換え、1〜3 をテストで縛る。書き換えたテストは、実装を前の形に戻すと落ちることを確かめる - [ ] 7. `docs/specifications/snapshot-series.md` の「世代の作り直し」の場面の表から復元前バックアップの行を外し、用語の表の「復元前バックアップ」に重なったときの名前の規則を書く。`CHANGELOG.md` の `[Unreleased]` に書く ## 進行 モード: — - [ ] 要求と受け入れ条件 - [x] 作業場所の用意 — 2026-10-13 02:27 - [ ] 設計 - [ ] 素材の収集と出典の確定 - [ ] ドキュメント再構成 - [ ] ドキュメントレビュー - [x] 計画 — 2026-10-13 02:26 - [x] 実装 — 2026-10-13 02:55 - [x] 構造改善 — 2026-10-13 03:07 - [x] 実装レビュー — 2026-10-13 03:25 - [x] 完了判定 — 2026-10-13 03:01 - [x] Pull Request — 2026-10-13 03:03 - [x] 確定仕様化 — 2026-10-13 04:02 - [ ] 後片付け - [x] 配布 — 2026-10-13 04:12 - [ ] 体裁レビュー - [x] リリース後テスト — 2026-10-13 04:12 - [x] 振り返り — 2026-10-13 04:26 - [x] 棚卸し — 2026-10-13 04:30 <!-- ndf:section-end --> 振り返り: https://github.com/devbasex/devbase/pull/481#issuecomment-6131178874
Activity
design(#466): 決定 4 で残す incr.tar.zst.new と確定仕様の作り直しの条件を揃える
Merge pull request #480 from devbasex/feat/issue-473-m8c
Merge pull request #482 from devbasex/docs/spec-m8c