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

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.md AMENDMENT 2 §D decided it, and the reason is that legal.signUpNotice is *"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

surfacewhat it renders todaythe asset that draws it
app/(auth)/sign-up/_components/SignUpCard.tsx:308,313a sentence with two inline links — /legal/terms and /legal/privacydesign/auth/legal-agreement.mock.html, panels 1–3 (cited in that component's own header comment)
app/(authed)/_components/SidebarNav.tsx:495a rail row, Scale icon, label nav.legal, href: '/legal', no active armdesign/shell/
app/(auth)/re-consent/_components/LegalDocumentRow.tsx:60per 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.

  1. 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.md AMENDMENT 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 with pt-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.
  2. 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 /legal is not this application), and reconcile with the existing external-link treatment.
  3. 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.
  4. 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.html already 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 .png at the same basename.
  • Reuse the shipped primitives and the --el-* element tokens plus element-semantic shape tokens; no Tier-0 --color-*, no raw rounded-* / p-*.
  • The rail treatment composes design/shell/'s rail — read that area's design-notes.md before drawing, and if the rail's bottom section is drawn there, amend THAT asset rather than re-specifying the rail inside design/auth/.

Boundary

  • It draws nothing on motir.co. The /legal index 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.html gains the UNCONFIGURED arm for sign-up and for the re-consent document rows, drawn beside their existing panels; legal-agreement.png is 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.html draws 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 a border-t with pt-4) — and design/auth/design-notes.md cites docs/decisions/public-surface-hosts.md AMENDMENT 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's isMotirCloud().
  • 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 flags section 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 — with update_work_item on 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 amended
  • motir-core/design/shell/ — the rail's design area
  • motir-core/app/(auth)/sign-up/_components/SignUpCard.tsx — the sentence and its two links
  • motir-core/app/(authed)/_components/SidebarNav.tsx — the rail row, and its comment on why it takes no active arm
  • motir-core/app/(auth)/re-consent/_components/LegalDocumentRow.tsx · ReconsentCard.tsx — the per-document row
  • motir-core/lib/legal/reconsentGate.tsisMotirCloud(), 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 reference advisories 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.