Marc-André Bombeck
00c282d311
fix(workouts): collapse a re-sent session on every surface, not just the list
...
The canonical picker keyed a session on sport, start, end and duration. Only the
workout list selected the end timestamp; the Coach narration, the per-sport
baseline and the deep-link cluster passed rows without it, so those rows carried
no session identity at all and the duplicate survived. One record counted once in
the list and two or three times everywhere else, including in the averages a
person is compared against.
Drop the end timestamp from the identity. On a workout with pauses it measures
wall-clock time while the duration counts only moving time, so two re-sends of
one session can differ in that field alone and the stricter key rejected a
genuine match. It also bought nothing in exchange: nobody starts a second
workout of the same sport in the same instant with the same duration.
The deep-link cluster now selects the duration it needs. A structural guard
freezes the call-site set and records which file owns each caller's select, so a
new surface cannot join the set without fetching the identity, and the identity
cannot grow a field only some callers fetch.
2026-07-30 11:54:58 +02:00
Marc-André Bombeck
c83254032e
fix(google-health): map badminton workouts
2026-07-29 22:24:04 +02:00
Marc-André Bombeck
0c7b958b1b
fix(workouts): collapse repeated same-source sessions
2026-07-29 21:30:52 +02:00
Marc-André Bombeck
271f0ed28a
fix(medications): make import replay results honest
2026-07-29 16:11:45 +02:00
Marc-André Bombeck
5b695f43ea
fix(analytics): restore device-priority sleep selection
2026-07-29 16:08:41 +02:00
Marc-André Bombeck
fb02cf89b1
fix(jobs): reconcile durable fact inventory
2026-07-29 15:59:27 +02:00
Marc-André Bombeck
75aa850eae
style: satisfy v1.34.1 format gate
2026-07-29 15:59:12 +02:00
Marc-André Bombeck
fb9ae2ac61
fix(coach): keep stateless turns grounded
2026-07-29 15:56:19 +02:00
Marc-André Bombeck
9354c649fe
fix(integrations): surface Google sync progress and canonical workouts
2026-07-29 15:55:37 +02:00
Marc-André Bombeck
b9879e8829
fix(nightscout): pin approved private origins
2026-07-29 15:54:01 +02:00
Marc-André Bombeck
8db21ab718
fix(jobs): persist bounded success outcomes
2026-07-29 15:50:42 +02:00
Marc-André Bombeck
b41b32d472
feat(i18n): complete v1.34.1 locale reconciliation
2026-07-29 15:11:40 +02:00
Marc-André Bombeck
5bc213c5b8
test(01-21): type guarded progress mock calls
...
- declare the updateMany mock argument tuple
- assert the guarded write exists before inspection
2026-07-29 15:04:08 +02:00
Marc-André Bombeck
104a058096
style(workouts): format pulse enrichment
2026-07-29 14:58:46 +02:00
Marc-André Bombeck
5ec1a3836f
feat(01-21): add fair Google sync outcomes
...
- finish workout and low-cost resources before dense metrics
- report bounded terminal outcomes and invalidate workout caches
2026-07-29 14:58:40 +02:00
Marc-André Bombeck
d2f6bf33eb
fix(workouts): sanitize WHOOP zone enrichment
2026-07-29 14:58:24 +02:00
Marc-André Bombeck
89fefce7ac
test(workouts): separate pulse aggregates from curves
2026-07-29 14:57:42 +02:00
Marc-André Bombeck
43cce08012
fix(workouts): share enriched canonical detail data
2026-07-29 14:56:59 +02:00
Marc-André Bombeck
635e9b64c5
fix(workouts): enrich canonical WHOOP aggregates
2026-07-29 14:55:11 +02:00
Marc-André Bombeck
1cb0f7dd6a
test(workouts): pin WHOOP aggregate enrichment
2026-07-29 14:53:59 +02:00
Marc-André Bombeck
c3ffc43335
refactor(01-22): reuse Google cohort concurrency limit
...
- preserve the shared Google Health poll fan-out width
2026-07-29 14:53:22 +02:00
Marc-André Bombeck
6a3861122c
feat(01-22): publish truthful cohort outcomes
...
- fold complete partial failed parked and skipped user verdicts
- bound serialized job facts to a privacy-safe scalar allowlist
- preserve provider retry isolation and reminder queue completion
2026-07-29 14:50:30 +02:00
Marc-André Bombeck
5cfcb69ef2
feat(01-21): add guarded Google sync progress
...
- persist one bounded owner-scoped current-run envelope
- reject stale writers and materialize interrupted runs safely
2026-07-29 14:49:12 +02:00
Marc-André Bombeck
addd6b7000
fix(01-19): avoid phantom ECG failure counts
...
- increment archive-level failures only for discovered ECG artifacts
2026-07-29 14:47:47 +02:00
Marc-André Bombeck
a686c7200b
feat(01-19): persist Apple Health ECG recordings
...
- encrypt and upsert stable content-addressed ECG recordings transactionally
- keep XML imports successful while ECG members fail with scalar counters
2026-07-29 14:45:40 +02:00
Marc-André Bombeck
f06137c0db
feat(01-19): add bounded Apple Health ECG parsing
...
- validate ZIP paths, compression metadata, and actual decompressed bytes
- normalize ECG CSV descriptors and bounded microvolt samples
2026-07-29 14:42:18 +02:00
Marc-André Bombeck
efe203212a
fix(01-20): classify safe assessment outcomes
...
- add a discriminated generated and fallback contract
- screen derived prose and expose retryable cache policy
2026-07-29 14:36:29 +02:00
Marc-André Bombeck
0ae9165aae
refactor(01-18): format occurrence identity changes
...
- apply repository formatting to reminder and scheduling updates
- preserve verified occurrence behavior without semantic changes
2026-07-29 14:36:21 +02:00
Marc-André Bombeck
840e47fda5
fix(01-18): preserve authoritative rolling due in consumers
...
- expose the canonical due schedule identity from the shared list read
- prevent passed local windows from rebinding a prior overdue occurrence
2026-07-29 14:35:23 +02:00
Marc-André Bombeck
2de9bccf9d
fix(01-18): retain rolling occurrence through due band
...
- preserve prior rolling identity independently of local-day flooring
- scope exact resolution by schedule and era while advancing resolved grids
- include open rolling slots for display without widening compliance bands
2026-07-29 14:33:17 +02:00
Marc-André Bombeck
c0af97ce46
fix(01-18): preserve reminder occurrence across midnight
...
- select active canonical recurrence slots instead of rebuilding from tick day
- scope intake suppression and dedup metadata to the occurrence local date
2026-07-29 14:30:23 +02:00
Marc-André Bombeck
690c4aeb5a
test(01-14): add failing truthful cohort contracts
...
- distinguish complete partial failed parked skipped and clean-zero outcomes
- require bounded privacy-safe scalar serialization and retry codes
2026-07-29 14:26:26 +02:00
Marc-André Bombeck
958b0e10d9
fix(01-11): keep reminder fixture type-safe
...
- mutate the inferred schedule fixture without widening nullable fields
- preserve the cross-midnight RED expectation unchanged
2026-07-29 14:24:00 +02:00
Marc-André Bombeck
6cc3de8248
test(01-12): add failing Apple ECG import contracts
...
- pin bounded path-safe archive and parser behavior
- require encrypted idempotent fail-soft persistence and WHOOP regressions
2026-07-29 14:20:56 +02:00
Marc-André Bombeck
d5f473d672
test(01-11): specify rolling weekly overdue identity
...
- pin the prior-day Mounjaro occurrence across local midnight and DST
- cover resolution state, band end, schedule siblings, and era isolation
2026-07-29 14:19:03 +02:00
Marc-André Bombeck
d8e52b831d
test(01-13): add red Google sync progress contracts
...
- pin workout-first fairness and bounded resource outcomes
- require owner-scoped race-safe current-run progress in PostgreSQL
2026-07-29 14:18:20 +02:00
Marc-André Bombeck
81893ac972
test(01-11): reproduce cross-midnight reminder identity bug
...
- pin prior-day occurrence lookup across timezone and DST boundaries
- prove real worker dedup and distinct next-dose behavior with PostgreSQL
2026-07-29 14:15:48 +02:00
Marc-André Bombeck
f95da50ba0
fix(01-07): enforce exact Nightscout origins
...
- move private-host authority to the server-owned exact-origin policy
- preserve stable redacted policy failures through connect and sync
2026-07-29 13:57:07 +02:00
Marc-André Bombeck
89c83510d4
feat(01-08): bind passkey enrollment to fresh cookie proof
...
- require an existing-factor proof before issuing registration options
- atomically claim session-bound challenges before credential persistence
2026-07-29 13:52:22 +02:00
Marc-André Bombeck
db08f6c175
fix(01-05): serialize MCP refresh families
...
- lock and rotate refresh families inside one database transaction
- revoke CAS losers and insert successors before commit
- sign refresh artifacts only after committed state
2026-07-29 13:50:14 +02:00
Marc-André Bombeck
a177869609
fix(01-07): classify embedded IPv4 destinations
...
- Normalize IPv6 literals before transition-prefix inspection
- Reject mapped, compatible, 6to4, and NAT64 private embeddings
- Share the verdict with pinned public and operator dispatchers
2026-07-29 13:49:49 +02:00
Marc-André Bombeck
36cb64c840
test(01-02): exercise DNS transition cases past fetch port guard
...
- replace blocked port 9 with non-blocked test port 8089
- preserve pre-connect ENOTFOUND assertions for all transition forms
2026-07-29 13:49:46 +02:00
Marc-André Bombeck
20a6731c8b
fix(01-05): enforce MCP health read scope
...
- require health:read or wildcard for MCP read capability
- reject insufficient scopes before downstream gates and server construction
2026-07-29 13:47:46 +02:00
Marc-André Bombeck
338dbe6c1f
fix(01-06): purge owned PWA caches on session end
...
- delete current and legacy HealthLog static page and data caches
- preserve unrelated CacheStorage namespaces during activation and logout
- keep IndexedDB query-cache removal in the session-end boundary
2026-07-29 13:46:15 +02:00
Marc-André Bombeck
51f5f43957
test(01-01): preserve explicit transaction contract
...
- keep the red transaction-client call aligned with the planned signature
- isolate the concurrent documentation commit from MCP test content
2026-07-29 13:43:27 +02:00
Marc-André Bombeck
cc8567d82f
docs(01-02): complete PWA and SSRF red contracts plan
...
- document expected cache-isolation and transition-form failures
- record preserved public and redirect behavior
- capture atomic task commits and verification evidence
2026-07-29 13:42:30 +02:00
Marc-André Bombeck
38501f6574
test(01-01): specify transactional refresh rotation
...
- require one transaction for rotation and successor insertion
- pin CAS-loss revocation and insertion rollback semantics
2026-07-29 13:40:03 +02:00
Marc-André Bombeck
e25080b214
test(01-02): add red DNS-pinned SSRF contracts
...
- refuse standard embedded-private IPv6 resolver answers pre-connect
- preserve public IPv6 to IPv4 fallback connectivity
- prove followed redirects repeat the pinned DNS verdict
2026-07-29 13:39:52 +02:00
Marc-André Bombeck
14f451093e
test(01-04): pin Nightscout egress enforcement
...
- Deny user-authorized and mismatched private origins before network access
- Preserve exact operator-private and public positive flows
- Require stable redacted policy reasons through sync boundaries
2026-07-29 13:39:06 +02:00
Marc-André Bombeck
6c0f47acad
test(01-01): pin MCP read scope boundaries
...
- cover health read and wildcard positive capability paths
- reject unrelated scopes before server registration and database reads
2026-07-29 13:38:41 +02:00