mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-12 06:06:10 +00:00
Production GET /api/analytics returned HTTP 500 for users with very long measurement histories (request-id d86db8e5… 2026-05-16 14:39:51 UTC). The wide-event log pinned the failure at Promise.all index 3 (PULSE) with RangeError: Maximum call stack size exceeded — a power user's Apple-Health heart-rate stream crossed V8's ~125k function-arity ceiling on the Math.min(...values) / Math.max(...values) spread inside summarize(). Fold sum, min, and max into a single pass over values so the transient argument array goes away and the working set stays bounded at the array itself. Mean is now derived from the same fold's sum/length instead of a second reduce. No public API change; min/max semantics for an empty series remain null via the early-exit branch. Adds a 250 000-row regression in trends.test.ts that raises the exact production stacktrace before the fix and passes after, plus a new src/app/api/analytics/__tests__/route.test.ts that pins the route-entry contract (5 000-row PULSE + zero-row brand-new user) so the upcoming C1 architectural rewrite can't silently reintroduce a spread anywhere along the call chain. Touched-file lint and pnpm typecheck clean; broader src/lib + src/app/api/analytics sweep is 2671 / 1 skipped.