From 4f48160b3d73c20acf8e652c781f8b08739c840f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 31 May 2026 22:01:45 +0200 Subject: [PATCH] feat(insights): rewrite the pulse assessment prompt to the assessment spec Drop the stale snapshot vocabulary (avg7/30/90, historicalComparison, slope30, rate-pressure product) and the chart-token instruction the status path strips out. Describe the graded pulse series and target band, compare the recent days to the person's own weekly/monthly baseline at a ~5 bpm significance threshold, and frame a rising or falling resting pulse as a possible explanation rather than a diagnosis. --- src/lib/ai/prompts/pulse.ts | 66 +++++++++---------------------------- 1 file changed, 16 insertions(+), 50 deletions(-) diff --git a/src/lib/ai/prompts/pulse.ts b/src/lib/ai/prompts/pulse.ts index a16a8291d..1ad2002b3 100644 --- a/src/lib/ai/prompts/pulse.ts +++ b/src/lib/ai/prompts/pulse.ts @@ -1,53 +1,21 @@ import type { Locale } from "@/lib/i18n/config"; import { getBaseSystemPrompt } from "./base-system"; -const PULSE_SECTION_DE = `FACHSPEZIFISCH — PULS/HERZFREQUENZ: -- Ruhepuls-Zonen: - * Bradykardie: < 50 bpm (bei Sportlern normal, sonst abklärungsbedürftig) - * Athletisch: 50-60 bpm - * Normal: 60-100 bpm - * Tachykardie: > 100 bpm (abklärungsbedürftig) -- Trend-Stabilität: Ruhepuls-Variabilität < 5 bpm über 7 Tage ist normal. -- Stress-Indikatoren: Steigende Ruheherzfrequenz kann auf Stress, Schlafmangel oder Übertraining hinweisen. -- Erholung: Sinkender Ruhepuls über Wochen deutet auf verbesserte kardiovaskuläre Fitness hin. -- Medikamenten-Einfluss: Betablocker senken die Herzfrequenz — Compliance-Korrelation prüfen. -- Blutdruck-Korrelation: Puls × systolischen Druck = Doppelprodukt als Herzbelastungsindikator. -- Stimmungs-Korrelation: Chronischer Stress kann Ruhepuls erhöhen. Nur erwähnen wenn moodVsPulse-Korrelation im Snapshot vorhanden und |r| > 0.4. -- moodVsPulse-Korrelation: Nur analysieren wenn im Snapshot vorhanden und |r| > 0.4. Falls nicht vorhanden, keine Korrelation interpretieren. -- pulseVsSystolic-Korrelation: Nur analysieren wenn im Snapshot vorhanden und |r| > 0.4. Bewertung der hämodynamischen Kopplung. -- Vergleiche avg7 vs avg30 vs avg90 vs allTimeAvg um kurzfristige Abweichungen von der Langzeit-Baseline zu erkennen. -- Nutze historicalComparison.pulse: Bei ≥5 bpm Veränderung gegenüber der Baseline klinisch bewerten. -- Fitness-Interpretation: - * slope30 < -0.2 bpm/Tag (≈ -6 bpm/Monat): Positives Fitness-Signal, kardiovaskuläre Verbesserung - * slope30 > +0.2 bpm/Tag (≈ +6 bpm/Monat) OHNE Stimmungsabfall: Mögliche Dekonditionierung - * slope30 > +0.2 bpm/Tag MIT moodVsPulse r > 0.4: Stressbedingte Pulserhöhung -- Risikoband 80-100 bpm: Technisch "normal", aber erhöhtes CV-Risiko (+6-9% Mortalität pro 10 bpm, Meta-Analyse). -- Resting HR > 90 bpm: Unabhängiger Mortalitätsprädiktor — als eigenes Finding mit assessment "warning" erfassen. -- Inline-Chart: Wenn die summary oder ein finding den Ruhepulsverlauf in den Mittelpunkt stellt, kannst du genau einen Token metric:PULSE im Text einbetten, um das Pulsdiagramm darunter einzublenden.`; +const PULSE_SECTION_DE = `METRIK — PULS / HERZFREQUENZ: +- Der Snapshot trägt pulse.summary + pulse.series (graded) und pulse.target (greenMin/greenMax/orangeMin/orangeMax, inTargetPctLast30DailyPoints). pulse.latestDayFocus zeigt den jüngsten Tageswert und den Schritt zum Vortag. +- Tendenz über Wochen: Vergleiche das recent-Mittel mit dem weekly/monthly-Mittel der Person. Eine Abweichung ab ~5 bpm gegenüber der eigenen Baseline ist signifikant; eine Variabilität < 5 bpm über die letzten Tage ist normal und kein Befund. +- Richtung: Ein über Wochen sinkender Ruhepuls deutet auf bessere kardiovaskuläre Fitness; ein steigender kann auf Stress, Schlafmangel oder Übertraining hinweisen — als mögliche Erklärung, nie als Diagnose. +- Einordnungs-Anker (Ruhepuls): athletisch 50-60, normal 60-100. Werte im Band 80-100 sind technisch normal, langfristig aber günstiger niedriger. < 50 oder > 100 über mehrere Tage ist erwähnenswert, ohne zu alarmieren. +- Medikamenten-Bezug: Betablocker senken die Herzfrequenz. moodContext.moodVsPulseCorrelation und ein pulseVsSystolic-Zusammenhang nur erwähnen, wenn vorhanden und |r| > 0.4 — als Zusammenhang, nie als Ursache. +- Eine Botschaft: Liegt der Ruhepuls über der eigenen Baseline, schließe mit EINEM machbaren Schritt (z.B. ein paar Tage morgens vor dem Aufstehen messen, um eine saubere Ruhe-Baseline zu bekommen). Verbessert er sich, erkenne das ehrlich an.`; -const PULSE_SECTION_EN = `DOMAIN — PULSE / HEART RATE: -- Resting-pulse zones: - * Bradycardia: < 50 bpm (normal in athletes, otherwise needs evaluation) - * Athletic: 50-60 bpm - * Normal: 60-100 bpm - * Tachycardia: > 100 bpm (needs evaluation) -- Trend stability: Resting-pulse variability < 5 bpm over 7 days is normal. -- Stress indicators: A rising resting heart rate can point to stress, sleep loss or overtraining. -- Recovery: A falling resting pulse over weeks suggests improved cardiovascular fitness. -- Medication influence: Beta-blockers lower heart rate — check the compliance correlation. -- BP correlation: Pulse × systolic = rate-pressure product as a cardiac-load indicator. -- Mood correlation: Chronic stress can elevate resting pulse. Mention only if moodVsPulse correlation is present and |r| > 0.4. -- moodVsPulse correlation: Analyse only if present and |r| > 0.4. Otherwise do not interpret. -- pulseVsSystolic correlation: Analyse only if present and |r| > 0.4. Score haemodynamic coupling. -- Compare avg7 vs avg30 vs avg90 vs allTimeAvg to detect short-term deviations from the long-term baseline. -- Use historicalComparison.pulse: Score deltas ≥ 5 bpm against the baseline clinically. -- Fitness interpretation: - * slope30 < -0.2 bpm/day (≈ -6 bpm/month): positive fitness signal, cardiovascular improvement - * slope30 > +0.2 bpm/day (≈ +6 bpm/month) WITHOUT mood drop: possible deconditioning - * slope30 > +0.2 bpm/day WITH moodVsPulse r > 0.4: stress-driven pulse rise -- Risk band 80-100 bpm: Technically "normal", but elevated CV risk (+6-9% mortality per 10 bpm, meta-analysis). -- Resting HR > 90 bpm: Independent mortality predictor — capture as its own finding with assessment "warning". -- Inline chart: When a summary or finding centres on the resting-pulse trajectory, embed exactly one metric:PULSE token in the text to inline the pulse chart beneath it.`; +const PULSE_SECTION_EN = `METRIC — PULSE / HEART RATE: +- The snapshot carries pulse.summary + pulse.series (graded) and pulse.target (greenMin/greenMax/orangeMin/orangeMax, inTargetPctLast30DailyPoints). pulse.latestDayFocus shows the latest daily value and the step from the prior day. +- Trend over weeks: compare the recent mean with the person's weekly/monthly mean. A shift of ~5 bpm against their own baseline is significant; variability < 5 bpm across the recent days is normal and not a finding. +- Direction: a resting pulse falling over weeks suggests improving cardiovascular fitness; a rising one can point to stress, sleep loss or overtraining — as a possible explanation, never a diagnosis. +- Placement anchors (resting pulse): athletic 50-60, normal 60-100. Values in the 80-100 band are technically normal but tend to be more favourable lower over the long run. < 50 or > 100 across several days is worth noting without alarm. +- Medication link: beta-blockers lower heart rate. Mention moodContext.moodVsPulseCorrelation and any pulse-vs-systolic association only when present and |r| > 0.4 — as an association, never a cause. +- One message: if the resting pulse sits above the person's baseline, close with ONE doable step (e.g. take readings on waking for a few days to get a clean resting baseline). If it is improving, acknowledge that honestly.`; export function getPulseSystemPrompt(locale: Locale): string { const section = locale === "en" ? PULSE_SECTION_EN : PULSE_SECTION_DE; @@ -68,14 +36,12 @@ export function getPulseUserPrompt( : ""; if (locale === "en") { return `Date: ${todayKey} (Europe/Berlin) -Analyse the pulse / heart-rate data with focus on resting-pulse trend, variability and links to medication and mood. -Use the precomputed correlations and historical comparison for a sound analysis.${ctxBlock} +Write one short assessment of this person's resting pulse: name the current level, place the recent days against their own weekly/monthly baseline, and close with one doable step. Judge confidence from the measurement count and recency.${ctxBlock} ${snapshotJson}`; } return `Datum: ${todayKey} (Europe/Berlin) -Analysiere die Puls-/Herzfrequenzdaten mit Fokus auf Ruhepulstrend, Variabilität und Zusammenhänge mit Medikation und Stimmung. -Nutze die vorberechneten Korrelationen und den historischen Vergleich für eine fundierte Analyse.${ctxBlock} +Schreibe eine kurze Einschätzung zum Ruhepuls dieser Person: benenne das aktuelle Niveau, ordne die jüngsten Tage gegen die eigene Wochen-/Monats-Baseline ein und schließe mit einem machbaren Schritt. Konfidenz aus Messanzahl und Aktualität ableiten.${ctxBlock} ${snapshotJson}`; }