feat(app): clean up recent UI per David's 49 calls (Home, sync, live, review)

GI
1d ago
+1253-11975

Requested by David

What

David reviewed 49 recently added UI items on 11-02 and gave a call on each one: 14 Remove, 15 Simplify, 20 Keep. This PR carries out those calls, plus his follow-ups on the renders (14:54Z, 15:43Z). It changes the Flutter app and one macOS badge.

Merge dependency: do not merge before #24382 (backend automatic release for held audio). This PR removes Home's waiting card, whose Process button is today's only way to release held recordings by hand. Once #24382 ships, the release happens on its own.

Home

  • Above the conversation list, Home shows only Questions for you (David: "Only the Questions for you should show up"). Removed from Home: the waiting card and its rows, Process/Not now, the processing and paused states, the confirm dialog, the older waiting card, the on-device banners, the yearly row and the dogfood alert. The speech-profile and firmware-update cards stay (David, 14:54Z).
  • Recordings waiting for a plan come back as locked rows in the list, on their own day (David: "show the locked conversation rows again").
    • They keep the frosted card, with no "Pending" text and a single Upgrade action that opens the plans (David, 15:43Z: "frosted card, but no Pending text its ugly").
    • Locked conversation rows match: Upgrade instead of View Usage, and no Pending.
    • There is no "Transcribe on this phone" option: it cannot unlock a recording already held on the server (David, 14:54Z).
  • The on-device banners and the dogfood alert (still debug and TestFlight only) moved to the Activity (bell) page (David: "Move any of this stuff into the Notification Bell page").
  • Short clips (noise and media) no longer fold on Home. Search finds them under a new Short clips filter (David: "Only shows up in search + add a search filter for it").

Elsewhere

  • Memories: locked memory rows match locked conversation rows: frosted card, no Pending text, Upgrade opens the plans sheet. They had shown Pending and View Usage.
  • Plan & Usage: the waiting card is gone. Only the save-live-hours toggle remains.
  • Live page: the paused upsell banner is removed. Notes lose the "On this phone" tag and caption. The "Recording safely" card is now one quiet line.
  • On the Way: the big headline, its progress bar and "Details for support" are removed. The day rows stay.
  • Offline Sync:
    • The step bar is one determinate bar.
    • Refused rows use a neutral status and no inline red Delete; swipe and confirm still remove them.
    • The charger wait is a quiet line here instead of a row status (David: "Put into Offline Sync page").
    • The sync details sheet shows only where the audio is. Speed, file and job counts and the firmware version now go only into the "Copy details for support" text.
  • Edge throttle: "Syncing paused briefly" is no longer shown anywhere (David, 14:54Z: "remove the syncing paused briefly since it's not actionable by the user"). Other cooldowns (backend busy, fair use, dispatch hold) still show.
  • Summaries: "Made on your iPhone" is a one-liner, and its explanation opens only on tap.
  • Device page: the stat tiles are one plain line that wraps at large text.
  • Onboarding: "Connect Omi" is the one filled button (David: "Emphasize Omi").
  • Review:
    • Dream Report drops tokens, cost and shadow copy. A preview-mode report still labels its edits "Would fix".
    • Recent changes is a lighter list.
  • macOS: the locked badge says Waiting in neutral ink instead of the amber "Saved and waiting".

Strings: added searchNoiseFilter; restored dreamReportWouldFix with main's translations; removed the dead homeNoiseFold* and syncDetailsForSupport. All changes went through scripts/l10n.py for 49 locales.

Renders

ChangeBefore (main)After (this PR)
Home above the listHome above the list beforeHome above the list after
Short clipsShort clips beforeShort clips after
Made on iPhoneMade on iPhone beforeMade on iPhone after
Live notes tagLive notes tag beforeLive notes tag after
Live transcript cardLive transcript card beforeLive transcript card after
Plan & Usage waiting cardPlan & Usage waiting card beforeRemoved
Live page paused bannerLive page paused banner beforeRemoved

Locked row history, from one fixture: Sep 30–Oct 14, Oct 14–now on main, and this PR:

locked row history

Review round 1 (Luna), addressed

  • P1, integration-test search fakes: fixed. Both visual-audit search.dart overrides take includeNoise.
  • P1, no UI path for waiting_choice: intended. It is this PR's merge dependency on #24382, which releases held audio automatically, so no manual accept is needed. Deferred conversations still appear as locked conversation rows and open the plans. This PR must not merge before #24382.
  • P2, Dream Report preview mode said "Fixed": fixed in round 2 per edit (see below); "Would fix" string restored from main.
  • P2, short clips filtered from only the first 20 discarded matches: mitigated. With the filter on, search reads 50 discarded matches. The backend has no content-kind filter, so a clip past the first 50 discarded matches can still be missed.

Review round 2 (Luna, delta), addressed

  • P1, a live report labelled every edit "Fixed": fixed. Each edit is labelled by its own outcome: applied edits show under "Fixed"; suggest-only, suppressed and shadow edits show under "Would fix". The test covers a mixed run in a live report. This replaces the round-1 report-level label.

Failure-Class: FC-decoded-outcome-discarded-before-canonical-record

Invariants

  • INV-NAV-1: ConversationRowView.swift changes only a comment about the locked badge's copy. No destination or route changes, and Conversations keeps its feature-complete page.
  • INV-MEM-1: memory_item.dart changes only the locked row's copy and its tap destination (the plans sheet). No memory tier, collection or access change.
  • PRODUCT.md asks for honest cooldown states. The edge-throttle pause is now hidden at David's explicit direction (quoted above), because it clears by itself and asks nothing of the user. Every other cooldown still shows.

Verification

  • flutter analyze on lib and test after merging main, plus the changed integration_test files: clean, apart from the generated-env errors that exist on main.
  • Ran 123 affected test files (tests importing changed files, plus changed tests), then the round-2 set (103 tests). All pass except l5_home_visibility_test "closed episode Home and search open the episode page", which times out in pumpAndSettle on unmodified main as well: it failed 2 of 3 main runs, under heavy host load.
  • New tests:
    • ui_cleanup_render_test.dart: Home locked rows and the search filter.
    • A short-clips filter behaviour test.
    • A collapsed-by-default check for the on-device provenance.
    • Locked rows carry no Pending text.
    • An edge throttle shows no pause.
  • macOS: copy-only Swift change. The pre-push gate built the app.
  • scripts/pr-preflight --pr-body-file: passed.

🤖 Generated with Claude Code