The seams unbind — the provider is always native, and the git stack compiles dead
Step 4 of strategy/01-git-excision.md, the entangled one: AppModel's makeHistoryProvider collapses to the native provider (the seam stays injectable per the reversibility posture), the session's git state and its wiring go (wireGitUndo, wireBranchSwitching, the card-session staging threading), BoardStore sheds commitSeam and the identity-history ranker (the loader's nil-safe rung now tops out at birth date — today's no-git behavior), SessionSettleGate keeps the gate and inherits the path utility it borrowed, BoardRegistry drops the persisted operation stamp (decode-safe), and the git banner family leaves BannerCenter with its announcer and accessibility phrases. One missed harvest tie severed (the narrator's root subject is its own now). Nothing outside Kanban/Git/ references the stack — proven by sweep. 2,855 tests green. Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
@@ -158,16 +158,6 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
/// `UserDefaults`.
|
||||
public var remoteLocationWarned: Bool
|
||||
|
||||
/// **A bracketed git operation this app started and has not finished** (06-history-undo.md ▸ Rules
|
||||
/// ▸ Abnormal repo states: "every bracketed operation stamps its intent app-side (per-board
|
||||
/// registry) before touching the repo").
|
||||
///
|
||||
/// `nil` for every board that is not mid-operation, which is every board almost all of the time:
|
||||
/// the stamp is written immediately before the repository is touched and cleared as soon as the
|
||||
/// operation is over, so finding one at open means the app died in between. See
|
||||
/// `GitOperationStamp` for why it lives here rather than in the board folder or under `.git`.
|
||||
public var gitOperationStamp: GitOperationStamp?
|
||||
|
||||
public init(
|
||||
id: UUID = UUID(),
|
||||
bookmark: Data,
|
||||
@@ -182,8 +172,7 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
pushOnCommit: Bool = false,
|
||||
remoteLocationWarned: Bool = false,
|
||||
icon: String? = nil,
|
||||
iconColor: String? = nil,
|
||||
gitOperationStamp: GitOperationStamp? = nil
|
||||
iconColor: String? = nil
|
||||
) {
|
||||
self.id = id
|
||||
self.bookmark = bookmark
|
||||
@@ -199,7 +188,6 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
self.remoteLocationWarned = remoteLocationWarned
|
||||
self.icon = icon
|
||||
self.iconColor = iconColor
|
||||
self.gitOperationStamp = gitOperationStamp
|
||||
}
|
||||
|
||||
// MARK: Codable
|
||||
@@ -227,7 +215,6 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
case iconColor
|
||||
case pushOnCommit
|
||||
case remoteLocationWarned
|
||||
case gitOperationStamp
|
||||
}
|
||||
|
||||
public init(from decoder: any Decoder) throws {
|
||||
@@ -246,11 +233,6 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
iconColor = try container.decodeIfPresent(String.self, forKey: .iconColor)
|
||||
pushOnCommit = try container.decodeIfPresent(Bool.self, forKey: .pushOnCommit) ?? false
|
||||
remoteLocationWarned = try container.decodeIfPresent(Bool.self, forKey: .remoteLocationWarned) ?? false
|
||||
// Tolerant twice over: absent on every record written before this key existed, and absent
|
||||
// again — rather than fatal — if a future build's stamp `Kind` is one this build cannot name.
|
||||
// A stamp that cannot be read is a stamp that cannot recover anything, which degrades to the
|
||||
// pause-and-defer stance rather than to a quarantined registry.
|
||||
gitOperationStamp = try? container.decodeIfPresent(GitOperationStamp.self, forKey: .gitOperationStamp)
|
||||
}
|
||||
|
||||
public func encode(to encoder: any Encoder) throws {
|
||||
@@ -269,7 +251,6 @@ public struct BoardRecord: Codable, Sendable, Equatable, Identifiable {
|
||||
try container.encodeIfPresent(iconColor, forKey: .iconColor)
|
||||
try container.encode(pushOnCommit, forKey: .pushOnCommit)
|
||||
try container.encode(remoteLocationWarned, forKey: .remoteLocationWarned)
|
||||
try container.encodeIfPresent(gitOperationStamp, forKey: .gitOperationStamp)
|
||||
// An unknown key is dropped, exactly as the synthesized conformance dropped it: the file's
|
||||
// forward tolerance is a decoding property, and nothing here preserves what it cannot read.
|
||||
}
|
||||
@@ -599,22 +580,6 @@ public final class BoardRegistry {
|
||||
update(id) { $0.remoteLocationWarned = true }
|
||||
}
|
||||
|
||||
/// **Records — or clears — the bracketed git operation this app is about to run**
|
||||
/// (`GitOperationStamp`).
|
||||
///
|
||||
/// It saves the file synchronously like every other setter here, and that is load-bearing rather
|
||||
/// than incidental: the whole value of the stamp is that it is on disk *before* the repository is
|
||||
/// touched, so a crash a millisecond later is still recognizable as this app's. `save()` writes
|
||||
/// atomically, so the file a next launch reads is either the old one or this one.
|
||||
public func setGitOperationStamp(id: UUID, _ stamp: GitOperationStamp?) {
|
||||
update(id) { $0.gitOperationStamp = stamp }
|
||||
}
|
||||
|
||||
/// The stamp this board is carrying, if any — read once per session, at open.
|
||||
public func gitOperationStamp(id: UUID) -> GitOperationStamp? {
|
||||
record(id: id)?.gitOperationStamp
|
||||
}
|
||||
|
||||
// MARK: - Reading
|
||||
|
||||
/// Every known board, most recently opened first, each classified by whether its bookmark
|
||||
|
||||
Reference in New Issue
Block a user