mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-09 13:01:00 +00:00
The calendar read, the Coach and MCP cycle block and the coming calendar feed now share one loader for the forecast's inputs (cycles, day logs, overnight wrist temperatures) and one gate (`gatedPrediction`: no forecast while prediction is off or raw-chart mode is on). The Coach block reads the calendar's default day-log window, so its next period is the date the calendar page shows, and resolves the luteal length through the engine's own clamp. `projectCycles` extends the engine's next-period forecast a few cycles ahead. Cycle 1 is the engine's result unchanged; later starts are anchored on it from the fractional median length, so six cycles out carry no rounding drift; later bands widen as the SD of a sum of k lengths with an estimated mean, with the engine's sparsity penalty, and never narrow. The list stops where a band passes ten days or half a cycle, holds the next period only while the engine is still learning or for perimenopause, and is empty once the next period's band has passed with nothing logged. `/api/cycle/calendar` publishes it additively as `projection` and `projectionState`; the Coach block carries it as `upcoming`.