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-3931Done

The `/design` asset draws muted captions on `--el-surface-soft` — 4.34:1, under AA in the default palette, and its own AA sweep never measured the pair

Found while building MOTIR-1043 (motir.co/design), against the asset that card builds to.

The defect

design/marketing/design-showcase.mock.html draws the axis rail as a --el-surface-soft band with the axis help lines set at 12px in --el-text-muted (.axis-hd .help { font-size: 12px; color: var(--el-text-muted) }, and .rail-head .lead likewise). The shipped AxisField does the same thing — text-xs text-(--el-text-muted) for help, and AxisNote for the registry line under each axis.

That pairing is under AA, and theme.css says so in its own words, at the token's declaration:

"⚠️ AA-SAFE ONLY ON THE WHITE PAGE/CARD, and by 0.04 (4.54:1). On --el-surface it is 4.17, on --el-muted 4.12, on --el-surface-soft 4.34 — all under AA. A muted caption belongs inside a card, never on a panel. (MOTIR-2455; light theme is the binding one — every ink clears AA on dark.)"

Re-measured independently over all ten palettes in both themes (tests/aaMatrix.test.ts, shipped by MOTIR-1043), the light theme of the default motir palette is the binding cell:

inkon --el-surface-softon --el-card / --el-page-bg
--el-text-muted4.344.54 ✓
--el-text-eyebrow4.344.54 ✓
--el-text-helper4.344.54 ✓

12px is not WCAG large text, so 1.4.3 asks 4.5:1.

Why the asset missed it, which is the part worth keeping

The asset's AA work was thorough and its harness has a control that reproduces to the digit. Its PAIRS list is five entries — four --el-accent-on-surface pairs and one --el-danger-on-surface pair — because the question it was answering was MOTIR-3872's accent-ink question. The pair it actually DRAWS on its own rail was never in the list, and a sweep that returns 0/10 on the pairs it measures reads as a clean bill of health for the surface.

This is the same shape as MOTIR-3874 one token over: an asset that reasons from a measured set, where the set was chosen by the question that prompted the measurement rather than by the elements the asset draws.

What MOTIR-1043 did, and why this is still owed

It put the axis stack inside a Card--el-card resolves to the same --color-background as the page, so all three inks return to 4.54:1 — and kept the --el-surface-soft band the layout is built on. The page ships AA-clean; the ASSET still draws the failing arrangement, so the next reader of design-showcase.mock.html builds the defect back.

Acceptance criteria

  • design/marketing/design-showcase.mock.html draws the axis rows on the page/card surface rather than directly on the --el-surface-soft band, matching what /design ships.
  • design/marketing/design-notes.md § motir.co/design records the pair, its number and the rule (a muted caption belongs inside a card, never on a panel), and its How this asset was measured section's PAIRS list gains --el-text-muted / --el-text-eyebrow / --el-text-helper against every surface the asset paints them on.
  • The re-exported design-showcase.png shows the corrected rail.
  • pnpm vitest --config vitest.design.config.ts — if that lane exists in this repository — plus pnpm lint, format:check, typecheck, build, test.

Boundary

This is an ASSET fix, not a token fix. --el-text-muted's values are motir-core's and are deliberate (MOTIR-2455 chose them and documented the constraint); nothing here asks for a republish. Whether AxisField should refuse to render a muted caption outside a card — i.e. whether the PACKAGE owes a guard — is a separate question for motir-core and is not claimed by this card.

Advisory dispositions

validate_work_item returned three at create time. All three are disposed of here, and the edge one is WIRED rather than noted.

  • shape · likely-self-blocking-design (design criterion 1, surface criterion 3) — DOES NOT APPLY. The detector fires on a childless card that is its own design blocker: one criterion produces a design and a later one builds a surface against it. This card is type: design and every criterion is part of the SAME three-file asset — the mock, its note section, its PNG export. There is no build criterion downstream of the design, so there is nothing to cut and nothing to split out.
  • subsumption · likely-in-flighttests/aaMatrix.test.ts on moooon-B-V/motir-marketing#15 — APPLIES, and it is why the edge below exists. That file is this card's EVIDENCE, not its deliverable: this card edits design/marketing/** and touches no test. But the pull request it sits on is MOTIR-1043's, and criterion 1 reads "matching what /design ships" — which is post-merge state.
  • reference · advisory — names MOTIR-1043 at in_review — APPLIES, same finding. Both are discharged by ONE blocked_by edge to MOTIR-1043, wired at filing, with this card moved into MOTIR-656 alongside it so the edge is intra-container rather than cross-parent (gate 7). It is blocked rather than todo accordingly.