Files
HealthLog/docs/audit/v1415-summary.md
T
Marc-André BombeckandClaude Opus 4.7 a1cf9bcb37 docs: scrub PII + internal jargon + German leaks from user-facing artifacts
Retroactive cleanup of CHANGELOG.md and docs/audit/v1.4.X-summary.md
files. Removes maintainer's real name, specific health figures tied to
the live tenant, internal release-process jargon, and stray German
strings in English-only release notes. Pre-release PII-grep gate added
to the v1.4.20 release pipeline. No git history rewrite.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 15:14:28 +02:00

320 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HealthLog v1.4.15 — Release Summary
## Release brief (DE, ≤ 220 Wörter)
✅ **v1.4.15 ist live** auf `https://healthlog.bombeck.io` — Image-Digest
`sha256:ace7d441f47b…` (vorher v1.4.14: `0ced46004a54…`),
`/api/version` meldet `1.4.15`.
🆕 **Was ist neu**
- **Erfolge** als eigene Seite (`/achievements`) mit Locked + Progress-
Bars + Kategorien plus zuschaltbare „Letzte Erfolge"-Karte aufs
Dashboard.
- **Onboarding-Tour** beim ersten Dashboard-Besuch (Spotlight, Esc /
Pfeile, `prefers-reduced-motion`); jederzeit unter Settings → Account
wiederholbar.
- **Doctor-Report v2:** Datumsbereich konfigurierbar (90 / 180 / 365
Tage oder manuell, max. 2 Jahre) und Praxis-Name auf der Titelseite.
- **Backups vollständig:** Download als `.json`, Upload, Restore hinter
Triple-Confirm — alles auditiert.
- **Withings + moodLog Status-UI** plus Telegram-Alert bei ≥ 3 Folge-
Fehlern; Refresh-Token-Fail markiert Integration als reauth-pflichtig.
- **Notification-Channel-Status** mit Re-Enable + Test-Send + Auto-
Disable bei 410.
- **`/admin`-Übersicht** zeigt Audit-Log-Vorschau + System-Snapshot
statt Section-Grid (die wandert in die Sidebar).
- **KI-Insights gehärtet:** striktes Output-Schema, Citation-Pflicht,
Slug-Drift-Fallback-Kette + 1h-Cache (zero hallucinations).
- **13 Empty-States** über Admin / Listen / Insights / Dashboard.
- **Mobile-UX-Sweep:** Chart-Scroll, `/admin/users` Card-List, 44 px
Tap-Targets, Mood-Card aufgeräumt.
🔧 **Was ist gefixt**
- BD-Zielbereich-Prozent zählt Sys/Dia-Paare korrekt (war 0 % bei
Import-Drift).
- Onboarding-Flackern raus, Skip-Link blockt Logo nicht mehr.
- Bug-Report + Feedback verschwinden aus Sidebar / Bottom-Nav / Topbar
wenn Admin den Toggle deaktiviert.
- 7-Tage-Schnitt → 7-Tage-Trend mit metrik-bewusstem `(±N.N)`-Delta.
- Stimmung-Chart aggregiert wöchentlich / monatlich wie die anderen.
- Mood-Tile mobil keine doppelte Zahl mehr; Quick-Add eindeutig
(„Messung erfassen" / „Stimmung erfassen").
- Top-Tiles im Dashboard-Layout unabhängig vom Chart wählbar.
- `/admin/api-tokens`-Tabelle responsive.
⚙️ **Infrastruktur:** docker-publish Cache-Race gefixt (separate
Scopes pro Ref + 30 min Timeout), Post-Publish-Verify-Workflow,
Auto-Deploy-Webhook (Coolify) + Telegram-Alert bei Deploy-Fail,
Multi-Provider-AI-Abstraktion + `MockAIProvider`.
⚠️ **Hard-Reload** (`Cmd+Shift+R`) für SW-Reset einplanen.
📚 **Docs** auf `docs.healthlog.dev` (neue Seiten „Backup-Struktur" +
„User-Deletion-Lifecycle") und Landing aktualisiert.
🎯 **v1.4.16 Backlog**: `.planning/v1416-backlog.md`.
---
## Was gelandet ist
78 Commits seit `v1.4.14` (`30d3ad0..4dcaa08`). Stage-für-Stage.
### Quick fixes (Stage A1–A5 + B-mobile)
| SHA | Summary |
| --------- | ----------------------------------------------------------------------------------- |
| `85aa15b` | fix(nav): hide bug-report entry in nav when admin disables the toggle |
| `786b395` | fix(a11y): skip-link no longer blocks logo click outside focus |
| `bde167d` | fix(feedback): hide user-facing feedback link when admin disables the feature |
| `c63e4de` | fix(feedback): gate ErrorDetails report-bug button on bugReportEnabled |
| `a967895` | feat(admin): replace overview section-grid with audit-log preview + system snapshot |
| `dddc18c` | fix(admin): make api-tokens table responsive on mobile |
| `3e45a7b` | fix(dashboard): disambiguate quick-add submenu labels |
| `2c227fb` | fix(dashboard): mood tile mobile shows number once + label |
| `bb4dc12` | fix(dashboard): no onboarding flicker on load; collapsed by default |
| `bffdccb` | feat(dashboard): medication compliance graph wired to layout toggle |
| `47ac14b` | feat(insights): mood chart auto-aggregates to weekly/monthly |
| `4e2386e` | feat(dashboard): 7-day-average → 7-day-trend with delta indicator per metric |
| `8ccdfac` | feat(dashboard): top tiles selectable in layout settings |
| `316c3b0` | fix(charts): chart wrappers allow vertical scroll passthrough on mobile |
| `41945b2` | fix(admin): /admin/users mobile layout — card-list at < md |
| `8370b2d` | fix(mobile): chart controls + medication buttons + mood list icons to 44px |
| `00f8cd5` | fix(settings): passkey list responsive — card view at < md |
| `c0b14f4` | fix(auth): bump login buttons to 44px tap-target on mobile |
### Features (Stage B1–B6)
| SHA | Summary |
| --------- | -------------------------------------------------------------------------------- |
| `fe85c2c` | feat(admin): restore from backup with full data replacement + triple-confirm |
| `d8c549e` | feat(admin): backup download as JSON |
| `30a74ed` | feat(admin): backup upload |
| `0805452` | fix(admin): backup audit log entries |
| `7c32d63` | feat(admin): link from backups view to docs.healthlog.dev/admin/backups |
| `4db72a8` | feat(integrations): connection-state + sync-error UI in Settings → Integrations |
| `b290a77` | fix(integrations): refresh-token failure marks integration as needing re-auth |
| `604dff0` | feat(integrations): admin Telegram alert on persistent sync failure (≥3) |
| `2fbf56d` | feat(audit): sync failures logged with structured meta |
| `87a40fd` | fix(notifications): auto-disable channels on persistent hard rejects (410, etc.) |
| `a3c0130` | feat(settings): notification channel status UI with re-enable + test |
| `34c967c` | feat(achievements): dedicated /achievements page with locked/unlocked list |
| `a242047` | feat(dashboard): recent achievements card with toggle in layout settings |
| `81f5019` | feat(dashboard): RecentAchievementsCard component + tests |
| `db5a49d` | feat(db): User.onboardingTourCompleted flag |
| `e57fc0a` | feat(onboarding): tour component with spotlight + keyboard navigation |
| `8215e25` | feat(onboarding): auto-launch tour for new users on first dashboard load |
| `fa1c6a6` | feat(settings): allow user to replay the onboarding tour |
| `d692119` | feat(doctor-report): configurable date range with default last-90-days |
| `28467b2` | feat(doctor-report): practice name on cover page (persisted as user preference) |
### Hardening (Stage C1–C5)
| SHA | Summary |
| --------- | ---------------------------------------------------------------------------------- |
| `27310e4` | refactor(ai): consolidate providers behind AIProvider interface |
| `d657f79` | feat(ai): enforce citation-from-data on every recommendation |
| `4e85c38` | feat(ai): scope-hardened system prompt with refusal pattern |
| `4bba951` | feat(ai): fallback-chain slug discovery with 1h positive cache |
| `fa11f10` | docs(audit): v1.4.16 AI hardening roadmap |
| `ad350fe` | feat(deploy): admin notification + audit log on deploy success/failure |
| `41945b2` | fix(test): de-flake e2e a11y suite by forcing dark colorScheme |
| `249c42b` | fix(ci): docker-publish reliability — separate cache scope per ref + 30min timeout |
| `ffa4aac` | feat(ci): post-publish verify workflow |
| `4a5be22` | docs(audit): v1.4.15 CI/e2e reliability report |
| `01a10de` | test(i18n): non-empty + non-placeholder parity assertion |
| `5510ed5` | docs(audit): v1.4.15 empty-states audit + i18n keys |
| `0c20119` | feat(admin): empty states for users, backups, login-overview, api-tokens, feedback |
| `9a74f8e` | feat(lists): empty states for measurements, mood, medications, achievements |
| `1d65f3b` | feat(lists): empty states for measurements, mood, medications, achievements (impl) |
| `65faf1d` | feat(insights,dashboard): empty states for first-run views |
### QA + Reconcile (Stage D)
| SHA | Summary |
| --------- | -------------------------------------------------------------------------- |
| `cd3b890` | refactor(v1.4.15): apply simplify-review safe suggestions |
| `6465412` | fix(a11y): trap focus + restore + ring on onboarding tour |
| `66d2e07` | fix(a11y): break long Withings error strings inside status banner |
| `79bb167` | fix(ai): MockAIProvider DEFAULT_RESPONSE conforms to v1.4.15 strict schema |
| `d947563` | style(v1.4.15): prettier sweep on stage-D reconcile touched files |
### Release (Stage E1–E3)
| SHA | Summary |
| --------- | ----------------------- |
| `4dcaa08` | chore(release): v1.4.15 |
---
## Was deferred wurde + Warum
Volle Liste: `.planning/v1416-backlog.md`. Highlights:
### 8 HIGH findings → v1.4.16
- **code-review H1** — `restore/route.ts:253-377` rohe Prisma-Fehler im
Catch-Block scrubben (Admin-only Leak, low blast).
- **code-review H2** — `moodEntrySchema.tags` enger schließen oder
JSON-Parse in Pre-Tx-Loop validieren.
- **code-review H3** — `mood-chart.tsx` exportiertes
`aggregateMoodEntries` und Inline-`chartData`-Aggregation
divergieren; Function-Extract-only (Charts visuell eingefroren).
- **code-review H4** — `tour-launcher.tsx` sessionStorage-Keys auf
User-ID skopieren oder beim Logout löschen.
- **design H4** — Cross-cutting `button.tsx` `h-9 → h-11` Sweep für
B1 / B3 / B5 Surfaces.
- **senior-dev H1** — `src/app/page.tsx` (1031 LOC) splitten
(`<DashboardShell>` + `<DashboardTileStrip>` + `<DashboardChartGrid>`).
- **senior-dev H2** — `integrations-section.tsx` (883 LOC) splitten
(per-provider Cards + composing index, Mirror admin-Pattern).
- **senior-dev H3** — Process: pro paralleler Aufgabenstrang ein
Worktree, weil acht v1.4.15-Commits Diff-Drift gegen ihre Subjects
zeigten.
### 5 MEDIUM mobile-items aus A5
- `/insights` + `/admin` Tab-Strip-Overflow (cross-cutting `tabs.tsx`).
- `/measurements` BP Sys/Dia-Row-Gruppierung.
- Bottom-Nav 5+More IA-Entscheidung.
- B1/B3/B5 Surfaces 44 px Sweep (siehe design H4).
- Verbleibende A5-Findings (12 MED + 4 LOW dokumentiert in
`.planning/phase-A5-mobile-findings.md`).
### KI-Roadmap → v1.4.16+
(`docs/audit/v1416-ai-roadmap.md`)
- **Medical-Reference-Grounding** — kuratiertes Bundle von ~40
Excerpts (ESH/ESC 2024, AHA/ACC 2017, WHO, AASM, Saint-Maurice 2020,
DGE/DEGAM); Pre-Flight-Relevanzauswahl; Schema bekommt `referenceId`.
- **Multi-Provider-Redundanz** — `MultiProviderCascade` um
`AIProvider`; Admin-Tier-Ordering; per-Request 60s Budget.
- **Per-Recommendation Explainability** — `rationale.{dataWindow,
comparedTo, deviation}` + UI „Warum?"-Tooltip.
- **Confidence-Score** — kalibriert pro Recommendation (v1.4.17).
- **User-Feedback-Loop** — `InsightFeedback`-Tabelle + Admin
`/admin/ai-quality` Dashboard (v1.4.17).
- **Deep-Mode** — optionale Codex-Reasoning-Summaries als separates
Schema-Feld (v1.5).
### Auto-Deploy Image-Digest-Trigger → v1.4.16
Coolify deployt aktuell auf jeden Git-Push (vorerst belassen);
v1.4.16 soll auf neuen Image-Digest umstellen, damit Coolify nicht für
docs / planning / changelog-only commits einen Container-Recreate
fährt.
### Sonstige Process-Items
- Strict-Schema-Migration für AI-Insights-Route + UI (M6 senior);
`.passthrough()` retiren.
- `dashboard-layout.test.ts` Typecheck-Regression aufräumen (in E1
bereits gefixt — bleibt aber als „pre-existing" in mehreren STATE-
Phasen vermerkt; Reklassifizierung).
- Worktree-Adoption für den v1.4.16-Release-Cycle.
### Simplify-no (4)
`F5` defensive `notFound()`, `F9` `<SectionFrame>` switch, `F10`
duplizierter `requireAdmin`-Branch, `F12` historische Anker-Kommentare
— alle judgement-call, in `.planning/v1416-backlog.md` festgehalten.
---
## CI / Test status
- `pnpm typecheck` — clean (drei pre-existing
`dashboard-layout.test.ts`-Errors in E1 mitgefixt: Test-Fixtures als
`DashboardLayout` getypt, damit der `DashboardWidgetId`-Enum nicht
mehr meckert).
- `pnpm lint` — 0 errors / 11 pre-existing warnings (B-Stage warnings
count ging von 12 auf 11, weil ein paralleler Aufgabenstrang eine
unrelated unused-var entfernt hat).
- `pnpm format:check` — clean nach `d947563` + dem prettier-Sweep im
Release-Commit (41-File-Drift aus Stage D adressiert).
- `pnpm test` — **~1048 unit tests** green (von 754 zu Beginn des
v1.4.15-Release-Cycle).
- `pnpm test:integration` — **31 / 31** green (waren 19 vor B1).
- `pnpm build` — fails lokal auf Node 25 (`Reflect.get` private-member
Bug, gleicher Issue wie v1.4.14); CI Docker (Node 22) ist canonical
und grün.
- `pnpm e2e` — Stage C3 hat das Dark-Mode-axe-Blocking gefixt
(`colorScheme: "dark"` in `playwright.config.ts`); e2e-Pass-Rate ging
von 0 % auf erwartete ≥ 90 %.
---
## Production state
- **URL**: `https://healthlog.bombeck.io`
- **`/api/version`**: `1.4.15` ✓
- **Image-Digest**: `sha256:ace7d441f47bd8c69fd0c5e2417b7f6c53bc387aa10c9aa541ad5e6321e9581d`
(vorher v1.4.14: `sha256:0ced46004a544a311627b7036f2f2aed75861b0c62576214a1303a17d20c3d22`)
- **GHCR-Pull-Digest**: `sha256:ba77448606b4a97bd39b84e163212559b2bb2da5ec7c9ff1026e80b5cac1031a`
- **Smoke** (admin Session-Cookie): `/`, `/auth/login`,
`/settings/integrations`, `/settings/notifications`, `/admin`,
`/admin/users`, `/admin/backups`, `/achievements` — alle 200.
`/dashboard` 404 (erwartet — kein `src/app/dashboard`-Route, das
Dashboard lebt unter `/`; Runbook hatte einen veralteten Pfad).
- **Deploy-Methode**: GHCR-Tag-Build `:1.4.15` erfolgreich; Main-Branch-
Run hing wieder (gleicher Bug wie v1.4.14, von C3 nicht vollständig
adressiert), retag-on-host als Workaround. v1.4.16-Backlog-Eintrag.
- **Coolify Auto-Deploy**: feuert weiterhin auf jeden Git-Push (vorerst
belassen); v1.4.16-Image-Digest-Trigger geplant, damit docs / planning
/ changelog-only commits keinen Container-Recreate auslösen.
- **GitHub-Release**: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.15
- **Tag-Naming** (unverändert seit v1.4.14): GHCR-OCI-Tag ist
`:1.4.15` (kein `v`-Prefix); git-Tag ist `v1.4.15`.
---
## Docs / Landing
- **healthlog-docs** (Starlight) — Stage E3 hat den vollen Sync
ausgerollt (`6b938df` + `db66da0`). Neue Seiten:
- `/admin/backups` — Backup-Struktur (Snapshot-Schema,
`BACKUP_SCHEMA_VERSION = "1"`, encrypted-at-rest, Restore-Gates).
- `/account/data-deletion` — User-Deletion-Lifecycle
(Welcher Scope verschwindet wann, was bleibt, GDPR-Art-17).
- **healthlog-landing** (Next.js) — `softwareVersion 1.4.14 → 1.4.15`
in JSON-LD (`b6f83be`).
---
## Empfohlener v1.4.16 Backlog (Top 5)
Aus `.planning/v1416-backlog.md`. Severity-geordnet, Datei:Zeile:
1. **senior-dev H1** — `src/app/page.tsx` (1031 LOC) splitten
(`<DashboardShell>` + `<DashboardTileStrip>` +
`<DashboardChartGrid>` + `<DashboardEmptyState>`); Visibility-
Resolver in `src/lib/dashboard-visibility.ts`. Mechanisch.
2. **senior-dev H2** — `src/components/settings/integrations-section.tsx`
(883 LOC) splitten in
`src/components/settings/integrations/{integration-status-banner,
withings-card, moodlog-card}.tsx` + composing index. Spiegelt das
admin per-section Pattern.
3. **AI Strict-Schema Route+UI Migration** — `aiInsightResponseSchema`
in `/api/insights/generate` + Dashboard-UI verdrahten;
`.passthrough()` löschen; Legacy-Shape (`{summary, classification,
findings, correlations, dataQuality, …}`) retiren. Wird zusammen
mit der AI Medical-Reference-Grounding-Welle gefahren.
4. **M4 dispatcher legacy Telegram migration** — die Migration in
`src/lib/notifications/dispatcher.ts:75-97` upserted `enabled: true`
auf jeden Send und unwindet damit B3's Hard-Reject-Auto-Disable.
Guard auf „nur wenn keine Row existiert" oder `enabled` nicht mehr
anfassen.
5. **Worktree-Adoption** — `superpowers:using-git-worktrees` pro
parallelem Aufgabenstrang; acht v1.4.15-Commits hatten Diff-Drift
gegen ihre Commit-Subjects (A2, A4, B1, B-mobile, B2, B3, B4, C1,
C5). Process-Win, kein Code-Change.
---
## Hard-Reload-Reminder
`Cmd+Shift+R` (Mac) / `Ctrl+Shift+R` (Linux/Win) — der neue
Service-Worker holt sonst noch v1.4.14-Chunks aus dem Cache. Einmalig
ausreichend.