(motir-core) design/shell's rail assets draw 2 of the 6 rows the shipped bottom nav renders — Git, Legal, Job runs and Security are absent at all three widths
⚠️ AMENDED ON THE RECORD 2026-09-02 by
motir run MOTIR-4130, which halted at guard #4 without writing to disk. Three things changed: the shipped-row enumeration was falsified and re-measured (three rows → six), theSettingsclause was inverted and is withdrawn, and the toolchain question is answered. The card is Blocked on MOTIR-3909 — an edge its own dispositions section denied. The as-authored text is quoted verbatim in MOTIR-4163; this body is the corrected one. Sizing re-run against the true scope: 3 pts / 45 min → 5 pts / 70 min.
Found by motir run MOTIR-3909 while drawing MOTIR-4006's unconfigured rail arm (2026-09-01).
The measurement — RE-MEASURED 2026-09-02 at origin/main cd236496d, and identical at the card's own base 5fb216b21
Command: git show <ref>:'app/(authed)/_components/SidebarNav.tsx', reading the sections.push({ id: 'bottom' … }) block in declaration order. The rail's default (project) surface is two sections — primary and bottom; this card is about bottom.
| # | row | icon | href | rendered |
|---|---|---|---|---|
| 1 | Settings | Settings | project settings, else the settings home | conditional — showSettingsDoor |
| 2 | Security | ShieldCheck | /settings/workspace/security | conditional — workspaceTierRevealed |
| 3 | Job runs | ListChecks | /settings/workspace/jobs | always |
| 4 | Git | GitBranch | /settings/workspace/github | always |
| 5 | Docs | BookOpen | /docs | always |
| 6 | Legal | Scale | /legal | always — changing, see below |
⚠️ The original table claimed THREE rows (Git · Docs · Legal). That was a correct count of the wrong set — an inventory of rows whose provenance the author had in hand, not a reading of the section. All six were present at 5fb216b21, so this is not drift: the enumeration was wrong when written. Filed as MOTIR-4163.
⚠️ The Settings clause was INVERTED and is WITHDRAWN. The original read "a Settings row is drawn that the shipped bottom section does not carry in that position". Settings is the first entry of the shipped bottom section — so the assets drawing it are correct about that row, and the open question the card posed (whether a Settings row belongs in that section at all) has a settled answer: yes, first. Do not delete it.
What design/shell/ actually draws — re-counted 2026-09-02 over the .pen sources
Command: parse each .pen as JSON, walk to the Nav Section Bottom frame (Drawer Nav Bottom in the drawer), and list its children.
| asset | bottom-section rows drawn | Settings | Security | Job runs | Git | Docs | Legal |
|---|---|---|---|---|---|---|---|
desktop.pen | 2 — Nav Item Settings, Nav Item Docs | ✅ | 0 | 0 | 0 | ✅ | 0 |
desktop-collapsed.pen | 2 icon-only — settings, book-open | ✅ | 0 | 0 | 0 | ✅ | 0 |
mobile-drawer.pen | 2 — Nav Settings, Nav Docs | ✅ | 0 | 0 | 0 | ✅ | 0 |
So the gap is FOUR undrawn rows, not two — Security, Job runs, Git, Legal — consistently at all three widths. Neither conditional row (Settings, Security) has its absent arm drawn anywhere either.
⚠️ BLOCKED — the Legal row is being changed by an OPEN pull request
MOTIR-3909 is in_review on open PR moooon-B-V/motir-core#2513, which edits SidebarNav.tsx and makes row 6 conditional:
- { icon: <Scale />, label: t('nav.legal'), href: '/legal' },
+ ...(legalIndexUrl
+ ? [{ icon: <Scale />, label: t('nav.legal'), href: legalIndexUrl }]
+ : []),
There is no correct arm available before that merges, which is why this is an edge and not a caveat:
- draw the row unconditional at
/legal⇒ the asset is stale within days — this card's own defect, reproduced on day one; - draw both arms ⇒ building against an unmerged branch, which the run rules forbid;
- omit it ⇒ fails the criterion this card is named after.
Resume condition: MOTIR-3909 done. Then the Legal row is drawn in two arms (configured → the manifest URL; unconfigured → absent), and this card supersedes design/auth/legal-agreement.mock.html panel 14 as the source for them, exactly as the Boundary always intended.
The toolchain question — ✅ ANSWERED 2026-09-02: the .pen route is CLOSED, use *.mock.html
Evidence, at cd236496d: no .pen renderer or exporter exists anywhere in the repository. The only files naming .pen are guards (tests/design-three-file-set.test.ts, tests/design-asset-addresses.test.ts), CLAUDE.md, and scripts/plan-seed/ data — none of which render. package.json has no Pencil dependency and no design-export script. The one renderer present is scripts/render-design-mock.mjs, which renders *.mock.html → .png. This matches design/auth/design-notes.md's divergence-ledger row 1 independently.
So the fix shape is settled before the work starts: port the rail's bottom section to a *.mock.html under design/shell/, built from the real shipped components/ui/Sidebar.tsx primitive, rendered to a same-basename .png. Do not edit the three .pen sources — their .pngs cannot be regenerated, and a source edit nobody can render is a second divergence.
Boundary
- It does not redesign the rail. The rows exist and ship; this is about the asset agreeing with them.
- It does not touch
design/auth/legal-agreement.mock.html. MOTIR-4006's panel 14 stands until this card lands. The ONEdesign/auth/edit in scope is the planning flag (AC 6). - It does not change any shipped component. No
.tsxis edited. - It does not delete the
Settingsrow from the assets — see the withdrawn clause above.
Acceptance criteria
- The six-row table above is re-confirmed at this card's own base (which will be after MOTIR-3909 merges, so the
Legalrow's two arms are then part of the measurement) and the command quoted in the PR body. - Every row the shipped bottom section renders is drawn by whichever
design/shell/asset owns that section, at all three widths (desktop, collapsed, mobile drawer) — six rows, with the two conditional rows (Settings,Security) and the now-conditionalLegalrow drawn in both arms, present and absent. - The toolchain answer above is restated in one line in the PR body with its evidence. (Settled 2026-09-02; the builder confirms it still holds rather than re-deriving it.)
design/shell/design-notes.mdrecords which source wins for the rail's bottom section — the new*.mock.htmlover the three.pens — in the formdesign/auth/design-notes.md's divergence ledger already uses.- No
.penis edited; the PR body states that its.pngcould not be regenerated and that the*.mock.htmlsupersedes it for this element. design/auth/design-notes.md's planning flag 1 is updated to point at the outcome — including that its "two rows short" count was four.- The new
*.mock.htmlhas a same-basename.png(the three-file-set guard). vitest --config vitest.design.config.tsis green.
Context refs
motir-core/app/(authed)/_components/SidebarNav.tsx— theid: 'bottom'section and its six rowsmotir-core/components/ui/Sidebar.tsx— the row primitive the mock must compose frommotir-core/design/shell/desktop.pen·desktop-collapsed.pen·mobile-drawer.pen— the stale, un-re-exportable sourcesmotir-core/scripts/render-design-mock.mjs— the only renderer in the tree; it takes*.mock.htmlmotir-core/design/auth/design-notes.md— the divergence ledger, planning flag 1, and the.mock.htmlroute the siblings took- MOTIR-3909 —
blocked_by; PR #2513 changes theLegalrow - MOTIR-4006 — the card that found it;
relates_to - MOTIR-4163 — the planning bug this amendment came from
Advisory dispositions — ⚠️ CORRECTED 2026-09-02
MOTIR-3909— ablocked_byIS owed, and is now wired. The original text denied it: "This card reads nothing either produces … both of which exist onorigin/maintoday." That applied the right test in the wrong tense — what exists onorigin/maintoday is precisely the row PR #2513 retires. See the BLOCKED section.MOTIR-4006— no edge owed, and this survives the correction. It isdoneand merged (PR #2504); its panel 14 is the interim source this card supersedes, so the ordering does run the other way.relates_tocarries the trace.subsumption/likely-already-shippedondesign/auth/legal-agreement.mock.html(PR #2504, merged) — read and not acted on. That path is excluded by the Boundary; this card's onlydesign/auth/edit is the planning flag indesign-notes.md, a different file.