- scripts/bicorder_common.py (new): single source of truth for historical
gradient renames (COLUMN_RENAMES), version detection (bicorder_version col
→ version col → data/<type>_<version>/ dir convention), and training-CSV
auto-selection (find_training_csv)
- classify_readings.py: auto-select training run by recorded bicorder version
(excludes the input itself to avoid circular training), canonicalize old
column names, version-mismatch warnings
- bicorder_classifier.py / export_model_for_js.py: share renames + dimension
loader; instructive error when clustering results are missing;
bicorder_version recorded in exported models
- compare_analyses.py: CLI (reference + comparison CSVs), rename
canonicalization so runs of different versions align on shared gradients,
Descriptor dedup (was silently skewing merges); legacy no-arg audit intact
- scripts/univariate_analysis.py (new): per-protocol/per-gradient averages,
distributions, summary stats; --img publishes the three README summary
charts to img/
- sync_readings.sh: defer classifier training to auto-matching; gitignore
analysis/.venv and __pycache__