Planning bug: "the ONLY viewport-sized declaration outside the shell" was a grep for the CSS token — Tailwind's `min-h-screen` compiles to the same `100vh` and five more surfaces carried it
Type · planning defect (an unverified totalising quantifier) · Found in · motir run MOTIR-3208, 2026-08-20.
About · MOTIR-3208. The correction is already applied on that card's branch — this is the record, not work.
The claim, and why it read as verified
MOTIR-3208's Root cause / fix says of app/globals.css:27:
This is the only viewport-sized declaration outside the shell, and it is in the wrong unit.
Everything around that sentence is exemplary and was re-checked here against origin/main 8599acf8: the shell really is h-dvh overflow-hidden with <main> the sole scroller, the body floor really is min-height: 100vh, and the report's two measured colours resolve exactly (#FFFFFF = --el-page-bg, #EEF2F8 = --color-surface under [data-palette='cobalt'], painted onto the body canvas by [data-style='neumorphism'] body).
What the claim missed
git grep -n '100vh' app components packages/design-system returns one hit, so the sentence is TRUE of the string it was searched for. It is FALSE of the declaration: Tailwind compiles min-h-screen to min-height: 100vh, and five surfaces outside the shell carried it —
app/(auth)/layout.tsx:62app/(public)/docs/layout.tsx:69app/(public)/explore/layout.tsx:20app/(onboarding)/onboarding/direction/[tier]/page.tsx:52app/_components/ConnectAiGate.tsx:22
A run following the card literally fixes one line and leaves five pages producing the same empty band, on the same class of browser, for the same reason.
The second half — the guard would have been born lying
The card's acceptance criterion 2 asks that "every viewport-sized length on the shell path is dvh". A guard written to that sentence goes red on those five files the day it is written, so it ships with an exemption list naming them — a standing carve-out for the very defect the card exists to remove. The card's own criterion is what makes the undercount structural rather than cosmetic.
Not a repeat of notes.html #292 — a second axis of the same shape
#292's counted enumeration missed two files because its grep was scoped to the wrong directory (app/ only). This one was scoped to the wrong vocabulary: every directory was searched, and the search term could not see the declaration written in the framework's alias for it. A toolchain that ALIASES a value gives every declaration two spellings, and only one is greppable as itself — Tailwind's screen / full / dvh scale, a CSS custom property, a design token, a named constant.
A third finding, on the same card, worth keeping separately
Criterion 1 asks for a Playwright spec that "FAILS on origin/main". Chromium resolves 100vh === 100dvh, headless and headed, so the natural geometry assertion is permanently green on the broken source — #292's named test home limb arriving as a named BROWSER rather than a named lane. The shipped spec had to emulate a divergent browser by rewriting the served stylesheet (100vh → calc(100dvh + 290px)) before the assertion could discriminate at all.
Correction applied (on MOTIR-3208's branch)
- All five
min-h-screenswept tomin-h-dvh, so the guard starts with no exemption list. tests/theme/shellViewportUnits.test.tsenforces theh-screenfamily at zero — the alias, not the token — plus the document floor in both stylesheets.tests/e2e/shell-viewport-floor.spec.tsemulates the divergent viewport, and is verified failing againstorigin/main's source and passing with the fix.
Acceptance criteria
- Recorded as a lesson in
motir-meta/notes.html(entry #340), which is where the durable form of this lives. - Closes when MOTIR-3208's pull request has merged, since the evidence above cites files that exist only on its branch until then.
Context refs
- MOTIR-3208 — the card, and the branch carrying the correction.
notes.html#292 (the wrong-directory grep) and the a number is the most dangerous thing a card can contain entry — the two this sharpens.