This public repository contains share-safe schemas, validation/build code, and an authenticated sync client. Real launch-monitor data, published value tables, source snapshots, normalized databases, and row-level derived artifacts are stored only in D-sorganization's private data authority.
python scripts/sync_private_data.py sync
$env:LAUNCH_MONITOR_DATA_ROOT = `
(Resolve-Path private_data/launch-monitor-authority).Path
launch-monitor-data validateThe sync client clones the private
D-sorganization/Launch-Monitor-Flight-Model-Campaign repository at the exact
commit d469b8a427418fa00e99b0ad488e4310b067697d recorded in
private_data.lock.json. It does not accept a moving branch
or silently download from third-party sources. Git ignores the checkout.
Users without private access can inspect and test the public code, but data commands fail closed until an authorized checkout is present.
Release A distinguishes the 261,666-row source inventory from scientifically qualified cohorts. The locked authority reports 13,855 complete, non-imputed five-input rows; outcome-specific agreement sample sizes are smaller. These are vendor-output agreement cohorts, not independent ground truth.
The authority's aggregate database carries 254 group-mean observations
across 91 registered sources, each transcribed from CC BY 4.0-licensed
tables: the Suzuki 2021 outdoor TrackMan study (24 observations), the
Robinson 2024 and Brennan 2024 cohort studies (4 and 8), the Ichikawa 2022
X3 driver study (2), the Navarro 2022 Foresight GC2+HMT club-speed study
(6), the Yang 2024 FlightScope Xi shaft-weight study (30), the Xiang 2025
tDCS crossover study (24), and the Goswami 2025 warm-up study (42). See
DATA_LICENSE.md for the license basis of the ingested and transcribed
sources.
Applications can inspect only hash-verified, data-free metadata from the authenticated checkout:
from launch_monitor_data import (
load_capabilities,
load_release_b_status,
load_source_metric_eligibility,
vendor_operation,
)
capabilities = load_capabilities()
trackman = vendor_operation("trackman", "model_agreement")
training = vendor_operation("trackman", "vendor_training")
assert trackman.allowed
assert not training.allowed
print(training.reasons) # no approved repeating split group
matrix = load_source_metric_eligibility(vendor_key="trackman")
release_b = load_release_b_status()
assert release_b.planned_pairs == 252
assert release_b.triggered_pairs == 0
assert release_b.analyzed_pairs == 0
assert not release_b.confirmatory_ready
assert release_b.vendor_training_eligible_rows == 0The API verifies the exact private commit, qualification schemas, policy/count agreement, and SHA-256 hashes before returning aggregate or source/metric policy metadata. It never returns shot rows. Unknown vendors, unknown operations, missing metadata, commit drift, and hash drift fail closed. Current metadata does not authorize within-player, longitudinal, strokes-gained, same-shot cross-device, public-output, or vendor-surrogate training workflows. ShotLink remains prohibited for vendor training and public output.
The pinned private authority contains a hash-verified structural schedule for
252 paired shots: 84 each for driver, 7-iron, and wedge. As of this exact
release, 0 of 252 pairs have been triggered or analyzed, every ledger row is
not_collected, and confirmatory_ready is false. No vendor-training decision
or group-safe training row became eligible.
load_release_b_status() verifies the private status, schedule, ledger, pair
membership, cell counts, accounting, and existing eligibility matrix before
returning aggregate status. It never returns schedule, ledger, capture, or shot
rows. The structural schedule does not establish vendor agreement and must not
be described as collected evidence. Physical campaign parameters—including
the ball SKU, numeric speed bands, hardware/reference set, calibration
certificates, and placement plan—remain owner-controlled pre-pilot hold points.
The private authority carries a source-partitioned Parquet corpus
(261,666 shots across 27 sources at the pinned authority commit). With the
corpus extra
installed (pip install -e ".[corpus]"), load it as an analysis-ready frame
in the canonical SI contract shared with UpstreamDrift's launch_monitor
analytics (angles in radians, speeds in m/s, spin in rad/s, distances in m):
from launch_monitor_data.corpus import available_sources, load_shots
load_shots(metrics=["ball_speed", "carry_distance"]) # pruned, fast
load_shots(sources=["blackmore_trackman_10169"]) # one source
load_shots(canonical_units=False) # keep native mph/deg/rpmEvery frame carries source_id, monitor, club, and
observation_kind="shot". The apex_native column is passed through
unconverted because its unit varies by source. For ad hoc SQL, DuckDB reads
the same dataset directly:
SELECT source_id, count(*) AS shots, avg(ball_speed_mph) AS avg_ball_mph
FROM read_parquet('private_data/launch-monitor-authority/data/authority/database/shot_corpus_parquet/*/*.parquet', hive_partitioning=true)
GROUP BY source_id ORDER BY shots DESC;- No real source rows or generated databases are tracked here.
- Public CI does not receive a private-repository token.
- Small synthetic parser fixtures may live in public consumer repositories.
- The 10,169-shot TrackMan corpus has no trustworthy player identifier and must not be presented as within-player evidence.
- Private storage does not change third-party licenses or grant redistribution rights.
See docs/PRIVATE_ACCESS.md for the folder contract.