Give card windows their own undo stacks and coarsen the close
Phase B of the two-level undo card: every card-window gesture — comment
post/delete/edit, body Edit sessions, style and details changes —
registers fine-grained on the window's own stack (window.undoManager
answers with it; board ⌘Z never sees mid-session card steps; an empty
window stack beeps, never falls through). Window close folds the stack
into one coarse values-based board step ("Edit card 'X'") — per-target
per-field later-wins merge, so foreign mid-session writes stay out by
construction, a no-net-change session registers nothing, and any stale
component skips the whole step. The comments/.trash purge defers with
the coarse step via a step-retirement seam on the providers: it runs
when the step leaves the board stack or the board session ends; the git
provider retires dropped steps on register, which keeps Pro's
purge-at-close-flush structural with no tier check. Interim on git
boards: gestures still auto-commit per debounce until phase C's
close-flush commit.
2432 tests in 418 suites green.
Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
@@ -21,6 +21,11 @@ import AppKit
|
||||
/// ⌘Z, the toolbar pair) by binding its provider and changing nothing here, which is what "a user
|
||||
/// subscribing (or lapsing) relearns nothing" (12) has to mean in code.
|
||||
///
|
||||
/// **And one per open card window**, over that window's own stack (13 ▸ Rules ▸ two levels, re-ruled
|
||||
/// 2026-07-31 — `CardWindowUndo.manager`): the second level needs precisely the same translation, so
|
||||
/// it gets the same object rather than a second one shaped like it. The name is now half-right and
|
||||
/// kept anyway: renaming it would say the two levels are two mechanisms, and they are not.
|
||||
///
|
||||
/// ### It deliberately keeps its inherited stack empty
|
||||
///
|
||||
/// Every question is overridden, so anything that *did* register into this manager by accident (a
|
||||
@@ -33,6 +38,11 @@ import AppKit
|
||||
/// not empty the board's stack (13-native-undo.md ▸ Rules — the stack belongs to the *session*, and
|
||||
/// its one clearing point is that session's teardown).
|
||||
///
|
||||
/// That non-forwarding is what the **close fold** rests on, now that a card window has a stack of its
|
||||
/// own: AppKit empties a closing window's undo manager, and the session's net effect is read off that
|
||||
/// window's steps a moment later, from `onDisappear` (`CardWindowSession.endSession`). A forwarded
|
||||
/// clear would silently make every close a no-net-change close.
|
||||
///
|
||||
/// ### The read-only lock disables Undo and Redo here
|
||||
///
|
||||
/// "Every read-only lock (vanished root, failed reload after wholesale ops, unwritable location)
|
||||
|
||||
Reference in New Issue
Block a user