Run the accessibility verification pass
The automated half: AccessibilityAuditTests runs performAccessibilityAudit over all eight surfaces DESIGN/10 names — board with trash hidden and shown, card window in Preview/Edit/raw source, welcome, template chooser, board popover. One audit per test, .all audit types, no issue handler — nothing waived; a future false-positive excusal must match one element on one surface with its reason beside it. Navigation is menu-bar titles and the arrow grammar; no accessibility identifiers added to production code. The suite launches with --ui-test-fixture-board: the sandbox forbids handing the app a temp-folder path (no bookmark behind it), so the flag carries no payload and the app builds a known board inside its own container through the ordinary BoardWriter door — three lanes, six cards, a rich Markdown body with attachment, one card already in .trash/ — with the registry redirected to the same scratch directory so audit runs never pollute real recents. LaunchPlan replaces the restore Bool (welcome / restoreBoards / uiTestFixture, fixture wins outright), decided once in KanbanApp.init and dispatched by RestoreBootstrapView; pure and pinned by UITestLaunchTests, and the fixture itself is materialized and read back through BoardLoader in units — the only proof available headlessly. The manual half: KanbanUITests/AccessibilityVerification.md is the one document — the audit suite at the top (it needs a real display and Accessibility permission), the per-release VoiceOver smoke script with expected utterances quoted from AccessibilityPhrases, and the consolidated m11 checklist from all four implementation cards. 1588 unit tests green, UI target compiles, both schemes build. The audit run and smoke script await a real display — the manual pass is the user's. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -434,7 +434,11 @@ public final class AppModel {
|
||||
/// known board and nothing should pay that on every scene-graph evaluation. An `App`'s `init` is
|
||||
/// not itself reachable from a test, so the decision is pulled out to here: two `Bool`s in, one
|
||||
/// out, provable without a real `UserDefaults` domain or a live registry.
|
||||
public static func shouldRestoreAtLaunch(preference: Bool, hasRestorables: Bool) -> Bool {
|
||||
///
|
||||
/// `nonisolated` because it is exactly as pure as that sentence claims — it touches no stored
|
||||
/// state, and `LaunchPlan.decide` (which is not main-actor-bound either, for the same reason)
|
||||
/// composes it into the three-way launch decision.
|
||||
public nonisolated static func shouldRestoreAtLaunch(preference: Bool, hasRestorables: Bool) -> Bool {
|
||||
preference && hasRestorables
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user