FR-DEV-5 specifies edit history "persisted with the catalog so history survives a restart" and "named snapshots of an edit state". Neither is built.
Gap
core/dr-pipeline/src/history.rs states this plainly in its own "What this is not, yet" section: the stack is in memory, 64 deep, per session, and closing the image forgets it. It also says why — the gap that mattered was an automatically-saved mis-drag with no way back, and that is what was closed first. That reasoning is sound; this is the remaining half.
Why snapshots first
Snapshots are the cheaper and more valuable half. A snapshot is an EditState, which is exactly what the history stack already holds and what the sidecar already round-trips — so the storage question is largely answered. Full per-step history persistence can follow, or be dropped by an explicit decision.
Snapshots are also what make hold-to-compare worth twice as much: comparing against the original is the honest check, comparing against "the version I liked twenty minutes ago" is how a photographer actually decides between two treatments.
Acceptance
Name, save, list, restore and delete a snapshot of the current edit.
Persisted in the sidecar, so it survives a restart and syncs between devices per field (FR-NC-9).
Restoring a snapshot is one history step, undoable.
A snapshot costs one EditState, not one rendered image.
Enables
Hold-to-compare against a chosen snapshot — FR-DEV-7's second clause.
Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
FR-DEV-5 specifies edit history "persisted with the catalog so history survives a restart" and "**named snapshots** of an edit state". Neither is built.
## Gap
`core/dr-pipeline/src/history.rs` states this plainly in its own "What this is not, yet" section: the stack is in memory, 64 deep, per session, and closing the image forgets it. It also says why — the gap that mattered was an automatically-saved mis-drag with no way back, and that is what was closed first. That reasoning is sound; this is the remaining half.
## Why snapshots first
Snapshots are the cheaper and more valuable half. A snapshot **is** an `EditState`, which is exactly what the history stack already holds and what the sidecar already round-trips — so the storage question is largely answered. Full per-step history persistence can follow, or be dropped by an explicit decision.
Snapshots are also what make hold-to-compare worth twice as much: comparing against the original is the honest check, comparing against "the version I liked twenty minutes ago" is how a photographer actually decides between two treatments.
## Acceptance
- [ ] Name, save, list, restore and delete a snapshot of the current edit.
- [ ] Persisted in the sidecar, so it survives a restart and syncs between devices per field (FR-NC-9).
- [ ] Restoring a snapshot is one history step, undoable.
- [ ] A snapshot costs one `EditState`, not one rendered image.
## Enables
Hold-to-compare against a chosen snapshot — FR-DEV-7's second clause.
---
Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
Closes the second clause of#14, once #3 accepts a snapshot as its comparison target. Reduces the urgency of#11 — snapshots cover a good part of what variants are wanted for, at a fraction of the cost.
**Closes the second clause of** #14, once #3 accepts a snapshot as its comparison target.
**Reduces the urgency of** #11 — snapshots cover a good part of what variants are wanted for, at a fraction of the cost.
Landed in d3b6127 (2026-09-12): a snapshot is a sidecar version carrying snapshot-of = <uuid>, nameable, restorable, and mergeable like any version. FR-DEV-5 is tagged in ten files.
Landed in d3b6127 (2026-09-12): a snapshot is a sidecar version carrying `snapshot-of = <uuid>`, nameable, restorable, and mergeable like any version. FR-DEV-5 is tagged in ten files.
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.
FR-DEV-5 specifies edit history "persisted with the catalog so history survives a restart" and "named snapshots of an edit state". Neither is built.
Gap
core/dr-pipeline/src/history.rsstates this plainly in its own "What this is not, yet" section: the stack is in memory, 64 deep, per session, and closing the image forgets it. It also says why — the gap that mattered was an automatically-saved mis-drag with no way back, and that is what was closed first. That reasoning is sound; this is the remaining half.Why snapshots first
Snapshots are the cheaper and more valuable half. A snapshot is an
EditState, which is exactly what the history stack already holds and what the sidecar already round-trips — so the storage question is largely answered. Full per-step history persistence can follow, or be dropped by an explicit decision.Snapshots are also what make hold-to-compare worth twice as much: comparing against the original is the honest check, comparing against "the version I liked twenty minutes ago" is how a photographer actually decides between two treatments.
Acceptance
EditState, not one rendered image.Enables
Hold-to-compare against a chosen snapshot — FR-DEV-7's second clause.
Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
Closes the second clause of #14, once #3 accepts a snapshot as its comparison target.
Reduces the urgency of #11 — snapshots cover a good part of what variants are wanted for, at a fraction of the cost.
Landed in
d3b6127(2026-09-12): a snapshot is a sidecar version carryingsnapshot-of = <uuid>, nameable, restorable, and mergeable like any version. FR-DEV-5 is tagged in ten files.