The prose catches up with the one-version app — tier qualifiers retired, the entitlement comment carried over
The excision's follow-up sweep: present-tense prose that still implied an edition axis now reads
correctly under one version ("in every tier" clauses dropped or turned substrate-shaped, the
announcer's "every free-tier bracket today" is "every bracket today" — nothing passes a phrase),
and forward-looking promises pinned to the mooted pro-m1/pro-m2 milestones now name the thing
itself (the change narrator in Kanban/Changes/, the foreign-change journal successor) or fall to
past tense. Kanban.entitlements' network-client comment sheds its "dormant until Pro ships"
framing for the pivot's own reasoning: the key stays because the sync capability to come needs
it regardless. Untouched on purpose: the storage layer's coerce/tolerate/refuse tiers, the
chooser's bundled/user/keyless tiers, verbatim design-doc quotations, and genuine past-tense
record. One dangling reference repaired en route: EndToEndVerification.md cited the long-renamed
InertGitTests. Comment-only throughout; 2,686 unit tests green, unchanged.
Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
@@ -371,7 +371,7 @@ struct BoardAnnouncerSpeechTests {
|
||||
#expect(BoardAnnouncer.speech(for: facts) == "Pulled 3 commits")
|
||||
}
|
||||
|
||||
/// Every free-tier bracket today. The seam exists; pro-m1 supplies the phrases.
|
||||
/// Every bracket today. The seam exists; nothing in the app supplies a phrase yet.
|
||||
@Test("A bracket with no phrase to say stays silent rather than falling back to the digest")
|
||||
func bracketWithoutAPhrase() {
|
||||
var facts = BoardAnnouncer.ReloadFacts()
|
||||
@@ -733,9 +733,9 @@ struct BoardAnnouncerStoreTests {
|
||||
#expect(log.lines == ["Card 'Fix login' was deleted externally"])
|
||||
}
|
||||
|
||||
/// The seam pro-m1 fills. No free-tier operation passes a phrase today, so this is the one
|
||||
/// place the completion path is exercised end to end — including that the phrase is *consumed*
|
||||
/// rather than left armed for whatever reload comes next.
|
||||
/// The seam a future wholesale operation fills. Nothing in the app passes a phrase today, so
|
||||
/// this is the one place the completion path is exercised end to end — including that the phrase
|
||||
/// is *consumed* rather than left armed for whatever reload comes next.
|
||||
@Test("A bracketed operation announces at completion, once, and never again")
|
||||
func bracketSpeaksOnceAtCompletion() async throws {
|
||||
let fixture = try makeBoard()
|
||||
@@ -755,7 +755,7 @@ struct BoardAnnouncerStoreTests {
|
||||
#expect(log.lines == ["Board changed: 1 card edited"], "the phrase was consumed, not carried forward")
|
||||
}
|
||||
|
||||
@Test("A bracket with no phrase to say stays quiet — every free-tier bracket today")
|
||||
@Test("A bracket with no phrase to say stays quiet — every bracket today")
|
||||
func silentBracket() async throws {
|
||||
let fixture = try makeBoard()
|
||||
defer { fixture.tearDown() }
|
||||
|
||||
@@ -3,7 +3,8 @@ import Testing
|
||||
@testable import Kanban
|
||||
|
||||
/// The snapshot summarizer — 10-accessibility.md ▸ Live board announcements' "one polite digest per
|
||||
/// reload debounce", and (later) pro-m1's commit-message engine, whose counting rules these are too.
|
||||
/// reload debounce", and (later) the change narrator's message engine (`Kanban/Changes/`), whose
|
||||
/// counting rules these are too.
|
||||
///
|
||||
/// Every case here is **two real loads of a real board**, written and mutated on disk the way an
|
||||
/// outside writer mutates one: `BoardDiff` compares what a reload compares, and a suite that
|
||||
|
||||
@@ -21,7 +21,7 @@ import Testing
|
||||
/// **A provider that retires every step on arrival** — the minimal fake `HistoryProviding.backedContent`'s
|
||||
/// own doc names ("a substrate that keeps no steps... and a test fake's"). `register(_:)` runs the
|
||||
/// step's retirement immediately and keeps nothing, which is what makes "purge rides the close flush"
|
||||
/// true over such a substrate with no tier check anywhere in the call path.
|
||||
/// true over such a substrate with no substrate check anywhere in the call path.
|
||||
@MainActor
|
||||
private final class NoBackingHistoryProvider: HistoryProviding {
|
||||
var canUndo = false
|
||||
@@ -843,8 +843,9 @@ struct CardSessionPurgeTests {
|
||||
let window = try makeWindow(fixture)
|
||||
window.comments.reload()
|
||||
// A substrate that keeps no steps drops every registration and retires it on the way past —
|
||||
// which is what makes "purge rides the close flush" true structurally, with no tier check at
|
||||
// any call site. `history` is weak, so the fake is held locally for the assertion's duration.
|
||||
// which is what makes "purge rides the close flush" true structurally, with no substrate
|
||||
// check at any call site. `history` is weak, so the fake is held locally for the assertion's
|
||||
// duration.
|
||||
let noBackingProvider = NoBackingHistoryProvider()
|
||||
window.store.history = noBackingProvider
|
||||
|
||||
|
||||
@@ -796,7 +796,7 @@ struct CommentUndoTests {
|
||||
#expect(store.editComment(ItemID(rawValue: CommentIdent.one), inCard: cardID, body: "revised\n"))
|
||||
store.purgeCommentTrash(inCard: cardID)
|
||||
|
||||
#expect(!history.canUndo, "no byte capture in any tier — 13's rule")
|
||||
#expect(!history.canUndo, "no byte capture on the undo stack, anywhere — 13's rule")
|
||||
// The gate did not make the purge inert: nothing on the stack names this entry, so it goes —
|
||||
// per entry, and still without a step to show for it.
|
||||
#expect(!fixture.exists("\(card)/comments/.trash/\(CommentIdent.two)"))
|
||||
|
||||
@@ -142,7 +142,7 @@ struct DedupeRuleTests {
|
||||
#expect(verdict.duplicates.map(\.path) == ["\(Ident.lane2)/\(Dup.lower)"])
|
||||
}
|
||||
|
||||
/// Rung one — once the git seam, which pro-m1 filled and base never did; nothing fills it now
|
||||
/// Rung one — once the git seam, which only the git provider ever filled; nothing fills it now
|
||||
/// that app-managed git is excised (`strategy/01-git-excision.md`, 2026-08-08), and the ladder
|
||||
/// falls through to birth date on every board.
|
||||
@Test("Git path history beats birth date")
|
||||
|
||||
@@ -522,9 +522,10 @@ struct EchoLedgerStoreTests {
|
||||
/// **The Writer's heal operations drop heal-marked receipts** (06-history-undo.md ▸ Commit messages,
|
||||
/// ruled 2026-07-29: "attribution machinery like the author split, never message tagging").
|
||||
///
|
||||
/// **Inert in base beyond the ledger itself**: nothing here reads the flag and nothing renders it —
|
||||
/// it is what pro-m1's committer will read to split a heal's paths into their own commit, and these
|
||||
/// tests pin the seam it will read from, not a committer that does not exist yet.
|
||||
/// **Inert beyond the ledger itself**: nothing here reads the flag and nothing renders it — it is
|
||||
/// what whatever records history next (the foreign-change journal, `strategy/01-git-excision.md` ▸
|
||||
/// Successors) would read to split a heal's paths out from a user's own, and these tests pin the
|
||||
/// seam it will read from, not a consumer that does not exist yet.
|
||||
@Suite("EchoLedger — heal-marked receipts")
|
||||
struct EchoLedgerHealMarkTests {
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import Testing
|
||||
///
|
||||
/// **EXCISION 2026-08-08** (`strategy/01-git-excision.md`) retired the pivot in turn: app-managed
|
||||
/// git is gone outright. There is no mode detection, no auto-committer, nothing left anywhere under
|
||||
/// `Kanban/` that opens `.git` for writing, on any board, in any tier. What the inert posture claimed
|
||||
/// `Kanban/` that opens `.git` for writing, on any board at all. What the inert posture claimed
|
||||
/// once, and the pivot scoped down to a single tier for a single day, is again the app's whole git
|
||||
/// story — this time app-wide rather than tier-gated, and for good rather than pending a paywall
|
||||
/// decision. This suite is that restored claim's proof.
|
||||
|
||||
Reference in New Issue
Block a user