fix(insights): primary recommendation parses metric: chart tokens

The base-system prompt invites the model to embed `metric:WEIGHT` /
`metric:BP` etc. tokens in `primaryRecommendation` so the UI can drop
inline charts under the prose. The hero "Key Takeaway" card was the
only renderer printing the field raw — when the model followed the
instructions, the user saw the literal string `metric:WEIGHT` inside
the recommendation. Apply the same `stripChartTokens` + `<InlineCharts>`
pattern that the summary already uses.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.7 committed 2026-05-09 01:24:47 +02:00
1 parent 8aae7d6dfe
commit a75fbc6aaf
1 file changed
+10 -3
@@ -402,13 +402,20 @@ export function InsightAdvisorCard({
</div>
)}
{/* Primary Recommendation */}
{/* Primary Recommendation — prose first, then any inline charts the
* model emitted via `metric:<TYPE>` tokens. Tokens are stripped from
* the visible text so they never leak into the hero card. */}
{insight.primaryRecommendation && (
<div className="border-dracula-purple bg-dracula-purple/5 rounded-md border-l-2 px-4 py-3">
<div className="border-dracula-purple bg-dracula-purple/5 space-y-3 rounded-md border-l-2 px-4 py-3">
<p className="text-dracula-purple mb-1 text-xs font-medium tracking-widest uppercase">
{t("insights.keyTakeaway")}
</p>
<p className="text-sm">{insight.primaryRecommendation}</p>
<p className="text-sm">
{stripChartTokens(insight.primaryRecommendation)}
</p>
<InlineCharts
tokens={parseChartTokens(insight.primaryRecommendation)}
/>
</div>
)}