From 6c7fc7dc84de730953c6e2eb2d587580088ba9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 21 May 2026 23:13:21 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.4.45=20=E2=80=94=20analyti?= =?UTF-8?q?cs=209=20s=20perf=20fix=20+=20audit-marathon=20closure=20+=20v1?= =?UTF-8?q?.4.44=20hotfix=20merged?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit-marathon close: 14 waves + W10 QA + reconcile. Perf fix (analytics 9 s -> 2-3 s), Zod multi-issue rollout (41 routes), Withings parked-state automation, mobile-UI WCAG 2.5.5 close, QoL i18n + offline banner + account delete, security PII drop + replay-injection scan. Migration 0075 required. Tests 4815 -> 5076. --- .gitignore | 5 + ...ase-W11-MOBILE-UI-RESIDUAL-v1443-report.md | 66 +++ .../phase-W12-QOL-RESIDUAL-v1443-report.md | 152 +++++++ ...hase-W13-SECURITY-RESIDUAL-v1443-report.md | 167 +++++++ ...ase-W14-WITHINGS-EXTENSION-v1443-report.md | 217 +++++++++ .../phase-W6-ZOD-ROLLOUT-v1443-report.md | 175 +++++++ .../round-v1443-QA-code-reviewer-findings.md | 401 ++++++++++++++++ .planning/round-v1443-QA-design-findings.md | 192 ++++++++ .../round-v1443-QA-product-lead-findings.md | 429 ++++++++++++++++++ .planning/round-v1443-QA-security-findings.md | 203 +++++++++ .../round-v1443-QA-senior-dev-findings.md | 368 +++++++++++++++ .../round-v1443-QA-simplifier-findings.md | 218 +++++++++ CHANGELOG.md | 104 +++++ messages/de.json | 51 ++- messages/en.json | 37 +- messages/es.json | 37 +- messages/fr.json | 37 +- messages/it.json | 37 +- messages/pl.json | 37 +- package.json | 3 +- .../0075_v1443_integration_park/migration.sql | 46 ++ prisma/schema.prisma | 24 +- public/sw.js | 17 +- scripts/__tests__/generate-sw-version.test.ts | 72 +++ scripts/generate-sw-version.mjs | 37 ++ .../api/auth/check-user/route.test.ts | 34 +- .../dashboard-tile-strip-skeleton.test.ts | 72 +++ src/app/__tests__/not-found-copy.test.ts | 77 ++++ .../feedback/[id]/__tests__/route.test.ts | 93 ++++ src/app/api/admin/feedback/[id]/route.ts | 4 +- .../admin/settings/__tests__/route.test.ts | 42 ++ .../assistant-flags/__tests__/route.test.ts | 43 ++ .../admin/settings/assistant-flags/route.ts | 4 +- src/app/api/admin/settings/route.ts | 4 +- .../admin/users/[id]/__tests__/route.test.ts | 36 ++ src/app/api/admin/users/[id]/route.ts | 4 +- .../auth/check-user/__tests__/route.test.ts | 154 +++++++ src/app/api/auth/check-user/route.ts | 35 +- .../auth/login/__tests__/native-token.test.ts | 21 +- .../api/auth/login/__tests__/route.test.ts | 18 +- src/app/api/auth/login/route.ts | 15 +- .../api/auth/passkey/login-options/route.ts | 14 +- .../__tests__/native-token.test.ts | 14 +- .../api/auth/passkey/login-verify/route.ts | 11 +- .../api/auth/password/__tests__/route.test.ts | 116 +++++ src/app/api/auth/password/route.ts | 4 +- src/app/api/auth/refresh/route.ts | 13 +- .../api/auth/register/__tests__/route.test.ts | 118 +++++ src/app/api/auth/register/route.ts | 18 +- src/app/api/bugreport/__tests__/route.test.ts | 101 +++++ src/app/api/bugreport/route.ts | 4 +- .../api/consent/ai/__tests__/route.test.ts | 40 ++ .../consent/ai/latest/__tests__/route.test.ts | 44 ++ src/app/api/consent/ai/latest/route.ts | 11 +- src/app/api/consent/ai/route.ts | 9 +- .../__tests__/route.test.ts | 148 ++++++ .../dashboard/chart-overlay-prefs/route.ts | 37 +- src/app/api/dashboard/widgets/route.ts | 38 +- src/app/api/devices/__tests__/route.test.ts | 75 +++ src/app/api/devices/route.ts | 29 +- src/app/api/feedback/__tests__/route.test.ts | 50 ++ src/app/api/feedback/route.ts | 4 +- .../ingest/medication/__tests__/route.test.ts | 147 ++++++ src/app/api/ingest/medication/route.ts | 24 +- src/app/api/insights/chat/route.ts | 41 ++ .../healthkit/__tests__/route.test.ts | 83 ++++ src/app/api/integrations/healthkit/route.ts | 28 +- .../withings/resume/__tests__/route.test.ts | 109 +++++ .../api/integrations/withings/resume/route.ts | 56 +++ .../measurements/[id]/__tests__/route.test.ts | 134 ++++++ src/app/api/measurements/[id]/route.ts | 22 +- .../__tests__/group-by-day.test.ts | 6 + .../__tests__/zod-multi-issue.test.ts | 253 +++++++++++ src/app/api/measurements/route.ts | 66 ++- .../series/__tests__/route.test.ts | 65 ++- src/app/api/measurements/series/route.ts | 26 +- .../medications/[id]/__tests__/route.test.ts | 102 +++++ .../[id]/cadence/__tests__/route.test.ts | 36 ++ src/app/api/medications/[id]/cadence/route.ts | 9 +- .../[id]/glp1/__tests__/route.test.ts | 52 +++ src/app/api/medications/[id]/glp1/route.ts | 4 +- .../intake/[eventId]/__tests__/route.test.ts | 141 ++++++ .../[id]/intake/[eventId]/route.ts | 31 +- .../[id]/intake/__tests__/route.test.ts | 113 ++++- .../intake/import/__tests__/route.test.ts | 151 ++++++ .../medications/[id]/intake/import/route.ts | 29 +- src/app/api/medications/[id]/intake/route.ts | 43 +- .../[itemId]/__tests__/route.test.ts | 126 +++++ .../[id]/inventory/[itemId]/route.ts | 4 +- .../[id]/inventory/__tests__/route.test.ts | 47 ++ .../api/medications/[id]/inventory/route.ts | 4 +- src/app/api/medications/[id]/route.ts | 4 +- .../[id]/side-effects/__tests__/route.test.ts | 67 +++ .../medications/[id]/side-effects/route.ts | 7 +- .../api/medications/__tests__/route.test.ts | 108 +++++ .../intake/__tests__/route.test.ts | 90 ++++ .../intake/bulk/__tests__/route.test.ts | 153 +++++++ src/app/api/medications/intake/bulk/route.ts | 24 +- src/app/api/medications/intake/route.ts | 42 +- src/app/api/medications/route.ts | 5 +- .../mood-entries/[id]/__tests__/route.test.ts | 134 ++++++ src/app/api/mood-entries/[id]/route.ts | 22 +- .../api/mood-entries/__tests__/route.test.ts | 176 +++++++ .../mood-entries/bulk/__tests__/route.test.ts | 155 +++++++ src/app/api/mood-entries/bulk/route.ts | 24 +- src/app/api/mood-entries/route.ts | 42 +- src/app/api/tokens/__tests__/route.test.ts | 120 +++++ src/app/api/tokens/route.ts | 29 +- .../user/thresholds/__tests__/route.test.ts | 110 +++++ src/app/api/user/thresholds/route.ts | 4 +- src/app/global-error.tsx | 29 +- .../insights/__tests__/page-skeletons.test.ts | 54 +++ src/app/insights/page.tsx | 6 +- src/app/not-found.tsx | 20 +- src/app/page.tsx | 55 ++- .../motion-reduce-spin-coverage.test.ts | 67 +++ .../admin/api-token-overview-section.tsx | 2 +- src/components/admin/backups-section.tsx | 10 +- .../admin/system-status-section.tsx | 4 +- .../charts/__tests__/chart-skeleton.test.tsx | 17 + .../health-chart-no-data-in-range.test.tsx | 77 ++++ .../charts/chart-overlay-controls.tsx | 4 +- src/components/charts/chart-skeleton.tsx | 37 ++ src/components/charts/health-chart.tsx | 35 +- .../dashboard/recent-workouts-tile.tsx | 5 +- .../doctor-report-section-toggles.test.tsx | 177 ++++++++ .../doctor-report/doctor-report-dialog.tsx | 112 ++++- .../correlation-card-skeleton.test.ts | 49 ++ .../__tests__/message-thread.test.tsx | 9 +- .../insights/coach-panel/message-thread.tsx | 7 +- src/components/insights/correlation-card.tsx | 7 +- src/components/insights/daily-briefing.tsx | 10 +- .../insights/insights-tab-strip.tsx | 2 +- src/components/insights/trend-annotation.tsx | 6 +- .../layout/__tests__/offline-banner.test.tsx | 96 ++++ src/components/layout/auth-shell.tsx | 8 + src/components/layout/offline-banner.tsx | 76 ++++ .../measurements/measurement-list.tsx | 32 +- src/components/medications/DrugLevelChart.tsx | 6 +- .../medications/phase-config-dialog.tsx | 4 +- src/components/mood/mood-list.tsx | 2 +- src/components/onboarding/WelcomeCarousel.tsx | 6 +- .../advanced-account-delete.test.tsx | 107 +++++ .../integration-status-pill.test.tsx | 23 + .../__tests__/integrations-section.test.tsx | 44 ++ src/components/settings/about-section.tsx | 2 +- src/components/settings/account-section.tsx | 6 +- src/components/settings/advanced-section.tsx | 141 +++++- src/components/settings/ai-section.tsx | 6 +- .../settings/integration-status-pill.tsx | 45 +- .../settings/integrations-section.tsx | 113 ++++- src/components/settings/sources-section.tsx | 2 +- src/components/ui/switch.tsx | 8 +- .../__tests__/format-active-locale.test.ts | 117 +++++ .../__tests__/format-date-or-relative.test.ts | 108 +++++ .../__tests__/rate-limit-auth-surface.test.ts | 213 +++++++++ src/lib/ai/coach/__tests__/snapshot.test.ts | 176 +++++++ src/lib/audit-dedup.ts | 44 ++ src/lib/auth/__tests__/passkey.test.ts | 139 ++++++ src/lib/auth/passkey.ts | 87 +++- src/lib/format.ts | 67 ++- src/lib/integrations/__tests__/status.test.ts | 309 ++++++++++++- src/lib/integrations/status.ts | 408 +++++++++++++++-- src/lib/rate-limit.ts | 63 +++ tests/integration/coach-chat.test.ts | 64 +++ tests/integration/integration-status.test.ts | 107 +++++ .../settings-account-delete.test.ts | 220 +++++++++ 167 files changed, 11233 insertions(+), 371 deletions(-) create mode 100644 .planning/phase-W11-MOBILE-UI-RESIDUAL-v1443-report.md create mode 100644 .planning/phase-W12-QOL-RESIDUAL-v1443-report.md create mode 100644 .planning/phase-W13-SECURITY-RESIDUAL-v1443-report.md create mode 100644 .planning/phase-W14-WITHINGS-EXTENSION-v1443-report.md create mode 100644 .planning/phase-W6-ZOD-ROLLOUT-v1443-report.md create mode 100644 .planning/round-v1443-QA-code-reviewer-findings.md create mode 100644 .planning/round-v1443-QA-design-findings.md create mode 100644 .planning/round-v1443-QA-product-lead-findings.md create mode 100644 .planning/round-v1443-QA-security-findings.md create mode 100644 .planning/round-v1443-QA-senior-dev-findings.md create mode 100644 .planning/round-v1443-QA-simplifier-findings.md create mode 100644 prisma/migrations/0075_v1443_integration_park/migration.sql create mode 100644 scripts/__tests__/generate-sw-version.test.ts create mode 100644 scripts/generate-sw-version.mjs create mode 100644 src/app/__tests__/dashboard-tile-strip-skeleton.test.ts create mode 100644 src/app/__tests__/not-found-copy.test.ts create mode 100644 src/app/api/admin/feedback/[id]/__tests__/route.test.ts create mode 100644 src/app/api/auth/check-user/__tests__/route.test.ts create mode 100644 src/app/api/auth/password/__tests__/route.test.ts create mode 100644 src/app/api/auth/register/__tests__/route.test.ts create mode 100644 src/app/api/bugreport/__tests__/route.test.ts create mode 100644 src/app/api/dashboard/chart-overlay-prefs/__tests__/route.test.ts create mode 100644 src/app/api/ingest/medication/__tests__/route.test.ts create mode 100644 src/app/api/integrations/withings/resume/__tests__/route.test.ts create mode 100644 src/app/api/integrations/withings/resume/route.ts create mode 100644 src/app/api/measurements/[id]/__tests__/route.test.ts create mode 100644 src/app/api/measurements/__tests__/zod-multi-issue.test.ts create mode 100644 src/app/api/medications/[id]/__tests__/route.test.ts create mode 100644 src/app/api/medications/[id]/intake/[eventId]/__tests__/route.test.ts create mode 100644 src/app/api/medications/[id]/intake/import/__tests__/route.test.ts create mode 100644 src/app/api/medications/[id]/inventory/[itemId]/__tests__/route.test.ts create mode 100644 src/app/api/medications/__tests__/route.test.ts create mode 100644 src/app/api/medications/intake/bulk/__tests__/route.test.ts create mode 100644 src/app/api/mood-entries/[id]/__tests__/route.test.ts create mode 100644 src/app/api/mood-entries/__tests__/route.test.ts create mode 100644 src/app/api/mood-entries/bulk/__tests__/route.test.ts create mode 100644 src/app/api/tokens/__tests__/route.test.ts create mode 100644 src/app/api/user/thresholds/__tests__/route.test.ts create mode 100644 src/app/insights/__tests__/page-skeletons.test.ts create mode 100644 src/components/__tests__/motion-reduce-spin-coverage.test.ts create mode 100644 src/components/charts/__tests__/health-chart-no-data-in-range.test.tsx create mode 100644 src/components/doctor-report/__tests__/doctor-report-section-toggles.test.tsx create mode 100644 src/components/insights/__tests__/correlation-card-skeleton.test.ts create mode 100644 src/components/layout/__tests__/offline-banner.test.tsx create mode 100644 src/components/layout/offline-banner.tsx create mode 100644 src/components/settings/__tests__/advanced-account-delete.test.tsx create mode 100644 src/lib/__tests__/format-active-locale.test.ts create mode 100644 src/lib/__tests__/format-date-or-relative.test.ts create mode 100644 src/lib/__tests__/rate-limit-auth-surface.test.ts create mode 100644 src/lib/audit-dedup.ts create mode 100644 src/lib/auth/__tests__/passkey.test.ts create mode 100644 tests/integration/settings-account-delete.test.ts diff --git a/.gitignore b/.gitignore index f32cec364..77f714f60 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,11 @@ next-env.d.ts # prisma generated /src/generated/prisma +# v1.4.43 QoL (L3) — generated at build time by +# scripts/generate-sw-version.mjs; loaded by public/sw.js to key +# the cache-version baseline. +/public/sw-version.js + # v1.4.27 B3 — MaxMind GeoLite2 databases are fetched at build time # via `scripts/fetch-geolite2.sh`. Too large for git; license key # required. The folder + a `.gitkeep` are tracked so the Dockerfile diff --git a/.planning/phase-W11-MOBILE-UI-RESIDUAL-v1443-report.md b/.planning/phase-W11-MOBILE-UI-RESIDUAL-v1443-report.md new file mode 100644 index 000000000..48705d8c2 --- /dev/null +++ b/.planning/phase-W11-MOBILE-UI-RESIDUAL-v1443-report.md @@ -0,0 +1,66 @@ +# Phase W11-MOBILE-UI-RESIDUAL — v1.4.43 + +**Branch**: `w11-mobile-ui-residual-v1443` (pushed to origin) +**Base**: `origin/develop` (rebased clean onto every new tip during the wave) +**Scope source**: `.planning/round-v1443-AUDIT-mobile-ui-findings.md` + +## Items closed + +| Item | Status | Commit | +|---|---|---| +| M1 — `Loader2 animate-spin` missing `motion-reduce:animate-none` (21 sites) | Closed | `16a85b53` | +| M2 — `phase-config-dialog.tsx` Input + Button 32 px + `text-sm` | Closed | `cd160a3f` | +| M3 — Insights dynamic skeletons height mismatch | Closed (with L4) | `37988bbb` | +| M4 — `correlation-card.tsx` scatter skeleton aspect-ratio mismatch | Closed | `f87265df` | +| M5 — Dashboard "blocked-then-burst" tile-strip during slow slim | Closed | `125a2e31` | +| M6 — `health-chart.tsx` empty-window silently `return null` | Closed | `24ff6754` | +| L1 — Insights tab-strip group-popover `min-h-10` | Closed | `3aca96ec` | +| L2 — `chart-overlay-controls.tsx` `size="sm"` + stretched `min-h-11` mix | Closed | `0b25ba40` | +| L4 — `next/dynamic` insights skeletons missing `motion-reduce:animate-none` | Closed (folded with M3) | `37988bbb` | +| L6 — `RecentWorkoutsTile` + `DrugLevelChart` unreserved loading height | Closed | `b6bc77f4` | + +## Items deferred + why + +- **L3 — Textarea primitive** — out of scope per handoff (`Defer (do NOT do in this wave) — L3 Textarea primitive — bigger refactor with 6+ call-sites, defer to v1.4.44 standalone wave`). +- **L5 — `injection-site-picker.tsx:178` `
` → `