The paper agrees with the code — guide v11, README, DESIGN re-rulings, and the adjudicated sweep

Step 7 of strategy/01-git-excision.md, the companions. The agent guide bumps to v11: the Git section teaches repo-resident etiquette alone (stage only your own paths, commit your own changes, leave app-maintained files to the app) — existing boards heal to the new text on next open. README re-anchors: the four git feature bullets out, tiers say the complete Mac experience is free, and one bullet states the format's git-friendliness promise. The changelog drops the never-shipped git entries. DESIGN re-rules: 06 retired with Undo routing migrated to 13 (now the sole substrate's doc, seam kept open), 07 retired as written pending the ops-service workstream, 14 retired as superseded record, 12 carries the second pivot note, the index reflects all of it; the charter gets a pointer note (the anchors' full re-ruling stays with the user). InertGitTests renames to GitAgnosticStorageTests — the excision restores its original claim app-wide. And the sweep: ~70 comment sites across 36 files adjudicated against the keeper list, every present-tense description of the excised machinery made past tense or repointed, keepers untouched. 2,707 tests green.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-08 12:31:27 -04:00
parent 8cf1457814
commit 445d035a83
50 changed files with 397 additions and 313 deletions
+25 -21
View File
@@ -13,13 +13,15 @@ import AppKit
/// exactly how the system's Edit Undo row and the toolbar's nil-target pair (`BoardToolbar`) light
/// up, disable and retitle with no code of the app's own.
///
/// The seam, though, must not be an `NSUndoManager`: a gitless board's stack is one, a Pro git
/// board's is git (12-editions.md The provider seam), and a protocol that vended one could only
/// ever have had a single implementation. So the substrate stays behind `HistoryProviding` and
/// The seam, though, must not be an `NSUndoManager`: a protocol that vended one could only ever have
/// had a single implementation, and the substrate stays behind `HistoryProviding` so a future
/// provider can bind without touching this class (`strategy/01-git-excision.md` Reversibility). So
/// *this* object is the translation one per board session, over whichever provider that session
/// was composed with. A git board inherits the whole command surface (enablement, dynamic titles,
/// 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.
/// was composed with. (Once two providers shared the seam this way a gitless board's native stack,
/// a Pro git board's git history, 12-editions.md The provider seam with whichever bound
/// inheriting the whole command surface, enablement, dynamic titles, Z, the toolbar pair, by
/// binding and changing nothing here. App-managed git is gone now, 2026-08-08, and native is the
/// only one left.)
///
/// **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
@@ -52,8 +54,8 @@ import AppKit
/// responder chain validates through this object, so answering `false` here disables all of them
/// at once, exactly as the lock's other victims disable through menu validation (02-architecture.md
/// § "The lock's scope"). Putting it in the *provider* would have been the same answer in the wrong
/// place: the stack is not the thing that is locked, the board is, and a Pro session binding the git
/// provider must inherit the rule without reimplementing it.
/// place: the stack is not the thing that is locked, the board is, and whatever provider a session
/// binds a future one included must inherit the rule without reimplementing it.
public final class BoardUndoManager: UndoManager {
/// The substrate this manager is a face for. Strong: the session owns both, and the manager is
@@ -65,7 +67,10 @@ public final class BoardUndoManager: UndoManager {
/// only under locks and on empty stacks the provider follows the board, so boards without
/// app-managed git repo-nested included bind 13-native-undo.md's native stack in **every**
/// tier" (03-board-ui.md Toolbar Catalog). The repo-nested board was the last holder of this
/// state and no longer is: that rule was about *git*, and this stack never touches git.
/// state and no longer is: that rule was about *git*, and this stack never touches git. (The
/// distinction the quote draws collapsed entirely with the 2026-08-08 excision,
/// `strategy/01-git-excision.md`: every board is "without app-managed git" now, not just
/// repo-nested ones.)
///
/// The state stays modelled because the seam still admits it a test binds a substrate-less
/// session through `AppModel.makeHistoryProvider` and because an absent substrate is the honest
@@ -73,20 +78,19 @@ public final class BoardUndoManager: UndoManager {
/// toolbar pair, and Z itself go quiet together through the same validation path a lock uses,
/// and nothing can accidentally accumulate in a stack that is not there.
///
/// ### Settable, for exactly one event
/// ### Settable, once for exactly one event now for none
///
/// **Add-git** (06 Rules Detection) is the design's one sanctioned mid-session mode flip:
/// "clicking it flips the open board into git mode immediately". 13's header says what that means
/// here the flip **swaps the substrate**: the mode-none board's native stack is discarded and
/// the git trail seeded from the root commit, the branch-switch discard-and-reseed precedent. The
/// composition root writes the new provider into this property rather than rebuilding this
/// object, so AppKit keeps the identical manager it has already been handed by
/// `windowWillReturnUndoManager` and simply revalidates over a different stack.
/// **Add-git** (06-history-undo.md Rules Detection, retired) was the design's one sanctioned
/// mid-session mode flip: "clicking it flips the open board into git mode immediately", swapping
/// the substrate the mode-none board's native stack discarded for the git trail seeded from the
/// root commit. The composition root wrote the new provider into this property rather than
/// rebuilding this object, so AppKit kept the identical manager it had already been handed by
/// `windowWillReturnUndoManager` and simply revalidated over a different stack.
///
/// (This is *not* a tier flip. 12-editions.md's "an open board finishes with the provider it
/// composed" is about a subscription lapsing, which cannot change a running session's tier at
/// all `BoardSession.tier` is a `let` with no setter. Mode can change, by explicit command,
/// and only in this one direction.)
/// App-managed git left the app entirely on 2026-08-08 (`strategy/01-git-excision.md`), and
/// add-git went with it: nothing left in the app ever assigns this property after composition. It
/// stays a `var` rather than a `let` for the same reason `HistoryProviding` stays a protocol a
/// future substrate swap, mid-session or not, re-binds without re-plumbing this class.
var history: (any HistoryProviding)?
/// Whether the board is refusing writes `BoardStore.isReadOnly`, read through a closure rather