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:
@@ -247,12 +247,22 @@ public final class GitHistoryProvider: HistoryProviding {
|
||||
|
||||
// MARK: - HistoryProviding
|
||||
|
||||
/// **Deliberately nothing.** On a git board an undo step is a commit, and the Writer boundary's
|
||||
/// inverse operations are the *free* tier's substrate (13-native-undo.md). `BoardStore` registers
|
||||
/// against whatever provider the session bound, and this one has a repository to read instead —
|
||||
/// so the registrations arrive and are dropped, which is exactly what "the commit trail itself is
|
||||
/// the substrate" (14 ▸ C1) means in code.
|
||||
public func register(_ step: HistoryStep) {}
|
||||
/// **Deliberately nothing — except the one thing a dropped step is owed.** On a git board an undo
|
||||
/// step is a commit, and the Writer boundary's inverse operations are the *free* tier's substrate
|
||||
/// (13-native-undo.md). `BoardStore` registers against whatever provider the session bound, and
|
||||
/// this one has a repository to read instead — so the registrations arrive and are dropped, which
|
||||
/// is exactly what "the commit trail itself is the substrate" (14 ▸ C1) means in code.
|
||||
///
|
||||
/// Dropping a step means **retiring** it (`HistoryStep.Retirement`), and that is what keeps the
|
||||
/// tier split in 13's purge rule structural rather than conditional: "on Pro the substrate is
|
||||
/// history: the close commit nets delete-plus-purge to a removal, revert restores it, so purge
|
||||
/// rides the close flush there as before" (13 ▸ Interaction with the trash). A card window's close
|
||||
/// step registered here is retired on arrival, so its deferred `comments/.trash/` purge runs
|
||||
/// immediately — at the close flush, exactly where it ran before this milestone — with no call
|
||||
/// site anywhere asking which substrate it is talking to.
|
||||
public func register(_ step: HistoryStep) {
|
||||
step.retirement?.run()
|
||||
}
|
||||
|
||||
public var canUndo: Bool {
|
||||
guard !isCrossing, isHeld?() != true else { return false }
|
||||
|
||||
Reference in New Issue
Block a user