feat(app): clean up recent UI per David's 49 calls (Home, sync, live, review)
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
| Change | Before (main) | After (this PR) |
|---|---|---|
| Home above the list | ![]() | ![]() |
| Short clips | ![]() | ![]() |
| Made on iPhone | ![]() | ![]() |
| Live notes tag | ![]() | ![]() |
| Live transcript card | ![]() | ![]() |
| Plan & Usage waiting card | ![]() | Removed |
| Live page paused banner | ![]() | Removed |
Locked row history, from one fixture: Sep 30–Oct 14, Oct 14–now on main, and this PR:
Review round 1 (Luna), addressed
- P1, integration-test search fakes: fixed. Both visual-audit
search.dartoverrides takeincludeNoise. - 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.swiftchanges 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.dartchanges 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 analyzeonlibandtestafter merging main, plus the changedintegration_testfiles: 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 inpumpAndSettleon 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











