merge: suppress-during-illness Rest Mode + FHIR Condition + doctor-report

This commit is contained in:
Marc-André Bombeck committed 2026-06-16 22:27:13 +02:00
commit b28fa4d4a5
37 files changed
+1352 -24

No files matched your search

@@ -41,13 +41,16 @@ function deviation(
}
function ok(
value: CoincidentDeviationValue,
value: Omit<CoincidentDeviationValue, "illnessExplained"> &
Partial<Pick<CoincidentDeviationValue, "illnessExplained">>,
band: "high" | "medium" | "low" | "draft" = "high",
): Resp {
return {
metric: "COINCIDENT_DEVIATION",
status: "ok",
value,
// v1.18.1 P4 — default the Rest Mode reframe flag off so the existing
// fixtures stay valid; the reframe test passes `illnessExplained: true`.
value: { illnessExplained: false, ...value },
coverage: {
requiredInputs: 5,
presentInputs: 5,
@@ -202,6 +205,32 @@ describe("<CoincidentDeviationCard>", () => {
expect(html).not.toContain('role="alert"');
});
it("reframes a fired flag as illness-explained during Rest Mode (no extra alarm)", () => {
mock(
ok({
fired: true,
day: "2026-06-03",
illnessExplained: true,
vitals: [
deviation("RESTING_HEART_RATE", true),
deviation("RESPIRATORY_RATE", true),
],
contributing: [
deviation("RESTING_HEART_RATE", true),
deviation("RESPIRATORY_RATE", true),
],
}),
);
const html = render(<CoincidentDeviationCard />);
expect(html).toContain('data-state="fired"');
// The reframe line replaces the open-ended "possible factors" copy.
expect(html).toContain("the condition you logged");
expect(html).not.toContain("Possible factors — never a cause");
// Annotate, don't escalate: no new destructive colour beyond the amber the
// fired state already carries.
expect(html).not.toContain("text-destructive");
});
it("softens a fired flag to the watch tone when history is thin", () => {
mock(
ok(
@@ -278,7 +278,13 @@ export function CoincidentDeviationCard({
className="text-muted-foreground text-xs leading-snug"
data-slot="coincident-factors"
>
{t("insights.derived.coincident.factors")}
{/* v1.18.1 P4 — Rest Mode reframe. When an illness episode is active
the deviations have a known explanation, so the card states it
plainly instead of leaving "possible factors" open. Neutral copy,
no extra colour. */}
{v.illnessExplained
? t("insights.derived.coincident.illnessExplained")
: t("insights.derived.coincident.factors")}
</p>
</CardShell>
);