The a11y sweeps load 9 routes and load them EMPTY — 108 of 134 files carrying a measured contrast defect sit on routes axe never visits
Filed by MOTIR-2481 rather than left in its body — a finding recorded in a bug report is not in the plan. Surfaced while measuring MOTIR-2459: the question "why are the a11y sweeps green if there are 262 contrast defects on main?" has an answer, and the answer is about the sweeps.
Repo: motir-core. One PR.
The measurement
tests/e2e/shell-a11y*.spec.ts runs axe with color-contrast enabled and zero rule exclusions — the sweeps are strict, and they are green. Crossing the 134 files carrying a measured --el-text-faint / --el-text-muted defect against the routes those specs actually goto:
- 108 of 134 sit on routes the sweeps never load. Whole areas are unswept:
app/(public)(the docs catalogue,/explore, the public project pages at/p/[identifier]),(onboarding),/backlog,/triage,/settings/account,/settings/organization,/code-health,/filters,/plans,/ready, andcomponents/planning. - The remaining 26 sit on a swept route and still pass, because
SHELL_ROUTESsweeps a fresh user with an empty project. The/itemsempty-state sweep waits for "No work items yet"; the faint ink lives on a populated row's timestamp, a "Showing N of M" tail, a menu section label — DOM the sweep never renders.
So both arms of the sweep are narrower than they read: a route list that covers a fraction of the product, and fixtures that keep the covered routes in their emptiest state.
Scope
In: widening the swept route set to the areas above, and giving the covered routes a populated fixture where the empty state is what is currently being measured.
Out: fixing the contrast defects themselves — that is MOTIR-2475 and MOTIR-2477, and this card is blocked_by them so it does not open against a tree that is still red. Also out: the public marketing surfaces outside this repo.
Acceptance criteria
- The
@a11ysweep visits the currently-unswept authed areas —/backlog,/triage,/settings/account,/settings/organization— and the public routes/explore,/docsand a/p/[identifier]project page, each with the sameWCAG_TAGSand the same zero rule exclusions the existing sweeps use. - At least one sweep loads a populated project rather than a fresh one, so row timestamps, "showing N of M" tails and menu section labels are in the DOM when axe runs — the shape that made 26 files pass while carrying defects.
- Where a route genuinely cannot be swept (an unreachable state, a third-party subtree), the spec says so in a comment naming what is not covered, in the mould of the existing
.exclude('.ProseMirror')justifications — never a silent omission. - The new sweeps are added to the existing E2E shard layout without pushing the a11y leg past the other shards' wall clock; if they do, the shard split is rebalanced in the same PR.
- Every route added is green at merge, with any defect it surfaces that is NOT a
--el-text-*contrast failure logged as its own bug rather than absorbed here.
Context refs
tests/e2e/shell-a11y.spec.ts—SHELL_ROUTES, the nine-route list and its empty-project fixture.tests/e2e/shell-a11y-detail.spec.ts— the populated/itemssweeps, the pattern to follow for a populated fixture.tests/e2e/shell-a11y-tokens.spec.ts— the specimen sweeps.- MOTIR-2481 — the planning bug that filed this.