mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 20:42:43 +00:00
When a first-attempt response omits the rationale object (or emits empty comparedTo / deviation strings), the corrective reprompt now names the three rationale fields explicitly so the model has a targeted fix instead of guessing what changed. The reprompt also restates that rationale.dataWindow MUST equal metricSource.timeRange — bracket-mismatch is the most likely model-side bug now that the shape is new. The wrapper's post-validation `annotate()` block additionally emits three new Wide-Event meta fields: - ai_rationale_total_recommendations - ai_rationale_with_rationale - ai_rationale_missing_recommendation_ids Strict-parsed payloads always have rationale on every rec (the schema rejects otherwise), so the missing-ids array is an observability tripwire — it will only populate if a legacy payload ever rides through .passthrough() on a back-compat path. v1.4.17 admin AI dashboard plots rationale-coverage alongside the existing citation-coverage breakdown. 4 new tests in `rationale-wrapper.test.ts` pin the contract: - corrective retry message names dataWindow / comparedTo / deviation - empty deviation triggers retry (not just absent rationale) - annotate() carries the new ai_rationale_* keys on success - rationale-coverage = totalRecommendations on a fully-shaped payload Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>