WORKOUT EXPORT EXPERIMENT — 12 October 2026 All workout values and coordinates are synthetic. No Health account, physical recording or receiving service was used. Run these checks on a separate copy of the downloads: they overwrite result files in that directory. WHAT RAN provenance.json pins the tested source revision and source-file hashes. The actual WorkoutPort FIT builder and extracted GPX/TCX method bodies produced the three originals. The XML harness changed method visibility and supplied fixture-only model adapters and a constant title. Its cycling adapter returns lowercase "biking", matching the app model. This exercises serialization, not the full iPhone acquisition/export pipeline. The app source and private fixture harness are needed to regenerate the originals; the public checks below read and validate the supplied bytes. 1. INDEPENDENT FILE READBACK Keep all downloads together. With Python and uv installed, run: uv run --no-project --with fitdecode==0.11.0 python inspect.py . This reads FIT with CRC errors raised, parses XML by namespace, creates the extensions-removed GPX control, and writes results.json, results.csv and checksums.json. It makes no service upload. uv may download the pinned Python dependency. Missing values must remain missing, and recorded zeros must remain zero. GPX has no supplied distance total; FIT and TCX do. 2. ACTUAL LOCAL IMPORT PREVIEW AND DUPLICATE CHECK Use a checkout of p0s/WorkoutPort at provenance.json's sourceRevision. Copy preview-import.swift there and compile it with that revision's core files: swiftc -parse-as-library Sources/WorkoutPortCore/WorkoutImport.swift \ Sources/WorkoutPortCore/ImportDuplicateCheck.swift preview-import.swift \ -o preview-import Run the executable with the downloads directory and the full tested source SHA: ./preview-import /absolute/path/to/downloads TESTED_SOURCE_SHA Its JSON output is import-preview.json in these downloads. The command prints to standard output; it does not save the report automatically. It calls the actual local parser and duplicate checker, with a synthetic existing FIT candidate. GPX, TCX, a renamed FIT and the sensor-stripped GPX match that candidate. Four-hour start and different-sport controls do not match. The GPX preview calculates distance from coordinates and has no calorie total. This is no app UI test, Health write, account migration or service acceptance test. A duplicate warning does not establish equal sensor content. 3. OFFICIAL XML SCHEMA CHECK Python and xmllint are required. Download these five official files into a separate schema directory, using the local filenames on the left: gpx.xsd https://www.topografix.com/GPX/1/1/gpx.xsd trackpoint-v2.xsd https://www.garmin.com/xmlschemas/TrackPointExtensionv2.xsd power-v1.xsd https://www.garmin.com/xmlschemas/PowerExtensionv1.xsd tcx.xsd https://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd activity-v2.xsd https://www.garmin.com/xmlschemas/ActivityExtensionv2.xsd Run: python3 check-schemas.py /absolute/path/to/downloads /absolute/path/to/schemas The script pins the exact official schema hashes, runs xmllint offline with combined schemas, and validates every declared extension root separately. That extra check prevents a core schema's lax extension handling from accepting an unknown wrapper without examining its fields. It writes schema-results.json. A schema-file change fails closed for review; schema validity does not prove that a receiving service supports a field or accepts a workout. Run inspect.py again after replacing reports if you want updated checksums. checksums.json covers the public data, scripts and these instructions. SCOPE AND CORRECTIONS Six sparse points, one segment, cycling, five minutes. Inputs are deliberately not kinematically realistic: speed and cumulative distance are supplied independently of the equatorial coordinates. They include missing HR, cadence and power, recorded zero power/cadence, and FIT elevation quantization. The GPX control deliberately removes extensions; no named converter caused it. GPX uses Garmin TrackPointExtension v2 and direct PowerExtension v1 PowerInWatts. The first published GPX had incorrect power/speed namespaces. The corrected source and sample also use TCX's required sport capitalization and omit an incomplete optional Creator element. The schema receipt records the checked replacement bytes. No App Store build, device accuracy, pause behavior, full optional-field coverage or receiving-service compatibility is claimed. Independent FIT reader: https://github.com/polyvertex/fitdecode (MIT).