mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-07 12:22:03 +00:00
docs(planning): v1.4.22 marathon scaffold — polishing before v1.5 iOS
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) <noreply@anthropic.com>
This commit is contained in:
1 parent
16b6976c54
commit
e794f57bae
2 files changed
+147
-336
No files matched your search
+15
-4
@@ -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
|
||||
|
||||
+132
-332
@@ -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 <Type>` 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/<section>` 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 <Type>` token leak fix
|
||||
|
||||
- [x] Replace `<InsightsPageHero>` 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] `<CorrelationRow>` + `<TrendsRow>` 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] `<HealthChart>` 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 `<lg`
|
||||
open side-sheets that host the same HistoryRail / SourcesRail
|
||||
the desktop layout uses; refactored body into
|
||||
`<CoachDrawerBody>` 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 `<Sheet side="right">` with three-column
|
||||
layout on `lg+` (history rail · message thread · sources rail) and
|
||||
full-screen single-column on mobile; `<MessageThread>` renders user
|
||||
/ assistant bubbles + an in-flight streaming bubble with
|
||||
pinned-to-bottom auto-scroll; `<SourceChips>` renders provenance as
|
||||
labels-only chips (metric · window · n-count, never raw values);
|
||||
`<CoachInput>` 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; `<HistoryRail>` with substring filter
|
||||
and confirm-then-go delete; `<SourcesRail>` 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
|
||||
`<HeroStrip>` exposes a different `data-slot` value than the
|
||||
legacy `<InsightsPageHero>` 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;
|
||||
`<HealthScoreCard>` (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?"); `<HeroStrip>` 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
|
||||
Reference in new issue
Block a user