chore(planning): bootstrap v1.4.19 marathon

Polish/bugfix release. Wave A spans eight buckets — BD-Zielbereich
constant 50% (4th attempt, live-DB audit), charts mobile axis-label
overflow + X-tick-density consistency, /insights polish with
comparison-toggle relocation and placeholder-leak cleanup, AI prompt
rework dropping the auto "Datengrundlage stark" first sentence,
Settings/Integrations status-UI consolidation, Settings mobile audit,
Admin polish (Feedback tabs, api-tokens 4th attempt via ellipsis +
tooltip, Zielwerte i18n + whitespace), and a write-only quality-of-
life audit feeding Wave B. Wave D ends on a Product-Lead pass briefed
for the next strategic milestone (Insights redesign + AI Coach).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.7 committed 2026-05-10 12:51:33 +02:00
1 parent 106ef2de5b
commit 56729a7de3
3 files changed
+284 -322

No files matched your search

+47 -16
View File
@@ -1,30 +1,61 @@
# HealthLog v1.4.18 — roadmap
# HealthLog v1.4.19 — roadmap
Milestone: **v1.4.18** (kicked off 2026-05-10)
Latest tag at start: v1.4.17 (live in prod, image digest
`sha256:936e9cf2…`)
Milestone: **v1.4.19** (kicked off 2026-05-10)
Latest tag at start: v1.4.18 (live in prod, image digest
`sha256:c636fca7db66…`)
| Phase | Goal | State |
| ----- | -------------------------------------------------------------------------------------------------------------- | ------- |
| 0 | Bootstrap — STATE+ROADMAP for v1.4.18, git sanity, single chore commit | done |
| A1 | BD-Zielbereich tile — 7T/30T sub-values render real numbers (currently "—" even with data) | pending |
| A2 | `/admin/api-tokens` table scrollbar (3rd attempt) — Playwright live-verify against prod, fix actual overflow | pending |
| A3 | Chart visual revert + per-chart toggles — drop gradient/emoji/auto-mean, ship 3 opt-in overlay toggles | pending |
| B1 | Achievements expansion — research + 15-25 new, hidden Easter-eggs, lock filter, hidden cards | pending |
| D | Multi-agent QA + Product-Lead — code-reviewer, security, design (Apple-Health lens), senior, simplify, product | pending |
| E | Release v1.4.18 — bump, CHANGELOG, tag, GHCR, deploy, /api/version=1.4.18, smoke, docs+landing sync | pending |
| Phase | Goal | State |
| ----- | -------------------------------------------------------------------------------------------------------------------------- | ------- |
| 0 | Bootstrap — STATE+ROADMAP for v1.4.19, git sanity, single chore commit | done |
| A1 | BD-Zielbereich constant 50% (4th attempt) — live-DB audit, root-cause calc bug, integration test | pending |
| A2 | Charts mobile audit — axis-label overflow, X-axis density consistency across charts, universal tick helper | pending |
| A3 | `/insights` polish — drop dashboard comparison toggle, reposition on insights, consolidate refresh, kill placeholder leaks | pending |
| A4 | AI prompt — drop default "Datengrundlage stark" first sentence, only mention data quality when low | pending |
| A5 | Settings/Integrations status-UI — single tag per integration, Mood Log divider, mobile-safe wrap | pending |
| A6 | Settings mobile audit — equalize input heights, Sprache positioning, right-side button alignment, consistent spacing | pending |
| A7 | Admin polish — Feedback tab scrollbar, api-tokens 4th attempt (ellipsis+tooltip), Zielwerte whitespace + DE labels | pending |
| A8 | Quality-of-life audit — write-only findings list (descriptions, redundancies, missing labels, inconsistencies) | pending |
| B | Apply A8 findings — fix CRITICAL/HIGH from quality-of-life audit | pending |
| D | Multi-agent QA + Product-Lead — code-reviewer, security, design, senior, simplify, product-lead (v1.4.20 strategic) | pending |
| E | Release v1.4.19 — bump, CHANGELOG, tag, GHCR, deploy, /api/version=1.4.19, smoke, docs+landing sync | pending |
Stop conditions: production red, large un-spec'd issue, context cutoff,
or budget short of polish — write status doc, do not auto-rollback.
Time-runs-short minimum to ship v1.4.18: Wave A (any subset) + Wave D
Time-runs-short minimum to ship v1.4.19: Wave A (any subset) + Wave D
- Phase E. Wave B (B1 achievements) is deferrable to v1.4.19 if context
budget tightens.
- Phase E. Wave B (A8-driven inline fixes) is deferrable to v1.4.20 if
context budget tightens.
Phase 0 spec for this marathon: orchestrator user message in this
session (not stored to disk).
Reserved next strategic milestones:
- **v1.4.20** — Insights redesign with AI Coach (research-driven, after
v1.4.19; design handoff at
`~/Downloads/design_handoff_insights_redesign`).
- **v1.5** — iOS app + Apple Health integration.
---
## Previous milestone — v1.4.18 (completed 2026-05-10T11:45+02:00)
| Phase | Goal | State |
| ----- | ---------------------------------------------------------------------------------------------------------- | ----- |
| 0 | Bootstrap — STATE+ROADMAP for v1.4.18 | done |
| A1 | BD-Zielbereich tile — 7T/30T sub-values render real numbers (currently "—" even with data) | done |
| A2 | `/admin/api-tokens` table scrollbar (3rd attempt) — Playwright live-verify against prod, fix actual offender | done |
| A3 | Chart visual revert + per-chart toggles — drop gradient/emoji/auto-mean, ship 3 opt-in overlay toggles | done |
| B1 | Achievements expansion — research + 15-25 new, hidden Easter-eggs, lock filter, hidden cards | done |
| D | Multi-agent QA + Product-Lead — code-reviewer, security, design, senior, simplify, product | done |
| E | Release v1.4.18 — bump, CHANGELOG, tag, GHCR, deploy, /api/version=1.4.18, smoke, docs+landing sync | done |
Marathon completed 2026-05-10T11:45+02:00 — v1.4.18 LIVE in prod.
Full report: `docs/audit/v1418-summary.md`. Backlog seeded to
`.planning/v1419-backlog.md` (tactical) and `.planning/v15-backlog.md`
+ `.planning/phase-D-v1418-product-lead-review.md` (strategic).
---
## Previous milestone — v1.4.17 hotfix (live 2026-05-10T07:58+00:00)
+172 -261
View File
@@ -1,296 +1,207 @@
# v1.4.18 marathon — state log
# v1.4.19 marathon — state log
Status: finished
Last update: 2026-05-10T11:45+02:00
Status: phase-0-done
Last update: 2026-05-10T12:48+02:00
> Previous milestone: v1.4.17 hotfix shipped (`/insights` TypeError fix);
> v1.4.16 full release at `docs/audit/v1416-summary.md`.
> Previous milestone: v1.4.18 live (image digest
> `sha256:c636fca7db66…`, `/api/version=1.4.18`).
> Next strategic milestone: v1.4.20 = Insights redesign with AI Coach
> (handoff at `~/Downloads/design_handoff_insights_redesign`).
> v1.5 reserved for iOS app + Apple Health integration.
## Phase 0 — Bootstrap
- [x] STATE+ROADMAP rewritten for v1.4.18
- [x] STATE+ROADMAP rewritten for v1.4.19
- [x] git status clean
- Result: ok / commit `<sha>`
- Detailed report: `.planning/phase-0-report.md`
## Wave A — Quick fixes (parallel buckets)
## Wave A — Bug fixes + polish (parallel buckets)
### A1 — BD-Zielbereich tile 7T/30T sub-values
### A1 — BD-Zielbereich constant 50% (4th attempt)
- [x] Investigate why "7T: —" / "30T: —" render even when user has data
- [x] Fix data source / aggregation for the sub-values
- [x] E2E test against tile rendering with real measurement data
- [ ] Live-DB audit of Marc's BP measurements (he granted access)
- [ ] Identify why all three windows (7T, 30T, total) show exactly 50%
— likely calculation bug, NOT predicate
- [ ] Root-cause fix + integration test that reproduces with Marc's
exact data fixture
- Detailed report: `.planning/phase-A1-report.md`
- Status: 2026-05-09T10:15+02:00 — done. Root cause was an
unfinished tile wire: `/api/analytics` only computed a single
30-day `bpInTargetPct`, and the dashboard tile passed
`avg7={null}, avg30={null}` so the sub-values rendered "—" no
matter how much data the user had. Added a windowed helper
`computeBpInTargetWindows()` (re-uses the v1.4.16 A2 ceiling
predicate, filters input by `measuredAt`), surfaced
`bpInTargetPct7d` / `bpInTargetPct30d` from the route, and wired
them through the tile. 6 new unit tests + 2 new testcontainer
integration tests, all green. Commit `23363ca` on origin/main.
### A2 — `/admin/api-tokens` table scrollbar (3rd attempt, Playwright live-verified)
### A2 — Charts mobile audit (axis-label overflow + X-axis density consistency)
- [x] Inspect prod (https://healthlog.bombeck.io/admin/api-tokens) at
Pixel 5 viewport with Playwright headless using Marc's session
cookie `cmox4d6fj000101p8w9ykhcnm`
- [x] Identify the exact element causing horizontal overflow (could be
page-level, not table-level)
- [x] Fix the actual overflow source (not just table column-hide which
earlier attempts already did)
- [x] Playwright e2e against PROD asserts no horizontal scroll at 393×851
- [ ] Playwright headless against live prod at Pixel 5 + smaller
viewports
- [ ] "Wochendurchschnitt" + "7T/30T/90T/Alle" tabs wrap-break:
shorten the label or hide on mobile
- [ ] Medication chart shows every date on X; weight/BMI charts
sparser. Make consistent across all charts
- [ ] Apply universal x-axis tick-density helper
- Detailed report: `.planning/phase-A2-report.md`
- Status: 2026-05-10T10:21+02:00 — done. Production probe at Pixel-5
with Marc's session pinned the painted scrollbar to the AdminShell
mobile section strip (13 entries, scrollWidth ~1700 vs clientWidth
~360), NOT the api-tokens table. Every previous attempt fixed the
wrong component because the strip sits right above the api-tokens
card. Added `no-scrollbar` utility to globals.css and applied to
both AdminShell + SettingsShell mobile strips (same defect, same
pattern); swipe + keyboard-arrow scrolling preserved. Document-
level overflow already 0 in prod
(innerWidth=scrollWidth=393). Tests: 1559/1559, typecheck clean,
lint 0/12-baseline. New AdminShell unit suite + settings-shell
assertion + e2e regression guard. Commit `3e16074` on origin/main.
### A3 — Chart visual revert + per-chart toggles
### A3 — /insights polish + Comparison switch move
- [x] Remove gradient-fill background (B1a `<ChartLinearGradient>` +
chart wrapper area-fill)
- [x] Remove emoji/smiley glyphs from mood-chart data points (replace
with simple dots or numeric)
- [x] Remove auto-overlay personal-baseline / mean line (only show when
actively requested)
- [x] Add per-chart overlay-controls component: 3 toggles
(showTrendIndicator / showTrendArrow / showTargetRange) per chart
- [x] Persist per-user per-chart overlay state (extended
dashboardLayout JSON with `chartOverlayPrefs`, no Prisma
migration; new PUT `/api/dashboard/chart-overlay-prefs`)
- [x] Default state: all overlays OFF (clean line is the default)
- [x] Keep the v1.4.16 wins that Marc didn't reject: smooth
interpolation, rich tooltip, animation-on-render
- [ ] Remove Comparison-toggle from Dashboard (insights only)
- [ ] Re-position Comparison-toggle on /insights (find the right spot
— research §4 said next to range tabs)
- [ ] Consolidate refresh-buttons (page-level vs card-level — pick
ONE)
- [ ] "Persönlicher AI Berater" title without content → fix or remove
(placeholder leaked through?)
- [ ] Remove small BP/Weight tiles on /insights (duplicate of
dashboard, wastes space)
- [ ] Fix raw "metric: blood_pressure_sweet" template leak at bottom
(debug code or unrendered placeholder)
- Detailed report: `.planning/phase-A3-report.md`
- Status: 2026-05-09T10:36+02:00 — done. Six atomic commits on
origin/main: gradient-fill revert + chart-gradient module deleted,
mood-chart emoji glyphs replaced with plain dots, personal-baseline
ReferenceLine gated behind the Trend toggle on health-chart and
mood-chart, new `chart-overlay-controls.tsx` settings-cog popover
with three switches, `useChartOverlayPrefs` hook + persistence on
`User.dashboardWidgetsJson.chartOverlayPrefs` (mirrors B8 pattern,
migration-free), Playwright + vitest coverage. Tests:
1569/1569 + integration 63/63, typecheck clean, lint 12/12 baseline
warnings. Worktree `../HealthLog-a3` on branch
`agent/a3-charts-revert`.
## Wave B — Achievements expansion (with research)
### A4 — AI prompt anpassen (no "Datengrundlage stark" as default first sentence)
### B1 — Achievements expansion
- [ ] Edit `src/lib/ai/prompts/insight-generator.ts`
- [ ] Remove the auto-positive-first-sentence about data quality
- [ ] Only mention data quality when low (helpful: "based on limited
data, treat with caution") not when fine
- [ ] Update tests
- Detailed report: `.planning/phase-A4-report.md`
- [x] Research what achievements make sense for HealthLog's tracked
metrics (BP / weight / pulse / mood / medication / streaks /
consistency / first-time / milestone)
- [x] Benchmark Apple Health badges, Withings, Oura — what works in
consumer health
- [x] Author the new achievement set (15 public, target was 15-25)
- [x] Hidden / Easter-egg achievements (6, target was 5-8)
- [x] Discovery filter: locked public badges only render when the
user has data for the metric; already-unlocked + hidden always
render; summary recomputed from the visible set so headline
counters match the rendered list.
- [x] Hidden achievements paint opaque "Hidden achievement" cards;
real strings never reach the DOM until unlock; toast on unlock
uses a longer Sparkles celebration with a localized "you
unlocked a hidden achievement!" headline.
- [x] Result: roster 38 → 59 (+21 = 15 public + 6 hidden). Tests:
1598/1598 unit, 62/62 integration, typecheck clean, lint
unchanged. Commits `75c74f1...e75ea75` on origin/main.
- Detailed report: `.planning/phase-B1-report.md`
### A5 — Settings/Integrations status-UI consolidation (Withings + Mood Log)
## Wave D — QA + Product-Lead review
- [ ] Single tag top-right per integration: "verbunden · vor X min"
- [ ] Remove redundant container with "verbunden / letzte
erfolgreiche / letzter Versuch" / bottom "letzter Sync" — pick
ONE place
- [ ] Mood Log container missing visual divider → add (consistency
with Withings)
- [ ] Mobile-safe: tag wraps gracefully on Pixel 5
- Detailed report: `.planning/phase-A5-report.md`
- [x] code-reviewer (1 CRITICAL, 5 HIGH, 7 MED/LOW)
- [x] security review (0 CRITICAL, 2 HIGH, 3 MED/LOW)
- [x] design / UX review (0 CRITICAL, 3 HIGH, 11 MED/LOW)
- [x] senior-dev review (0 CRITICAL, 0 HIGH, 6 MED/LOW)
- [x] simplify (7 apply-yes, 0 apply-no)
- [x] Product Lead — strategic v1.5 update filed
- [x] Reconcile applies CRITICAL/HIGH inline
- Status: 2026-05-10T11:08+02:00 — done. C1 hidden-achievement
wire-leak fixed (`545f44c`); 8 of 10 HIGH fixed inline (1
deferred to v1.4.19 — security HIGH-2 i18n bundle strip needs
a build-time hook), all 7 simplify-yes applied (`720e6c8`).
Format sweep across the tree (`3048dd6`). Tests: 1605/1605
unit, 66/66 integration. Typecheck + lint + format-check
clean. Backlog seeded to `v1419-backlog.md`; strategic v1.5
items added to `v15-backlog.md`. Detailed report:
`.planning/phase-D-reconcile-report.md`. Commits on
origin/main: `545f44c`, `720e6c8`, `fbf14fc`, `194ec2f`,
`cf75579`, `c6e3ac6`, `3048dd6`.
### A6 — Settings mobile audit + consistency
## Phase E — Release v1.4.18
- [ ] Playwright headless audit `/settings/account`,
`/settings/profile`, `/settings/integrations`,
`/settings/notifications`, `/settings/ai`,
`/settings/dashboard`, `/settings/export`
- [ ] Equalize input heights (Username/Email/Geburtsdatum)
- [ ] Sprache-Menü positioning consistent
- [ ] Right-side action buttons (Passwort Reset, Tool Neustarten)
consistent vertical position
- [ ] Spacing between elements consistent
- Detailed report: `.planning/phase-A6-report.md`
- [x] Pre-release verify
- [x] Bump package.json + CHANGELOG
- [x] Tag + push v1.4.18
- [x] GHCR build green (both main + tag)
- [x] Coolify deploy
- [x] /api/version=1.4.18 confirmed
- [x] Production smoke
- [x] GH release
- [x] Docs site + landing site sync
- [x] `docs/audit/v1418-summary.md` (Marc-Brief)
- Detailed reports: `.planning/phase-E1-report.md`, `phase-E2-report.md`, `phase-E3-report.md`
- Status: 2026-05-10T11:14+02:00 — Phase E1 done. Verify clean
(typecheck 0, lint 0/12-baseline, format-check clean, unit
1605/1605, integration 66/66). Release commit `0243e20`
(package.json 1.4.17 → 1.4.18 + CHANGELOG entry, English,
sections Added / Changed / Fixed / Deferred). Tag `v1.4.18`
annotated, pushed alongside `c072ad8..0243e20 main -> main`.
GHCR tag-build run id `25624945158` in_progress; main builds
`25624944860` (security) + `25624944855` (integration) also
in_progress. ZERO unresolved CRITICAL; one HIGH (security
HIGH-2 i18n bundle leak) deferred to v1.4.19 per
`.planning/v1419-backlog.md`.
### A7 — Admin polish (Feedback, api-tokens 4th attempt, Zielwerte, i18n)
- [ ] Admin Feedback "offen/bestätigt/erledigt/archiviert" tabs has
spurious mini-scrollbar → remove
- [ ] `/admin/api-tokens` scrollbar 4th attempt: truncate token-name
with `text-ellipsis` + tooltip on hover (not column-hide)
- [ ] `/admin/api-tokens` "Einklappen" button removed (page only has
1 section)
- [ ] Admin Zielwerte page: reduce whitespace between overview header
and values
- [ ] Translate Zielwerte status labels: "Low / On Target / Stable /
Moderate" → DE
- Detailed report: `.planning/phase-A7-report.md`
### A8 — Quality-of-life audit (write-only, fix-set deferred to inline B agent)
- [ ] Audit descriptions correctness across all pages
- [ ] Find redundancies + missing labels
- [ ] Find UI inconsistencies (text styling, spacing, button
alignment)
- [ ] Output prioritized list for inline fixing
- Detailed report: `.planning/phase-A8-quality-findings.md`
## Wave B — Apply A8 findings (after A8 completes)
- [ ] Fix CRITICAL/HIGH from quality-of-life audit
- Detailed report: `.planning/phase-B-report.md`
## Wave D — Multi-agent QA + Product-Lead review
- [ ] code-reviewer
- [ ] security review
- [ ] design / UX review
- [ ] senior-dev review
- [ ] simplify
- [ ] Product Lead — strategic for v1.4.20 (Insights redesign roadmap,
AI Coach feasibility)
- [ ] Reconcile applies CRITICAL/HIGH inline
- Detailed report: `.planning/phase-D-report.md` +
`product-lead-review.md`
## Phase E — Release v1.4.19
- [ ] Pre-release verify
- [ ] Bump package.json + CHANGELOG
- [ ] Tag + push v1.4.19
- [ ] GHCR build green
- [ ] Coolify deploy
- [ ] /api/version=1.4.19 confirmed
- [ ] Production smoke
- [ ] GH release
- [ ] Docs site + landing site sync
- [ ] `docs/audit/v1419-summary.md` (Marc-Brief)
- Detailed report: `.planning/phase-E-report.md`
---
## Status block — Phase 0 (v1.4.19)
- 2026-05-10T12:48+02:00 — Phase 0 complete. STATE.md + ROADMAP.md
scaffolded for v1.4.19 marathon (Wave A: A1 BD-Zielbereich constant
50% 4th attempt, A2 charts mobile audit + universal X-tick-density
helper, A3 `/insights` polish + Comparison-toggle relocation, A4
AI-prompt rework, A5 Settings/Integrations status-UI consolidation,
A6 Settings mobile audit, A7 Admin polish, A8 quality-of-life
write-only audit; Wave B applies A8 findings; Wave D multi-agent QA
+ Product-Lead briefed for v1.4.20 Insights redesign + AI Coach;
Phase E release). Previous v1.4.18 / v1.4.17 / v1.4.16 entries
archived above. Tracked tree clean on entry; four untracked stale
dotted-segment route directories
(`src/app/api/export/{full-backup.json,measurements.csv,
medications.csv,mood.csv}/`) left in place — same call as v1.4.16 /
v1.4.18 Phase 0, they belong to previous milestones. Phase 0 commit
contains only `.planning/STATE.md`, `.planning/ROADMAP.md`,
`.planning/phase-0-report.md`. v1.4.20 reserved for Insights
redesign with AI Coach (handoff at
`~/Downloads/design_handoff_insights_redesign`); v1.5 reserved for
iOS app + Apple Health.
---
## Previous milestone — v1.4.18 (completed 2026-05-10T11:45+02:00)
LIVE at https://healthlog.bombeck.io · `/api/version=1.4.18` · image
digest `sha256:c636fca7db66…` (was v1.4.17: `sha256:936e9cf25b2d…`).
Full Marc-Brief at `docs/audit/v1418-summary.md`. Backlog seeded to
`.planning/v1419-backlog.md` (1 HIGH i18n bundle leak + MED/LOW) and
`.planning/v15-backlog.md` / `.planning/phase-D-v1418-product-lead-review.md`
(strategic).
Phases run during v1.4.18 marathon:
- Phase 0 — Bootstrap (STATE+ROADMAP for v1.4.18)
- Wave A — A1 BD-Zielbereich tile sub-values, A2 admin-shell mobile
strip scrollbar, A3 chart visual revert + per-chart overlay
toggles
- Wave B — B1 achievements expansion (38 → 59, +6 hidden, discovery
filter, opaque hidden cards)
- Wave D — Multi-agent QA + reconcile (1 CRITICAL cleared, 8 of 10
HIGH fixed inline, 1 HIGH deferred to v1.4.19)
- Phase E1-E3 — Release v1.4.18 (tag, GHCR both green, Coolify deploy
via force-pull, GH release, docs+landing sync, Marc-Brief)
---
## Previous milestone — v1.4.17 hotfix (live 2026-05-10T07:58+00:00)
LIVE at https://healthlog.bombeck.io · `/api/version=1.4.17` · image
digest `sha256:936e9cf2…` (was v1.4.16: `sha256:05f8a126d639…`).
Triggered by Marc's `/insights` crash 6 hours after v1.4.16 went live.
Cached pre-strict insight blob (v1.4.14 shape: `{changed, stable,
drivers, nextSteps, confidence, limitations}`) fell through
`safeParse(insightResultSchema)` because the route surfaces the raw
blob when validation fails; rich `<InsightAdvisorCard>` then called
`stripChartTokens(undefined)` and crashed.
Fix:
- `isLegacyInsightPayload()` now flags blobs missing both `summary`
AND `recommendations[]` (the v1.4.14 shape) so the API surfaces
`legacyPayload: true` correctly.
- `<InsightAdvisorCard>` short-circuits to a self-contained
legacy-payload card with the regenerate CTA when `legacyPayload` is
set OR when the shape is unrenderable.
- Defense-in-depth: `stripChartTokens()` and `parseChartTokens()`
treat null/undefined as empty string / empty array.
Audit (`git grep -nE '\.replace\(' src/`): 82 hits, only the crash
site is fragile. Audit doc: `.planning/v1417-replace-audit.md`.
Verification: `pnpm typecheck` 0 errors, `pnpm lint` 0 errors / 12
pre-existing warnings, `pnpm test` 1547/1547 (+7 defensive tests),
`pnpm test:integration` 59/59.
Commits on origin/main:
- `79bfa27 fix(insights): handle legacy cached payload without rationale (regenerate CTA)`
- `adab80a chore(release): v1.4.17`
- `da7070e style(insights): prettier sweep on legacy-payload hotfix files`
GH release: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.17.
Detailed report: `.planning/phase-v1417-hotfix-report.md`.
`/insights` TypeError on legacy cached payload — `isLegacyInsightPayload()`
flag + advisor card short-circuit + defensive `stripChartTokens` /
`parseChartTokens`. Three commits: `79bfa27` (fix), `adab80a`
(release), `da7070e` (prettier). Detailed report:
`.planning/phase-v1417-hotfix-report.md`.
---
## Previous milestone — v1.4.16 (completed 2026-05-10T04:05+02:00)
LIVE at https://healthlog.bombeck.io · `/api/version=1.4.16` · image
digest `sha256:05f8a126d639…` (was v1.4.15: `sha256:ace7d441f47b…`).
Full Marc-Brief, commit table, deferred items, CI/prod state and
Phase-D reconcile detail: `docs/audit/v1416-summary.md`. Backlog seeded
to `.planning/v15-backlog.md` (11 deferred HIGH + tactical follow-ons +
Product-Lead strategic v1.5 plan).
Phases run during v1.4.16 marathon:
- Phase 0 — Bootstrap (STATE+ROADMAP for v1.4.16)
- Wave A — A1-A8 quick fixes (admin nav, BD-Zielbereich, api-tokens
responsive, 7-Tage-Trend rename, top-tile selector, medication chart
parity, AI rate-limit, umlaute fix, long-window split-half delta)
- Wave B — B1a/b chart + insights polish, B2 AI provider UX, B3
host-load chart, B4 audit-log + app-log preview, B5a-e medical
references / fallback chain / explainability / confidence /
feedback, B6 settings naming audit, B7 export consolidation, B8
comparison overlay
- Wave C — Catch-up (CI fix, 5 of 8 deferred HIGH from v1.4.15, 3 of 5
deferred MED from A5 mobile, docker-publish drop qemu-arm64)
- Wave D — Multi-agent QA + reconcile (3 CRITICAL cleared, 9 HIGH
fixed inline, 11 HIGH deferred to v1.5 backlog)
- Phase E1-E3 — Release (v1.4.16 tag, GHCR both green, Coolify deploy
with retag-on-host fallback, GH release, docs+landing sync,
Marc-Brief)
Marathon recurring meta: per-agent git-worktree adoption succeeded;
keep the rule.
---
## Status block — Phase 0 (v1.4.18)
- 2026-05-10T10:02+02:00 — Phase 0 complete. STATE.md + ROADMAP.md
scaffolded for v1.4.18 marathon (Wave A: A1-A3 quick fixes
including chart visual revert per Marc's gradient/smiley/auto-mean
feedback, Wave B: B1 achievements expansion with research, Wave D
multi-agent QA + Product-Lead, Phase E release). Previous v1.4.17
hotfix and v1.4.16 entries archived above. Working tree carries
4 untracked stale dotted-segment route directories
(`src/app/api/export/{full-backup.json,measurements.csv,
medications.csv,mood.csv}/`) plus 3 untracked v1.4.16 phase
reports (`phase-E1-report.md`, `phase-E2-report.md`,
`phase-E3-report.md`) — same call as v1.4.16 Phase 0: leave them
in place, they belong to previous milestones. Tracked files clean.
Phase 0 commit contains only `.planning/STATE.md`,
`.planning/ROADMAP.md`, `.planning/phase-0-report.md`.
## Status block — Phase E2 (v1.4.18)
- 2026-05-10T11:30+02:00 — Phase E2 complete. v1.4.18 LIVE at
https://healthlog.bombeck.io. GHCR runs 25624945158 (v1.4.18 tag) and
25624944843 (main) both `success`; image digest flipped from
`sha256:936e9cf25b2d…` (v1.4.17) to `sha256:c636fca7db66…` (v1.4.18).
Coolify still on git-push trigger so force-pulled via
`docker compose pull && docker compose up -d app` on apps-01 (the
retag-on-host fallback was not needed — `:latest` had already
refreshed). `/api/version` flipped 1.4.17 → 1.4.18 within the first
5s poll cycle. Smoke 14/14 real routes 200 (the `/dashboard` 404 in
the brief is a known stale path; HealthLog's dashboard is at `/`).
GH release v1.4.18 created via sed-extracted notes (lines 3-74 of
CHANGELOG, 72 lines): https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18.
Detailed report: `.planning/phase-E2-report.md`. No rollback action
taken (and per brief, would not have been on red).
## Status block — Phase E3 (v1.4.18)
- 2026-05-10T11:38+02:00 — Phase E3 complete. healthlog-docs:
`6688c81` (six existing pages refreshed — dashboard-customization,
gamification, comparison, admin-settings, scaling, updates) +
`e5a58bc` (new `features/achievements-hidden.mdx` page wired into
sidebar via `astro.config.mjs`). 45 Starlight pages built, 0
warnings. healthlog-landing: `ed638db` (`softwareVersion 1.4.16 →
1.4.18` in JSON-LD, featureList rewritten for clean-line aesthetic,
two capability badges updated). All three commits pushed to
origin/main on their respective repos. Detailed report:
`.planning/phase-E3-report.md`.
## Status block — Final (v1.4.18)
- 2026-05-10T11:45+02:00 — v1.4.18 marathon finished. Marc-Brief
filed at `docs/audit/v1418-summary.md` and committed to origin/main.
Top-of-file Status flipped to `finished`. v1.4.18 is LIVE at
https://healthlog.bombeck.io with `/api/version=1.4.18` and image
digest `sha256:c636fca7db66…`. Backlog seeded
(`.planning/v1419-backlog.md` for tactical, `.planning/v15-backlog.md`
+ `.planning/phase-D-v1418-product-lead-review.md` for strategic).
ZERO unresolved CRITICAL; one HIGH (security HIGH-2 i18n bundle
leak) deferred to v1.4.19. Tests: 1605/1605 unit, 66/66 integration,
typecheck clean, lint 12-baseline. CHANGELOG.md current. GH release
page live. Docs site + landing site sync committed and pushed. Next
marathon: v1.4.19 cleanup pass (i18n bundle strip + MED backlog) or
jump straight to v1.5 strategic work per Product-Lead review.
Full report: `docs/audit/v1416-summary.md`. v1.5 backlog seeded at
`.planning/v15-backlog.md`.
+65 -45
View File
@@ -1,21 +1,32 @@
# Phase 0 — v1.4.18 bootstrap report
# Phase 0 — v1.4.19 bootstrap report
Timestamp: 2026-05-10T10:02+02:00
Timestamp: 2026-05-10T12:48+02:00
Branch: `main`
Tracked-files baseline: clean (untracked-only working tree on entry).
## What landed
- `.planning/STATE.md` rewritten for v1.4.18: `Status: phase-0-done`,
Phase 0 marked complete, Wave A (A1 BD-Zielbereich tile sub-values,
A2 `/admin/api-tokens` 3rd-attempt scrollbar, A3 chart visual revert
- per-chart toggles), Wave B (B1 achievements expansion with
research + hidden Easter-eggs + lock filter), Wave D multi-agent QA
- Product-Lead, Phase E release. v1.4.17 hotfix and v1.4.16 release
blocks archived inline above.
- `.planning/ROADMAP.md` rewritten with the v1.4.18 one-liner table
for Phase 0 / A1-A3 / B1 / D / E. v1.4.17 hotfix line + the full
v1.4.16 / v1.4.15 / v1.4.14 archive tables retained beneath.
- `.planning/STATE.md` rewritten for v1.4.19: `Status: phase-0-done`,
Phase 0 marked complete, Wave A scaffolded with eight buckets (A1
BD-Zielbereich constant 50% 4th-attempt root-cause via live-DB audit,
A2 charts mobile axis-label + X-axis-density audit + universal
tick-density helper, A3 `/insights` polish + Comparison-toggle
relocation + placeholder-leak cleanup, A4 AI-prompt rework dropping
the auto "Datengrundlage stark" first sentence, A5
Settings/Integrations status-UI consolidation, A6 Settings mobile
audit + consistency, A7 Admin polish covering Feedback tabs +
api-tokens 4th attempt + Zielwerte i18n + whitespace, A8 quality-of-
life write-only audit). Wave B applies A8 findings inline. Wave D
multi-agent QA + Product-Lead briefed for v1.4.20 Insights-redesign
roadmap + AI-Coach feasibility. Phase E is the release. v1.4.18,
v1.4.17 hotfix and v1.4.16 archived inline beneath the active
scaffold.
- `.planning/ROADMAP.md` rewritten with the v1.4.19 one-liner table
for Phase 0 / A1-A8 / B / D / E. Reserved-next strategic milestones
recorded explicitly: v1.4.20 = Insights redesign with AI Coach
(handoff at `~/Downloads/design_handoff_insights_redesign`), v1.5 =
iOS app + Apple Health. v1.4.18 archived alongside the existing
v1.4.17 / v1.4.16 / v1.4.15 / v1.4.14 tables beneath.
- `.planning/phase-0-report.md` (this file).
## What did NOT land in this commit
@@ -24,39 +35,46 @@ Source files. Phase 0 is planning-only per the brief.
## Working tree on entry
Branch was already in sync with `origin/main` after v1.4.17 release
commits. Untracked items left in place (same call as v1.4.16 Phase 0):
Branch in sync with `origin/main` after the v1.4.18 release commits
(head `106ef2d docs(audit): v1.4.18 release summary`). Untracked items
left in place (same call as v1.4.16 / v1.4.18 Phase 0):
- `.planning/phase-E1-report.md`, `phase-E2-report.md`,
`phase-E3-report.md` — v1.4.16 release reports, belong to that
milestone.
- `src/app/api/export/{full-backup.json,measurements.csv,
medications.csv,mood.csv}/` — stale dotted-segment route directories;
the live plain-segment routes shipped in B7 of v1.4.16 (per
`phase-E1-report.md`).
the live plain-segment routes shipped in B7 of v1.4.16.
## Marc's v1.4.18 input
## Marc's v1.4.19 input
Four items reported by Marc, all reflected as scaffolded checklists:
Eight buckets Marc reported plus a quality-of-life audit, all
reflected as scaffolded checklists:
1. BD-Zielbereich tile shows "7T: —" / "30T: —" with real data behind
it — investigate root cause and fix the sub-value aggregation.
2. `/admin/api-tokens` table still scrolls horizontally on mobile (3rd
attempt — earlier column-hide passes addressed table-level overflow
but page-level overflow may be the real source). Live verify with
Playwright headless against prod using Marc's session cookie before
touching code.
3. Chart visual rollback — drop the v1.4.16 B1a gradient fill, drop
the mood-chart emoji glyphs, drop the auto-overlay personal-baseline
line. Replace with three opt-in toggles per chart (showTrendIndicator
/ showTargetRange / showPersonalBaseline). Default OFF. Persist
per-user per-chart. Keep smooth interpolation, rich tooltip,
animation-on-render.
4. Achievements expansion with proper research first (Apple Health,
Withings, Oura benchmarking lens). 15-25 new achievements, 5-8
hidden Easter-eggs (playful, not health-coercive). Lock filter
hides metrics user has no data for; hidden achievements appear as
"Hidden" cards (the user knows there's something to find).
1. BD-Zielbereich tile reads exactly 50% across all three windows
(7T / 30T / total) — looks like a calculation bug, not the
predicate. Marc granted live-DB access for the root-cause audit.
2. Charts at Pixel-5 viewport: "Wochendurchschnitt" + range tabs
wrap-break, and X-axis tick density is inconsistent (medication
chart shows every date, weight/BMI sparser). Universal helper.
3. `/insights` polish: Comparison-toggle move from Dashboard to
`/insights` (research §4 said next to range tabs), refresh-button
consolidation, "Persönlicher AI Berater" empty-title fix, drop the
small BP/Weight tile duplicates, kill the raw `metric:
blood_pressure_sweet` template-leak at the bottom.
4. AI prompt: stop opening every recommendation with "Datengrundlage
stark"; only mention data quality when low.
5. Settings → Integrations: single status tag top-right per
integration (Withings + Mood Log), drop the redundant container,
add the Mood Log divider, mobile-safe wrap.
6. Settings mobile audit: equalize input heights, consistent Sprache
menu position, right-side action-button alignment, consistent
spacing across all `/settings/*` pages.
7. Admin polish: Feedback tab spurious mini-scrollbar, api-tokens
4th-attempt fix via `text-ellipsis` + tooltip on hover (NOT
column-hide), drop the unnecessary "Einklappen" button, Zielwerte
whitespace + DE labels for status pills.
8. Quality-of-life write-only audit (A8) — find descriptions
correctness issues, redundancies, missing labels and UI
inconsistencies; output prioritized list. Wave B applies the
CRITICAL/HIGH inline.
## Constraints honoured
@@ -65,13 +83,15 @@ Four items reported by Marc, all reflected as scaffolded checklists:
body.
- Co-Author Claude Opus 4.7 trailer present.
- No `--no-verify`, no `--no-gpg-sign`.
- Single chore commit: `chore(planning): bootstrap v1.4.18 marathon`.
- Single chore commit: `chore(planning): bootstrap v1.4.19 marathon`.
- No source files touched.
## Next
Wave A (A1 + A2 + A3) parallel-bucket dispatch is the obvious next
step; A3's chart revert is the user-visible one Marc will notice
first. A2 wants live Playwright reproduction before any code edit.
B1 starts with a research-first pass per Marc's standing rule on
complex features — no implementation until the research doc lands.
Wave A (A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8) parallel-bucket
dispatch. A1 needs live-DB read against Marc's account before any
code change. A2 + A6 need Playwright headless against prod. A8 is
write-only and feeds Wave B. Product-Lead briefing for Wave D should
include the v1.4.20 Insights-redesign handoff at
`~/Downloads/design_handoff_insights_redesign` so the strategic review
is forward-looking, not just retrospective.