MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-24

1.1.10 Card-wrapped auth layout + Vercel preview-cleanup workflow

Done
Description

Estimate: 25m · Depends on: 1.1.5, 1.1.6, 1.1.7

Mid-stream Subtask added between 1.1.7 and 1.1.8 as a precondition for the starter snapshots. Two unrelated-but-paired concerns landed in one Subtask:

Card-wrapped auth layout. The Story-1.1.1 mockup was Clay-style (no card chrome, wordmark top-left). User asked mid-validation to flip to a more modern card-wrapped layout — a white card with soft shadow, centered on a tinted page background — and to remove the placeholder “Motir” wordmark entirely. The wordmark removal is the deeper decision: in a real Motir-planned project, the brand mark is a late-Epic-4 Subtask (agent or human task) scheduled when the product has enough surface for the brand decision to be informed. Shipping UI Subtasks without placeholder branding avoids a filler element becoming load-bearing across every screen. Captured as a current-state principle in MOTIR.md.

Vercel preview-cleanup workflow. notes.html mistake #25 ("Vercel-Neon Marketplace integration auto-provisions Neon branches per preview but doesn't auto-tear them down") had been tracked as unresolved operational debt with a "wait until cadence justifies" deferral. The 1.1.8 + 1.1.9 starter snapshots multiply branch pressure (each new preview deploy gets its own Neon branch), so cleanup became precondition rather than nice-to-have. A .github/workflows/cleanup-preview-deployments.yml workflow now listens for pull_request: closed and deletes every Vercel preview deployment for the closing PR's head ref; the Vercel-Managed Neon integration cascades the branch deletion automatically. Implementation detail worth flagging: initial instinct was to delete the Neon branch directly via the Neon API, but the docs check revealed that under the Vercel-Managed integration, Neon-branch cleanup is bound to Vercel deployment lifecycle (not Git ref lifecycle), so the right primitive is to delete the Vercel deployment. The workflow self-validated on its own first PR merge — when 1.1.10 merged, the just-active workflow caught its own closure event and deleted PR #20's preview.

Why bundled into one Subtask: both changes were small enough (single-file edit + new workflow file) that splitting them would have meant two PRs with ~30 min of round-trip overhead each. The card change was the trigger; the cleanup workflow was the user's gated precondition before dispatching 1.1.8 + 1.1.9 ("we need the neon branch clean on PR merge too in the pipeline before doing 1.1.8 and 1.1.9, add this in the current PR"). Both shipped in PR #20 with two focused commits.

Execution mode: first Subtask where the planner executed directly rather than dispatching a coding agent. Justification: the scope was small (one layout file + one workflow file + two doc updates), the decisions were settled, and the agent-dispatch overhead (worktree creation, prompt-writing, env setup) outweighed the implementation cost. Calibration point for future small UI / infra Subtasks.

Acceptance criteria

  • app/(auth)/layout.tsx renders the auth pages inside a white card with soft shadow, centered on a tinted page background. No placeholder wordmark anywhere in the layout.
  • Card uses existing design tokens (--radius-card, --shadow-elevated, --color-surface) — no new tokens added.
  • All four auth pages (sign-in, sign-up, reset-password, reset-password/new) render correctly inside the new wrapper without any per-page changes (the AuthShell component's internal vertical rhythm composes cleanly inside the card).
  • .github/workflows/cleanup-preview-deployments.yml fires on pull_request: closed, enumerates Vercel preview deployments by branch ref, and DELETEs each via the Vercel API. The Vercel-Managed Neon integration cascades the Neon-branch deletion.
  • Workflow uses secrets.VERCEL_TOKEN (Vercel Access Token, team-scoped) and hardcoded project/org IDs for motir-core. For the starters (1.1.8 + 1.1.9), the same workflow is parameterized with GitHub repo vars instead of hardcoded IDs so each user wires their own.
  • MOTIR.md's "Current state" entry for the preview-branch debt flips from UNRESOLVED to RESOLVED with a forward reference to this Subtask + the workflow file.
  • notes.html mistake #25 gets a Resolution prompt-hint appended with the workflow reference + the "verify the fix's mechanism before shipping it" recursive-corrective learning.
  • pnpm typecheck, pnpm lint, pnpm test (39/39 Vitest), pnpm test:e2e (2/2 Playwright) all green.

Context refs

  • app/(auth)/layout.tsx — current Clay-style layout from 1.1.5
  • app/globals.css — existing radius/shadow/surface tokens to compose
  • notes.html mistake #25 — the lesson body's three documented cleanup options (GitHub Action, Neon expires_at, manual)
  • Neon docs on Vercel-Managed branch lifecycle: https://neon.com/docs/guides/vercel-branch-cleanup
  • Vercel API: v6/deployments (list) and v13/deployments/{id} (delete)
Status
Done
Type
Sub-task