feat(cycle): exclude disturbed temperatures from the symptothermal engine

A fever, illness, alcohol or a late/short-sleep reading can fake or mask
a temperature rise. Add a per-day `temperatureExcluded` flag on
CycleDayLog (migration 0156): when set, the engine drops the reading from
the cover-line baseline AND the shift evaluation, so a spike neither
fabricates nor masks a rise (Sensiplan: the cover line is drawn over the
last six unbracketed values).

Wired end to end — schema + Prisma, the engine's `detectTempShift`
filter, the Zod input/patch schemas, the day-log upsert (partial merge +
change detection), the read DTO, the calendar/insights/coach selects, the
backup round-trip, and the OpenAPI contract (a new boolean on the day-log
and calendar-day DTOs for the iOS client). The log-day sheet gains a
"mark reading as disturbed" toggle that appears once a temperature is
entered, translated across all six locales.

Citation: de.wikipedia "Symptothermale Methode"; myNFP "Temperaturkurve
auswerten" — Störfaktor bracketing.
This commit is contained in:
Marc-André Bombeck committed 2026-06-14 15:04:25 +02:00
1 parent cd55c60fae
commit 4bfe9f11d7
27 files changed
+199 -7

No files matched your search

+12
View File
@@ -117,6 +117,8 @@ paths:
type: number
minimum: 30
maximum: 45
temperatureExcluded:
type: boolean
ovulationTest:
type: string
enum:
@@ -252,6 +254,8 @@ paths:
minimum: 30
maximum: 45
- type: "null"
temperatureExcluded:
type: boolean
ovulationTest:
anyOf:
- type: string
@@ -412,6 +416,8 @@ paths:
type: number
minimum: 30
maximum: 45
temperatureExcluded:
type: boolean
ovulationTest:
type: string
enum:
@@ -6240,6 +6246,8 @@ components:
anyOf:
- type: number
- type: "null"
temperatureExcluded:
type: boolean
ovulationTest:
anyOf:
- type: string
@@ -6333,6 +6341,7 @@ components:
- flow
- intermenstrualBleeding
- basalBodyTempC
- temperatureExcluded
- ovulationTest
- cervicalMucus
- sexualActivity
@@ -6647,6 +6656,8 @@ components:
anyOf:
- type: number
- type: "null"
temperatureExcluded:
type: boolean
ovulationTest:
anyOf:
- type: string
@@ -6677,6 +6688,7 @@ components:
- hasSymptoms
- confidence
- basalBodyTempC
- temperatureExcluded
- ovulationTest
- cervicalMucus
additionalProperties: false