Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-2496Done

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:linesurface
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.ts can see: a control whose disabled is an EXPRESSION no longer takes the 1.4.3 exemption, and a placeholder:-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.ts is GREEN on a fresh checkout of main with 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:400 is in packages/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 prettier and next build pass.

Context refs

  • tests/theme/inkContrastLint.test.ts — the repo-wide guard that is red.
  • tests/theme/inkContrastScan.tsowningElement / isDisabledElement / rendersText, widened by MOTIR-2489.
  • main run 31304252390 — the red Vitest (1/3) job.
  • The five files above.