← Back ← Back
# Plan: Mobile-friendly SPA (a439)

**Goal**: Make the Mavis HQ SPA actually work on iPhone 13. Per a438 amendment, this is split out of a438 v2 so the link-shape design can be decided in parallel without blocking the mobile fix.

**Why split**: a438 v2 (reports + agenda + checklist) is a logic change. a439 (mobile media queries) is a CSS/layout change. They can ship independently. The `relations` block on a438 will say `parallel: a439`.

**Constraint from G (2026-08-03 09:55 BST)**: "split but needs more thinking how do we link related plans" — handled in the `relations` sub-shape on a438 (and this plan mirrors the same shape).

---

## Step 1: Apply Q1/Q3/Q4 decisions to a438 v2 (already in plan, just amend meta)

- Q1: 2 new tabs (Reports + Agenda)
- Q3: yes backfill 9 existing prompts
- Q4: split — a438 keeps reports/agenda/checklist, a439 owns mobile

## Step 2: Add `relations` sub-shape to a438 + this plan

Locked shape:

"relations": [
  {"kind": "parallel", "target": "a439", "note": "ships at the same time as mobile media queries"}
]
5 kinds: `follows`, `blocks`, `parallel`, `supersedes`, `extracted`. ## Step 3: Mobile CSS changes (the work this plan owns) 3.1 Plan detail page: 1.4fr 1fr → 1fr at ≤768px, with section dividers 3.2 Targeting card: 1fr 1fr → 1fr at ≤768px 3.3 Back link: 12px text → 44px tap-target button 3.4 Long step labels: `flex-wrap: wrap` on the step row 3.5 17-step lists: collapse/expand toggle, default collapsed on mobile 3.6 Sticky back button on plan detail 3.7 State banner on plan detail (currently missing) 3.8 Tabs: taller tap targets, active pill, scroll-x on overflow 3.9 Topbar: stats hidden on mobile with compact replacement 3.10 Card padding 16px 12px on mobile (was 20px 24px) ## Step 4: Playwright iPhone 13 verification 390x844 viewport, take screenshot of: - /mavis/plans - /mavis/plans/438 (with checklist expanded) - /mavis/timeline - /mavis/repos - /mavis/artifacts - /mavis/inbox Verify: - 44px min tap targets - No horizontal overflow - State banner visible - Sticky back button works - All buttons reachable ## Step 5: Push + verify on VPS Commit, push to avidtech6/fva-control-panel main, restart operator-panel, verify live URL. --- ## Open question for G (the "more thinking" part) **The `relations` shape** — am I right that the 5 kinds above are enough, or do you see link kinds I'm missing? Specifically: - **`blocks`** — strict gate (a439 blocks a440 until a439 ships). Right? - **`parallel`** — ships together, no gate. Right? - **`follows`** — sequential but not gated (a440 follows a439 but doesn't block). Right? - **`supersedes`** — version chain (a438 v2 supersedes a438 v1). Right? - **`extracted`** — split out of (a439 extracted from a438 v2). Right? Or do you want simpler — just a `linked_plans: ["a437", "a439"]` array with no kind, and the relationship is just "see also"? **My lean**: typed edges (5 kinds). Reasons: 1. The state machine needs to know about `blocks` to auto-pause a plan 2. The auto-bulletin on plan-finished can include the right "this follows from aNNN" or "this unblocks aNNN" line 3. "See also" loses information — every link becomes equivalent, and the SPA can't show "this plan is waiting on aNNN to finish" differently from "this plan is a v2 of aNNN" But I'm open to simpler. Your call.