Repository navigation
EPIC: UI overhaul — macro-tracking + social identity #63
Description
Why
UDine's product identity (owner decision, 2026-08-19) is a macro tracker + social layer connected to the real UMass menu — not a restyled port of the official dining app. The styling wave (#36–#41, #43) gave both consistency and a component system on web; this epic reshapes the information architecture and product feel around that identity, and brings mobile up to the same design language.
Design decisions (made, not open)
- Today-first home (web + mobile). The first screen is your day: macros so far, quick-log entry, and what's on at the halls — not a bare list of four buildings. Halls/menu browse stays one tap away.
- Social is a feed, not a settings page. Pings and favorited-food sightings become a single activity feed; "come eat with me" is a first-class action. Signed-out users see the feature with a sign-in value prop, never a dead end.
- Ranking feeds the experience. Post-log comparison prompts and a "your top dishes" module — ranking data stays device-only per the residency table.
- Anonymous-first stays sacred. Everything except friends/pings/push works with zero account, and the UI must make that legible (device-only data promise surfaced in onboarding, not buried in a footer).
Children (sequence)
- web IA: Today-first home #64 web IA: Today-first home
- mobile: port the design system + restyle all screens #65 mobile: port the design system + restyle all screens
- web: social activity feed (pings + sightings) #66 web: social activity feed (pings + sightings)
- web: rank-informed surfaces (post-log compare prompt, top dishes) #67 web: rank-informed surfaces (post-log compare prompt, top dishes)
- onboarding/first-run: anonymous-first value prop (web + mobile) #68 onboarding/first-run: anonymous-first value prop (web + mobile)
Order: #64 first on web (it moves routes/specs others build on); #65 runs in parallel (different package); #66/#67 after #64; #68 last.
Ground rules for every child (repo standing policy)
Red-green TDD with pasted red evidence per spec; pr-reviewer pass before merge; mutation-testing for pre-existing behavior; data-residency table in CLAUDE.md is law; no new hex colors — tokens/components only; per-worktree Playwright ports (PORT env).
Activity
TSVRN9 commentedon Aug 19, 2026
Two small follow-ups from PR #69's review, to fold into remaining epic work: (1) nav link to
/still reads 'Dining Halls' while the page is now 'Today' — deliberate (locator blast radius), needs a coordinated rename + spec-locator update as its own small change; (2) cosmetic inverted loading flash on/: pre-IndexedDB-resolve renders a zeroed stat card for a beat before the empty state (theloadedguard covers one direction only).TSVRN9 commentedon Aug 19, 2026
Note from #72 (web: browse upcoming days' menus, done — see PR #76): web now has prev/today/next date navigation on
/halls/[slug](?date=YYYY-MM-DD). Mobile date nav was explicitly out of scope for #72, deferred until #65's restyle lands — but it isn't yet a tracked follow-up child here. Flagging so mobile doesn't quietly fall behind web on this once #65 ships; may need a small #65-follow-up ticket rather than folding it into #65 itself, since #65 is scoped as visual parity only (no new behavior).TSVRN9 commentedon Aug 19, 2026
Epic complete — all five children merged and closed.
Every child went through implement (red-green evidence) → independent review (mutation spot-checks, live drives) → fix rounds where needed → re-review → merge. Bonus landings along the way: upcoming-menus browsing (#72/PR #76), FAQ/staff cut (#50), mobile OAuth fixes (#44/#46), local-only CI (#55/#73).
Open follow-ups spawned by the epic's reviews: #80 (hall-rank sync drift), #81 (untested pointer-events wrapper + one retired-form guard), #82 (narrow-viewport prompt occlusion). Remaining pre-epic backlog: #45, #54.
TSVRN9 commentedon Aug 19, 2026
Closing: all children shipped.