Skip to content

feat(undo): enable tile undo by default (PR12) - #294

Merged
barakbl merged 1 commit into
mainfrom
feat/undo-tiles-default-on
Jul 16, 2026
Merged

feat(undo): enable tile undo by default (PR12)#294
barakbl merged 1 commit into
mainfrom
feat/undo-tiles-default-on

Conversation

@barakbl

@barakbl barakbl commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Flips the default so tile-based undo drives undo/redo restore + persistence for everyone. This is the user-facing cutover the whole roadmap has been building toward (PR1-PR11 all merged).

The change

readUndoTilesMode: unset (and any unknown value) → on. "off" (kill switch) and "shadow" (capture + verify only, the old full-snapshot path) remain as explicit localStorage escape hatches. One line of real behavior change.

Why now / soak basis

  • Default has been shadow since 0.57.0 (PR9) — three releases of dual-capture + reconstruction-verify.
  • Mismatch counters are zero across the smoke suite (shadow-verify, tiled-boot, tiled-restore, dirty-coverage).
  • Honest caveat for the merge decision: the soak signal is my local smokes + testing, not user telemetry (the mismatch counter is local console/undoStats, not reported). So "green" means "my coverage is green," not "N users saw zero mismatches." Merging this is the deliberate go/no-go.

Safety / rollback

  • Rollback = flip the default back (one-line PR) or a per-user localStorage["nekudot.undoTiles"]="shadow"|"off".
  • The v1 shadow keyframe keeps even a version rollback lossless; the boot ladder degrades a holed chain to "history depth lost", never blank paint; add/remove/reorder-layer undo steps fall back to the full snapshot.

Verification

  • Full suite 834/834; readUndoTilesMode now defaults to on with explicit off/shadow/unknown coverage; the two shadow-only AppHistory tests pin the flag.
  • tiled-boot.mjs gains a Phase 0 proving a no-flag user runs on-mode (v2 chain written): 14/14 on GPU Chrome (migration → boot-from-v2 → eviction+undo reload → quota recovery → dpr).
  • tiled-restore.mjs 8/8.
  • boot-live.mjs: identical to main — 9/13 with the same 4 pre-existing headless-harness failures (Start-page-on-cold-boot, brush-size-persist, its undo-after-reload flow, reset); the flip adds no new failures. lint/tsc clean, build:app OK.

Remaining: PR13 (post-rollout cleanup: raise MAX_UNDO, drop legacy readers) — one release after this.

Flip the nekudot.undoTiles default from "shadow" to "on" after the shadow soak (PR9
shipped 0.57.0; default shadow since, mismatch counters zero across the smoke suite).
The tile delta chain now drives undo/redo restore + persistence for everyone.

- readUndoTilesMode: unset (and any unknown value) -> "on"; "off" (kill switch) and
  "shadow" (capture + verify only, the old full-snapshot live path) stay as explicit
  escape hatches via localStorage.

Rollback is a one-line default flip or a per-user localStorage flag; the v1 shadow
keyframe keeps even a version rollback lossless. Contained by the boot ladder
(a chain hole degrades to "depth lost", never blank paint) and the snapshot fallback
(add/remove/reorder-layer steps).

Tests: readUndoTilesMode default now "on" + explicit off/shadow/unknown coverage; the
two shadow-only AppHistory tests pin the flag. tiled-boot.mjs gains a Phase 0 proving
a no-flag user runs on-mode (v2 chain written) - 14/14 on GPU Chrome. Full suite 834.
boot-live.mjs unchanged vs main (same 4 pre-existing headless-harness failures, no new
ones from the flip).
@barakbl
barakbl merged commit 6a4c562 into main Jul 16, 2026
5 checks passed
@barakbl
barakbl deleted the feat/undo-tiles-default-on branch July 16, 2026 23:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant