From c4f8e0c8afc3d2577de24f667cba65ccd0f6630d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 17 May 2026 15:47:18 +0200 Subject: [PATCH] docs(planning): v1.4.37 closure + post-deploy perf verification Adds the v1.4.37 row to the audit-marathon closure ledger (now six releases on 2026-05-17) with the headline numbers and the post-deploy perf-QA write-up. Live verify confirms the deploy is healthy (tag 1.4.37, build 88028fa0, reminder worker up in 772 ms, no pending migrations). The W10-1 Critical fix (DRAIN_CUMULATIVE_QUEUE registration in allQueues) is verified by clean worker boot -- absent the fix, the boot would have failed on the boss.schedule call. The W2 perf claim (full /api/analytics route 111 s cold worst-case down to 1.5-3 s) needs a real authenticated dashboard mount to surface in the logs; framework + verification path captured for when the numbers land. --- .planning/round-audit-marathon-closure.md | 5 +- .planning/round-v1437-perf-verify.md | 91 +++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 .planning/round-v1437-perf-verify.md diff --git a/.planning/round-audit-marathon-closure.md b/.planning/round-audit-marathon-closure.md index 33dfb61a4..4fc6ba946 100644 --- a/.planning/round-audit-marathon-closure.md +++ b/.planning/round-audit-marathon-closure.md @@ -1,6 +1,6 @@ -# v1.4.34.4 + v1.4.34.5 + v1.4.35 + v1.4.35.1 + v1.4.36 — Audit-Marathon Closure (extended) +# v1.4.34.4 + v1.4.34.5 + v1.4.35 + v1.4.35.1 + v1.4.36 + v1.4.37 — Audit-Marathon Closure (extended) -Shipped: 2026-05-17 (five consecutive releases on the same date as v1.4.34.3). +Shipped: 2026-05-17 (six consecutive releases on the same date as v1.4.34.3). | Tag | Highlights | Release | | --- | --- | --- | @@ -9,6 +9,7 @@ Shipped: 2026-05-17 (five consecutive releases on the same date as v1.4.34.3). | v1.4.35 | Layer B landed — persistent `measurement_rollups` foundation + partial reader read-swap on the comprehensive aggregator and the slim summaries slice | [v1.4.35](https://github.com/MBombeck/HealthLog/releases/tag/v1.4.35) | | v1.4.35.1 | Auto-converging rollup backfill on worker boot — no operator action required on self-hosted instances | [v1.4.35.1](https://github.com/MBombeck/HealthLog/releases/tag/v1.4.35.1) | | v1.4.36 | Perf, charts, AI payload trim, UX punch — heavy-aggregate skip on the rollup-fresh path, daily chart fetches opt into rollup buckets, Insights `extractFeatures` swap (25.9 MB → 30,096 tokens, **−99.5 %**), page-blocking call 10.88 s → 4.57 s (**−58 %**), per-section early-skeleton paint, intake-history list restored, About → Admin Console, auto-checking update badge, cumulative-metric tiles, IP-whois fallback | [v1.4.36](https://github.com/MBombeck/HealthLog/releases/tag/v1.4.36) | +| v1.4.37 | Final web polish before iOS focus — full `/api/analytics` route on the rollup-coverage probe (cold worst-case 111 s → **~1.5–3 s** estimated), Apple Health step consolidation (`groupBy=day` + nightly drain, **~50× row compression target**), `IntakeHistoryListV2` regression fix, Coach disable cascade with invariant test, Mounjaro/Ramipril card byte-equivalent symmetry, HealthScoreCard full-height parity, `TRUST_CF_CONNECTING_IP` env flag, Arztbericht hero card, dashboard `Medikamenteneinnahme` quick-add overlay, timezone-override removal + silent auto-seed, v1.4.36 red-CI cleanup, **README + healthlog-docs + healthlog-landing refresh with five new Dracula-palette architecture diagrams**. Unit suite 4354 → 4486 passing. | [v1.4.37](https://github.com/MBombeck/HealthLog/releases/tag/v1.4.37) | ## Audit waves diff --git a/.planning/round-v1437-perf-verify.md b/.planning/round-v1437-perf-verify.md new file mode 100644 index 000000000..93974dd74 --- /dev/null +++ b/.planning/round-v1437-perf-verify.md @@ -0,0 +1,91 @@ +# v1.4.37 post-deploy perf verification + +**Release:** v1.4.37 (`88028fa0` on main, live 2026-05-17 13:42 UTC) +**Live host:** https://healthlog.bombeck.io +**Account under test:** Marc's production account (311,779+ measurements) + +## TL;DR + +- Live tag is **1.4.37**; build hash `88028fa082085f595e5ee423839c4561c21a11c9`. +- Boot clean: reminder worker up in 772 ms; no pending migrations (the v1.4.36 `0068_v1436_insights_exclude_metrics` was already applied). +- No boot errors → the W10-1 C-1 fix landed correctly: `DRAIN_CUMULATIVE_QUEUE` registration in `allQueues` succeeded; the worker boot would have aborted on the `boss.schedule(DRAIN_CUMULATIVE_QUEUE, …)` call otherwise. +- Anonymous 401 baseline 77–130 ms on `/api/insights/comprehensive` + `/api/analytics` — identical to v1.4.36 (no auth-layer regression). +- The W2 perf carry-over (full `/api/analytics` 111 s cold worst-case → ~1.5–3 s) needs a real authenticated web load to confirm — pending Marc's next dashboard / insights mount. Framework captured below; live numbers fill in as they surface in the logs. + +## Boot trace (verified) + +``` +HealthLog: Waiting for database... +HealthLog: Database is reachable. +HealthLog: Running database migrations... +[...] +No pending migrations to apply. +HealthLog: Migrations complete. +HealthLog: Starting application... +▲ Next.js 16.2.6 +✓ Ready in 0ms +{ background.task_name: "startup", reminder_worker: "started", duration_ms: 772 } +``` + +No `boss.createQueue` errors, no schedule-registration warnings. C-1 fix verified by absence of failure. + +## Anonymous latency (auth-layer baseline) + +| Surface | Cold | Notes | +|---|---|---| +| `/api/version` | 80 ms | sanity ping, public | +| `/api/insights/comprehensive` (anon) | 77–108 ms | 401 reject | +| `/api/analytics` (anon) | 84–131 ms | 401 reject | +| `/api/health` (Uptime-Kuma) | 73 ms | health check | + +Identical envelope to v1.4.36 → no auth/middleware regression. + +## Expected authenticated wins (pending Marc's web session) + +| Surface | v1.4.36 baseline | v1.4.37 expected | Mechanism | +|---|---|---|---| +| `/api/insights/comprehensive` (cold) | 4566 ms | comparable (no changes this release) | already on rollup probe | +| `/api/analytics` slim slice | 4153 ms | comparable | already on rollup probe | +| `/api/analytics` FULL slice (correlations + healthScore + bp_in_target) | **111,092 ms** worst-case cold | **1500–3000 ms** | W2 — three branches on the rollup-coverage probe with per-branch `path` annotate | +| `/api/insights/targets` | 1609 ms cold / < 50 ms cached | unchanged | LRU same | +| `GET /api/measurements?groupBy=day&type=ACTIVITY_STEPS` (new) | n/a | < 200 ms | rollup DAY buckets, no per-sample scan | +| `GET /api/measurements?aggregate=daily&source=rollup` (existing v1.4.36) | < 100 ms | unchanged | rollup-direct | + +## Headline perf bet — full `/api/analytics` cold-path + +The W2 wave lifted correlations + healthScore + bp_in_target onto the v1.4.36 `probeRollupCoverage` probe. Each branch now: + +- consults the probe once per request +- reads from `measurement_rollups` when DAY-bucket coverage is full +- falls back to live SQL chunks when partial +- emits `meta..path: "rollup"|"live"` for prod observability + +The correlations branch additionally tightened its scan from 30 to 28 days with a `CORRELATION_WINDOW_DAYS` constant + sentinel annotate. + +**Verification path** (run once Marc loads the dashboard / insights): + +```bash +# Capture the most recent FULL /api/analytics call on Marc's account +ssh apps-01 'docker logs $(docker ps --format "{{.Names}}" | grep "^app-pg8wggwogo8c4gc4ks0kk4ss") 2>&1 | jq -c "select(.http.path == \"/api/analytics\" and (.meta?.analytics?.slim_summaries | not))" | tail -3' + +# Look for: meta.correlations.path, meta.healthScore.path, meta.bp_in_target.path +# Each should be "rollup" on Marc's account (every type has DAY coverage from the v1.4.35.1 auto-converging backfill). +``` + +If the first cold hit is < 5 s and per-branch paths are all "rollup": shipped. If any branch still says "live": the probe didn't cover — check the rollup table for that type. + +## Apple Health step consolidation (W7c) + +The new `groupBy=day` + `dayKey` modes don't run automatically — they kick in only when the UI requests them. Marc's iOS app does not yet pass these params (a v1.5 iOS sprint item), so the feature lives on the web measurement-list page for now. + +The nightly drain at 03:45 Europe/Berlin (36 h grace) will run for the first time tonight. Tomorrow the table should be ~50× smaller for cumulative HK types on Marc's account. + +## Carry-over to v1.4.38 if a number lands materially worse than estimate + +If the full `/api/analytics` cold hit stays above 5 s on Marc's account after the deploy: file v1.4.37.1 hotfix issue, investigate why the probe missed (per-type coverage gap? cache miss cascade? something downstream of the W2 work). + +If the nightly drain produces no row-count compression: the singleton-key on the pg-boss schedule may be coalescing with no-op runs; investigate the W10-2 M-2 finding (per-process singleton-guard) earlier than planned. + +## Verdict (interim — pending Marc-authenticated traffic) + +Deploy is **healthy and live**. The W10-1 Critical fix (drain queue registration) is verified by clean boot. The W2 perf claim is **framework-ready, awaiting first authenticated mount on Marc's account** to confirm cold worst-case in the 1.5–3 s range.