Design amendment — the UNCONFIGURED arm of every motir-core surface that shows a legal link: sign-up, the rail row, the re-consent document rows
Type: design · Executor: coding_agent · Repo: motir-core · ONE PR. An AMENDMENT to the existing three-file set at design/auth/ — legal-agreement.mock.html + legal-agreement.png + the design-notes.md entry — plus whatever design/shell/ owes for the rail row.
Once the legal documents live somewhere else, motir-core gains a state it has never had: no legal links at all. Three shipped surfaces render one today, and the asset that draws them draws only the arm where they exist.
⚠️ AMENDED 2026-09-01 by MOTIR-4004 — the SIGN-UP NOTICE IS ABSENT WHEN UNCONFIGURED, not re-flowed.
docs/decisions/public-surface-hosts.mdAMENDMENT 2 §D decided it, and the reason is thatlegal.signUpNoticeis *"By creating a Motir account you agree to our<terms>Terms of Service</terms>and<privacy>Privacy Policy</privacy>."* — a sentence entirely ABOUT two documents. Unlinking it does not weaken the notice, it makes it FALSE: an assertion that the reader agreed to documents nobody published. A self-hoster has no Terms of Service, and the honest sign-up form is one that does not claim otherwise. **The whole<p>does not render.** **This REMOVES work rather than adding it**: no new copy string, nozhtwin, no parity risk.legal.signUpNotice` survives unchanged for the CONFIGURED case.
The three surfaces, read on origin/main e76d1afdd
| surface | what it renders today | the asset that draws it |
|---|---|---|
app/(auth)/sign-up/_components/SignUpCard.tsx:308,313 | a sentence with two inline links — /legal/terms and /legal/privacy | design/auth/legal-agreement.mock.html, panels 1–3 (cited in that component's own header comment) |
app/(authed)/_components/SidebarNav.tsx:495 | a rail row, Scale icon, label nav.legal, href: '/legal', no active arm | design/shell/ |
app/(auth)/re-consent/_components/LegalDocumentRow.tsx:60 | per outstanding document, a row linking /legal/${slug} | design/auth/legal-agreement.mock.html, panels 5–7 (cited in ReconsentCard.tsx's header) |
What this amendment DRAWS — the second arm of each
Per plan-rules/phase-deepen.md's state-set limb: the enum is the checklist. The enum here is binary — the operator has configured legal documents, or has not — and the second value is what a self-hosted build shows on day one, which makes it the COMMON case for the open product rather than an edge.
- Sign-up, unconfigured — the sentence is ABSENT. ⚠️ AMENDED 2026-09-01: this is no longer the designer's choice. MOTIR-4004 decided it in
docs/decisions/public-surface-hosts.mdAMENDMENT 2 §D: the whole legal<p>does not render. Draw sign-up without it, and show what the card's spacing and rhythm do when that paragraph and its top border are gone — the notice sits under a border-top withpt-4, so its removal is a visible change to the card's foot, not a no-op. The notes record the decision and its reason (a sentence entirely about two documents becomes FALSE, not merely weaker, when the documents do not exist) and cite the record. - Sign-up, configured but pointing OFF-HOST. Today the links are same-origin; after this story they are absolute URLs on whatever host the operator configured. Draw whether they read as leaving (
motir.co's own/legalis not this application), and reconcile with the existing external-link treatment. - The rail, unconfigured. The row is absent. Draw the bottom rail section without it — that section already carries the non-product doors, so removing one row changes its rhythm, and the notes state what happens if it empties.
- The re-consent rows, unconfigured. Draw the degraded row. Note that this arm is REACHABLE only on a cloud build (
reconsentGate.isMotirCloud()), so it should be drawn as the misconfiguration state it is — a cloud deployment whose manifest is missing — not as a normal self-host state.
Composition, not redrawing
- AMEND the shipped asset in place.
legal-agreement.mock.htmlalready draws the sign-up notice and the re-consent screen; add the second arm beside each existing panel, keep the panel index numbering stable, and re-export the.pngat the same basename. - Reuse the shipped primitives and the
--el-*element tokens plus element-semantic shape tokens; no Tier-0--color-*, no rawrounded-*/p-*. - The rail treatment composes
design/shell/'s rail — read that area'sdesign-notes.mdbefore drawing, and if the rail's bottom section is drawn there, amend THAT asset rather than re-specifying the rail insidedesign/auth/.
Boundary
- It draws nothing on
motir.co. The/legalindex and document pages are the motir-marketing design card's. - It does not change the re-consent FLOW. The interstitial's sequence, its single Agree-and-continue button and the deferral screen are unchanged; only the per-document row's link arm moves.
- It writes no code. Every criterion below resolves inside
design/; the surfaces are built by the link-surfaces card.
Acceptance criteria
design/auth/legal-agreement.mock.htmlgains the UNCONFIGURED arm for sign-up and for the re-consent document rows, drawn beside their existing panels;legal-agreement.pngis re-exported at the same basename;design/auth/design-notes.md's panel index names the new panels.- The rail row's absent arm is drawn in whichever asset owns the rail's bottom section —
design/shell/if it draws it,design/auth/otherwise — and the notes say which and why. design/auth/legal-agreement.mock.htmldraws the sign-up card's unconfigured form with the legal paragraph ABSENT — including what its removal does to the card's foot (it sits under aborder-twithpt-4) — anddesign/auth/design-notes.mdcitesdocs/decisions/public-surface-hosts.mdAMENDMENT 2 §D for why omission rather than re-flow.drawn as finished copy … the decision between omitting the sentence and re-flowing it(⚠️ AMENDED 2026-09-01: the decision is made, and it is omission).- The off-host configured arm is drawn, with the treatment for a link that leaves this application reconciled against the shipped external-link treatment.
- The re-consent unconfigured arm is labelled in the notes as a cloud misconfiguration state, citing
lib/legal/reconsentGate.ts'sisMotirCloud(). - Measured at 1280 and 390 CSS px, with the fold stated; AA contrast holds in both themes for anything the amendment introduces.
- The notes'
## ⚠️ Planning flagssection names anything found that no card owns, with a key for each. - The GIVES / TAKES sweep is run and recorded over every
MOTIR-<n>the amended asset names — element, structure or premise — withupdate_work_itemon every TAKES in the same pass, bounded by this story's subtree rather than by the asset's own key list.
Context refs
motir-core/design/auth/legal-agreement.mock.html·legal-agreement.png·design/auth/design-notes.md— the asset being amendedmotir-core/design/shell/— the rail's design areamotir-core/app/(auth)/sign-up/_components/SignUpCard.tsx— the sentence and its two linksmotir-core/app/(authed)/_components/SidebarNav.tsx— the rail row, and its comment on why it takes noactivearmmotir-core/app/(auth)/re-consent/_components/LegalDocumentRow.tsx·ReconsentCard.tsx— the per-document rowmotir-core/lib/legal/reconsentGate.ts—isMotirCloud(), which makes the re-consent arm cloud-only- the decision card — settles that unconfigured means no link;
blocked_by - the link-surfaces card — this asset's consumer
Advisory dispositions
- The remaining
referenceadvisories name cards this one's Boundary excludes. A boundary exists to say a deliverable is somebody else's, and naming the owner is what makes the exclusion checkable — so the reference is deliberate and no edge is owed.