Patterns
Partial Data States
The engine layer is built for gaps: missing data reduces confidence, never scores. The UI renders partiality through assumptions, missing-input lists, confidence gating, and cycle-mode subtitles.
62d since last bleed — recommendations follow how you feel, not cycle phase.
No sleep logged — assumed 6h. Capacity is not penalised.
Rules
- 01Unknown sleep → assume 6h internally; no crash risk added, capacity not reduced.
- 02missingInputs[] (max 3) renders in the fueling drawer.
- 03patternConfidence gates how much cycle framing appears.
- 04cycleMode swaps the focus subtitle: phase → “Cycle irregular” → “Xd since last bleed”.
Examples
Late perimenopause
≥60 days since last bleed: no phase labels at all; the subtitle counts days; operating mode is “Follow how you feel today.” The product gracefully sheds its cycle layer as cycles fade — the core perimenopause design problem, solved structurally.
Anti-patterns
What breaks this pattern
- Penalising scores for unlogged days
- Showing phase guesses during late peri
- Hiding cards because one input is missing
Do
- ·Disclose every internal assumption
- ·Shed features gracefully as data fades
Don't
- ·Treat missing as bad
- ·Guess silently