screen-locker/stronglift_replacement/workout_app/test
Krzysztof kuhy Rudnicki 81ebccb51a
Some checks are pending
md-naming / markdown naming convention (push) Waiting to run
pre-commit / pre-commit (push) Waiting to run
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.12) (push) Waiting to run
Tests / lock-popup-safety (push) Waiting to run
release-apk / release (APK) (push) Waiting to run
Stop the phone counting deleted and empty manual workouts
The app said "manual budget exhausted for this window" (2/2w, 4/10m) while
the PC read 1/2w, 2/10m for the same records. The PC was right; two
independent Dart defects each inflated a window by one.

`_readMergedPayloads` never looked at `Record.deleted`, so the tombstoned
duplicate `manual:2026-08-21T21:00` -- the second of two logged on 08-21,
already deleted -- kept consuming a weekly slot. Suppression is collected
across the whole device union and applied after the merge, not per file:
one device tombstoning a record while another still holds it live must
delete it, and a per-file skip would just let the live copy win. This
mirrors the PC's `_tombstoned_ids`.

`countManualBudget` also counted `manual_workout:2026-08-15`, a bare
`{type, kind, date}` stub with no evidence fields. The PC refuses to ingest
those ("no workout data to ingest; skipping permanently"), so the phone was
charging budget for a workout neither device ever accepted. The filter lives
in the counter rather than the shared reader because `runnerup_verified` and
`pc_workout_verified` payloads legitimately carry no `start_time`, and the
history view must keep showing them.

Covered by a shared literal fixture both languages read, rather than two
independent round-trips: each side's own tests passed while the pair
disagreed, which is exactly how this shipped. Verified by reverting each
guard in turn and watching the twin fail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AWq9MRemX9ZWvNmnhNWUP2
2026-08-27 20:13:12 +02:00
..
models Stop the phone counting deleted and empty manual workouts 2026-08-27 20:13:12 +02:00
screens Stop the phone counting deleted and empty manual workouts 2026-08-27 20:13:12 +02:00
services Cover the lock-mode flag, and mark the one branch Linux cannot reach 2026-08-22 13:06:49 +02:00
ui workout_app: warm-tint the unified-design-system palette 2026-07-22 21:08:45 +02:00
widgets Add sync-status card and duration-threshold fixture 2026-08-15 18:41:31 +02:00
fake_audio_platform.dart Add phone-workout GitHub sync via shared crdt_sync (Workstream C) 2026-07-11 00:06:59 +02:00
fake_secure_storage.dart Add phone-workout GitHub sync via shared crdt_sync (Workstream C) 2026-07-11 00:06:59 +02:00
firebase_backend_google_test.dart workout_app: add Google sign-in support for the Firebase sync account 2026-08-14 10:56:16 +02:00
google_platform_test.dart workout_app: add Google sign-in support for the Firebase sync account 2026-08-14 10:56:16 +02:00
google_platform_web_test.dart workout_app: add Google sign-in support for the Firebase sync account 2026-08-14 10:56:16 +02:00
google_sign_in_backend_test.dart workout_app: add Google sign-in support for the Firebase sync account 2026-08-14 10:56:16 +02:00
main_lifecycle_test.dart Cover the lock-mode flag, and mark the one branch Linux cannot reach 2026-08-22 13:06:49 +02:00
widget_test.dart Add sync-status card and duration-threshold fixture 2026-08-15 18:41:31 +02:00