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
+3 -1
View File
@@ -215,7 +215,9 @@ private struct BannerRowView: View {
switch control {
case let .cancel(cancel):
// Cancel appears on safe copies only (02, settled): it means "remove the partial copy,
// nothing lost". Git brackets pass no closure and therefore get no button.
// nothing lost". Wholesale brackets that pass no closure get no button once git's,
// before the excision (`strategy/01-git-excision.md`, 2026-08-08); no caller passes one
// today.
Button(control.label, action: cancel)
.buttonStyle(.link)
.font(.callout)
+6 -4
View File
@@ -93,11 +93,13 @@ extension BoardStore {
/// broader lockdown that already covers these two items.
/// - **The board popover's fields** are covered by disabling while the popover is open at all
/// coarser than per-field focus, but it is a configuration surface (04's carve-out) and no lane
/// move belongs under it. That clause covers **every** configuration field the app has again since
/// move belongs under it. That clause covered **every** configuration field the app had since
/// 2026-08-07: the 2026-07-31 split moved most of them to a board settings sheet, whose flag this
/// function read as a third disjunct, and the reversal brought them back branch creation, commit
/// identity, and pro-m2's remote URL and credentials all live in the popover's Git tab, under the
/// popover's own open-at-all rule.
/// function read as a third disjunct, and the reversal brought them back under the popover's own
/// open-at-all rule branch creation, commit identity, and pro-m2's remote URL and credentials
/// among them, all in the popover's Git tab at the time. The Git tab itself retired with
/// app-managed git (`strategy/01-git-excision.md`, 2026-08-08); the popover's open-at-all rule
/// now guards only `BoardInfoTabView`'s ordinary fields.
/// - **The search field** is per-focus and exact (`BoardSearchPresentation.isFocused`), which it has
/// to be: the field's own rule is that board commands *stay enabled* while it holds the keyboard
/// (04 § Search), so these two are the narrow exception to it and nothing coarser would do.
+4 -3
View File
@@ -43,9 +43,10 @@ extension NSToolbarItem.Identifier {
/// `windowWillReturnUndoManager` hands back the session's `BoardUndoManager`, and both therefore
/// enable exactly when that board has a step to cross and no read-only lock stands
/// (13-native-undo.md Rules). **Every board has undo in every tier**, so there is no tier-shaped
/// disablement to write: 03's parenthetical about boards without undo is 06's *git* substrate, which
/// a board binds by being in git mode on any tier since 12-editions.md PIVOT 2026-08-07, and
/// under a Pro subscription before it.
/// disablement to write: 03's parenthetical about boards without undo was 06's *git* substrate,
/// which a board once bound by being in git mode on any tier since 12-editions.md PIVOT
/// 2026-08-07, and under a Pro subscription before it, until app-managed git left the app entirely
/// (`strategy/01-git-excision.md`, 2026-08-08) and there stopped being a substrate to bind.
///
/// Their labels are the design's one exception to the menu-title rule: `NSUndoManager` rewrites the
/// *menu* titles as the stack changes ("Undo Move Card"), which a toolbar label does not track, so
+4 -4
View File
@@ -75,9 +75,9 @@ public final class CardBodyPresentation {
/// is the type every path that *enters* Edit already holds, so attaching the announcement to the
/// flip makes "always" true by construction rather than by three call sites remembering.
///
/// Filled in by the window with its edit session's `beginEditSession()`. Its consumer is pro-m1's
/// auto-committer, which stages around the card's folder for as long as the session stands
/// (06-history-undo.md Rules Auto-commit).
/// Filled in by the window with its edit session's `beginEditSession()`. Its original second
/// consumer the auto-committer's stage-around left with the git excision (2026-08-08,
/// strategy/01-git-excision.md); the session bookkeeping it drives is its own reason now.
public var beginEdits: (() -> Void)?
/// Whether the opening rule has already run for this window.
@@ -97,7 +97,7 @@ public final class CardBodyPresentation {
hasOpened = true
mode = CardBodyMode.opening(body: body)
// A card that opened straight into Edit because its body was empty is in a session exactly
// like one the user pressed E in, and the committer has to stage around it either way.
// like one the user pressed E in, and the session bookkeeping applies either way.
if mode == .edit { beginEdits?() }
return mode
}
+2 -2
View File
@@ -146,8 +146,8 @@ public final class CommentEditSession {
/// **Save, or ** the session's commit point (05 The comments column). Flushes and ends.
///
/// A named call rather than a bare `flush()` for `CardBodyEditSession.endEditSession()`'s reason:
/// this is the boundary a Pro auto-commit coalesces on, one commit per session and never per save
/// tick (06-history-undo.md Rules Auto-commit).
/// this is the session's one settlement boundary the excised auto-committer coalesced on it
/// (one commit per session, never per save tick), and any future history consumer would too.
@discardableResult
public func commit() -> Bool {
guard !hasEnded else { return false }