v1.3.2
Garmin Running Data Normalizer v1.3.2
v1.3.2 is the published stable Snapshot correctness and evidence-preservation
patch. Its annotated tag, latest GitHub Release, and Production PyPI
distribution were published from the reviewed release commit.
Why this release exists
Validation across multiple Garmin Export Snapshots exposed boundary cases where
current-export absence, duplicate observations, unresolved variants, candidate
ambiguity, or runtime processing order could obscure already observed evidence.
This patch makes those boundaries explicit without changing the v1.3 dataset
catalog or Product API.
Fixed and improved
Snapshot-aware relationship resolution
Previously, an endpoint absent from the current Export could remain unresolved
even when it had been authoritatively observed in an earlier Snapshot. The
Snapshot-aware relationship path can now resolve such endpoints from the
accumulated evidence. A valid but unresolved relationship remains non-fatal and
auditable; malformed input remains fail-closed.
Sleep exact duplicates
Exactly identical Sleep observations are collapsed deterministically with audit
counts. Divergent values, provenance conflicts, and missing/invalid windows
remain reviewable or fail-closed according to the existing boundary. No Sleep
value is inferred or copied into Activity facts.
Endurance and UDS observed variants
When cross-Snapshot observations for one stable key differ, accepted observed
variants are retained in audit evidence. No winner, latest-wins value, or
unsupported canonical interpretation is selected.
Lactate Threshold candidates
Accepted Lactate candidates are preserved when authority is unresolved. Exact
repeats and distinct candidates remain auditable, no winner is selected, and
Stable Public Promotion remains intentionally unavailable.
Snapshot ordering
Snapshot chronology uses manifest.export_observed_at with the registered
Snapshot ID as a deterministic tie-breaker. Runtime processing sequence is
diagnostic only and cannot alter normalized truth, relationship classification,
or candidate selection.
Public-safe disclosure
Affected boundaries were multi-export Snapshot processing, relationship endpoint
resolution, exact Sleep duplicate handling, cross-Snapshot observed variants,
Lactate candidate ambiguity, and processing-order-dependent relationship
classification.
The patch does not introduce latest-wins, keep-last, inferred value generation,
or automatic winner selection. Stable dataset identifiers, grains, keys, and
the v1.3 dataset count remain unchanged. Lactate Threshold is not promoted to a
stable public dataset. These statements describe the reviewed evidence; they do
not claim universal platform compatibility or Garmin-official semantics.
Validation evidence
- 4 real Garmin Export Snapshots.
- 15/15 non-empty real-data subset Full Run-All validations.
- 24/24 Synthetic processing-order permutations with identical result.
- 4/4 representative real-data processing orders with identical result.
- Lost observed values: 0; invented values: 0; automatic winners: 0.
- pytest: 251 passed; unittest: 208 passed.
- Isolated build and strict Twine validation: PASS.
- Wheel and sdist clean install, installed Synthetic Run-All, and installed
handoff: PASS.
Known limitations
- Lactate Threshold remains candidate/audit only; machine identity, units,
authority, and Stable Promotion are not finalized. - Valid unresolved relationships remain visible in audit evidence.
- Different observed values remain preserved without a selected winner.
- FIT-incomplete input may produce
PARTIAL_SUCCESSwith warnings. - A full private 24/24 real-data order matrix remains deferred; the published
release uses the reviewed 15-subset matrix and representative real orders
described above.
Upgrade
Install or upgrade the published stable distribution with:
python -m pip install --upgrade garmin-running-data-normalizer==1.3.2
python -m garmin_running_data_normalizer --versionDesign background
Zenn is supplementary project storytelling, not the Product contract or release
authority.