# Trained-model artifacts: byte-exact, never line-ending-converted (SHA-256 verified on load).
# Without this, Windows autocrlf could rewrite the bundled model.json and bloat diffs.
silly_kicks/tracking/_xshot_weights/** binary
silly_kicks/tracking/_xcross_weights/** binary
# Ghost-GK was the odd one out until ADR-050 gave it a feature contract; it is now a
# fingerprint-bearing artifact like the other two and gets the same pin. Its load() path
# already normalizes CRLF before hashing, so this is churn prevention, not a bug fix --
# without it the bundled metadata.json flips to CRLF on the next checkout.
silly_kicks/tracking/_ghost_gk_weights/** binary
# Ghost-outfield (TF-60 PR5) is the same fingerprint-bearing model.npz + metadata.json + SHA256SUMS
# bundle as ghost-GK, so it gets the same whole-directory pin. load() normalizes CRLF before hashing,
# so this is churn prevention (keeps the committed SHA byte-exact across OS), not a bug fix.
silly_kicks/tracking/_ghost_outfield_weights/** binary
# xSuccess (TF-61) bundled weights: model.json (SHA-verified) + metadata.json (37KB feature-contract
# + chirality) + SHA256SUMS + MODEL_CARD.md. Whole-directory pin like the four above, so Windows
# autocrlf cannot flip the checksummed model.json or bloat the large metadata.json diff on checkout.
silly_kicks/xsuccess/weights/** binary
# Match-outcome (TF-53) bundled Dixon-Coles rho: model.json (SHA-verified) + SHA256SUMS. Whole-directory
# pin like the five above. UNLIKE ghost-GK/gk-completion/receiver, DependenceModel.load hashes the RAW
# bytes (no CRLF normalization -- byte-exact, like xshot/xcross), so this pin is LOAD-BEARING for
# verification, not churn prevention: without it Windows autocrlf flips model.json to CRLF on checkout
# and the SHA-256 no longer matches SHA256SUMS -> MatchOutcomeIntegrityError (caught on windows CI).
silly_kicks/match_outcome/weights/** binary
# GK-completion (4.73.0), pinned NARROWLY -- only the SHA-verified pair, not the whole directory
# like the three above. Its `_sha` normalizes CRLF before hashing, so verification was never at risk;
# the pin exists to stop model.json flipping to CRLF on the next checkout and producing a spurious
# diff. `metrics.json` and `MODEL_CARD.md` are deliberately LEFT AS TEXT: `superseded_coef` is
# recorded in metrics.json precisely so a weights change is reviewable later, and a binary pin would
# make exactly that unreadable in review.
silly_kicks/tracking/_gk_completion_weights/*/model.json binary
silly_kicks/tracking/_gk_completion_weights/*/SHA256SUMS binary
# Expected-receiver model (4.90.0, ADR-066), pinned NARROWLY like GK-completion above -- only the
# SHA-verified pair. `_sha` normalizes CRLF before hashing so verification is safe either way; the pin
# just stops model.json flipping to CRLF on the next checkout and bloating diffs. `metrics.json` and
# `MODEL_CARD.md` stay TEXT so the coefficients/provenance remain reviewable.
silly_kicks/tracking/_receiver_weights/*/model.json binary
silly_kicks/tracking/_receiver_weights/*/SHA256SUMS binary
# Win-probability (TF-63, ADR-101), pinned NARROWLY like GK-completion/receiver -- only the SHA-verified
# pair. UNLIKE those, WinProbabilityModel.load hashes the RAW model.json bytes (read_bytes, no CRLF
# normalization -- like match-outcome/xshot/xcross), so this pin is LOAD-BEARING for verification, not
# churn prevention: without it Windows autocrlf flips model.json to CRLF on checkout and the SHA-256 no
# longer matches SHA256SUMS -> WinProbabilityIntegrityError (caught on windows CI). `metrics.json` and
# `MODEL_CARD.md` stay TEXT so the calibration numbers + provenance remain reviewable.
silly_kicks/win_probability/weights/model.json binary
silly_kicks/win_probability/weights/SHA256SUMS binary
# StatsBomb 360 slice: byte-exact, never line-ending-converted. Its SOURCE_SHA records SHA-256
# digests of these files, so autocrlf silently breaks verification -- CI caught exactly that:
# the digest was computed on a CRLF working copy and ubuntu read LF. Same reason as the three
# model-artifact pins above; recorded because this is now the fourth time.
tests/datasets/statsbomb/three-sixty/*.json binary
