feat(mosaic): durable pre-update snapshot + verify net + restore CLI (#791 PR2)
Some checks failed
ci/woodpecker/pr/ci Pipeline failed
Some checks failed
ci/woodpecker/pr/ci Pipeline failed
Third, independent recovery layer for keep-mode upgrades (Part of #791). PR1's manifest keeps the sync out of operator paths and the ephemeral /tmp snapshot rolls back a mid-write crash; this adds the case neither covers — a "successful" upgrade that a manifest/logic bug silently let touch an operator file. - install.sh make_durable_snapshot(): before any mutation, copy the operator-owned surface that exists to $XDG_STATE_HOME/mosaic/backups/pre-update-<UTC-ts>/ (0700 dirs / 0600 files, umask 077 scoped + restored). Fail-open; retention MOSAIC_BACKUP_RETENTION (default 5). - install.sh verify_operator_surface(): post-sync, restore any operator file the upgrade diverged/removed and warn loudly (a divergence = manifest bug). Honors intentional migration removals; refuses to restore through a symlink (CWE-59); guards mkdir under set -e. - mosaic restore (TS): --list (default dry-run), --from <ts> confirmation-gated restore. Strict timestamp selector (CWE-22), O_NOFOLLOW 0600 writes (CWE-59), containment + managed-dir checks via secure-file.ts. Counts/paths only — never emits file contents (secrev). - Gates: typecheck/lint/format ✓; mosaic vitest 1252; restore.spec 30; bash gates durable-snapshot 41 / manifest-guard 193 / rollback 28 / migration 21. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -48,15 +48,19 @@ steps:
|
||||
# keep mode is a single cp-based path that must not depend on rsync), and that a
|
||||
# corrupt/empty/missing manifest aborts fail-closed leaving operator files
|
||||
# untouched (B2/B3). The rollback gate proves a mid-sync failure is rolled back
|
||||
# from the pre-update snapshot (B1). The migration matrix pins the v2→v3
|
||||
# contract-file semantics. Pure bash, no node_modules — runs early alongside
|
||||
# sanitization.
|
||||
# from the pre-update snapshot (B1). The durable-snapshot gate (#791 PR2) proves
|
||||
# the retained, operator-scoped pre-update backup is taken before any mutation
|
||||
# (0700/0600, secret never logged, retention-pruned) and that the post-sync
|
||||
# verify net restores any operator file a manifest bug lets the sync touch. The
|
||||
# migration matrix pins the v2→v3 contract-file semantics. Pure bash, no
|
||||
# node_modules — runs early alongside sanitization.
|
||||
upgrade-guard:
|
||||
image: *node_image
|
||||
commands:
|
||||
- apk add --no-cache bash rsync
|
||||
- bash packages/mosaic/framework/tools/quality/scripts/test-upgrade-manifest-guard.sh
|
||||
- bash packages/mosaic/framework/tools/quality/scripts/test-upgrade-rollback.sh
|
||||
- bash packages/mosaic/framework/tools/quality/scripts/test-upgrade-durable-snapshot.sh
|
||||
- bash packages/mosaic/framework/tools/quality/scripts/test-install-migration.sh
|
||||
|
||||
typecheck:
|
||||
|
||||
Reference in New Issue
Block a user