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>
16 KiB
HealthLog v1.4.14 — Release Summary
Release brief (DE, ≤ 200 Wörter)
✅ v1.4.14 ist live auf https://healthlog.bombeck.io — Image-Digest
sha256:0ced46004a54… (vorher v1.4.12: 791c2cd2…), /api/version
meldet 1.4.14.
🆕 Was ist neu
- Codex/ChatGPT-Modell-Slug korrigiert auf
gpt-5.3-codex— KI- Insights laufen jetzt direkt mit deinem ChatGPT-Login durch, kein API-Key nötig. Operator-Override perCODEX_MODEL-Env-Var möglich. - Admin-Bereich auf Unterseiten aufgeteilt (
/admin/users,/admin/backups,/admin/system-status,/admin/integrations, …) — bessere Übersicht, schnelleres Laden, Status-Cards verlinken direkt. - Neue Backups-Sektion mit Tabelle aller bisherigen Sicherungen und „Backup jetzt erstellen“-Knopf.
- Neue User-Verwaltung mit Rollen-Filter und „Force-Logout"-Aktion (eigene Session ist gesperrt).
- „Gespeicherten KI-Schlüssel entfernen" als eigener Knopf in Settings → KI.
- Trend-Pfeile sind jetzt metrik-bewusst — Blutdruck ↑ orange, Stimmung ↑ grün, Puls ↑ neutral.
🔧 Was ist gefixt
- Notification-Channels + Push-Subscriptions werden jetzt vom „Alle Daten löschen“ tatsächlich entfernt.
- DST-Wechsel verschiebt keine Tageswerte mehr in Cross-Metric-Joins (war zwei Tage/Jahr falsch).
- KI-Provider-Fehler werden korrekt klassifiziert (422/503/429 statt pauschal 500).
- Logging-Redactor verschluckt keine harmlosen Wörter wie
task-forceoderrisk-managementmehr.
⚡ Performance
/insightsinitiales JS −108 KiB (Recharts deferred geladen).- Dashboard-Checklist Netzwerk −950 ms für Bestandsnutzer.
⚠️ Hard-Reload (Cmd+Shift+R) für den einmaligen Service-Worker-
Reset einplanen.
📚 Docs auf docs.healthlog.dev und Landing aktualisiert.
🎯 v1.4.15 Backlog: .planning/v1415-backlog.md.
Was gelandet ist
53 Commits seit v1.4.13 (5df74f7..e5fae9b). Severity-geordnet.
Release
| SHA | Summary |
|---|---|
e5fae9b |
chore(release): v1.4.14 |
f0d53fb |
chore(release): rebrand artifacts as v1.4.14 (patch, not minor) |
Codex-OAuth verification (Stage 1)
| SHA | Summary |
|---|---|
5df74f7 |
fix(ai): default Codex model to gpt-5.3-codex for ChatGPT-account auth |
v1.4.6 deferred bugfix backlog (Stage 2)
| SHA | Summary |
|---|---|
512a6a6 |
fix(admin): wipe-all-data clears notification channels, push subs, telegram deletions (T2.1) |
cb6a59a |
fix(insights): correct DST handling in cross-metric daily bucket pairing (T2.2) |
5403821 |
fix(insights): map AI provider errors to 422/503 instead of 500 (T2.3) |
d6696cf |
fix(logging): redactSecrets regex requires non-alphanumeric prefix (T2.5) |
Admin Panel refactor (Stage 4b — folds T2.6 + T2.7)
| SHA | Summary |
|---|---|
d8b71b3 |
feat(admin): scaffold per-section dynamic routes (admin-shell + [section]/page.tsx) |
12b280b |
refactor(admin): move sections to dynamic-route pattern + reduce overview |
69c5225 |
feat(admin): backups view + manual backup trigger (T2.6 deferred) |
5957e18 |
feat(admin): users management with filters + force-logout action (T2.7 deferred) |
a34cd8c |
refactor(i18n): namespace admin keys under admin.section.<slug>.* |
73965cd |
feat(admin): expandable sidebar nav for admin sections |
961e2a9 |
fix(admin): status-card CTAs use real routes (not #anchor) |
7a47532 |
feat(admin): redirect legacy section-anchor paths to dynamic routes |
1a7e3d6 |
test(admin): tighten status-card-grid + add per-section render smoke |
UX polish (Stage 5)
| SHA | Summary |
|---|---|
987ce0d |
fix(a11y): clear axe-core violations on /admin and key sub-routes |
38f12df |
feat(ui): trend arrow color reflects metric-specific direction sentiment |
788c8ad |
feat(settings): allow removing saved AI provider key |
569300e |
style(ui): use semantic tokens for mood and feedback indicators |
e3a6899 |
fix(ui): disambiguate dashboard quick-add menu items |
65cfb27 |
fix(a11y): label /admin overview quick-jump as a navigation landmark |
Multi-pass QA reconcile (Stage 6)
| SHA | Summary |
|---|---|
88c8db1 |
refactor: apply simplify-review safe-to-apply suggestions (11 of 11) |
b3f282a |
fix(security): block force-logout from targeting the admin's own session |
8e17f22 |
fix(admin): rate-limit /api/admin/backups/run to 3/min per admin |
f0cfd26 |
fix(security): redact standalone hlk_ / hlr_ native API tokens in logs |
bd24f13 |
fix(a11y): drop duplicate h2 inside single-section /admin/<slug> routes |
499cfad |
fix(a11y): bump /admin/users + /admin/login-overview tap targets to WCAG 2.5.5 |
ef96e87 |
fix(admin): default api-tokens + login-overview routes to expanded |
End-to-end test coverage (Stage 3)
| SHA | Summary |
|---|---|
535465c |
test(e2e): seeded test user + auth storageState fixture |
3999ea7 |
test(e2e): authenticated dashboard + add-measurement flow |
2b6f959 |
test(e2e): mocked Codex device-flow + insights regenerate specs |
a106547 |
test(e2e): doctor-report PDF + mobile-viewport smoke |
ca3c599 |
test(e2e): extend axe-core to authenticated surfaces; fix login regex |
7af1f59 |
fix(a11y): close violations the new e2e axe-core sweep surfaced |
Performance (Stage 4)
| SHA | Summary |
|---|---|
bb2b1de |
perf(insights): defer Recharts ScatterChart imports via next/dynamic |
519e36e |
perf(dashboard): skip checklist API fetches once onboarding is complete |
1a85da0 |
fix(insights): preserve chart visual parity in deferred bundle |
41fa203 |
docs(audit): v1.4.14 performance audit report |
CI / housekeeping
| SHA | Summary |
|---|---|
3cacdf2 |
fix(tests): share next/headers cookieJar across integration suite |
c847b80 |
chore(format): trend-card test file prettier sweep |
badd380 |
style(admin): apply prettier to stage-6 reconcile changes |
6b88e56 |
chore(format): prettier sweep over stage-2 touched files |
Was deferred wurde + Warum
v1.4.14 release-cycle "Apply automatically? no" simplify findings (8)
Aus phase-6-simplify-findings.md:
- F5 Defensive
notFound()hinterdynamicParams = false— Entscheidung pending zwischen (a) Kommentar trimmen vs. (b) Guard droppen + casten. - F9
<SectionFrame>inrenderer.tsxswitch — die Repetition ist echt, aber das Tabellen-Refactor wäre schlechter (asymmetrischecurrentUserId-Prop). Recommend: keep as-is. - F10
if (!user || user.role !== "ADMIN") return nulldoppelt — zwei Sites, unter dem 4-uses-Threshold. Recommend: keep. - F12 Historische Anker-Kommentare (
v1.4.6 T2.6,P15,v1.4.7.1, …) — judgement-call sweep; ein Teil enthält echtes WHY-Wissen, ein Teil ist Archäologie. - F13 ~270 LOC duplication in den drei Status-Generatoren
(mood/weight/blood-pressure) —
_status-helpers.ts-Extraktion ist medium-risk, braucht fokussierten Pass + Tests. - F14
formatBytes(fmt: ReturnType<typeof useFormatters>)— cosmetic. - F18
getApiErrorMessagedoppelter Fallback-Branch — cosmetic. - F19
eslint-disable-next-line react-hooks/exhaustive-depsauf Device-Code-Polling — verifizieren, obt/queryClient-deps eine Re-poll-Loop auslösen.
v1.4.6 P4+ Items (nicht aufgenommen)
useAdminSettings / useSystemStatus Test-Coverage für die
isError-UI aus P19 ist weiter manuell-only — nicht in v1.4.14
gepflegt, kein Regressionsrisiko. Trägt sich in den v1.4.15-Backlog.
4 HIGH findings → v1.4.15
Aus phase-6-reconcile-report.md:
- H4d/H5d design — StatusCardGrid i18n (Englisch-only
Severity-Labels, Card-Titel/-CTAs,
fmtRelative/fmtUptime, StatusBadge-aria-label). ~15 Keys × 2 Locales + Test-Rewrite — zu breit für sicheren Overnight-Apply. - H2 code-review — Admin-Page server-side
requireAdmin(). Heute ist die Rolle nur client-seitig geprüft; das Shell flackert kurz. Braucht eine server-renderedrequireAdmin()-HOC, präzisiert für den HealthLog-Auth-Stack. - H-1 security — "Wipe all data"-Scope-Drift. v1.4.14 hat
Notification-Channels, Push-Subs und Telegram-Scheduled-Deletions
ergänzt. Was weiter überlebt:
MoodEntry,RefreshToken,DataBackup,Device,UserAchievement,IdempotencyKey, plus einige verschlüsselte Spalten. Entscheidung pending: (a) Scope nochmal weiten oder (b) Operation umbenennen ("Reset health data").
CI / Test status
pnpm typecheck— cleanpnpm lint— 0 errors / 12 pre-existing warnings (none introduced)pnpm format:check— clean nachc847b80(trend-card test file sweep)pnpm test— 97 files / 754 tests greenpnpm test:integration— 5 files / 11 tests green; mock-leak flake zwischenadmin-data-wipe.test.tsundidempotency-replay.test.tsviatests/integration/mock-next-headers.tsshared cookieJar behoben (10/10 consecutive runs grün)pnpm build— fails lokal auf Node 25 (Reflect.getprivate-member bug); CI Docker (Node 22) ist canonicalpnpm e2e— gleicher Node-25-Bug betrifft auchnext dev; CI runs green auf Node 22 (Phase-3 Report: 41/41 specs green)
Production state
- URL:
https://healthlog.bombeck.io /api/version:1.4.14✓- Image digest:
sha256:0ced46004a544a311627b7036f2f2aed75861b0c62576214a1303a17d20c3d22(vorher v1.4.12:sha256:791c2cd2a8eae5ec0a6fd666074c9f646c17414e3521d526267131c2a3b7edab) - Smoke (curl mit Session-Cookie):
/,/auth/login,/settings/integrations,/admin— alle 200 - Deploy-Methode:
:1.4.14von GHCR auf den Host gepullt, dort als:latestretagged (kein Compose-Edit), danndocker compose up -d appin/data/coolify/applications/pg8wggwogo8c4gc4ks0kk4ss/. Der parallelemain-Branch-GHCR-Run war auf demselben SHA hängengeblieben (>45 min), wurde gecancelt — harmlos, weil der Tag-Build:latestbereits gepusht hatte. Retag-on-host war defensiv aber sicher. - GitHub Release: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.14
- Tag-Naming: GHCR-OCI-Tag ist
:1.4.14(keinv-Prefix); git-Tag istv1.4.14. Hard-Rule's:v1.4.14-Slug needs a docs fix.
Codex-OAuth Status (das v1.4.7–v1.4.13 Saga-Ende)
- Resolution: ChatGPT-Account-Auth verlangt das Modell-Slug
gpt-5.3-codex. Das ist canonical, gepflegt ausopenai/codex→codex-rs/models-manager/models.json. Sowohlgpt-5-codexals auch das v1.4.13-Fallbackgpt-5werden vom Codex-Backend mit ChatGPT-Subscription explizit abgelehnt (The 'gpt-5' model is not supported when using Codex with a ChatGPT account.). - Spec extension:
docs/codex-protocol-spec.md§7a dokumentiert jetzt die ChatGPT-Account-Auth-Allow-List + die Lehre, dass die Slugs inmodel_migration.rsMigration-Prompts sind, keine Wire-Slugs. - Operator-Override:
CODEX_MODEL-Env-Var auf apps-01 lässt alternative Slugs ohne Rebuild testen — als Sicherheitsnetz für andere Plan-Tarife oder zukünftige OpenAI-Slug-Wechsel sinnvoll. - Live-Probe verifiziert:
/api/ai/testund/api/insights/generatelaufen beide gegen das ChatGPT-Plus-Abo des Live-Tenants durch./tmp/v15-codex-working.pngzeigt das grüne "ChatGPT connected"-Badge in/settings/ai.
Docs / Landing
- healthlog-docs (Starlight) — 7 Files aktualisiert: AI-Insights
(Codex device-code-Pfad neu), Admin-Settings (Backups + Users
Sektionen), Environment-Variables (
CODEX_MODEL), Updates (Backups- View), Introduction (One-Click Codex-Flow), Troubleshooting (Codex-Failure-Modes), Dashboard-Customization (Perf-Note). Commit06bc616. Coolify auto-redeploys docs.healthlog.dev. - healthlog-landing (Next.js) —
softwareVersion 1.4.6 → 1.4.14in JSON-LD; AI-Providers-Copy auf "one-click device-code Codex flow, no API plan needed" angepasst. Commit92c6588.
GitHub releases
v1.4.7 … v1.4.13 waren bereits real-time während des
Codex-OAuth-Iterationstags veröffentlicht; nur v1.4.13 war pending
und wurde nachgezogen. v1.4.14 selbst ist jetzt als Latest geflagged.
Empfohlener v1.4.15 Backlog
Aus .planning/v1415-backlog.md (severity-geordnet, Datei:Zeile, ein
Satz Recommendation pro Item). Top-Hits:
HIGH
- H4d+H5d —
StatusCardGridi18n: Severity-Labels, Card-Titel, CTAs,fmtRelative,fmtUptime, StatusBadge-aria-label nachadmin.statusGrid.*migrieren (EN+DE Parität, ~15 Keys × 2 Locales). - H2 —
requireAdmin()server-side auf/admin/[section]/page.tsxund/admin/page.tsxziehen, damit Non-Admins 403 sehen, bevor das Shell paint-flickert. - H-1 — "Wipe all data" Entscheidung: (a) Scope auf
MoodEntry,RefreshToken,DataBackup,Device,UserAchievement,IdempotencyKey+ verschlüsselte Codex/AI/moodLog-Spalten weiten, oder (b) Operation umbenennen ("Reset health data") und "preserved"- Liste explizit zeigen. Recommend (a) für GDPR-Art-17-Alignment.
MEDIUM (Highlights)
- M-2 security
/api/admin/users/[id]/force-logoutohne Rate-Limit und ohne Last-Admin-Guard. - M-3 security Wide-Event-
meta-Strings nicht durchredactSecrets()gezogen —addMeta()braucht den Filter. - M-5 security Wipe-Rate-Limit BEFORE auth — unauth'd Traffic
mutiert
rate_limits. Reorder:requireAdmin()zuerst, dann key byuser.id. - M1 code-review
/insightsTrendCard-Tile-Strip noch ohnedirectionSentimentverdrahtet (war v1.4.14 nur Dashboard). - M2 code-review Legacy-Admin-Anchor-301s leaken Slug-Existenz an unauth'd Hits — Redirect-Block muss NACH dem Session-Check.
- M3 code-review
BackupsSection2-Sek-Timeout für Refetch ist ein Guess — auf 5–8s mit Double-Invalidate, oder Job-State pollen.
LOW
- L-1 security
/api/auth/codex/callbackals PUBLIC_PATH gelistet, aber kein Route-File existiert — Eintrag ausproxy.tslöschen. - L-2 security Codex
codex_device-Cookie ohne Per-User-Binding —userIdin den encrypted Blob einbetten, Mismatch rejecten. - L7 design
/insightsSticky-<nav>ohnearia-label. - L8 design Mobile-Strip-Pattern für
<FeedbackInboxSection>-Tabs und<AdminShell>-Mobile-Section-Strip (snap-x snap-mandatory).
Recharts-Replacement (eingefroren auf v1.4.15+)
108 KiB pro Chart-Page sparbar, aber Effort L (alle Charts in
src/components/charts/ müssen neu, plus neue Dependency). v1.4.14
no-new-deps Hard-Rule blockiert; v1.4.15+ wenn die Range frei wird.
Hard-Reload-Reminder
Cmd+Shift+R (Mac) / Ctrl+Shift+R (Linux/Win) — der neue
Service-Worker holt sonst noch v1.4.13-Chunks aus dem Cache. Einmalig
ausreichend.