A host restoring after the original is gone has no local index and cannot know a snapshot's human ID. snapshot list shows such snapshots only by their remote key, but snapshot restore and snapshot verify accepted only the human ID — so the documented recovery flow could not be followed.
What changed
Restore and verify resolve an identifier to the snapshot's remote key: a human ID is hashed as before; a remote key, or an unambiguous leading part of it (exactly what the snapshot list table prints as <remote only:...>), is used directly, resolved against the store's metadata listing.
Deep verify reads the single snapshot in the exported per-snapshot database instead of filtering by the human ID it no longer has.
New README section "Restoring on another machine" walks the flow end to end and states that no age_recipients and no local index are needed. Drops the now-done roadmap item.
Test
TestRestoreOnAnotherMachine backs up with one index and hostname to a file:// store, then lists, restores (by the abbreviated key), and deep-verifies from the store with a fresh empty index, a different hostname, and no age_recipients, comparing restored bytes to the source. The empty index is what makes it fail if restore ever needed the original.
Human IDs are never pure hex, so the hex-shape test cleanly tells the two identifier forms apart.
make check green.
model: claude-opus-4-8
A host restoring after the original is gone has no local index and cannot know a snapshot's human ID. `snapshot list` shows such snapshots only by their remote key, but `snapshot restore` and `snapshot verify` accepted only the human ID — so the documented recovery flow could not be followed.
**What changed**
- Restore and verify resolve an identifier to the snapshot's remote key: a human ID is hashed as before; a remote key, or an unambiguous leading part of it (exactly what the `snapshot list` table prints as `<remote only:...>`), is used directly, resolved against the store's metadata listing.
- Deep verify reads the single snapshot in the exported per-snapshot database instead of filtering by the human ID it no longer has.
- New README section "Restoring on another machine" walks the flow end to end and states that no `age_recipients` and no local index are needed. Drops the now-done roadmap item.
**Test**
`TestRestoreOnAnotherMachine` backs up with one index and hostname to a `file://` store, then lists, restores (by the abbreviated key), and deep-verifies from the store with a fresh empty index, a different hostname, and no `age_recipients`, comparing restored bytes to the source. The empty index is what makes it fail if restore ever needed the original.
Human IDs are never pure hex, so the hex-shape test cleanly tells the two identifier forms apart.
`make check` green.
model: claude-opus-4-8
A host restoring after the original is gone has no local index and cannot
know a snapshot's human ID; `snapshot list` shows such snapshots only by
their remote key. Restore and verify now resolve an identifier to that
remote key: a human ID is hashed as before, and a remote key (or an
unambiguous leading part of it, as the table prints) is used directly,
resolved against the store's metadata listing. Deep verify reads the one
snapshot in the exported database rather than filtering by the human ID.
Adds an integration test that backs up with one index and hostname, then
lists, restores, and deep-verifies from the store with a fresh empty
index, a different hostname, and no age_recipients — comparing restored
bytes to the source. The empty index is what makes it fail if restore
ever needed the original one.
Adds a "Restoring on another machine" README section walking the flow end
to end, and drops the now-done roadmap item.
Model: claude-opus-4-8
Rebased onto current origin/next (past #146). The only conflict was the README roadmap under ### infrastructure: this PR drops the now-done "Cross-machine restore documentation" item, and #146 reworded the schema bullet to point at docs/DATAMODEL.md; the resolution keeps only the reworded "Cross-version schema upgrades" bullet so both reads stand. No TODO.md changes were involved. make fmt clean; authoritative make check passed as one complete run on the gated head 68f4ccf5b9. Force-pushed with lease; still needs-review, assigned clawbot.
model: claude-opus-4-8
Rebased onto current `origin/next` (past https://git.eeqj.de/sneak/vaultik/pulls/146). The only conflict was the README roadmap under `### infrastructure`: this PR drops the now-done "Cross-machine restore documentation" item, and https://git.eeqj.de/sneak/vaultik/pulls/146 reworded the schema bullet to point at `docs/DATAMODEL.md`; the resolution keeps only the reworded "Cross-version schema upgrades" bullet so both reads stand. No TODO.md changes were involved. `make fmt` clean; authoritative `make check` passed as one complete run on the gated head 68f4ccf5b9c8bd2b02df9e0dc822bdd4409e1aab. Force-pushed with lease; still `needs-review`, assigned clawbot.
model: claude-opus-4-8
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A host restoring after the original is gone has no local index and cannot know a snapshot's human ID.
snapshot listshows such snapshots only by their remote key, butsnapshot restoreandsnapshot verifyaccepted only the human ID — so the documented recovery flow could not be followed.What changed
snapshot listtable prints as<remote only:...>), is used directly, resolved against the store's metadata listing.age_recipientsand no local index are needed. Drops the now-done roadmap item.Test
TestRestoreOnAnotherMachinebacks up with one index and hostname to afile://store, then lists, restores (by the abbreviated key), and deep-verifies from the store with a fresh empty index, a different hostname, and noage_recipients, comparing restored bytes to the source. The empty index is what makes it fail if restore ever needed the original.Human IDs are never pure hex, so the hex-shape test cleanly tells the two identifier forms apart.
make checkgreen.model: claude-opus-4-8
b76437aa7bto68f4ccf5b9Rebased onto current
origin/next(past #146). The only conflict was the README roadmap under### infrastructure: this PR drops the now-done "Cross-machine restore documentation" item, and #146 reworded the schema bullet to point atdocs/DATAMODEL.md; the resolution keeps only the reworded "Cross-version schema upgrades" bullet so both reads stand. No TODO.md changes were involved.make fmtclean; authoritativemake checkpassed as one complete run on the gated head68f4ccf5b9. Force-pushed with lease; stillneeds-review, assigned clawbot.model: claude-opus-4-8
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.