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>
17 KiB
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/usersCard-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-377rohe Prisma-Fehler im Catch-Block scrubben (Admin-only Leak, low blast). - code-review H2 —
moodEntrySchema.tagsenger schließen oder JSON-Parse in Pre-Tx-Loop validieren. - code-review H3 —
mood-chart.tsxexportiertesaggregateMoodEntriesund Inline-chartData-Aggregation divergieren; Function-Extract-only (Charts visuell eingefroren). - code-review H4 —
tour-launcher.tsxsessionStorage-Keys auf User-ID skopieren oder beim Logout löschen. - design H4 — Cross-cutting
button.tsxh-9 → h-11Sweep 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+/adminTab-Strip-Overflow (cross-cuttingtabs.tsx)./measurementsBP 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 —
MultiProviderCascadeumAIProvider; 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-qualityDashboard (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.tsTypecheck-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-existingdashboard-layout.test.ts-Errors in E1 mitgefixt: Test-Fixtures alsDashboardLayoutgetypt, damit derDashboardWidgetId-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 nachd947563+ 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.getprivate-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"inplaywright.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./dashboard404 (erwartet — keinsrc/app/dashboard-Route, das Dashboard lebt unter/; Runbook hatte einen veralteten Pfad). - Deploy-Methode: GHCR-Tag-Build
:1.4.15erfolgreich; 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(keinv-Prefix); git-Tag istv1.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.15in JSON-LD (b6f83be).
Empfohlener v1.4.16 Backlog (Top 5)
Aus .planning/v1416-backlog.md. Severity-geordnet, Datei:Zeile:
- senior-dev H1 —
src/app/page.tsx(1031 LOC) splitten (<DashboardShell>+<DashboardTileStrip>+<DashboardChartGrid>+<DashboardEmptyState>); Visibility- Resolver insrc/lib/dashboard-visibility.ts. Mechanisch. - senior-dev H2 —
src/components/settings/integrations-section.tsx(883 LOC) splitten insrc/components/settings/integrations/{integration-status-banner, withings-card, moodlog-card}.tsx+ composing index. Spiegelt das admin per-section Pattern. - AI Strict-Schema Route+UI Migration —
aiInsightResponseSchemain/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. - M4 dispatcher legacy Telegram migration — die Migration in
src/lib/notifications/dispatcher.ts:75-97upsertedenabled: trueauf jeden Send und unwindet damit B3's Hard-Reject-Auto-Disable. Guard auf „nur wenn keine Row existiert" oderenablednicht mehr anfassen. - Worktree-Adoption —
superpowers:using-git-worktreespro 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.