From e794f57bae68bc874b69d8c07e6339bae4b73fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 10 May 2026 20:20:01 +0200 Subject: [PATCH] =?UTF-8?q?docs(planning):=20v1.4.22=20marathon=20scaffold?= =?UTF-8?q?=20=E2=80=94=20polishing=20before=20v1.5=20iOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Big-polishing release scope: BD-Zielbereich 5th attempt, BD-Kachel parity, comparison-toggle global via Settings, Insights grid normalisation, "Muster" rename + tabs above hero, raw Metrik token leak, Coach prompt rewrite (research-driven), collapsible provenance, Gravatar parity, disclaimer move, settings cog wire-or-remove, Zielwerte upgrade, api-tokens 5th attempt, Coolify auto-deploy fix, AuthShell flicker, node-26-alpine investigation, full v1421-backlog cleanup. Marathon plan: research/probe → polish waves → QA → release. Co-Authored-By: Claude Opus 4.7 (1M context) --- .planning/ROADMAP.md | 19 +- .planning/STATE.md | 464 ++++++++++++------------------------------- 2 files changed, 147 insertions(+), 336 deletions(-) diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 32ad3e08a..35ce1b64f 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -1,12 +1,23 @@ # HealthLog v1.4.22 — roadmap -Milestone: **v1.4.22** (kicked off 2026-05-10, post-v1.4.21 patch) +Milestone: **v1.4.22 — big polishing release before v1.5 iOS** (kicked off 2026-05-10, post-v1.4.21 patch) Latest tag at start: v1.4.21 (live in prod, image digest `sha256:4e818d44702c…`) -| Phase | Goal | State | -| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| G | E2E fix wave — 7 stale-selector / layout regressions surfaced post-v1.4.20 (HeroStrip slot, onboarding-card, chart-overlay, api-tokens-mobile, charts-mobile) | in flight | +Marc's directive: close ALL known bugs + apply ALL deferred items +from `.planning/v1421-backlog.md` so the iOS app builds on a clean +foundation. Marathon-style execution: research/probe first, then +parallel polish waves, then multi-agent QA, then release. + +| Wave | Goal | State | +| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | +| 1 | Research + probe — Playwright PROD probe (BD-Zielbereich 5th attempt, api-tokens 5th attempt, Metrik token leaks, Targets page brainstorm); health-coach prompt research | in flight | +| 2 | Insights surface polish — A1 BD framing, A2 BD-Kachel parity, A3 comparison-toggle global, A4 grid normalisation, A5 Muster rename + tabs above hero, A6 token-leak fix | pending | +| 3 | Coach polish — B1 prompt rewrite, B2 collapsible provenance, B3 Gravatar parity, B4 disclaimer move, B5 settings cog wire-or-remove | pending | +| 4 | Other surfaces + backlog cleanup — C1 Zielwerte upgrade, C2 api-tokens 5th attempt, C3 Coolify auto-deploy, C4 AuthShell flicker, C5 node-26-alpine, D backlog wave | pending | +| G | E2E fix wave (already on `develop`) — 7 stale-selector / layout regressions; release-merge brings them into main with v1.4.22 | done | +| 5 | Multi-agent QA + Product-Lead review | pending | +| 6 | Release v1.4.22 — bump, CHANGELOG, release-merge, tag, GHCR, Coolify deploy (validated by C3), smoke, GH release, docs+landing sync, brief | pending | Carry-over candidates already captured in `.planning/v1421-backlog.md` (now serving as the v1.4.22 backlog diff --git a/.planning/STATE.md b/.planning/STATE.md index 9395ae063..ee05c507e 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,384 +1,184 @@ -# v1.4.20 marathon — state log +# v1.4.22 marathon — state log -Status: in flight -Last update: 2026-05-10T15:00+02:00 +Status: kickoff +Last update: 2026-05-10T20:15+02:00 -> Previous milestone: v1.4.19 live (image digest -> `sha256:b48f93874cdb…`, `/api/version=1.4.19`). -> v1.4.20 = Insights redesign with AI Coach -> (handoff at `~/Downloads/design_handoff_insights_redesign`). -> v1.5 reserved for iOS app + Apple Health integration. +> Previous patch: v1.4.21 live (image digest +> `sha256:4e818d44702c…`, `/api/version=1.4.21`). +> v1.4.22 = big polishing release before v1.5 iOS. Closes ALL known +> bugs + applies ALL deferred items from `.planning/v1421-backlog.md` +> so the iOS app builds on a clean foundation. -## Foundation — pre-flight before any feature work +## Wave 1 — Research + probe (parallel) -Per `.planning/v1420-marathon-handoff.md`, F1–F6 must complete before -B1 dispatches. +Per `feedback_research_before_complex_features.md`, deep-fix work on +4-attempt bugs (BD-Zielbereich, api-tokens scrollbar) + Coach prompt +rewrite needs research first. -### F0 — Commit dangling v1.4.19 reports + bootstrap v1.4.20 scaffold +### W1a — Playwright PROD probe + token-leak hunt -- [x] Commit phase-E1-report.md + phase-E3-report.md v1.4.19 updates -- [x] STATE.md replaced with v1.4.20 scaffold; v1.4.19 archived to ROADMAP.md -- [x] ROADMAP.md updated with v1.4.20 milestone + previous-milestone archive +- [ ] BD-Zielbereich tile rendering against PROD with maintainer + session (4-attempt bug pattern: probe before patching) +- [ ] Admin / api-tokens scrollbar at multiple viewports (5th attempt) +- [ ] Raw `Metrik ` token leaks in Recommendations / Findings +- [ ] Targets / Zielwerte page screenshot for upgrade brainstorm +- [ ] Inventory `.planning/v1421-backlog.md` items by complexity +- Detailed report: `.planning/phase-W1a-report.md` -### F1 — Branch model: long-lived `develop` +### W1b — Health-coach prompt research -- [x] Create `develop` from cleaned `main` HEAD (`a1cf9bc`) -- [x] Push `develop` to origin (tracking set up) -- [x] GHCR workflow verified — only `branches: [main]` + `tags: ['v*']` push paths build/publish; PRs to `main` build but do not push; develop is build-free -- [x] All v1.4.20 commits target `develop`; release-merge to `main` only at Phase E -- Detailed report: `.planning/phase-F1-report.md` +- [ ] Benchmark health-coach / motivational-interviewing prompt + patterns (Apple Health Coaching, Oura, Whoop, …) +- [ ] Define "natural prose first, evidence collapsible" structure + with concrete EN + DE drafts +- [ ] PROMPT_VERSION 4.20.2 → 4.22.0 (significant Coach tone shift) +- Detailed report: `.planning/phase-W1b-coach-prompt-research.md` -### F2 — Document branch + release model +## Wave 2 — Insights surface polish -- [x] Extend `CONTRIBUTING.md` with branch flow + ASCII diagram (this branch) -- [x] Mirror page on healthlog-docs at `/contributing/branch-model/` (`5d96861` on healthlog-docs/main) -- [x] User-vs-contributor distinction explicit in both surfaces -- Detailed report: `.planning/phase-F2-report.md` +### A1 — BD-Zielbereich 5th attempt -### FX — User-facing artifact cleanup (PII + jargon + German leaks) +- [ ] Decide framing: re-anchor headline to last-30d with all-time + footnote, OR add explicit window label ("All-time: 11% + in target") +- [ ] Implement; integration test +- Detailed report: `.planning/phase-A1-report.md` -Combined sweep across HealthLog main repo + healthlog-docs + healthlog-landing -(F3 + F4 + new PII rule consolidated into one wave). +### A2 — BD-Kachel feature parity -- [x] HealthLog main repo: 20 files scrubbed, `a1cf9bc` on origin/main - (CHANGELOG.md, docs/audit/v146 / v1414 / v1415 / v1416 / v1418 / - v1419, docs/codex-protocol-spec.md, docs/migration/, docs/ops/) -- [x] healthlog-docs: 7 files scrubbed, `782862b` on origin/main - (api/ examples replaced "marc" → "alice", DE leaks fixed) -- [x] healthlog-landing: 1 file scrubbed, `9b31083` on origin/main - (JSON-LD author block depersonalised) -- [x] GH releases v1.4.14–v1.4.19: republished bodies from cleaned - CHANGELOG sections during Phase E pipeline -- [ ] Source-comment sweep (`src/` has 191 `Marc` references in - maintainer comments) — defer to v1.4.21 backlog as low-priority -- [ ] DE+EN bilingual CHANGELOG entries (v1.4.15 era) — defer; larger - rewrite, captured in v1.4.21 backlog -- Detailed report: `.planning/phase-FX-report.md` +- [ ] Trend arrow + per-tile features the other tiles ship -### F5 — Best-practice GitHub repo audit +### A3 — Comparison-Toggle → global Settings -- [x] CODE_OF_CONDUCT.md (Contributor Covenant 2.1, `e7b6b27`) -- [x] Issue + PR templates (`.github/ISSUE_TEMPLATE/*.yml`, `PULL_REQUEST_TEMPLATE.md`, `072941b`) -- [x] Dependabot expanded to github-actions + docker (`779e5a3`) -- [x] package.json metadata: description, license, homepage, repository, bugs, keywords (`f7977d1`) -- [x] LOW carry-over (README badges, FUNDING.yml, repo-root tidy) deferred to `.planning/v1421-backlog.md` -- Detailed report: `.planning/phase-F5-report.md` -- Note: initial sub-agent dispatch hit a content-filter block on the CoC text; refactored to inline execution (download CoC verbatim from contributor-covenant.org). +- [ ] Move toggle from `/insights` AND `/dashboard` to + `/settings/dashboard` as a single global preference +- [ ] Persist in `User.dashboardWidgetsJson.compareOverlay` +- [ ] Comparison overlay activates everywhere when enabled, off + everywhere when disabled -### F6 — Multi-agent QA on new docs +### A4 — Insights layout grid normalisation -- [x] 38 docs site pages cross-checked against the live app (v1.4.19), CHANGELOG, `.env.example`, Dockerfile, docker-compose, docker-publish workflow -- [x] CRITICAL fixed inline: `19eb8de` (S3 env-var names + arm64 build claim removed) on healthlog-docs/main -- [x] HIGH fixed inline: `3d3ea21` (achievement count 38 → 59, `/admin/
` paths, AI rate-limit 2/h → 10/h, default-locale flip, comparison-overlay scope) on healthlog-docs/main -- [x] 9 MED + 5 LOW deferred to `.planning/v1421-backlog.md` "Docs site audit" section -- [x] Two flagged-but-uncertain items captured for maintainer review -- Detailed report: `.planning/phase-F6-report.md` +- [ ] Row-fill rule: 1 card → 100% width, 2 cards → 50/50 +- [ ] Trends row equal heights via `min-h-…` +- [ ] Hide empty-state cards entirely (insufficient-data tiles + vanish, not render placeholder) -## Wave B — Insights redesign with AI Coach (sequential) +### A5 — Section heading + tab rename -Per `.planning/phase-D-v1419-product-lead-review.md`. Each phase -ships behind a feature flag and unlocks independently. +- [ ] "Muster" → "Trends" or "Zusammenhänge" (DE-locale check) +- [ ] "KI Gesundheitsanalyse" trim or restructure +- [ ] Tabs (Allgemein / Blutdruck / Gewicht / Puls / Stimmung) lift + above the Hero strip; in-place tab switch -### B1 — Hero strip + Daily Briefing + Suggested-prompts (~3-5 days) +### A6 — Raw `Metrik ` token leak fix -- [x] Replace `` with new hero strip (greeting, - action row + suggested-prompt strip; Daily Briefing card mounts - full-width below the hero) -- [x] New `src/components/insights/{hero-strip,daily-briefing, - suggested-prompts}.tsx` -- [x] Extend `aiInsightResponseSchema` with `dailyBriefing` - (`paragraph`, `keyFindings[]`) -- [x] PROMPT_VERSION bump 4.19.0 → 4.20.0 -- [~] Apple Health gated tiles — descoped per `phase-D-v1419-product- - lead-review.md` decision. The 4-vitals tile row from the artboard - uses BP / Weight / Pulse / Mood (all data already in the app); - HRV / Sleep / Resting-HR tiles defer to v1.5 / iOS app. The B1 - tile row itself (Vitals at-a-glance) is deferred to a later - B-phase since it duplicates the per-section status cards below - — see B1 report for the rationale. -- Detailed report: `.planning/phase-B1-v1420-report.md` (the older - `phase-B1-report.md` is from the v1.4.18 achievements marathon) +- [ ] Find token-emit point in AI response or template +- [ ] Either substitute via existing PARSE_TOKEN_REGEX or strip via + STRIP_TOKEN_REGEX (widen to lowercase `Metrik` if needed) -### B2 — AI Coach panel + streaming chat + persistence (~5-7 days) +## Wave 3 — Coach polish -Split into B2a (backend, complete) + B2b (drawer UI, complete). Both -halves landed on `develop` under nine atomic commits total — five -for the backend wave, four for the drawer wave plus a state-tick -commit. +### B1 — Prompt rewrite -- [x] New `POST /api/insights/chat` SSE-streaming endpoint -- [x] New `GET /api/insights/chat` (list) + `GET/DELETE - /api/insights/chat/[id]` (single + delete) -- [x] New Prisma `CoachConversation` + `CoachMessage` + `CoachUsage` - (encrypted content, GDPR cascade) -- [x] Source-chip provenance attached to every assistant message -- [x] Token-budget cap (25 000 tokens / user / UTC-day) + 20-turn - conversation cap with summarised-history fold -- [x] Prompt-injection + off-topic refusal pattern (EN+DE) -- [x] Drawer overlay over `/insights`; full-page `/insights/coach` - route deferred to v1.5 paired with the iOS app -- [x] New `src/components/insights/coach-panel/*` — drawer shell, - message thread, source chips, composer, history rail, - sources rail, TanStack Query + SSE hooks -- Detailed report: `.planning/phase-B2a-report.md` (backend); - `.planning/phase-B2b-report.md` (drawer UI) +- [ ] Adopt W1b research output: natural prose-first, motivational, + conservative, evidence-grounded +- [ ] PROMPT_VERSION 4.22.0; EN + DE +- [ ] Coach-specific test suite covering tone + evidence-collapsible + pattern -### B3 — Correlation discovery + Trends row with AI annotations (~3-5 days) +### B2 — Collapsible provenance + values -- [x] 3 pre-defined hypotheses: BP×compliance, mood×pulse, - weight×weekday -- [x] New `src/lib/insights/correlations.ts` (Pearson + weekday-ANOVA; - n >= 14 + p < 0.05 surfacing gate) -- [x] New `src/components/insights/{correlation-card,correlation-row, - trends-row,trend-annotation}.tsx` -- [x] Confidence interval via Fisher z-transform; conservative - phrasing locked in by code-review convention -- [x] PROMPT_VERSION 4.20.0 → 4.20.1; new `trendAnnotations` block - on the AI response schema (nullable + optional for legacy - payloads) -- [x] `/api/analytics` now emits `correlations: {bpCompliance, - moodPulse, weightWeekday}` server-side -- [x] `` + `` mounted on `/insights` - between Daily Briefing and the Advisor card -- Detailed report: `.planning/phase-B3-report.md` +- [ ] Move inline raw values out of prose into a + "Worauf bezieht sich das?" expandable below each assistant + message +- [ ] Source chips stay visible; values reveal on click -### B4 — Weekly Report + Storyboard + Mobile passes (~3-4 days) +### B3 — User avatar = Gravatar (parity) -- [x] PROMPT_VERSION 4.20.1 → 4.20.2; aiInsightResponseSchema gains - `weeklyReport` + `storyboardAnnotations`; GROUND RULES 10/11 - across EN + DE prompts -- [x] New `/insights/report/[week]` route — newsletter-style - printable surface with Summary / Going-well / Worth-watching / - Tips / Data-quality sections; `window.print()` export via - Tailwind `print:` variants -- [x] Hero strip banner-card surfaces the fresh weeklyReport with - Read · Share · Export PDF actions; Share uses Web Share API + - clipboard fallback; Export deep-links to `?print=1` -- [x] `` gains an additive `annotations[]` prop; - `resolveAnnotationPositions()` pure helper maps date→pointIndex - with a 7-day snap window and 24-char small-viewport truncation -- [x] Coach drawer rail trays — chevron-button triggers on `` for SSR-test surface -- Detailed report: `.planning/phase-B4-report.md` +- [ ] Same dimensions as Coach avatar +- [ ] Reuses existing `gravatarUrl` from `/api/auth/me` -### B5 — Personal AI Coach Health Score (~2-3 days) +### B4 — Disclaimer move -- [x] Composite Health Score (0-100): 30% BP-target + 20% - weight-trend + 20% mood-stability + 30% compliance -- [x] Three bands (≥75 green, 50–74 yellow, <50 red) -- [x] "Ask the Coach" CTA opens B2 drawer with prefilled prompt -- Detailed report: `.planning/phase-B5-report.md` +- [ ] "Coach replies are generated. Clinical decisions belong with + your doctor." moves from below input → right rail +- [ ] Right rail "Coach reads only your connected data" repurposed + so the source picker stands alone -## Wave B summary (B1–B5) +### B5 — Settings cog wire-or-remove -Wave B closed the Insights redesign across 5 phases on `develop`: +- [ ] Decide: wire to per-user prompt-tuning toggles (Coach tone, + verbosity), OR remove the icon +- [ ] No dead buttons in v1.4.22 -| Phase | Theme | Commits | Test count delta (unit / int) | -| ----- | ------------------------------------------ | ------- | ----------------------------- | -| B1 | Hero strip + Daily Briefing + Suggested | 5 | 1672 → 1753 (+81) / 67 → 67 | -| B2 | AI Coach drawer (B2a backend + B2b UI) | 5 + 4 | 1753 → 1833 (+80) / 67 → 78 | -| B3 | Correlation discovery + Trends row + AI | 5 | 1833 → 1907 (+74) / 78 → 78 | -| B4 | Weekly Report + Storyboard + Mobile passes | 5 | 1907 → 1975 (+68) / 78 → 78 | -| B5 | Personal Health Score | 5 | 1975 → 2026 (+51) / 78 → 81 | -| | **Cumulative** | **29** | **+354 / +14** | +## Wave 4 — Other surfaces + backlog cleanup -Test count: 1672 → 2026 unit (+354), 67 → 81 integration (+14). -Test files 217 → 237. typecheck clean every phase; lint -13 baseline warnings unchanged. +### C1 — Zielwerte page upgrade -## Wave D — Multi-agent QA + Product-Lead review +- [ ] Visual + UX brought to the v1.4.20 polish bar -- [x] code-reviewer (`.planning/phase-D-v1420-code-review.md`) -- [x] security review (`.planning/phase-D-v1420-security-review.md`) -- [x] design / UX review (`.planning/phase-D-v1420-design-review.md`) -- [x] senior-dev review (`.planning/phase-D-v1420-senior-dev-review.md`) -- [x] simplify (`.planning/phase-D-v1420-simplify-review.md`) -- [x] Product Lead — v1.5 redesign plan (`.planning/phase-D-v1420-product-lead-review.md`) -- [x] Reconcile applied CRITICAL + HIGH (13 of 13) + 6 MED inline; 22 MED + 16 LOW + 4 simplify-apply-maybe deferred to `.planning/v1421-backlog.md` "Phase D reconcile carry-over" section -- Detailed report: `.planning/phase-D-v1420-reconcile-report.md` +### C2 — Admin / api-tokens scrollbar 5th attempt -## Phase E — Release v1.4.20 +- [ ] Live Playwright probe: which element actually overflows +- [ ] Patch the right layer this time -- [x] Pre-release verify (typecheck, lint, test, integration, - format, build) — 2026 unit + 81 integration green -- [x] Bump package.json + CHANGELOG (`aac8b5e chore(release): v1.4.20`) -- [x] Sync Dependabot dep bumps from main → develop (`dd2ef57`) -- [x] Release-merge develop → main (`666f6ee Release v1.4.20`) -- [x] Tag + push v1.4.20 (annotated, `666f6ee`) -- [x] GHCR build green (run `25633807964`, 4m02s, - digest `sha256:b112a31947…`) -- [x] Coolify deploy — auto-deploy webhook still missing on - apps-01; host-side retag fallback used (same fault mode as - v1.4.19) -- [x] /api/version=1.4.20 confirmed (flipped 2026-05-10T16:49:25Z) -- [x] Production smoke — all gated routes redirect 307 → - `/auth/login` as expected for an unauthenticated request; - `/api/version` and `/auth/login` 200 -- [x] GH release published (https://github.com/MBombeck/HealthLog/releases/tag/v1.4.20) -- [x] GH releases v1.4.14 → v1.4.19 republished from cleaned - CHANGELOG sections (FX carry-over) -- [x] Docs site sync (`0b83430` on healthlog-docs/main — - version pins + ai-insights v1.4.20 callout) -- [x] Landing site sync (`43ce4c7` on healthlog-landing/main — - JSON-LD `softwareVersion` 1.4.20 + 3 new featureList entries) -- [x] `docs/audit/v1420-summary.md` (release brief, `7f9ae21`) -- [x] v1.5 plan refreshed — see `.planning/phase-D-v1420-product- - lead-review.md` +### C3 — Coolify image-digest auto-deploy ---- +- [ ] Wire watchtower-via-Coolify path OR enable Coolify + image-digest checkbox +- [ ] Validate end-to-end: tag push → fresh image deployed without + host-side retag -## Status block — F0 (v1.4.20) +### C4 — AuthShell post-hydration redirect flicker -- 2026-05-10T15:00+02:00 — F0 complete. Dangling v1.4.19 release - reports (`phase-E1-report.md` + `phase-E3-report.md`) committed, - STATE.md replaced with v1.4.20 scaffold (F1–F6 foundation + - B1–B5 Insights redesign + Wave D + Phase E), ROADMAP.md updated - to track v1.4.20 with v1.4.19 archived. Branch model unchanged - for this commit (still `main`); F1 will introduce `develop`. +- [ ] Move null-`onboardingCompletedAt` redirect to `proxy.ts` + server-side, OR gate dashboard render on the field -## Status block — B2a (v1.4.20) +### C5 — node-26-alpine bump -- 2026-05-10T16:15+02:00 — B2a complete. AI Coach backend landed in - five atomic commits on `develop`: Prisma migration - `0035_coach_conversations_v1420` adds `CoachConversation`, - `CoachMessage`, and `CoachUsage` tables (cascade-on-user-delete); - Coach helpers (types, persistence with AES-256-GCM message bodies, - per-day 25 000-token budget ledger, EN+DE prompt-injection + - off-topic refusal); SSE streaming endpoint at POST - `/api/insights/chat` (idempotent on conversation creation only, - 20-turn history fold, refusal short-circuit, provenance frame, done - frame); list / fetch-single / delete endpoints with 404-not-403 - ownership boundary. Tests: 1753 → 1781 unit (+28), - 67 → 78 integration (+11). UI drawer (B2b) deferred to a separate - dispatch. +- [ ] Investigate the dependabot PR that failed; either patch the + Dockerfile to support node 26 or close the PR with reasoning -## Status block — B2b (v1.4.20) +### D — `.planning/v1421-backlog.md` cleanup wave -- 2026-05-10T16:30+02:00 — B2b complete. AI Coach drawer landed in - four atomic commits on `develop`: TanStack Query + SSE streaming - hooks (`useCoachConversations`, `useCoachConversation`, - `useDeleteCoachConversation`, `useSendCoachMessage`) with a - pure `parseSseChunk()` helper for unit-testable frame parsing; - drawer shell wrapped in `` with three-column - layout on `lg+` (history rail · message thread · sources rail) and - full-screen single-column on mobile; `` renders user - / assistant bubbles + an in-flight streaming bubble with - pinned-to-bottom auto-scroll; `` renders provenance as - labels-only chips (metric · window · n-count, never raw values); - `` composer with Enter / Cmd+Enter / Shift+Enter - semantics, disabled mic placeholder ("voice arrives in v1.5"), and - the "Coach replies are generated. Clinical decisions belong with - your doctor." disclaimer; `` with substring filter - and confirm-then-go delete; `` with the five Coach - metric contracts; `/insights` page mounts the drawer with the - hero strip's "Ask the coach" button + suggested-prompt chips - driving open + prefill. Tests: 1781 → 1833 unit (+52, - six new test files: `use-coach`, `source-chips`, `message-thread`, - `coach-input`, `sources-rail`, `history-rail`). Integration count - unchanged at 78. typecheck + lint clean (12 baseline warnings). +Apply or confirm-defer every item: -## Status block — Wave D reconcile (v1.4.20) +- [ ] Phase D reconcile carry-over (22 MED + 16 LOW + 4 simplify-maybe) +- [ ] F6 docs site audit (9 MED + 5 LOW) +- [ ] F5 best-practice (5 LOW) +- [ ] FX carry-overs: + - [ ] 191 `Marc` references in `src/` source comments + - [ ] DE+EN bilingual CHANGELOG entries normalised to EN + - [ ] `CLAUDE.md` + `AGENTS.md` filename rename or retire decision -- 2026-05-10T18:15+02:00 — Wave D reconcile complete. Six reviewers - filed 0 CRIT · 12 HIGH · 28 MED · 22 LOW + 5 simplify-apply-yes + - 4 simplify-apply-maybe + 3 simplify-apply-no across the code, - security, design, senior-dev, simplify, and product-lead lenses. - All 12 HIGH items + the design pushback on the disabled weekly- - report button + 6 MED items + every simplify-apply-yes item landed - inline across 11 atomic commits on `develop` (`e632e26` → - `31fbf98`). 22 MED + 16 LOW + 4 simplify-apply-maybe deferred to - `.planning/v1421-backlog.md` under "Phase D — v1.4.20 reconcile - carry-over". Test counts unchanged (2026 unit / 81 integration); - typecheck + lint clean; one observed integration-test flake on - `coach-chat.test.ts` "round-trips" (not introduced by Phase-D — - consistent re-runs pass). Phase E (release v1.4.20) unblocked. +### E2E fix wave (already on develop) -## Phase F — v1.4.20.1 hotfix +- [x] 5 commits on develop from the v1.4.21 follow-up; release-merge + brings them into main when v1.4.22 ships -Triggered by Marc's testing of the new Insights/Coach surface in -production after v1.4.20 went live. Five issues captured in -`feedback_v1420_post_deploy_bugs.md` — landed across six atomic -commits on `develop`. No tag yet; maintainer decides whether to ship -as v1.4.20.1 or bundle into v1.4.21. +## Wave 5 — Multi-agent QA + Product-Lead review -- [x] Daily Briefing regenerate produces a non-empty briefing - (`/api/insights/generate` now uses `getStrictInsightsSystemPrompt` - so GROUND RULE 8 reaches the model — `7921ffc`) -- [x] Coach snapshot ships day-level readings with weekday labels - and a per-day medication-adherence row (`ed61b17`) -- [x] Coach system prompt instructs the model to use the timeline - block for day-specific or weekday-specific questions - (`2143377`) -- [x] Streaming bubble clears once the persisted twin lands — - message-thread render-time dedup keyed on `messageId` - (`f07e35b`) -- [x] Drawer header settings cog moved to the left side so Radix - Sheet's close-X no longer overlaps it (`ddb2914`) -- [x] Sources rail grows per-source checkboxes + window selector; - scope flows through `useSendCoachMessage` to the chat request - body and into `buildCoachSnapshot` (`08fd411`) -- [x] Detailed report: `.planning/phase-v1421-hotfix-report.md` +- [ ] code-reviewer +- [ ] security review +- [ ] design / UX review +- [ ] senior-dev review +- [ ] simplify +- [ ] Product Lead — v1.5 plan refresh based on v1.4.22 state +- [ ] Reconcile applied CRITICAL + HIGH; defer MED/LOW with reasoning -## Status block — F (v1.4.20.1 hotfix) +## Wave 6 — Release v1.4.22 -- 2026-05-10 (post-deploy) — Hotfix complete. Six commits on - `develop` (`7921ffc` → `08fd411`). Test counts: 2026 → 2036 unit - (+10 net across snapshot + message-thread + sources-rail tests). - Integration tests unchanged at 81 — coach-chat.test.ts still 5/5. - typecheck + lint clean (13 baseline warnings unchanged). Token- - budget impact of the day-level snapshot: ~190 → ~3000 tokens per - full-scope turn; the new scope picker is the relief valve, single- - source narrowed turns land around 600-700 tokens. v1.4.21 should - watch usage and consider trimming `DAILY_TIMELINE_DAYS` from 14 to - 10 if heavy users start hitting the 25k/day cap. - -## Status block — v1.4.21 release - -- 2026-05-10T17:46+00:00 — v1.4.21 LIVE in production. Tag `v1.4.21` - on `8e198e1 Release v1.4.21` (release-merge of develop into main), - GHCR build run `25635294152` succeeded, image digest - `sha256:4e818d44702c3581a14d6480a953fd20d16cbbaf21c41e0c778c07340d3c4b1c`. - Coolify auto-deploy webhook still missing (same fault as v1.4.19 + - v1.4.20) — host-side retag fallback used (`docker pull :1.4.21 → - docker tag :latest → docker compose up -d --force-recreate app`) - on apps-01. `/api/version` flipped to `1.4.21` between - 19:45+02:00 and 19:46+02:00. Production smoke (no session): every - gated route 307 → `/auth/login`; `/api/version` 200; `/auth/login` - reachable. GH release: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.21. - Marc-Brief at `docs/audit/v1421-summary.md`. Docs site + landing - site sync skipped (patch is invisible at the docs page level — - the v1.4.20 entries already cover the Insights redesign + - Coach surface). - -## Phase G — e2e fix wave (in flight on develop) - -The post-v1.4.20 e2e workflow on `main` reported 7 failing specs. -Five are stale selectors from the B1 hero rewrite (the new -`` exposes a different `data-slot` value than the -legacy `` the specs assert), the other two are -Pixel-5 layout drift on `admin-api-tokens-mobile` and -`charts-mobile`. A focused fix wave is in flight on `develop`; -the next release (v1.4.22) will land them. - -## Status block — B5 (v1.4.20) - -- 2026-05-10T17:45+02:00 — B5 complete. Personal Health Score - landed in five atomic commits on `develop`: pure formula library - (`src/lib/analytics/health-score.ts`) with linear-regression - slope, coefficient-of-variation, weight-trend alignment, mood - stability, and compliance-rate helpers; the four-component - composite scales remaining weights when sub-components are null - (29 unit tests pin every shape); `/api/analytics` emits - `healthScore: { score, band, components, delta } | null` with - the wide-event annotation carrying score + band + delta; - `` (220 px desktop, full-width mobile) with - band-tinted progress bar, four sub-bars, "vs last week" delta - line, score-aware "Ask the Coach" prefill ("Why is my health - score X out of 100?"); `` flips to `lg:flex-row` and - mounts the panel beside the title block when the analytics - payload includes a score. Tests: 1975 → 2026 unit (+51), 78 → 81 - integration (+3). typecheck + lint clean. Canonical sample (the - integration's strong-positive seed): score 95, band green, - components 90/100/89/100. Wave-B closed; Wave D dispatch next. +- [ ] Pre-release verify (typecheck, lint, test, integration, + format, build) +- [ ] Bump `package.json` 1.4.21 → 1.4.22 + CHANGELOG +- [ ] Release-merge develop → main +- [ ] Tag + push v1.4.22 +- [ ] GHCR build green +- [ ] Coolify deploy (should work without host-side fallback after C3) +- [ ] /api/version=1.4.22 confirmed +- [ ] Production smoke + e2e workflow on main passes (e2e fix wave + from develop is included in the release-merge) +- [ ] GH release +- [ ] Docs site + landing site sync +- [ ] `docs/audit/v1422-summary.md` (release brief) +- [ ] v1.5 plan refreshed for the iOS push