Bind the undo provider to the board, not the tier

The 2026-07-31 re-ruling: gitless boards bind the native stack in every
tier — a Pro upgrade no longer removes undo from mode-none boards — and
Pro git boards bind the git provider; repo-nested stays the no-undo
case under Pro, while the free tier (which never runs detection) binds
native there too, per 12's inert posture. Add-git now swaps a live
native substrate mid-session: the in-flight stack is cleared with the
discarded provider, the git trail seeds from the root commit, and the
same BoardUndoManager instance keeps nil-target menu validation fresh.

2405 tests in 413 suites green.

Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
2026-07-31 18:53:38 -04:00
parent 3bd6187b94
commit 2e4dde5655
9 changed files with 286 additions and 104 deletions
+4 -2
View File
@@ -159,8 +159,10 @@ public final class GitAutoCommitter {
/// this engine clears the instant a window commits so the moment of landing is the only moment
/// at which "that commit was the heal" is knowable at all.
///
/// `nil` on every board with no undo provider bound (the free tier's committer does not exist;
/// a Pro board's does, and a provider is bound beside it).
/// `nil` wherever no `GitHistoryProvider` is listening which in practice is nowhere a committer
/// exists at all: a committer's existence is exactly mode `git`, and mode `git` is exactly where
/// the composition root binds the git provider (`AppModel.makeHistoryProvider`). Mode-none boards
/// have a native stack and no committer; repo-nested boards have neither.
@ObservationIgnored
public var reportLanded: (@MainActor (GitLandedWindow) -> Void)?