main IS RED — MOTIR-2489 and MOTIR-2477 merged 37 seconds apart, each green on its own base, and their composition reports five muted sites neither PR had to fix
main is red right now, and a red main red-lights EVERY open PR — PR CI checks the branch out MERGED with main, so every other card's Vitest lane inherits this. Surfaced while running MOTIR-2482, whose branch is off cb971f7b and whose diff touches none of the five files below.
Repo: motir-core. One PR.
The evidence
main run 31304252390 (2026-08-09T08:44:56Z): Vitest (2/3) success, Vitest (3/3) success, Vitest (1/3) FAILURE:
FAIL tests/theme/inkContrastLint.test.ts
> ink-contrast lint — --el-text-muted carries no text over a TINTED surface
> leaves no muted violation the scanner can resolve a surface for
Reproduced locally on a clean checkout of cb971f7b — five sites:
| file:line | surface |
|---|---|
app/(authed)/backlog/_components/CreateIssueRow.tsx:119 | --el-surface-soft |
app/(authed)/settings/project/automation/_components/AutomationRuleAuditLog.tsx:323 | --el-muted |
components/onboarding/DiscoveryChatRail.tsx:175 | --el-surface |
components/planning/PlanChangeComposer.tsx:328 | --el-surface |
packages/design-system/src/components/ui/MultiSelectPicker.tsx:400 | --el-surface-soft |
Each reports --el-text-muted is 4.12–4.34:1 on <surface>; it clears AA only on the white page/card.
The cause — a composition, not a regression in either PR
Two PRs merged 37 seconds apart, and each was green against the base it was tested on:
- MOTIR-2489 (merged 08:44:16) WIDENED what
tests/theme/inkContrastScan.tscan see: a control whosedisabledis an EXPRESSION no longer takes the 1.4.3 exemption, and aplaceholder:-prefixed class is now judged as text on every element. - MOTIR-2477 (merged 08:44:53) turned ON the guard's muted arm and swept every site the pre-widening scanner reported.
Neither is wrong. 2477 fixed exactly the set its base could see; 2489 widened the lens on a base where the muted arm was not yet armed. Composed on main, the widened lens plus the armed arm report five sites that were invisible to both — and every one of them is a disabled={<expression>} control or a placeholder: class, i.e. precisely 2489's shapes #2 and #3.
This is notes.html #203 all over again — "Two green PRs, red main — one added a required field, the other added a construction site for it, and they merged sixty seconds apart." Same shape, same minute-scale window, a different pair of PRs.
Scope
In: moving the ink at the five sites so the guard is green on main, under the SAME no-allowlist rule 2475 and 2477 held to — a site is fixed, never exempted.
Out: changing the scanner. 2489's widening is correct and is what caught these; narrowing it to make the lane green would delete the finding rather than fix it.
Acceptance criteria
pnpm vitest run tests/theme/inkContrastLint.test.tsis GREEN on a fresh checkout ofmainwith this PR merged, with no entry added to any allowlist or exemption list.- Each of the five sites moves to an ink that clears AA on the surface it actually sits on —
--el-text-secondary(6.18–6.51:1 on all three greys) unless the site has a reason to differ, stated in a comment. MultiSelectPicker.tsx:400is inpackages/design-system, so its fix ships in the shared package and the package's own tests stay green.- The PR body states the verdict census before and after, so the delta is legible — the same evidence 2489 and 2477 each carried.
pnpm lint,pnpm typecheck,pnpm prettierandnext buildpass.
Context refs
tests/theme/inkContrastLint.test.ts— the repo-wide guard that is red.tests/theme/inkContrastScan.ts—owningElement/isDisabledElement/rendersText, widened by MOTIR-2489.mainrun 31304252390 — the redVitest (1/3)job.- The five files above.