v1.4.39.3 — Dashboard slim/thick merge robustness and list-page precision
The post-deploy CI for v1.4.39.2 surfaced eight e2e failures across the
chromium-desktop and chromium-mobile profiles that all routed through
two narrow regressions and one durable test-fixture gap. v1.4.39.3
fixes the root causes, hardens the merge contract with a pure helper
plus unit coverage, and aligns the e2e route-mock patterns with the
v1.4.37 W-CI lesson so the regression class cannot recur.
Fixed
- Dashboard slim/thick merge no longer blanks the tile strip when
the slim slice resolves with an empty summaries record. The
v1.4.39.2 inlineslim?.summaries ?? thick?.summariesshort-
circuited on JavaScript's truthy-empty-object semantics even when
thick carried the full payload. The merge moved to a pure
mergeSlimAndThickAnalyticshelper that uses object emptiness as
the discriminator. Populated slim still wins on overlapping fields
(the v1.4.39.2 progressive-paint contract is preserved), empty slim
falls through to thick, both empty leaves the dashboard's data-
floor gates to render the appropriate empty state. Eight new
behaviour-level unit tests cover the edge cases. MeasurementListnon-grouped rows now preserve decimal precision
on both the desktop table and the mobile card grid. The v1.4.37
W7c collapsed-list view passed every value throughfmt.integer,
which kept the per-day step / activity aggregates correct but
silently truncated single weight / body-fat / temperature
readings — 78.4 kg rendered as "78 kg". Grouped rows (cumulative
HK type day aggregates) stay onfmt.integerbecause their
readings are integer-only by definition; non-grouped rows now use
fmt.numberwhich honours up to three fraction digits without
forcing a minimum.
Changed
- Playwright route mocks for
/api/analyticsmigrate from the
literal string glob to the regex form across every authenticated
spec. The**/api/analyticsglob does not match the sliced URL
form/api/analytics?slice=summariesthe v1.4.39.2 dashboard split
fires alongside the thick request, so the slim request fell through
to the real route on the seeded test user. Ten specs migrate; the
regex form is the durable alignment with the v1.4.37 W-CI lesson
that already sweptonboarding-flicker.spec.tsand
mobile-viewport.spec.ts.
Notes
- No schema migration. Runtime + test-fixture-only changes.
pnpm test --rungreen at 4662 / 4663 (1 long-standing skip).- Full Playwright suite green at 116 passing / 36 skipped / 152 total
on bothchromium-desktopandchromium-mobileprofiles against
the production Next.js build. Closes every failure from the
v1.4.39.2 post-deploy CI run.