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
+10 -7
View File
@@ -13,8 +13,9 @@ import Foundation
/// "Duplicate is a full fork, `.trash/` included dropping it would leave the copy's working tree
/// disagreeing with its own copied HEAD". This file does nothing to achieve that: the trash is an
/// ordinary folder under the root, so the tree walk carries it by declining to be clever.
/// - **`.git` comes along** a duplicate of a git board is a fork of its history with only its
/// remote configuration stripped, which is m7's.
/// - **`.git` comes along** a duplicate of a board that has one is a fork of its history
/// verbatim, remote configuration included; a stripped-remote protection was once slated for this
/// (m7-git), never built before the git excision (`strategy/01-git-excision.md`, 2026-08-08).
/// - Timestamps, unknown keys, strays, `CLAUDE.user.md`, attachments: verbatim, for the same reason.
/// **Nothing here reads a board file at all.**
///
@@ -245,11 +246,13 @@ enum BoardDuplicator {
}
BoardTreeCopy.restoreAttributes(from: rootAttributes, onto: destination)
// m7-git: strip the copy's remote configuration "the duplicate keeps `.git` but has its
// remote configuration stripped ... it must not silently push into the original's remote"
// (03-board-ui.md). Remotes only: the repo-local `user.name`/`user.email` survives, so the
// fork keeps its commit identity (06-history-undo.md's identity home). Push-on-commit needs
// nothing here it lives on the registry record, and the copy's record is born fresh.
// Once slated (m7-git) to strip the copy's remote configuration here "the duplicate keeps
// `.git` but has its remote configuration stripped ... it must not silently push into the
// original's remote" (03-board-ui.md) before app-managed git was excised entirely
// (`strategy/01-git-excision.md`, 2026-08-08) with the milestone unbuilt. `.git`, remote
// configuration included, now rides along exactly as verbatim as every other file this walk
// carries; a duplicate of a board sitting in a user's own repo is that user's to manage, same
// as the original was.
return destination
}
+15 -12
View File
@@ -107,9 +107,10 @@ struct BoardWindowHost: View {
/// following walk builds (`BoardRepairRun`, `EchoLedger.adopt`).
///
/// It cannot live anywhere else: the repairs run before a store exists and the receipts have to
/// reach that store's ledger before `beginSession` composes a git board's committer, or the app's
/// own repair commits as `Lanework External`. (Pro's committer, until 12-editions.md PIVOT
/// 2026-08-07 made it every git board's.) Cleared once adopted.
/// reach that store's ledger before the store's own landing reload classifies them arrive late
/// and the repair's own writes would misattribute as foreign, and the announcer would speak about
/// them. (Once fed a git board's auto-committer instead; app-managed git is gone now,
/// `strategy/01-git-excision.md`, 2026-08-08.) Cleared once adopted.
@State private var repairLedger: EchoLedger?
@State private var phase: Phase = .opening
@@ -225,8 +226,10 @@ struct BoardWindowHost: View {
}
// (**The board settings sheet was presented here** between 2026-07-31 and 2026-08-07,
// when the popover/sheet split was reversed: the sheet retired, its contents rehomed
// into the popover's Git tab, and this window has no modal configuration surface at all
// now 03-board-ui.md Board settings sheet, marked retired.)
// into the popover's Git tab itself retired 2026-08-08 with the git excision
// (`strategy/01-git-excision.md`), the git-specific contents gone with it and this
// window still has no modal configuration surface at all, now for either reason
// 03-board-ui.md Board settings sheet, marked retired.)
//
// "The board in front", for the menu items that act on it (`LaneWidthCommands`), and
// beside it the window's own popover flag, which is what File Board Info toggles, its
@@ -382,13 +385,13 @@ struct BoardWindowHost: View {
loading.end()
// **The repair's receipts, into the board's own ledger before the session composes**
// (01: "On Pro boards the repairs drop heal-marked receipts and commit separately as one
// repair commit" every git board's since 12-editions.md PIVOT 2026-08-07, the sentence
// otherwise unchanged). `beginSession` is where that committer is built and started, and the
// committer harvests the ledger it is handed; receipts adopted after that line would be
// receipts the repair commit never sees, and the app's own repair would be authored
// `Lanework External`.
// **The repair's receipts, into the board's own ledger before the session's landing reload
// classifies them.** (01-storage-format.md read, of a now-retired repair-commit path: "On Pro
// boards the repairs drop heal-marked receipts and commit separately as one repair commit"
// every git board's, since 12-editions.md PIVOT 2026-08-07. App-managed git left the app
// entirely on 2026-08-08, `strategy/01-git-excision.md`; there is no repair commit now.)
// Receipts adopted after this line would be receipts the landing reload never classifies, and
// the repair's own writes would misattribute as foreign.
if let repairLedger {
store.echoes.adopt(repairLedger)
self.repairLedger = nil
+11 -10
View File
@@ -195,12 +195,13 @@ final class CardWindowSession: CardSessionFlushing {
func endSession() async {
guard !hasEnded else { return }
hasEnded = true
// pro-m1: this is the boundary the auto-committer coalesces on one commit per Edit
// session, "never per save tick" (06-history-undo.md Rules Auto-commit). The debounced
// saves inside the session are ordinary bracketed writes; what makes them one commit is that
// the committer's own debounce outlives them and this call is where the session is known to
// be over. It is also where the body's *last* fine step joins this window's stack, which is
// why it has to precede the fold below.
// Once the boundary the auto-committer coalesced on too "one commit per Edit session,
// never per save tick" (06-history-undo.md Rules Auto-commit, retired with app-managed
// git, `strategy/01-git-excision.md`, 2026-08-08). What is left is native undo's own version
// of the same idea: the debounced saves inside the session are ordinary bracketed writes, and
// what makes them one step is that `endEditSession` registers exactly one (13-native-undo.md
// Rules) once the session is known to be over. It is also where the body's *last* fine step
// joins this window's stack, which is why it has to precede the fold below.
body.endEditSession()
// **The saves, in the order the comments build fixed**: the inline session's flush, then the
// draft's (`CardComments.endSession`). Both may register their own last fine step, so both
@@ -212,10 +213,10 @@ final class CardWindowSession: CardSessionFlushing {
// This is the one place that knows both halves: the window's stack, which is the session's
// net effect, and the `comments/.trash/` purge, which must not run while a board step's undo
// still restores comments out of it. Registering answers whether the step took the purge on
// and a board whose substrate keeps no steps has already run it by the time that answer comes
// back, which is how a git board keeps purging at the close flush without a word about tiers
// here (and there is none to say since 12-editions.md PIVOT 2026-08-07 the substrate is
// the board's mode, not a subscription).
// and a board whose substrate declines to keep a step (`registerCardSession`'s three `false`
// cases above) has already run the purge by the time that answer comes back. The seam stays
// nil-safe on purpose for whatever substrate registers next (`strategy/01-git-excision.md`
// Reversibility); today the native stack is the only one that ever says yes.
//
// **This window stops owning its card's comment trash first** (ruled 2026-08-06 the
// open-window carve-out). While the window is open the store defers every purge of this
+9 -7
View File
@@ -84,9 +84,10 @@ public extension CardSessionFlushing {
/// call site and supplies the real ones.
///
/// The two flush seams that are `nil` today `editorFlush` and `committerFlush` are named rather
/// than left to be discovered: 02 fixes their relative order ("editor saves before the pending
/// auto-commit"), and the milestone that adds a debounced editor save should have nowhere to put it
/// except the slot that already sits in the right place.
/// than left to be discovered: 02 fixes their relative order (editor saves before any board-level
/// flush), and a future consumer should have nowhere to land except the slot that already sits in
/// the right place. `committerFlush`'s original consumer was the auto-committer, excised 2026-08-08
/// (strategy/01-git-excision.md); the slot outlives it for whatever durable-history flush comes next.
@MainActor
public struct CloseFlushCoordinator {
@@ -121,12 +122,13 @@ public struct CloseFlushCoordinator {
public var storeFlush: () async -> Void
/// The card windows' debounced body saves (05-card-window.md, m6). Runs **before**
/// `committerFlush`: 02 is explicit that editor saves land before the pending auto-commit, so a
/// session's last keystrokes are inside the commit that closes it rather than orphaned in the
/// next one.
/// `committerFlush`: 02 is explicit that editor saves land before any board-level flush, so a
/// session's last keystrokes ride whatever board-level flush follows rather than being orphaned
/// behind it.
public var editorFlush: (() async -> Void)?
/// The pending debounced auto-commit (06-history-undo.md, m7).
/// The board-level flush that ran last the excised auto-committer's slot, permanently `nil`
/// since 2026-08-08 (strategy/01-git-excision.md); see the header for why the slot survives.
public var committerFlush: (() async -> Void)?
// MARK: Step 3 the record
+3 -2
View File
@@ -112,8 +112,9 @@ public struct SettleableSession {
// MARK: - SessionSettleGate
/// **The save-or-discard step**, as one reusable decision procedure (06-history-undo.md Rules
/// Undo restore vs open Edit sessions; Branch switching).
/// **The save-or-discard step**, as one reusable decision procedure 06-history-undo.md Rules
/// Undo restore vs open Edit sessions; Branch switching, retired with the callers that read it
/// (`strategy/01-git-excision.md`, 2026-08-08).
///
/// ### One machinery, every caller, by design
///
+5 -4
View File
@@ -25,10 +25,11 @@ import os
/// rule this file invents:
///
/// - **The two exclusions are top-level only** (`BoardTreeCopy`): `.git` and `.trash/` mean
/// something at a board root and nowhere else. `.git` is skipped so an instantiated board is never
/// silently in git mode (06-history-undo.md's no-silent-auto-init); its actual mode follows 06's
/// nearest-`.git`-wins detection at the destination the save panel chose. `.trash/` is skipped
/// because "a new board isn't born with trash".
/// something at a board root and nowhere else. `.git` is skipped so a template's own repository
/// never rides along into every board it stamps out once phrased as keeping an instantiated
/// board from silently landing in git mode (06-history-undo.md's no-silent-auto-init, retired with
/// app-managed git, `strategy/01-git-excision.md`); there is no mode left to land in today.
/// `.trash/` is skipped because "a new board isn't born with trash".
/// - **Everything else copies verbatim** strays, `CLAUDE.user.md`, a seeded `.gitignore`,
/// attachments, card bodies, unknown keys, line endings (09 Save as Template, "Strays copy
/// through *and* instantiation alike"), and **symlinks as symlinks**, never traversed