The tier axis comes out of the git stack — compose unconditional, postures mode-driven
HistoryStore.compose(boardRoot📒) returns non-optional and runs for every session — the nil the gate produced was the only nil it ever had. makeHistoryProvider is a one-axis decision: git-mode boards bind the git provider, everything else native, in every tier; Session.tier stays recorded, dormant. BoardGitSection shrinks to the four mode postures (.absent and .proPointer die, BoardGitNote and the .git probe with them); every board carries all three popover tabs (BoardInfoTab.available retired); the titlebar branch shows on any git-mode board; the settings sheet and card History section stop reading tier. InertGitTests is repurposed as UntouchedGitTests — the file layer still never opens .git, now load-bearing for mode-none boards. The accessibility audit reaches the settings sheet at last: the fixture board hosts it in every tier, so the free-fixture disabled-row test becomes an open-and-audit test. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -11,17 +11,16 @@ import XCTest
|
||||
/// currently displayed UI** rather than a subtree, so each test's job is entirely navigation: get the
|
||||
/// surface on screen, then let the audit look at whatever is there.
|
||||
///
|
||||
/// ### The one surface this suite cannot reach, and why it is not fixable here
|
||||
/// ### The board settings sheet is reachable since the 2026-08-07 pivot
|
||||
///
|
||||
/// The **board settings sheet** is Pro-only (03-board-ui.md ▸ Board settings sheet;
|
||||
/// `BoardSettingsAvailability`), and the fixture launch has no tier control: `AppModel.currentTier`
|
||||
/// reads `ProEntitlement`, which reads StoreKit, and there is deliberately **no launch argument that
|
||||
/// grants Pro**. Adding one would be worse than the gap it closed — `UITestLaunch` is compiled into
|
||||
/// the shipping binary on purpose ("the thing being audited must be the app that ships"), so a
|
||||
/// `--ui-test-pro` flag would be a subscription bypass anyone could type into Terminal. So the sheet's
|
||||
/// own audit is **deferred to the manual VoiceOver pass** (`AccessibilityVerification.md`), and what
|
||||
/// is automated here instead is the posture that *is* reachable: the free tier's, where the row exists
|
||||
/// and is disabled. See `testBoardSettingsRowIsPresentAndDisabledOnTheFreeFixture`.
|
||||
/// The sheet was Pro-only, and this suite could not reach it: the fixture launch had no tier
|
||||
/// control, and a `--ui-test-pro` launch argument was rejected as a subscription bypass anyone could
|
||||
/// type into Terminal (`UITestLaunch` ships in the app binary on purpose). Since the pivot
|
||||
/// (12-editions.md ▸ PIVOT 2026-08-07 — git left the paywall), `BoardSettingsAvailability` asks only
|
||||
/// the board's mode, the fixture board is mode `none`, and the sheet opens for the audit like any
|
||||
/// other surface — the deferral to the manual VoiceOver pass is retired with the gate. The
|
||||
/// no-bypass objection stands as precedent for whatever the next split gates. See
|
||||
/// `testBoardSettingsSheetOpensFromTheMenuAndAudits`.
|
||||
///
|
||||
/// ### No waiving
|
||||
///
|
||||
@@ -203,22 +202,12 @@ final class AccessibilityAuditTests: XCTestCase {
|
||||
|
||||
// MARK: - The board settings sheet
|
||||
|
||||
/// **The reachable half of the settings sheet's audit** — the free tier's, which is the tier the
|
||||
/// fixture launch runs in (see this file's header for why there is no Pro fixture and why adding
|
||||
/// one would be a subscription bypass).
|
||||
///
|
||||
/// What it pins is the design's deliberate asymmetry between the sheet's two doors
|
||||
/// (`BoardSettingsAvailability`): the **menu row stays visible and disabled** where the sheet
|
||||
/// cannot exist — standard menu validation, and 11-command-nexus.md's "a command absent here
|
||||
/// doesn't exist" read in the other direction — while the popover's row is *absent* there instead.
|
||||
/// A row that vanished from the menu on the free tier would be the app hiding its own inventory;
|
||||
/// one that was enabled would present an empty sheet.
|
||||
///
|
||||
/// The audit call is the board's, taken with the Board menu closed again: the sheet is what this
|
||||
/// test cannot open, so auditing the surface that *is* on screen keeps the test honest about what
|
||||
/// it checked.
|
||||
/// **The settings sheet's audit**, reachable since the 2026-08-07 pivot (this file's header):
|
||||
/// the fixture board is mode `none`, `BoardSettingsAvailability` asks only the mode, so the menu
|
||||
/// row opens the sheet — add-git's home (03-board-ui.md ▸ Board settings sheet) — and the audit
|
||||
/// looks at the sheet itself rather than deferring to the manual VoiceOver pass.
|
||||
@MainActor
|
||||
func testBoardSettingsRowIsPresentAndDisabledOnTheFreeFixture() throws {
|
||||
func testBoardSettingsSheetOpensFromTheMenuAndAudits() throws {
|
||||
let app = XCUIApplication.launchedWithFixtureBoard()
|
||||
|
||||
let bar = app.menuBars.firstMatch
|
||||
@@ -232,14 +221,21 @@ final class AccessibilityAuditTests: XCTestCase {
|
||||
let row = bar.menuItems["Board Settings…"]
|
||||
XCTAssertTrue(
|
||||
row.waitForExistence(timeout: XCUIApplication.uiTimeout),
|
||||
"Board ▸ Board Settings… is missing — the row ships whether or not this board can open it"
|
||||
"Board ▸ Board Settings… is missing — the row ships in every mode that can host the sheet"
|
||||
)
|
||||
XCTAssertFalse(
|
||||
XCTAssertTrue(
|
||||
row.isEnabled,
|
||||
"the free tier has no board settings sheet, so the row must be disabled rather than open an empty one"
|
||||
"a mode-none board hosts the sheet (add-git's home) — the pivot retired the tier gate that disabled this row"
|
||||
)
|
||||
app.typeKey(.escape, modifierFlags: [])
|
||||
row.click()
|
||||
|
||||
let sheet = app.sheets.firstMatch
|
||||
XCTAssertTrue(
|
||||
sheet.waitForExistence(timeout: XCUIApplication.uiTimeout),
|
||||
"the Board Settings sheet did not present from its menu row"
|
||||
)
|
||||
try app.performAccessibilityAudit()
|
||||
|
||||
app.typeKey(.escape, modifierFlags: [])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user