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