diff --git a/.planning/v1428-feedback-2026-05-15.md b/.planning/v1428-feedback-2026-05-15.md new file mode 100644 index 000000000..82cd332bd --- /dev/null +++ b/.planning/v1428-feedback-2026-05-15.md @@ -0,0 +1,211 @@ +--- +file: .planning/v1428-feedback-2026-05-15.md +purpose: Maintainer's post-v1.4.27 walk-through of the live build at 2026-05-15 evening — surfaces real regressions, stuck behaviour, and scope items the next release pass owns +created: 2026-05-15 +target_tag: v1.4.28 +--- + +# v1.4.28 — Maintainer Feedback (post-v1.4.27) + +Read once: every entry below is something the maintainer hit while walking through the live app at `healthlog.bombeck.io` right after v1.4.27 shipped. Grouped by theme + severity. Marc-Voice English. No PII. Forbidden vocabulary purged. + +Severity rubric: **Critical** = live bug, broken feature, can't ship the next release with it; **High** = strong opinion, regression vs. expected behaviour; **Medium** = polish + consistency; **Low** = nice-to-have. + +--- + +## Theme A — Dashboard cleanup (Critical) + +The maintainer wants two surfaces gone from the dashboard entirely. + +| ID | Item | Severity | +|---|---|---| +| FB-A1 | The Mounjaro / GLP-1 dashboard tile is unwanted and unwanted-configurable. Not "hide via Settings → Dashboard"; **remove from code entirely**. Search every reference to `glp1-tile`, the Mounjaro brand string, the dashboard widget entry — drop. | Critical | +| FB-A2 | The `DrugLevelChart` in its current dashboard shape is wrong. The concept is good but this iteration is "fürchterlich". **Remove the dashboard mount entirely** for v1.4.28. The component itself stays (consumed by the standalone medications surface). A future opt-in widget (see FB-E2) may bring it back. | Critical | + +Net effect on the dashboard: no GLP-1 tile, no drug-level pane on `/`. The retired surfaces ripple through `dashboard-layout.ts`, the layout-section Settings, the i18n keys, the tests. + +--- + +## Theme B — Workout/Sport edit error (Critical bug) + +| ID | Item | Severity | +|---|---|---| +| FB-B1 | Editing a sport entry and clicking save throws an error. Reproduce path TBD — the maintainer hit it consistently. This is a real save-path bug. **Treat as Critical, must reproduce + fix before release.** | Critical | + +--- + +## Theme C — BD-Zielbereich tile broken (Critical bug) + +| ID | Item | Severity | +|---|---|---| +| FB-C1 | The BD-Zielbereich tile renders "1.1." (likely a malformed date or progress fraction) instead of the actual numbers. The numbers are the load-bearing payload of the tile — without them the tile is useless. | Critical | +| FB-C2 | The BD-Zielbereich tile does not behave like its siblings (Weight, BP). Different layout, different state shape, different render path. **Streamline so it matches the Weight + BP tile pattern.** Same chrome, same prop API, same fallback states. | High | + +This tile has been the divergent case for at least three releases (v1.4.22, v1.4.25, v1.4.26 patches all touched it). v1.4.28 should rewrite it against the shared TrendCard primitive instead of patching. + +--- + +## Theme D — Performance regression (Critical) + +| ID | Item | Severity | +|---|---|---| +| FB-D1 | The app feels measurably slower than v1.4.26. General perception, no specific bottleneck called out. | Critical | +| FB-D2 | The pulse insights chart (`/insights/puls`) loads "unfassbar lange oder lädt gar nicht" — likely a real broken endpoint or a stuck React-Query state. | Critical | +| FB-D3 | Scrolling between insight charts (the tab-strip transitions on `/insights`) feels stuck — the page sometimes refuses to scroll at the wrong vertical position. Likely the sticky tab strip + intersection-observer logic is fighting itself. | High | + +The performance theme calls for a full perf-audit pass in v1.4.28 — measure first, then act. Possible suspects: the new `useIsMobile` hook running on every interactive surface, the visual-viewport listener on the message thread, the GeoIP backfill running on a hot path, the dashboard's new dynamic chart imports under-suspending. Plus the dispatch-localised notification's prisma-find-unique on every audit-log write. + +--- + +## Theme E — Medications GLP-1 sub-surface cleanup (High) + +| ID | Item | Severity | +|---|---|---| +| FB-E1 | The "Dosis-Historie" section under a GLP-1 medication is unwanted. **Delete from code entirely.** The intake-history-list mount on the GLP-1 detail page + every reference. | High | +| FB-E2 | The "Bestand" (inventory) section under a GLP-1 medication is unwanted. **Delete from code entirely.** The inventory-section mount + every reference. | High | +| FB-E3 | The "Geschätzter Wirkstoffverlauf" chart is wanted but at a different home: an **opt-in dashboard widget** that surfaces in `/settings/dashboard` only when an active GLP-1 medication exists. The user toggles it on; the dashboard renders the chart with a header pill row. Same widget mechanism the other dashboard tiles use. | Medium | + +The net effect for the medications surface: the GLP-1 detail page collapses to header + schedule + side-effects (the wanted sections), nothing else. + +--- + +## Theme F — Medications detail page chrome inconsistency (High) + +| ID | Item | Severity | +|---|---|---| +| FB-F1 | "Nebenwirkungen erfassen" call-to-action string overflows the side-effects tile. The card breaks visually at common viewport widths. | High | +| FB-F2 | The "letzte 30 Tage Magen/Darm/Bauchschmerzen 15.05" layout — date + free-text + count rendering is misaligned. Visual rhythm broken, the date stamp does not have a fixed slot. | Medium | +| FB-F3 | "Zeitplan", "Erinnerung an", "Bearbeiten nächste Dosis" all have different chrome — different heading sizes, different font weights, different paddings. Reads unruly + ungewollt. **Audit every section header on the medications detail page + collapse to one chrome.** | High | +| FB-F4 | Too many different fonts on the page. Best-practice scan: one heading scale, one body scale, one micro scale. | Medium | + +This is a v1.4.27 R4 UI-conformity finding extended — the medications surface escaped the symmetry sweep that landed for settings/admin. v1.4.28 sweeps it. + +--- + +## Theme G — Medication list display consistency (High) + +| ID | Item | Severity | +|---|---|---| +| FB-G1 | The GLP-1 entry in the medications list renders differently from the regular medications. Examples:
• Ramipril: "Ramipril 5 mg" on line 1 + "Blutdrucksenker" on line 2; no icon.
• Mounjaro: "Mounjaro · 7,5" on a single line with a dot separator; brand icon present.
**Streamline both to the same row shape.** Pick the Ramipril shape (two-line, no icon) — that's the established pattern; the GLP-1 row is the outlier. | High | + +--- + +## Theme H — Insights HealthScore card height (High) + +| ID | Item | Severity | +|---|---|---| +| FB-H1 | The HealthScore card width is OK; **height is too short**. Currently ends at the separator line below "Wochenbericht erstellen / Coach fragen". | High | +| FB-H2 | Wanted shape: the HealthScore card should occupy the full height of the action+prompts column on its left — ending where the last suggested-prompt chip ends (e.g. at "Wirkt mein Medikament?"). Equal-height row across the hero strip. | High | +| FB-H3 | To buy that height: **remove the "Wochenbericht erstellen" button** from the hero action row. It's a placeholder / pre-selected affordance. Leave only "Coach fragen" inline. The weekly-report surface stays accessible via its existing menu entry (or not at all if no consumer exists — see Theme N below). | High | + +--- + +## Theme I — "vs last week" delta needs explanation (Medium) + +| ID | Item | Severity | +|---|---|---| +| FB-I1 | The HealthScore delta line ("-3 vs last week" or equivalent) should expose a `?` icon next to it. Mouseover (desktop) / tap (mobile) opens a small popover explaining the calculation: which components contributed, which window, what the user can do to improve. | Medium | + +This is a "why" affordance that turns a number into an actionable signal. + +--- + +## Theme J — Insights advisor surface retire (Critical scope reduction) + +| ID | Item | Severity | +|---|---|---| +| FB-J1 | The "Persönlicher Berater" / `InsightAdvisorCard` mounted at the bottom of `/insights` is unwanted. **Remove from code entirely** — the component, its imports, its test fixtures, its i18n keys, its analytics references. It does not appear on `/insights` anymore. | Critical | +| FB-J2 | The "Insights aktualisieren" button / regeneration affordance retires with the advisor card. The whole bottom area collapses. | Critical | + +This is the second advisor surface retirement of the v1.4.x line (v1.4.27 retired `InsightsCardPreview` from the dashboard). The intent is clear: the assistant lives in the Coach drawer, nowhere else. v1.4.28 follows through. + +--- + +## Theme K — Trends row equal-height (High) + +| ID | Item | Severity | +|---|---|---| +| FB-K1 | The trend tiles on `/insights` do not align vertically. The mood (Stimmung) tile is taller; the chart inside it is taller with more padding above the data start. Every other trend tile is shorter. | High | +| FB-K2 | Wanted contract: **chart + caption text together must always sum to the same total tile height** across every trend tile in the row. Independent of how long the caption text is — short captions get padding, long captions clip with `line-clamp` or grow the tile but the chart shrinks correspondingly. The visual rhythm of the row is non-negotiable. | High | + +v1.4.27 R3a B1 + R4 design review touched this; the actual contract did not land. v1.4.28 finishes it. Bring screenshots into the audit — desktop + mobile. + +--- + +## Theme L — Targets page Coach launch button (Low) + +| ID | Item | Severity | +|---|---|---| +| FB-L1 | The bottom-left "Coach fragen" button on `/targets` (Zielbereich) takes too much visual attention. Replace text + button with **just an icon** ("Kurzfragen" / chat-bubble glyph). The label disappears; the affordance stays. | Low | + +--- + +## Theme M — General consistency audit (High) + +Underlying theme behind FB-A through FB-L: **the maintainer wants ruthless consistency**. Multiple shapes for the same concept is the persistent pain. v1.4.28 commits an explicit "every-class-once" pass: + +- One medication-list row shape (FB-G1). +- One medication-detail section header chrome (FB-F3 / F4). +- One tile-height contract on the trend row (FB-K). +- One HealthScore column shape (FB-H). +- One Coach-launch affordance shape across all pages (FB-L echoes Coach drawer FAB pattern). + +This is a follow-through on the v1.4.27 R4 UI-conformity reviewer's 639-line report. Pick up the deferred Medium+ items that fit the maintainer's call-outs. + +--- + +## Theme N — Weekly-report path decision (Medium) + +The "Wochenbericht erstellen" button is being retired from the hero action row (FB-H3). Decision needed: does the weekly-report surface stay accessible via another route (a Settings entry, an Insights menu item, an admin-only path), or does the entire weekly-report code path retire? + +v1.4.27 R3a B1 already noted the weekly-report route is dead-clickable from the dashboard (finding F7, deferred to v1.4.28 with a maintainer-screenshot ask). FB-H3 strengthens the case for retiring the whole path. + +**Default decision for v1.4.28**: retire the weekly-report code path entirely unless the maintainer surfaces an explicit use. Two-line ask in the v1.4.28 kickoff. + +--- + +## Severity tally + +| Tier | Count | +|---|---| +| Critical (must fix to ship v1.4.28) | FB-A1, FB-A2, FB-B1, FB-C1, FB-D1, FB-D2, FB-J1, FB-J2 — 8 items | +| High | FB-C2, FB-D3, FB-E1, FB-E2, FB-F1, FB-F3, FB-G1, FB-H1, FB-H2, FB-H3, FB-K1, FB-K2 — 12 items | +| Medium | FB-E3, FB-F2, FB-F4, FB-I1, FB-N — 5 items | +| Low | FB-L1 — 1 item | +| **Total** | **26 items** | + +Plus the carried-over deferrals from v1.4.27 R4 reviewers (in `.planning/v1428-backlog.md`). + +--- + +## Recommended v1.4.28 strategy + +The list says less scope, more depth than v1.4.27. The big themes that drive sub-passes: + +1. **Bug-fix sub-pass** — FB-B1 (workout save), FB-C1 (BD tile numbers), FB-D2 (pulse chart load), FB-D3 (scroll stuck). All Critical, all reproducible, all need real-environment instrumentation. This sub-pass kicks off the release — without it ship is blocked. +2. **Performance sub-pass** — FB-D1 + the suspects called out under Theme D. Measure first (Lighthouse + React profiler + Sentry timing breakdowns), then act. No premature optimisations. +3. **Scope-reduction sub-pass** — FB-A1, FB-A2, FB-E1, FB-E2, FB-J1, FB-J2. Six "remove from code entirely" directives. Clean delete commits, no half-measures. +4. **Consistency sub-pass** — FB-C2, FB-F3, FB-F4, FB-G1, FB-H1-3, FB-K1-2, FB-L1. The "everything looks the same" pass. Audit + apply. Probably the biggest chunk of v1.4.28 by LOC. +5. **Polish sub-pass** — FB-E3 (GLP-1 widget opt-in), FB-F1 + F2 (medications card overflow), FB-I1 (delta tooltip). Self-contained features. +6. **Decision sub-pass** — FB-N (weekly-report retire). One maintainer check, one commit. + +The v1.4.27 mobile sweep delivered an architectural shift (ResponsiveSheet, NativeSelect, CoachLaunchProvider). v1.4.28 collects the broken-edges-revealed-by-the-shift plus the consistency directives the maintainer's daily-walk-through surfaces. + +--- + +## Open until clarified + +- **Performance baseline**: do we already have Lighthouse / Sentry / Web Vitals snapshots from before v1.4.27 to diff against, or does v1.4.28 establish the baseline as it ships? +- **FB-B1 reproduce**: maintainer pastes the exact steps + the error toast text when the next session opens. +- **FB-N**: maintainer confirms whether weekly-report retires entirely or keeps a hidden route. + +--- + +## Convention compliance for v1.4.28 + +Same overrides as v1.4.27: +- Forbidden words in artifacts (commits, planning docs, CHANGELOG, in-app copy): AI, Claude, agent, marathon, wave, phase, session, subagent, Anthropic. Use neutral alternatives. +- NO PII (maintainer name, health figures, target ranges, measurement counts) in user-facing artifacts. +- Branch model: commit to `develop`, release via PR `develop → main`, tag on `main`. +- No `Co-Authored-By: Claude` trailer. No `--no-verify`. +- Marc-Voice English everywhere.