Files
HealthLog/src/lib/ai/coach/__tests__
Marc-André Bombeck feeff38ba2 feat(coach-prompt): GROUND RULE 13 (insights) + 8 (coach) — no internal metric enum names in prose
Closes the loop on the "Metric Pressure_Sys" leak Marc reported on
the Einschätzungen surface 2026-05-14. The stripChartTokens regex
extension cleans up render-time output, but the model was free to
keep emitting raw enum identifiers turn after turn. This commit
teaches the generator to stop emitting them in the first place.

Insight-generator (DE + EN) gets GROUND RULE 13:

  - Lists every banned identifier verbatim — Pressure_Sys,
    BLOOD_PRESSURE_SYS, PULSE_BPM, MOOD_SCORE,
    MEDICATION_COMPLIANCE_PCT, plus the v1.4.23 Apple Health surface
    (HEART_RATE_VARIABILITY, RESTING_HEART_RATE,
    ACTIVE_ENERGY_BURNED, FLIGHTS_CLIMBED,
    WALKING_RUNNING_DISTANCE, VO2_MAX, BODY_TEMPERATURE,
    SLEEP_DURATION).
  - Enumerates the exact user-facing fields the ban applies to —
    summary, recommendations[].text, findings, dailyBriefing,
    trendAnnotations.*, weeklyReport.*, storyboardAnnotations.
  - Carves out the contract identifiers the parser reads
    (metricSource.type, sourceMetric, trendAnnotations keys) so the
    JSON contract stays intact — the ban applies ONLY to prose.
  - Documents the natural-language labels to use instead ("your
    systolic", "your weight", "your medication adherence", …).

Coach system-prompt (DE + EN) gets the matching GROUND RULE 8 with
the same banned list, the same prose-only carve-out, and an extra
clarification that evidence-block labels stay human-readable
("avg30 systolic", NOT "BLOOD_PRESSURE_SYS_AVG_30") while the
window slot keeps its documented contract vocabulary.

PROMPT_VERSION 4.23.0 → 4.24.0. The rule is genuinely new (neither
prompt previously mentioned the enum identifiers in any form), so
the bump reflects the additive behavioural change. Existing pin
assertions in coach-prompt-v423.test.ts + coach/system-prompt.test.ts
loosen from `/^4\.23\.\d+$/` to `4.{>=23}.x` so future additive
ratchets don't force a hostile test rewrite each time.

New unit tests pin GROUND RULE 13 + 8 by the banned-identifier
strings + the contract-carve-out wording so a future copy-paste
regression can't silently drop either rule.
2026-05-14 12:52:18 +02:00
..