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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user