Intégrité
Le registre des vérifications derrière chaque nombre du site.
La barrière est fermée : le déploiement d'aujourd'hui a été refusé.
Cette page est le dossier d'essais derrière chaque nombre : ce qui a été vérifié, par rapport à quoi, avec quel résultat, et qui décide de la suite.
- Barrière
- fermée
- Tâches au vert
- Matchs complets
- Décisions en attente
Barrière fermée
- excluded-source:
Avertissements (ne ferment pas la barrière) :
- record-gaps:
- range-soft:
- ledger-re-resolution:
- control-alert:
- stale-build:
- contract-deploy.data:
- anomaly-defects:
La tâche de déploiement lit cette barrière avant de préparer une version. Fermée veut dire que la version d'hier reste en ligne. Une barrière périmée (plus de 30 h) est un avertissement dans le journal de déploiement, pas un refus : une analyse qui n'a pas roulé ne peut pas bloquer en silence le déploiement quotidien approuvé.
Tâches dont dépend le site
Vert veut dire que la tâche a produit son artefact à temps, jamais seulement qu'elle s'est terminée. Les tâches d'analyse écrivent un signal de vie ; les autres tâches sont jugées sur le fichier qu'elles laissent.
| Tâche | État | Dernière production | Fréquence | Détails |
|---|---|---|---|---|
| Morning assay ·critique | vert | |||
| Game passports ·critique | vert | |||
| Data contracts ·critique | vert | |||
| Control charts | vert | |||
| Golden replay | vert | |||
| Mutation tests | vert | |||
| Hub controls (pull) | vert | |||
| Hub cards + notification (push) | vert | |||
| Model spend ledger | vert | |||
| Nightly model state (refresh-predictions) ·critique | vert | |||
| Ledger: morning predictions recorded ·critique | vert | |||
| Licensed feeds pulled ·critique | vert | |||
| Injury listings | vert | |||
| White noise | vert | |||
| Daily data deploy ·critique | périmé |
Versions de production connues de cette tâche
Chaque match de saison régulière attendu, chaque saison sur disque
Un match est complet quand les artefacts du registre sont présents et que chaque vérification de rapprochement réussit. Les couches de couverture (extraits, fiches des joueurs actuels) sont signalées, mais ne rendent jamais un match incomplet.
| Saison | Matchs attendus | Complets | Minutes cartographiées | Détails |
|---|---|---|---|---|
- goalsAgree : Les buts concordent entre le fichier des tirs, le registre des buts et les événements
- shiftSums : Les feuilles de présences totalisent un nombre réel de joueurs, sans doublon
- shooterOnIce : Chaque tireur et chaque gardien figuraient sur la feuille à la seconde du tir
- teamAgree : Le club du tireur sur la feuille est le club au tir dans le fichier des tirs
- assistsOnIce : Chaque mention d'aide est allée à un joueur sur la glace
- emptyNetGoalie : L'indicateur de filet désert concorde avec la feuille
- timeBounds : Chaque temps se situe à l'intérieur de sa période
Artefacts cette saison
matchs complets ; incomplets. Construit le 2026-10-18.
| Artefact | Présents | Partiels | Manquants | Détails |
|---|---|---|---|---|
| Ligne du calendrier | ||||
| Tirs | ||||
| Feuilles de présences (deux clubs) | ||||
| Événements jeu par jeu | ||||
| Registre des buts | ||||
| Officiels | ||||
| Fiches de match (joueurs actuels) | ||||
| Alignements en uniforme | ||||
| Fichier des buts attendus | ||||
| Extraits des buts | ||||
| Match condensé | ||||
| Résumé |
Lacunes de couverture (non bloquantes) : officials:missing ×, clips:partial ×.
| Match | Date | Défauts |
|---|---|---|
| PHI à NJD | shiftSums: 26 overlapping shifts by the same player; 3 club-periods with more than six on the ice for over 60 s | |
| BOS à WPG | shiftSums: club 52 period 3: 7.58 players on ice on average; 64 overlapping shifts by the same player; 6 club-periods with more than six on the ice for over 60 s | |
| STL à DAL | emptyNetGoalie: 2 of 61 shots whose empty-net flag disagrees with the chart | |
| BOS à MIN | shiftSums: 11 overlapping shifts by the same player; 3 club-periods with more than six on the ice for over 60 s | |
| COL à WPG | shiftSums: 3 club-periods with more than six on the ice for over 60 s | |
| MIN à FLA | shiftSums: 13 overlapping shifts by the same player | |
| DAL à PIT | shiftSums: 25 overlapping shifts by the same player; 4 club-periods with more than six on the ice for over 60 s | |
| COL à DAL | shiftSums: 3 club-periods with more than six on the ice for over 60 s | |
| VGK à NSH | shiftSums: club 18 period 1: 6.82 players on ice on average | |
| NYI à OTT | shiftSums: 15 overlapping shifts by the same player; 4 club-periods with more than six on the ice for over 60 s | |
| STL à NSH | shiftSums: 22 overlapping shifts by the same player; 3 club-periods with more than six on the ice for over 60 s |
Source: Game passports · as of 2026-10-18
Ce que chaque flux a livré en dernier
Chaque nombre du site nomme son flux et sa date de référence ; un flux périmé est affiché périmé, en toutes lettres, jamais comme à jour.
| Flux | État | En date du | Âge (jours) | Détails |
|---|---|---|---|---|
| Roster transactions | à jour | |||
| Injury listings | à jour | |||
| Projected lineups | périmé | |||
| Starting goalies | not-connected | |||
| Market odds | not-connected | |||
| Attention (stories, Wikipedia, social) | à jour | |||
| Model state | à jour |
Formes et plages, vérifiées ce matin
La forme JSON du plus récent fichier de chaque flux est comparée à celle d'hier ; les plages et vocabulaires des tirs, présences, événements, buts, calendriers et registres de contrats sont vérifiés comme unités typées.
- shots.type: lignes ; exemple {"game":"2026020015","type":"unknown"}
- contracts.signingDate: lignes ; exemple {"club":"carolina-hurricanes","player":"Andrei Svechnikov","signedOn":"2021-08-26","firstSeason":"2024–25","why":"signed 3 summers before its first season"}
- contracts.termVsSeasons: lignes ; exemple {"club":"boston-bruins","player":"Fraser Minten","termYears":3,"seasons":"2022–23 to 2026–27","span":5}
| Mise en échec | Violations | Lignes |
|---|---|---|
| shots.dist | ||
| shots.angle | ||
| shots.type | ||
| shots.strength | ||
| shots.t | ||
| shots.period | ||
| shots.flags | ||
| shots.ids | ||
| shifts.bounds | ||
| shifts.ids | ||
| events.type | ||
| events.x | ||
| events.y | ||
| events.time | ||
| goals.time | ||
| schedule.row |
Registres de contrats : contracts.capHit ; contracts.term ; contracts.tier .
Cartes de contrôle sur chaque compte quotidien
Une moyenne à pondération exponentielle et un CUSUM bilatéral par série, avec des limites apprises de l'historique ; une série de moins de lectures est en « apprentissage », jamais « normale ». Les points de rupture sont datés par segmentation binaire.
| Série | État | Lectures | Moyenne | Dernier | Dernière date | Détails |
|---|---|---|---|---|---|---|
| 2026-27.shotsPerGame | in-control | |||||
| 2026-27.eventsPerGame | in-control | |||||
| 2026-27.shiftRowsPerGame | in-control | |||||
| 2026-27.goalsPerGame | in-control | |||||
| 2026-27.shotCoverage | in-control | |||||
| 2026-27.shiftCoverage | in-control | |||||
| feed.transactionsPerDay | alerte | |||||
| feed.injuryListings | alerte | |||||
| feed.socialPosts7d | in-control | |||||
| feed.leagueStories7d | in-control | |||||
| feed.wikiPageviews7d | in-control | |||||
| feed.ledgerPredictionsPerDay | in-control |
- feed.transactionsPerDay : cusum down
- feed.injuryListings : cusum up
Rejeu de référence
Une tranche figée de matchs est reconstruite deux fois chaque matin; les deux sorties doivent avoir le même hachage et correspondre à la référence consignée. Un constructeur dont la sortie bouge sans changement de code a une entrée cachée.
Tests de mutation
Des corruptions connues sont appliquées à la tranche de référence et doivent être détectées par une vérification. Une mutation qui survit est un trou dans les vérifications, et la barrière se ferme jusqu'à ce qu'une vérification existe.
| Mutation | Détectées | Détectée par | Détails |
|---|---|---|---|
| shot-time-base-off-by-a-period | ok | shooterOnIce, timeBounds | |
| club-ids-swapped-in-shift-chart | ok | teamAgree | |
| second-period-missing-from-chart | ok | shooterOnIce, emptyNetGoalie | |
| shots-duplicated | ok | goalsAgree | |
| goal-record-times-shifted | ok | assistsOnIce | |
| shift-chart-deleted | ok | artefact:shifts, artefact:rosters | |
| goalie-vanishes-from-chart | ok | shooterOnIce, emptyNetGoalie | |
| goal-events-dropped | ok | goalsAgree | |
| shot-distances-impossible | ok | range:shots.dist | |
| shooter-ids-zeroed | ok | shooterOnIce, range:shots.ids |
Instantané adressé par contenu de l'ensemble des fichiers
Chaque fichier à partir duquel le site est construit, haché chaque matin ; les petits fichiers modifiés sont conservés selon leur hachage, de sorte que ce qui était détenu un jour donné peut être reproduit octet pour octet. Un changement dans le fichier d'une saison terminée est signalé, parce que l'historique est censé être immuable.
Quel constructeur a écrit chaque fichier, et à partir de quoi
Pour chaque fichier de données utilisé par le site : le constructeur, ses intrants, le niveau de provenance, l'heure de construction et le hachage. Une version est périmée quand le hachage d'un intrant a changé après elle, ou quand des matchs présents dans les intrants y manquent.
- site/impact.json est périmé :
- site/deployment.json est périmé :
- site/advanced.json est périmé :
- site/shotmaps.json est périmé :
- site/coaching.json est périmé :
- site/involvement.json est périmé :
- site/prospect-rankings.json est périmé :
- site/careers-site.json est périmé :
- site/model-cards.json est périmé :
- site/integrity.json est périmé :
| Fichier du site | État | Niveau | Constructeur | Construit | Détails |
|---|---|---|---|---|---|
| xg-2025-26.json | à jour | derived | tools/train-xg.mjs | ||
| impact.json | périmé | derived | tools/build-impact.mjs | ||
| deployment.json | périmé | derived | tools/build-deployment.mjs | ||
| advanced.json | périmé | derived | tools/build-advanced.mjs | ||
| matchups.json | input-missing | derived | tools/build-matchups.mjs | ||
| shotmaps.json | périmé | derived | tools/build-shotmaps.mjs | ||
| coaching.json | périmé | derived | tools/build-coaching.mjs | ||
| involvement.json | périmé | derived | tools/build-involvement.mjs | ||
| durability.json | à jour | derived | tools/build-durability.mjs | ||
| officials.json | unverified | derived | tools/build-officials.mjs | ||
| goal-archive.json | à jour | measured | tools/build-goals.mjs | ||
| video-reads.json | à jour | judgement | tools/build-video-reads.mjs | ||
| game-model.json | à jour | derived | tools/build-game-model.mjs | ||
| champion-state.json | à jour | derived | tools/build-game-sim.mjs (EXPORT=1) | ||
| champion.json | unverified | derived | tools/export_champion.py | ||
| player-ratings.json | à jour | derived | tools/build-lineups.mjs | ||
| player-props.json | unverified | derived | tools/player_props.py | ||
| ledger-public.json | à jour | derived | tools/build-ledger-page.mjs | ||
| schedule-strength.json | à jour | derived | tools/build-schedule-strength.mjs | ||
| white-noise.json | à jour | derived | tools/build-white-noise.mjs | ||
| transactions.json | à jour | licensed | tools/build-transactions.mjs | ||
| injuries.json | à jour | licensed | tools/build-injuries.mjs | ||
| projected-lines.json | à jour | licensed | tools/build-projected-lines.mjs | ||
| contracts | à jour | researched | tools/import-contracts.mjs | ||
| prospect-rankings.json | périmé | derived | tools/build-prospect-rankings.mjs | ||
| league-ladder.json | à jour | derived | tools/build-league-ladder.mjs | ||
| abroad.json | à jour | derived | tools/build-abroad.mjs | ||
| draft-class.json | unverified | derived | tools/build-draft-class.mjs | ||
| measures-2025.json | à jour | derived | tools/assay/build-measure-data.mjs | ||
| careers-site.json | périmé | derived | tools/assay/py/careers/run.py | ||
| stat-cards.json | à jour | derived | tools/assay/build-stat-cards.mjs | ||
| model-cards.json | périmé | derived | tools/assay/build-model-cards.mjs | ||
| integrity.json | périmé | derived | tools/assay/build-integrity.mjs |
Un joueur, plusieurs identifiants
Chaque table de correspondance (Wikipédia, Sportradar, autres ligues) porte la règle qui l'a produite et une probabilité de correspondance ; les paires en zone grise attendent une personne dans une file.
- at
- generatedAt
- spine
- sourceCounts
- crosswalks
- wikipedia
- sportradar
- otherLeagues
- queue
- teams
- params
Vérificateur de sources
Les pages citées derrière les impacts sur le plafond et les clauses sont récupérées de nouveau par échantillon continu ; un fait dont la seule source a disparu ou n'affiche plus le montant est listé ici.
- at
- summary
- deadOrChanged
Matrice de concordance des contrats
Concordance champ par champ entre les communiqués de la ligue, les fichiers de recherche et le registre du site, avec la résolution de chaque désaccord.
- at
- fields
- overall
- coverage
- thinnest
Horodatages externes
Les têtes de chaîne du registre des prédictions sont ancrées chaque jour avec un horodatage de confiance RFC 3161 ; le registre peut donc être vérifié sans faire confiance à ce site.
| Date | Vérifié | Autorité | Détails |
|---|---|---|---|
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | digicert | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa | ||
| vérifié | freetsa |
Profils d'enregistrement par aréna
Distributions domicile contre visiteurs de la distance des tirs et des comptes subjectifs par aréna ; la correction appliquée aux positions et l'étiquette appliquée aux comptes.
- at
- seasons
- arenas
- note
Registre des biais
Pour chaque mesure créée : le résidu moyen par position, côté, âge, club, aréna, nationalité, repêchage, statut contractuel, tranche salariale et taille du marché, après contrôle du rôle et des minutes, avec intervalles bootstrap et contrôle de Benjamini-Hochberg. Seules les tranches qui survivent au contrôle des fausses découvertes sont listées.
Saison , construit le .
| Mesure | Joueurs | Tranches qui survivent au FDR | Lesquelles (groupe, n, résidu) | Détails |
|---|---|---|---|---|
| drive | ||||
| driveOff | ||||
| driveDef | ||||
| shutdown | ||||
| driveOffAdj | ||||
| twoWayAdj | ||||
| startPM60 | ||||
| setupXg60 | ||||
| finish | ||||
| gsax | ||||
| aPM60 | ||||
| realPoints60 | ||||
| turnover60 | ||||
| whiteNoise |
Constats structurels, tels que mesurés :
- drive:
- driveOff:
- driveDef:
- shutdown:
- driveOffAdj:
- twoWayAdj:
- startPM60:
- setupXg60:
- finish:
- gsax:
- aPM60:
- realPoints60:
- turnover60:
- whiteNoise:
Où le prix penche
Pour chaque tranche de matchs (club, domicile/visiteur, favori, niveau, matchs consécutifs, mois, division, saison), la probabilité moyenne du modèle contre la part de victoires, des plages bootstrap, le contrôle des fausses découvertes et un suivi séquentiel du registre en direct qui garde son taux d'erreur sous contrôle malgré les consultations quotidiennes.
- month 02 (home side):
Matchs sans ligne au calendrier : .
Aucune tranche signalée.
Matchs sans ligne au calendrier : .
studies, built . Every number below is read from the study files at build time; a missing one reads "unknown".
Expected goals: challengers, the event clock and arena scorers
Findings
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- decision
- caveat
- decision
- caveat
- measured
- measured
- measured
- measured
Challengers
| Challenger | Result | Log loss against champion | 95% range | Détails |
|---|---|---|---|---|
A negative difference is a lower (better) log loss than the champion. A pass needs the whole range below zero.
Known limitation: the event clock
| Seconds after the previous event | Scored, raw clock | Scored, goals moved back | Shots (raw) | Détails |
|---|---|---|---|---|
| Placebo input | Clock | Change in log loss | 95% range | Lowers log loss |
|---|---|---|---|---|
| Flag | Shots flagged, raw | Shots flagged, corrected | Added, of them goals | Détails |
|---|---|---|---|---|
Caveats on the clock follow-up (7)
Arena scorer effects
| Building | Recorded distance against road shots | About (95%) | KS p | Détails |
|---|---|---|---|---|
Positive means shots in that building are recorded farther from the net than the same clubs' shots elsewhere.
| Season | Spread (ft) | Split-half r | Détails |
|---|---|---|---|
Caveats on the arena study (9)
Caveats (7)
Study stamp . Read from data/models/xg-challengers.json, data/quality/decisions-request-xg.json, data/quality/xg-clock-finding.json, data/quality/arena-profiles.json.
Prospect formula: cohort backtest
Findings
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- caveat
- measured
- measured
- measured
Validity against draft position
| Predictor (skaters) | NHL games to 23 | 95% range | Détails |
|---|---|---|---|
| Formula at | Difference in rank correlation | 95% range | Reading | Détails |
|---|---|---|---|---|
Whole classes: graduation by round
Outcome: NHL regular-season games and points summed over every season up to and including the age-23 season (age = whole years on 15 September of the season's start year). Graduated = 82 NHL games within any two consecutive seasons, both no later than the age-23 season. gpAfter / ptsAfter at an age count only the seasons after that age's season.
| Round | Graduated by 23 | Played an NHL game | Mean NHL games to 23 | Détails |
|---|---|---|---|---|
Caveats on the whole-class count (2)
Graduation by score at 18
| Tenth of the score | Graduated by 23 | Scores |
|---|---|---|
The league ladder, re-measured
| League | Measured translation | 95% range | Site value | Site inside range | Détails |
|---|---|---|---|---|---|
Caveats (10)
Study stamp . Read from data/assay/prospect-backtest.json.
Contracts: what the market pays for, and how well a cap hit can be predicted
Findings
- measured
- measured
- measured
- measured
- caveat
- caveat
- measured
- measured
- measured
- measured
- measured
- measured
- caveat
Backtest against simple baselines
| Test deals | Deals | Fit: median error | Production-quantile match | Position median | Détails |
|---|---|---|---|---|---|
| Term (years) | Deals | Seen in training | Fit prices too high by | Median error |
|---|---|---|---|---|
Band coverage
| First season | Inside the band | Terms seen | Terms not seen | Détails |
|---|---|---|---|---|
What the market pays for
| Other things held | Effect on cap hit | 95% range | p |
|---|---|---|---|
Where the residuals lean
| Group | Paid against the fit | 95% range | Deals | Détails |
|---|---|---|---|---|
Caveats (19)
Study stamp . Read from data/assay/pricing-backtest.json.
Ask the CBA: evaluation of the grounded assistant
Findings
- measured
- measured
- measured
- measured
- measured
- measured
- caveat
- measured
- measured
- measured
- decision
Retrieval
| Within the top | Right passage found | Questions | 95% range |
|---|---|---|---|
| Topic | Top five | First | Questions |
|---|---|---|---|
Questions written after the ranking was frozen
| Change | Decision | Why |
|---|---|---|
Refusing by retrieval score
| Threshold chosen for | Unanswerable refused | Answerable refused | Détails |
|---|---|---|---|
Defects found in the app
Caveats (14)
Study stamp . Read from data/assay/assistant-eval.json, data/assay/assistant-eval-mirror.json, data/assay/assistant-eval-items.json, data/assay/assistant-eval-heldout.json, data/assay/assistant-eval-heldout-results.json.
Start +/-: how much the sequence window matters
Findings
- measured
- measured
- caveat
| Window | Goals with a start | Players | Top three |
|---|---|---|---|
| Player | Narrowest window | Widest window | Moved |
|---|---|---|---|
Study stamp . Read from data/assay/sensitivity-start.json.
Video reads: today's blind review sample
Findings
- measured
- measured
- caveat
| Event type | In the sample | Windows read | Détails |
|---|---|---|---|
How to review: Open /video/<gameId> and jump to the window's start second. Record every entry (carried/dumped/denied), exit, takeaway, giveaway, board battle, shot and save you see, with jersey numbers, BEFORE revealing the model's events. Save the flags; the morning build applies them (wrong → drop, edited → retype, correct → confidence 1, missed → add) and reports precision and recall per type on /integrity.
Study stamp . Read from data/condensed/review-sample-2026-09-29.json.
Career arcs: aging curves, draft projections and career labels
Findings
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
- measured
| Label | Position | Shipped | Decision |
|---|---|---|---|
| Checkpoint | Landed above the 90th percentile | Landed below the 10th (non-zero floor) | Shipped |
|---|---|---|---|
The full desk, with every chart and list, is on /careers.
Caveats (1)
Study stamp . Read from data/assay/careers.json.
Registre de préenregistrement
Chaque changement de modèle est consigné avant d'être exécuté : hypothèse, mesure, saisons de preuve et règle de décision. Les résultats sont consignés quels qu'ils soient. L'adoption d'un challenger est une carte de décision dans le hub.
| Entrée | Inscrit | Statut | Hypothèse | Résultat | Détails |
|---|---|---|---|---|---|
| p4-9-market-logloss-v1 | inscrit | On the live 2026-27 ledger, the champion's standing pre-start home-win probability is compared with the vig-free market closing line (The Odds API v4, h2h, region us; proportional devig per book, median across books; last snapshot before puck drop) on log loss, same games. | |||
| p10-6-voi-v1 | exécuté | Each Sportradar trial feed (transactions, injuries, depth charts, starters) adds measurable value over its allowed replacement (league roster lists + NHL.com trades; none for injuries; the club's last shift chart for lines; the league boxscore starter flag) to model accuracy or to panel completeness and accuracy. | |||
| p10-6-shiftchart-lines-v1 | exécuté | After the Sportradar licence lapses, each club's most recent shift chart (lines, pairs and power-play units grouped by shared 5v5 and PP ice time; goalie 1 = that game's boxscore starter) is a usable replacement for the depth-chart panel. | |||
| assistant-prompt-v2 | inscrit | Sonnet 5.5 states the right facts but often leaves the direct-answer sentence without an [n] marker, and the gate deletes it (26.4% answerable pass against Sonnet 5's 71.8% on prompt v1). A v2 system prompt that says exactly where markers go (every sentence including the first, inside the sentence before its full stop, [n] = position in the quotes array, a self-check before returning) and shows one worked example (an invented, non-hockey passage) lets a model that follows instructions closely keep its citations, without hurting refusals or planted-number resistance. Expected: Sonnet 5.5 recovers most of the gap; Sonnet 5 moves little. | |||
| p6-7b-summer-cap-space-v1 | exécuté | Adding summer (June-September) retention trades quoted from NHL.com/ESPN/theScore stories, 2013 on, gives the summer window enough priced retentions for a range of pick value per 1M cap-season. | |||
| p6-5b-slot-market-description-v1 | inscrit | Per deployment slot (forward line 1-4, defence pair 1-3, goalies) the market's pricing of current contracts can be described by the champion hedonic fit's terms; description only, the P6.5 challenger is not adopted. | |||
| p6-8b-win-now-v1 | rejeté | Deadline rental prices (pick value sent for a pending free agent, January 1 to the deadline) rise with the marginal value of a win to the buying club on the trade date (closeness to its conference's playoff line given games left); the part of each price the standings explain is 'justified', the rest is not. | |||
| p6-4b-relative-tax-v1 | exécuté | The flat-cap tax is relative: a contract's room lost in a flat season is compared with the hit-weighted mean tax rate (1 - actual cap / expected cap) of every archive deal in force that season; deals signed before the 2020 MOU carried a higher rate than the league average of deals in force in 2020-21 to 2023-24. | |||
| p6-4b-buyers-market-v1 | rejeté | The flat cap made a buyer's market: standard deals signed in the 2020 and 2021 signing summers carry a lower first-season cap share than the market line (champion hedonic fit, BASE terms, fitted on every other signing summer) predicts for the same production, age, term, position and UFA status. | |||
| p7-2-move-fit-v2 | rejeté | Point-in-time fit components (club strength change, destination club strength, system-profile change and distance, mid-season, coach familiarity and tenure) predict the change in a mover's point-in-time 5v5 RAPM (teammate- and opponent-adjusted xG/60, offence + defence) beyond a baseline of age, prior RAPM and minutes. | |||
| p5-10-arbitrage-v2 | exécuté | Platform public stats, weighted by their value in wins (win weights fitted on selection deals), predict a deal's realised first-season WAR beyond what its cap share predicts: the arbitrage table carries information the price does not. | |||
| p5-10-arbitrage-v1 | rejeté | Public stats priced by the market differ from their value in wins, and the gap is real: a deal's arbitrage score (WAR predicted from platform stats with win weights, minus the WAR its cap share buys) predicts its realised first-season WAR net of price, out of sample. | |||
| p4-7-contract-next-v1 | inscrit | Frozen Next calls (champion pricing fit, term mixture from the archive) for every pending 2027 UFA and RFA predict the signed deal: share inside the 80% band about 80% of the time; median share error near the backtest's 28.9%; and the market pays against the cap in force ($104M) or the projected cap ($113.5M), read by which framing errs less. | |||
| p7-4-minutes-v1 | rejeté | The lineup optimiser, on point-in-time values, places a mover in a slot whose club TOI is within 2:00 of the all-situation TOI he actually plays in his first 20 games at the new club. | |||
| p7-5-goalie-surface-v1 | rejeté | A mover's GP-smoothed save surface integrated against his new club's shot-against density predicts his GSAx per shot at the new club better than the movers' save% persistence baseline (r = 0.01). | |||
| p6-5-market-fits-v1 | exécuté | A signings history that covers short terms fixes the pricing fit's unseen-term failure: the champion hedonic fit (BASE terms, linear term, trained on ledger deals with first seasons to 2024-25) re-fitted with log(term) and the archive's researched short-term history rows (fall-2020 one- and two-year deals, Toronto 2018-19 signings) in training. | |||
| p7-2-move-fit-v1 | exécuté | Point-in-time fit components (club strength change, destination club strength, system-profile change and distance, mid-season, coach familiarity and tenure) predict the change in a mover's isolated 5v5 xG share beyond a baseline of age, prior level and minutes. | |||
| scout-dawid-skene-v2 | exécuté | Same model as v1 with two defences redesigned after the v1 finding: (a) the sybil check counts shared mistakes against GOLD (known truth) instead of the crowd consensus, so a ring large enough to swing the consensus is still caught; (b) the gold screen is also applied per club: a scout whose gold accuracy on items involving one club is below the floor (with at least the minimum gold answers there) gets weight 0 on that club items only. | |||
| scout-dawid-skene-v1 | rejeté | Dawid-Skene with allegiance-aware confusion matrices (own/rival/neutral per worker, shrunk to the worker pooled matrix), gold clamping, a gold screen, correlated-error sybil clustering and arbitration freezes recovers known truth from a simulated scout crowd that contains club fans with a lean, a coordinated sybil ring and a brigade inside a freeze window. | |||
| p7-1-pit-canary-v1 | exécuté | Every pre-move input of the fit backtest is rebuilt from rows dated on or before the day before the player's first game in new colours; no post-move data enters. | |||
| p5-8-defence-in-front-v1 | exécuté | Defence-in-front: mean champion xG per unblocked shot a goalie faced minus the league mean (empty net excluded). Disclosed before the look: it is mostly a club measure; the card also reports the YoY r on goalies who changed club (descriptive only). | |||
| p5-8-workload-v1 | rejeté | Workload sensitivity: GSAx per 100 shots in heavy games (second game of a back-to-back for that goalie, or >= 35 unblocked shots faced) minus GSAx per 100 in the rest; goalies need >= 200 heavy-game shots in both seasons (else excluded). | |||
| p5-8-pull-propensity-v1 | exécuté | Pull propensity: share of a goalie's starts (first goalie on the ice for his club) in which he leaves before the end of regulation for another goalie (not an empty-net pull), relief entries excluded; goalies with >= 20 starts in both seasons. | |||
| p5-8-freeze-road-v1 | exécuté | Scorer-effect check on p5-8-freeze-rate-v1: the same freeze rate above expected computed on ROAD games only (different scorers every night). If the road-only YoY r fails the bar, the freeze-rate card says its reliability may be the home scorer. | |||
| p5-5-nowcast-finish-v2 | exécuté | Finish nowcast, second registration: v1 chose q/tau2 = 0.1 at the top edge of its grid. v2 = the same model and proof with the grid widened to q/tau2 in {0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10}. v1 stays on the record unchanged. | |||
| p5-7-rapm-priors-v1 | rejeté | Isolation with priors. A: 5v5 ridge RAPM chained from 2018 like D3, but (i) the prior mean is last season's estimate moved by the position x age drift (mean change of the chained estimate by age, F/D, measured on dev seasons 2018-2023), and (ii) club-season attack and defence columns (lightly penalised, lambda_club = lambda / 20) absorb club strength. Coach terms: NOT included (no coach-by-game file on disk; stated). B: A plus pair-interaction columns for skater pairs sharing >= 300 5v5 minutes in the season, penalised at 4 x lambda. lambda from {16000, 32000, 64000} on dev end seasons 2021-2023 (targets 2022-2024), same harness as D3 (drive_multi). | |||
| p5-9-xg-gbm-v1 | exécuté | xG challenger: LightGBM (fixed params: 255 leaves max 31, lr 0.05, 400 rounds, min data 200, seed 5) on the champion's 34 features plus strength state as categorical and pre-shot proxies from the events (previous event type, seconds since it, distance from its location, same club or not). Trained 2023-24 + 2024-25, tested 2025-26 (the challengers' test season; not sealed). | |||
| p5-9-xg-uncertainty-v1 | exécuté | xG uncertainty carried into bands: refit the champion logistic (numpy ridge IRLS on the replica's features) on 50 game-cluster bootstrap resamples of 2023-24 + 2024-25; per-shot SD of xG; per player 2025 Finish and goalie GSAx recomputed under each draw. Descriptive: no adoption bar; published as the model-uncertainty share of each band. | |||
| p5-4-gp-aging-v1 | exécuté | Hierarchical Gaussian-process aging: m_it = mu_pos(age) + f_i(age) + e_it, f_i ~ GP(0, s_c^2 + s_l^2 RBF(ell)), e_it ~ N(0, v_it) (v from the careers desk, same as forecaster K). mu_pos = smoothed dev-season age mean per position. (s_c, s_l, ell) by type-II maximum likelihood on qualifying seasons <= the careers DEV_LAST. Joint exit model: logistic P(no qualifying season next year | GP-predicted level, age), fitted on dev seasons, reported (it does not enter the MSE). Exact GP in numpy (series are <= 20 points): the GPU is not needed. | |||
| p5-6-lgcp-fields-v1 | exécuté | Shot fields: log intensity on a 4 ft grid of the offensive half-rink = league field + arena (venue) field + club field, each a Gaussian Markov random field (second-difference penalty), fitted by penalised Poisson Newton (MAP of the log-Gaussian Cox process); penalties chosen on 2024 odd/even games. Archetypes as probabilities: Gaussian mixture (4 components, like the k-means) responsibilities on the club fields. | |||
| shadow-ratings-only-v1 | inscrit | The ratings-only game simulation (lib/game-sim.ts without the champion's learned layer), already frozen beside every champion price as challengers.ratingsOnly, is a weaker forecaster than the champion on live games; it is kept in shadow so a regression of the champion shows up against a simpler model. | |||
| p5-5-nowcast-drive-v1 | exécuté | In-season form for Drive (5v5 on-ice xG differential per 60 minus the club without him, per game) is real: a time-varying state predicts the next game better than the season-to-date static estimate. | |||
| p5-5-nowcast-finish-v1 | exécuté | In-season form for Finish (goals minus xG per shot, per game) is real: a time-varying state predicts the next game better than the season-to-date static estimate. | |||
| p5-5-nowcast-gsax-v1 | exécuté | In-season form for GSAx (xG minus goals per shot faced, per goalie game) is real: a time-varying state predicts the next game better than the season-to-date static estimate. | |||
| p5-8-hd-gsax-v1 | rejeté | High-danger GSAx: sum(xG - goal) per 100 faced shots with champion-replica xG >= 0.15 (threshold fixed before looking). | |||
| p5-8-rebound-control-v1 | exécuté | Rebound control: (expected - actual) rebounds per 100 saves; a rebound = the next unblocked shot of the shooting club within 3 s in the same period after a save; expected = league rebound rate of the saved shot's shot type that season. | |||
| p5-8-freeze-rate-v1 | exécuté | Freeze rate: share of saves (shot-on-goal events that are not goals, goalie from the shots file) followed by a stoppage event within 2 s with no other event in between, minus the league rate for the saved shot's shot type. | |||
| p5-3-pp-rapm-v1 | exécuté | Power-play offence RAPM: ridge regression of the power-play club's xG per 60 on its skaters (+1) and the short-handed skaters (-1, separate PK-defence columns) and the PK goalie, with 5v3 / 4v3 / home covariates, over all man-advantage stints (both goalies in, periods 1-3) built from shift charts; lambda by 5-fold-by-game CV. ppO in xG/60 of PP time; goals above average = ppO x PP minutes / 60. | |||
| p5-3-pk-rapm-v1 | exécuté | Penalty-kill defence RAPM: the PK-defence columns of the same fit (positive = suppresses the power play's xG/60). Goals above average = pkD x PK minutes / 60. | |||
| p5-3-penalty-diff-v1 | exécuté | Penalty differential in goals: (penalties drawn - penalties taken, minors+majors, excluding offsetting/misconduct-only) per player, referee-adjusted (each game divided by the mean of its two referees' empirical-Bayes-shrunk call-rate ratios), times the season's net power-play goal value per penalty (net ST xG of the advantaged club over ST seconds, per penalty). | |||
| p5-3-faceoffs-v1 | exécuté | Faceoffs in goals: (wins - losses) by zone times the zone's goal value of a win, the latter = mean net xG of the winning club in the 20 s after the faceoff (cut at the next faceoff), even strength, measured per season on the season itself. | |||
| p5-2-war-v1 | exécuté | WAR = (EV RAPM goals + PP goals + PK goals + penalty-differential goals + faceoff goals - replacement) / goals-per-win. EV goals = (oRAPM + dRAPM) x 5v5 minutes / 60 from rapm-<Y>.json (D3 champion). Replacement = per position group (F, D), the mean per-60 total of players outside the top 13 F / 7 D per club by TOI, times the player's minutes. Goals-per-win per season = least-squares slope of club wins on club goal differential (that season). Components that fail their own entry enter at zero. Goalies excluded from this version (goalie WAR waits on P5.8). | |||
| xg-era-recal-v1 | exécuté | The site's xG champion (xg-2025-26.json, trained 2023-24/2024-25 on the corrected clock) over-predicts goals in the back-filled seasons (goals/xG 0.92-0.96 in 2010-11 to 2014-15; slap shots 21-24% of unblocked attempts then vs ~15% now). R1 = per-season recalibration: logit(p) = logit(champion xG) + d_season, one intercept per season fitted by maximum likelihood (Newton, offset = champion logit) on that season's own unblocked shots (data/pbp/shots-<Y>.json, the same rows as the xG sidecar). R2 = R1 + a slap-shot offset per season (the shot-type-by-era term): logit(p) = logit(champion) + d_season + s_season * [shotType == slap]. Seasons 2010-11 to 2017-18, each on its own. Cross-fitting by game halves: each season's games are split in two by a seeded permutation (seed 5); parameters fitted on half A are scored on half B and vice versa; the held-out log loss is the mean over all shots of both held-out halves. Calibration by decile of predicted xG on the held-out halves (predicted vs observed goals per decile, and the max absolute decile gap). | |||
| careers-goalie-labels-v2 | not-shipped | G2, second look at the goalie arc and ceiling labels after filling birth dates (registered 2026-09-30, before the refreshed goalie numbers were computed). careers-goalie-labels-v1 failed on data where only 32% of goalie shots had a known age: every goalie missing from the birth-date sources was absent from K_G, the curves and every label sample. Change: birth dates for every goalie and skater in the season record requested from the league's player landing endpoint (cached in data/landing-cache). NOTHING ELSE CHANGES: K_G (zero aging drift, extended likelihood grid, binomial observation variance), the label rules, thresholds and the scale fix of v1 are kept exactly. BLINDNESS: not blind with respect to careers-goalie-labels-v1 (same development seasons <= 2018, same proof seasons 2019-2025, and the v1 proof numbers were seen). Blind with respect to every season not yet examined: no goalie-season of 2026-27 or later has been looked at, and the goalie-seasons of goalies who had no birth date at v1 were never in any examined sample; their calibration is reported separately as the never-examined subset (a description, not an extra gate). | |||
| careers-label-early-peak-v1-look2 | not-shipped | SECOND LOOK at careers-label-early-peak-v1 (registered 2026-09-30 before the refreshed numbers were computed). The first look failed only on sample size (12 proof label-holders, rule needs 20). Since: birth dates filled from the league's landing endpoint and on-ice game data extended back to 2010-11. Definition, forecaster (K + headline curve, dev-fitted), threshold (z <= -1.5 at 26-27), proof window (age-28 season in 2019-2025) and decision rule are exactly those of v1. NOT BLIND: the proof seasons are the ones already examined in the first look. | |||
| careers-label-fell-short-v1-look2 | not-shipped | SECOND LOOK at the fell-short half of careers-label-ceiling-v1 (registered 2026-09-30 before the refreshed numbers were computed). First look: fell short passed its rule only at age 22 and did not ship there because the age-22 projection's lower tail failed; at the draft and age 20 it had too few held-out label-holders. Since: birth dates filled and on-ice data extended to 2010-11. Definition (V25 below the conformalised 10th percentile where that bound is > 0; validation through 23 vs the season-24/25 q10), bounds (v2 registered), proof classes 2015-2018 and the decision rule are exactly those of careers-label-ceiling-v1. NOT BLIND: the proof classes are the ones already examined. | |||
| careers-goalie-labels-v1 | not-shipped | G, goalie-specific arc labels and ceiling label. REGISTERED AFTER the pooled label and ceiling results (all positions together) were seen; the goalie-only proof numbers below had NOT been computed. Diagnosis that prompted it (development data and code only): (1) the labels were validated with K built on the development goalie aging curve, which is empty (no age step with >= 30 pairs before 2018, so zero drift), but applied on the site with the all-season curve (pattern-mixture, peak 24, -0.24 save-% points a year, from 477 qualifying goalie-seasons with a known age; the mixed model on the same rows says -0.02 a year). That drift pulled a 31-year-old's expectation down ~1.5 points, so 'expected' in a goalie sentence was on a different scale from the one validated (Hellebuyck 2024-25: expected -0.07 on the site, +0.77 under the validated K). (2) The maximum-likelihood tau^2 sat on the lower edge of the search grid. (3) Goalie label-holders were a small share of the pooled validation, so no goalie label was ever tested on goalies. (4) Goalie draft-checkpoint upper-tail misses run 18-20% against a nominal 10%, and the position check only asked the Wilson interval to overlap the window. K_G: zero aging drift for goalies everywhere (fit, labels, site bands); tau^2, omega^2 by maximum likelihood on seasons <= 2018 over an extended grid (tau^2 0.002-1.5 x level variance, omega^2 0.0005-0.3 x); observation variance binomial by shots faced (shot-volume-aware shrinkage, unchanged). Label rules and thresholds unchanged (z 2.0 spike, 1.0 flash, 1.5 sustained / late bloomer). | |||
| careers-checkpoint-projection-v5 | inscrit | P, next blind test (registered 2026-09-29, NOT run: its proof data do not exist yet). After v2-v4 all failed the lower tail at ages 20 and 22 on the 2015-2018 classes with the median too high (PIT mean 0.37-0.41), while the draft checkpoint passed: those classes played ages ~21-25 through the shortened 2019-20 (~70 games) and 2020-21 (56 games) schedules, which a model fitted on 2010-2014 cannot know. v5 = v4 (increment target, Mondrian CQR) with every NHL season's TOI, games and points scaled to an 82-game schedule (x 82 / club games that season) in both features and outcomes, fitted on classes 2010-2018. | |||
| careers-checkpoint-projection-v4 | shipped | P, structural repair. REGISTERED AFTER the v2 and v3 proof results were seen (v3: lower-tail misses 16.5% at 20 and 16.8% at 22). A development-only diagnosis (leave-one-class-out, 2010-2014) shows the cause: the models predict cumulative totals and are then floored at the minutes already banked; for about half the rows the raw 10th percentile is below what is banked, so the floor lifts the median (P(y < q50) 0.48 -> 0.56 at 20, 0.51 -> 0.58 at 22) and raw quantile boosting under-covers the lower tail (35-38% misses). v4 models the INCREMENT after the checkpoint (>= 0) and adds the banked amount back; Mondrian CQR as v3. Models, features and model choice otherwise unchanged. | |||
| careers-checkpoint-projection-v3 | not-shipped | P, calibration repair. REGISTERED AFTER v2's proof result was seen: v2 failed the lower-tail test at age 20 (21% misses) and age 22 (20%); the development folds show the same (~25%), so the cause is structural: the single pooled conformal correction is set by the mass of players at 0 NHL minutes and never moves the lower bound of players already on an NHL path. v3 = v2 with Mondrian (group-conditional) CQR: separate corrections per checkpoint x target x target age x group, group = (q10 > 0 or not) for the lower bound and tercile of q90 for the upper, each from development leave-one-class-out scores only (groups under 30 rows fall back to the pooled correction). Models, features and choice unchanged. | |||
| careers-checkpoint-projection-v2 | shipped | P (amended before any projection was fitted or scored). Identical to careers-checkpoint-projection-v1 except the shipping test. Reason: V25 has a large mass at exactly 0 (most picks never play), so for a player whose 10th percentile is 0 the interval [q10, q90] covers about 90%, not 80%, by construction; the v1 window [0.75, 0.85] for two-sided coverage would fail a perfectly calibrated model. The amended test checks each tail where a miss is possible. | |||
| careers-aging-survivorship-v1 | adopté | A1. Delta-method aging curves (mean within-player change between consecutive qualifying seasons, weighted by the harmonic mean of the two seasons' TOI, chained from age 19) are biased upward at older ages because players who decline leave the sample. Two corrections: (i) inverse-probability weighting of each observed pair by 1 / P(next season observed | age, position, level percentile, TOI share, GP, previous delta) from a logistic fitted by position; (ii) pattern-mixture imputation: every exit (no qualifying next season, age <= 38) gets a next-season delta = the IPW-weighted conditional mean delta for its covariates plus a shift s estimated from near-dropouts (next season 1-19 GP, observed but thin), s = TOI-weighted mean residual of near-dropouts. Expected: the corrections move peak age earlier and steepen the post-peak decline, most for forwards' points/60. | |||
| careers-aging-mixed-v1 | benchmark | A2. A linear mixed model level_it = f(age) + b0_i + b1_i (age - 27) + e_it, f a natural cubic spline (knots 21, 24, 27, 30, 33, 36), random intercept and slope with unstructured 2x2 covariance, residual variance inversely proportional to the season's TOI, fitted by EM (REML-style) in numpy, gives a peak and decline in the same place as the corrected delta curve (likelihood under MAR dropout ignores exit that depends on past observed level). | |||
| careers-aging-tiers-v1 | exécuté | A3. Stars and depth players age differently. Tier is fixed one season BEFORE the delta is measured (tier from season t-1, delta t -> t+1) so selection noise in t does not create regression to the mean: star = top 10% of position-age level in t-1, depth = bottom 50%. Plus quantile curves: linear quantile regression (MM algorithm) of level on the age spline at tau 0.1, 0.5, 0.9, IPW-weighted. Expected: stars peak later and decline slower in points/60. | |||
| careers-checkpoint-projection-v1 | superseded | P. From information available at a checkpoint only (draft: through the draft-year season; age 20 and age 22: through that season) - draft position, round, age in days at the checkpoint, position, height, weight, pre-NHL production translated by the site league ladder (league-ladder.json; leagues without a translation keep raw points per game plus a league-family indicator), NHL games / points / TOI to date - a quantile model projects each drafted player's path: cumulative NHL TOI hours, cumulative NHL games and cumulative NHL points through each age to 25, and season TOI hours at each age, with calibrated 10/50/90% bounds. Career outcome V25 = cumulative NHL TOI hours through the age-25 season (observable for every pick of 2010-2018). | |||
| careers-label-ceiling-v1 | shipped | L1. Exceeded ceiling at checkpoint c (draft / 20 / 22): V25 above the conformalised 90th percentile projection at c. Fell short: V25 below the conformalised 10th percentile (only defined where that bound is > 0). Probability shown = 1 - projected CDF at the realised V25. Validation (does it predict anything out of sample): the same label computed on cumulative TOI through 23 must predict season TOI at 24 and 25 beyond the projection's own 90th (10th) percentile of those seasons. | |||
| careers-label-flash-v1 | shipped | L2. Spike season: qualifying season t with z >= 2.0 against K's forecast from strictly earlier seasons, the player having >= 2 earlier qualifying seasons. Flash in the pan (retrospective): spike, and the mean of the qualifying seasons among t+1..t+2 (at least one) has z <= 1.0 against the PRE-spike forecast. Claim: a spike season regresses MORE than regression to the mean alone (K with all seasons through t) predicts, i.e. spikes are disproportionately luck. | |||
| careers-label-sustained-v1 | shipped | L3. Sustained breakout: a spike season t (as L2) and both t+1 and t+2 qualifying with the z of their variance-weighted mean against the PRE-spike forecast >= 1.5. Claim: the change is real, so the season after the window (t+3) stays above the pre-spike forecast. | |||
| careers-label-late-bloomer-v1 | shipped | L4. Late bloomer: two consecutive qualifying seasons both at age >= 26 whose variance-weighted mean has z >= 1.5 against K's forecast from seasons through age 25 only (prior alone if none), and the player's K estimate at 25 is not above the position's 75th percentile of age-25 talent. Claim: the late rise is real, so the next season stays above the through-25 forecast. | |||
| careers-label-early-peak-v1 | not-shipped | L5. Early peak: the player's best two consecutive qualifying seasons (variance-weighted mean level) end at age <= 24, and the variance-weighted mean of his qualifying seasons at ages 26-27 has z <= -1.5 against the forecast made at the end of the peak pair (K + headline curve). Claim: the decline is real, so age 28 stays below that forecast. | |||
| careers-bias-fdr-v1 | exécuté | B. The checkpoint projections are fair across nationality (birth country: CAN, USA, SWE, FIN, RUS, CZE+SVK, other), draft round (1..7), birth quarter (Jan-Mar ... Oct-Dec), league of origin at the draft (CHL, NCAA/US college, US junior, Sweden, Finland, Russia, Czechia/Slovakia, other Europe, other) and market (drafting club's metro tercile from data/assay/market-size.json). Residual = PIT of V25 under the out-of-fold projection (leave-one-class-out for 2010-2014, frozen model for 2015-2018). | |||
| drive-multiseason-d1-v1 | adopté | D1. Drive computed on 5v5 on-ice and off-ice xG pooled over the current and prior two seasons with decay weights (1, a, b), a and b on a 0.05 grid in [0,1] chosen on the development end seasons 2021-2023 by maximising the pooled next-season correlation, predicts next season's single-season Drive better than the single-season Drive, with no more club leakage. | |||
| drive-eb-prior-d2-v1 | passed-not-adopted | D2. D1 shrunk toward a position/usage prior (weighted regression of D1 on position F/D/unknown and 5v5 minutes per game, fitted cross-sectionally within the season) by normal-normal empirical Bayes: each player's sampling variance from a 200-rep game-cluster bootstrap, prior variance tau^2 estimated by method of moments (never hand-set). Beats the champion and possibly D1. | |||
| drive-rapm-chain-d3-v1 | rejeté | D3. Multi-season RAPM: each season's ridge RAPM (tools/assay/py/measures/rapm.py design) penalised toward the previous season's estimate instead of zero, chained from 2018; ranking value = oRAPM + dRAPM; lambda from {16000, 32000, 64000} chosen on the development end seasons. Expected to predict well but to carry club leakage (single-season RAPM total r_club 0.41). | |||
| prospect-growth-age-v1 | rejeté | P1. The site's hand-set age line (1.00 at 18, minus 0.06 a year, floor 0.58) is flatter than measured same-league growth in points per game (whole classes: steeper through 22). Replacing it with the measured curve, selection-corrected (same-league pairs reweighted so their production mix matches every line at that age in that league, because stayers are the unpromoted), ranks prospects better. Within one age the change only reorders by months of age, so the expected per-age gain is small (under 0.01); the effect is across ages. | |||
| prospect-pick-blend-v1 | adopté | P2. Draft position ranks NHL games through 23 better than the formula at 18 and 19 (whole classes 0.605 vs 0.448 at 18). A blend of the two percentiles with one weight w, chosen on the development classes, beats the formula alone. Expected: a large gain at 18, shrinking by 20. | |||
| prospect-corrected-ladder-v1 | rejeté | P3. The league ladder is measured on players who moved to the NHL, who are the league's best scorers, so it understates what a typical line is worth. Re-measuring each league's translation with movers reweighted to the league's production deciles (inverse probability of moving), on 2010-2015 classes only, and using it in place of the site's ladder ranks prospects better. | |||
| prospect-fitted-benchmark-v1 | benchmark | P4. A fitted benchmark (L2-regularised logistic regression on graduation, numpy only because lightgbm is not installed) on the formula's parts, age, position, league family, height, draft-year production and draft position shows how much ranking the formula leaves on the table. It is a ceiling, not a site candidate: it uses draft position and a fitted black box the page could not print. | |||
| cba-retrieval-r1-vocab-repair-v1 | rejeté | The contract-term rule of the question expansion fires on 'long-term', 'how long' and 'length' in questions that are not about contract length, and several rules append words that are common across the agreement. Repairing the triggers and dropping the common words raises the rank of the passage that answers a fan-worded question. Expected: a gain concentrated on long-term-injury and duration questions and small overall (the rule fired on 24 of 110 development questions); 60 held-out questions may be too few to show it. | |||
| cba-retrieval-r2-weighted-expansion-v1 | rejeté | Expansion words at full weight can outweigh the fan's own words. Entering them at a reduced weight keeps the bridge between a fan's vocabulary and the agreement's while letting the question lead. Expected: a small gain in MRR; possibly none if R1 has already removed the expansions that did harm. | |||
| cba-retrieval-r3-ocr-word-split-v1 | rejeté | In the scanned 2025 MOU, words run together by the OCR are single tokens that no question contains. Splitting them, for the index only, into words of the clean documents (2013 CBA, 2020 MOU) makes those passages findable; the passage text shown and quoted is unchanged. Expected: gains only where the gold sits in the 2025 MOU (12 of the 60 held-out questions), so the overall effect may be too small to pass the rule. | |||
| cba-retrieval-r3b-ocr-letter-repair-v1 | rejeté | The same scan reads the letter m as 'in', 'im', 'iin' or 'rn' ('terin' for term, 'aimount' for amount, 'liimit' for limit, 'gaine' for game). Replacing, for the index only, a token that is absent from the clean vocabulary by the one clean-vocabulary word those confusions lead to makes the agreement's commonest words match in the 2025 MOU. Expected: larger than R3 on 2025 MOU questions, because the damaged words are the ones fans type; still limited to the 12 held-out questions whose gold sits there. Added by the desk; not in the coordinator's list. | |||
| cba-retrieval-r4-field-weights-v1 | rejeté | The title is counted twice and the score is raised 8% per document rank; both were set by hand. A title weight or document boost chosen on development questions ranks the gold passage higher. Expected: small. On the development questions the boost was worth 2 points of recall@5, inside the noise, and the 2020 and 2025 MOU chunks all carry the same title, so the title can only help in the 2013 CBA. | |||
| cba-retrieval-r5-feedback-pass-v1 | rejeté | A second ranking pass that appends the most distinctive terms of the first pass's top three passages, at low weight, finds passages the fan's words miss. Expected: uncertain; feedback helps when the first pass is mostly right and hurts when it is wrong, and a fan's first pass is often wrong. | |||
| cba-fallback-refusal-v1 | adopté | While the model is unavailable the passages-only fallback answers every question, including the 30 of 30 development questions the agreement cannot answer. Retrieval evidence alone (top score, margin to the second, share of the question's words found in the top passages, a named player or club) separates enough of them to refuse or warn without often refusing a question the agreement does answer. Expected: the name rule catches the named-player and club questions; the evidence rule catches about half of the rest at 5% wrong refusals (the top score alone caught 50% at that point on development). | |||
| cba-number-gate-exact-v1 | adopté | The check that every number in an answer appears in the passage it cites is a substring test, so a claimed '5' passes against a passage that says '50' or '2025'. An exact test on number tokens, compared as canonical decimals, closes that hole without failing answers that are right. | |||
| cba-clause-split-fix-v1 | adopté | The fallback is meant to quote clauses of semicolon lists, but its split pattern has a literal 's' where whitespace was meant, so it never splits at '; ' and quotes whole sentences. Splitting on whitespace after a semicolon gives shorter quotes that are nearer the question. | |||
| xg-clock-corrected-flags-v1 | adopté | With the champion's rebound and rush flags recomputed on a clock that does not depend on the outcome (goal times moved back 1 s, the offset measured on 2023-24 + 2024-25, before the 3 s and 4 s windows are applied) and everything else unchanged, held-out log loss does NOT improve and is expected to get slightly worse, by about 0.0002 to 0.0003 per shot, because the raw flags carry information about the outcome through the clock. A worse log loss here means part of the champion's published accuracy was the clock. | |||
| xg-clock-corrected-split-v1 | exécuté | F's corrected flags inside the four strength-state fits of challenger B. Expected against the champion: the strength split's gain on the proof season (about 0.0005 with two seasons of training) less the cost of correcting the clock (about 0.0002 to 0.0003), a net gain near 0.0002 that may not clear the rule. The split's gain is not robust to the amount of training data: trained on one season it was worse than a single fit. | |||
| xg-clock-corrected-flurry-v1 | exécuté | G plus the flurry features of challenger C (seconds since the previous unblocked shot by the same club in the same period, capped at 30 s, and an indicator for under 3 s) computed on the corrected clock. Expected: little or nothing beyond G. The gain C showed with goal times moved back is expected to have been mostly a repair of the raw flags, which G already has. | |||
| xg-rink-adjusted-v1 | exécuté | Replacing the recorded shot distance with its league-equivalent (the arena quantile map estimated on 2023-24 + 2024-25 only, applied to the training rows and carried unchanged to 2025-26; angle recomputed from the same geometry where well conditioned) removes scorer error from the most important xG input and lowers held-out log loss. Expected effect: very small and possibly negative - the arena study found the scorer effect has shrunk to about 1 ft standard deviation against about 0.55 ft of noise, and that an unshrunk map carried into the next season did not improve agreement. | |||
| xg-strength-split-v1 | exécuté | Four separate fits by strength state (5v5 = strengthDiff 0 and net occupied, power play, shorthanded, empty net) with the champion's features minus the strength flags let distance, angle and shot-type effects differ by state and lower the combined held-out log loss. Expected effect: a small gain concentrated on the power play; the shorthanded and empty-net fits have few rows and may give some of it back. | |||
| xg-flurry-feature-v1 | exécuté | Adding the time since the previous unblocked shot by the same club in the same period (capped at 30 s) and an indicator for under 3 s to the champion's 34 features lowers held-out log loss, because shots inside a flurry are taken against a goalie out of position beyond what the rebound flag already records. | |||
| xg-combined-abc-v1 | exécuté | Rink-adjusted distance, strength-state fits and the flurry features together lower held-out log loss by more than any of them alone. | |||
| arena-scorer-profiles-v1 | exécuté | Some NHL arenas record unblocked shots at systematically different distances than the same clubs' shots are recorded elsewhere (a scorer effect in the recorded location, visible in |x| as well as in distance), the effect persists from one season to the next, and subjective counts (hits, giveaways, takeaways, blocked shots) differ by building beyond what the clubs involved explain. Expected size in the 2021+ feed: a standard deviation across arenas near 1 ft, far below the 3-5 ft effects published for the 2007-2013 feed. | |||
| score-dist-challengers-v1 | rejeté | Given the same walk-forward Kalman goal rates, a low-score dependence (Dixon-Coles), a shared component (bivariate Poisson) or per-side over-dispersion (negative binomial) improves the regulation-score log score over independent Poisson on 2025-26; NHL regulation scores are close to independent Poisson so any gain is expected to be small (under 0.01 nats per game) and the negative binomial may fit worse than Poisson. | |||
| momentum-hawkes-v1 | exécuté | Within NHL regulation play, goals cluster in time beyond what a Poisson process with a rate varying by game minute and by score state predicts (a "reply goal" / momentum effect); if it exists, the Hawkes branching ratio fitted on data exceeds the ratio the same fit produces on simulated null games, and short inter-goal intervals (under 60 s) are more common than in the null. | |||
| state-space-kalman-v2 | exécuté | A Kalman random-walk attack/defence model on regulation goals (linear-Gaussian observation, daily process noise, season-start inflation, home advantage and scoring level as slowly drifting states) predicts home wins walk-forward about as well as the champion; it is expected NOT to beat the champion on log loss because it sees only goals, but it may add information in a blend and gives a transparent rating. | |||
| state-space-kalman-v1 | exécuté | A Kalman random-walk attack/defence model on regulation goals (linear-Gaussian observation, daily process noise, season-start inflation, home advantage and scoring level as slowly drifting states) predicts home wins walk-forward about as well as the champion; it is expected NOT to beat the champion on log loss because it sees only goals, but it may add information in a blend and gives a transparent rating. | |||
| isotonic-calibrator-v1 | rejeté | The champion home-win probabilities carry a miscalibration that a monotone (isotonic) map fitted on earlier seasons corrects out of sample; because the walk-forward reliability is already close to the diagonal the expected gain is small (under 0.003 log loss) and may be zero or negative. | |||
| hist-2026-09-26-game-model-v2 | adopté | Even-strength xG Elo + goals Elo + PP/PK EWMA + rest and back-to-back lowers held-out log loss versus ratings only. | |||
| hist-2026-09-26-starting-goalie-feature | rejeté | Adding the starting goalie's GSAx as a pre-game feature lowers log loss. | |||
| hist-2026-09-26-tournament | adopté | Boosted trees or added feature families beat a ridge logistic on ratings + rest. | |||
| hist-2026-09-26-search-3000 | rejeté | One of 3,000 feature-set versions beats the champion on a proof season it was not selected on. | |||
| hist-2026-09-26-block-search-49k | rejeté | Some combination of 14 input families (special teams, finishing+goalie, lineup, rivalry, travel, goalie rotation, schedule spot, GM context, discipline+referees, puck play, grudge scrums, league scoring) beats the champion. | |||
| hist-2026-09-26-travel | rejeté | Travel distance, time zones crossed, three-in-four and road-trip length carry information beyond rest and back-to-backs. | |||
| hist-2026-09-26-goalie-rotation-trap | rejeté | Goalie rotation (backup/tired) and schedule-spot (trap game) features lower log loss. | |||
| hist-2026-09-26-score-engines | rejeté | Monte Carlo minute-level or Markov score engines beat the closed-form Poisson on score and finish log loss. | |||
| hist-2026-09-26-lineups | adopté | Walk-forward skater relative-xG ratings plus starter GSAx and missing-vs-usual lineup lower log loss. | |||
| hist-2026-09-26-props | adopté | A learned logistic layer over hand features (shot rate, finishing, opponent shots allowed, venue, ice time, individual xG rate, opposing starter form) beats the base rate for anytime-goal and anytime-point. | |||
| hist-2026-09-26-confidence | rejeté | Bootstrap spread across 100 refits marks the games the model gets right more often. | |||
| hist-2026-09-22-xg-v1 | adopté | A logistic expected-goals model on distance, angle, shot type, strength, rebound, rush and empty-net flags beats the league-average goal rate on an unseen season. |
Every job has a written contract
What each job reads and writes, when it runs, what makes it green, what it may spend, how it is stopped, and whether it can be run dry or replayed. Green means it produced its artefact on time. The digests are taken from this morning's content-addressed snapshot, so what a job read and wrote on a given day can be cited exactly.
| Job | State | Kind | Schedule | Green when | Budget | Détails |
|---|---|---|---|---|---|---|
| Condensed-game reader (single model, first version) | manual | reader | ||||
| Condensed-game reader (two detectors and a verifier) | manual | reader | ||||
| Goal highlight-clip pipeline (eye-test facts) | manual | reader | ||||
| Nightly condensed-game routine (index, download, read, rebuild video facts) | manual | reader | ||||
| Video detector and clock evaluations | manual | reader | ||||
| Zone-entry pass over a condensed game | manual | reader | ||||
| League record pull and nightly model state ·critical | green | Pulls | ||||
| Licensed feeds pull ·critical | green | Pulls | ||||
| Base-salary pull: Sportradar team profiles (trial) | manual | Pulls | ||||
| Contract fields check: league public endpoints | manual | Pulls | ||||
| Contract reference pull: ESPN core API (reference only, never shown) | manual | Pulls | ||||
| Contract reference pull: TheSportsDB (reference only until a commercial key) | manual | Pulls | ||||
| League roster lists (daily snapshot) | green | Pulls | ||||
| Licensed contract API pull: cap vendor A (off until keyed) | manual | Pulls | ||||
| Licensed contract API pull: cap vendor B (off until keyed and contracted) | manual | Pulls | ||||
| Lineup watch for the ledger | green | Pulls | ||||
| Starting goalie probes | green | Pulls | ||||
| Data contracts (shape, ranges, text encoding, ledger consistency) ·critical | green | Checks | ||||
| Game passports ·critical | green | Checks | ||||
| Career arcs: aging curves, draft projections, arc labels | green | Checks | ||||
| Content-addressed snapshot | green | Checks | ||||
| Contract agreement matrix | green | Checks | ||||
| Control charts and changepoints | green | Checks | ||||
| External timestamp of the ledger | green | Checks | ||||
| Game model bias audit | green | Checks | ||||
| Golden replay | green | Checks | ||||
| Identity spine | green | Checks | ||||
| Lineage and stale builds | green | Checks | ||||
| Model drift | green | Checks | ||||
| Mutation tests of the checks | green | Checks | ||||
| Per-game anomaly scores and duplicate rows | green | Checks | ||||
| QA crawler: every number on a page against the data | green | Checks | ||||
| Red team: published values re-derived by an independent path | green | Checks | ||||
| Source verifier | green | Checks | ||||
| Contracts, rights and budgets ·critical | green | Governs | ||||
| Morning assay and the gate ·critical | green | Governs | ||||
| Cost governor (model account) | green | Governs | ||||
| Hub controls (pull and apply) | green | Governs | ||||
| Decision cards for the owner | green | Notifies | ||||
| Morning note to the hub inbox | green | Notifies | ||||
| Daily data deploy ·critical | stale | Deploys | ||||
| Guarded code deploy | manual | Deploys | ||||
| Build abroad.json | green | Builds | ||||
| Build advanced.json | stale | Builds | ||||
| Build careers-site.json | stale | Builds | ||||
| Build champion-state.json | green | Builds | ||||
| Build champion.json | unverified | Builds | ||||
| Build coaching.json | stale | Builds | ||||
| Build contracts | green | Builds | ||||
| Build deployment.json | stale | Builds | ||||
| Build draft-class.json | unverified | Builds | ||||
| Build durability.json | green | Builds | ||||
| Build game-model.json | green | Builds | ||||
| Build goal-archive.json | green | Builds | ||||
| Build impact.json | stale | Builds | ||||
| Build injuries.json | green | Builds | ||||
| Build integrity.json | stale | Builds | ||||
| Build involvement.json | stale | Builds | ||||
| Build league-ladder.json | green | Builds | ||||
| Build ledger-public.json | green | Builds | ||||
| Build matchups.json | missing-input | Builds | ||||
| Build measures-2025.json | green | Builds | ||||
| Build model-cards.json | stale | Builds | ||||
| Build officials.json | unverified | Builds | ||||
| Build player-props.json | unverified | Builds | ||||
| Build player-ratings.json | green | Builds | ||||
| Build projected-lines.json | green | Builds | ||||
| Build prospect-rankings.json | stale | Builds | ||||
| Build schedule-strength.json | green | Builds | ||||
| Build shotmaps.json | stale | Builds | ||||
| Build stat-cards.json | green | Builds | ||||
| Build transactions.json | green | Builds | ||||
| Build video-reads.json | green | Builds | ||||
| Build white-noise.json | green | Builds | ||||
| Build xg-2025-26.json | green | Builds |
What may be shown, and until when
The licence is stored with the data, not remembered. Every source says what it supplies, what the site shows from it and what it never shows. A licence with an end date is counted down here; when it ends, its files are emptied by the build and the gate closes if they are not.
| Source | State | Tier | Licence | Supplies | What the site shows | Never shown | Détails |
|---|---|---|---|---|---|---|---|
| The league's public statistical record | ok | measured | play-by-play, shift charts, schedules, rosters, game logs, season summaries, draft records | facts and statistics computed from them, with the league named as the origin | the league's video, audio, photographs, logos and written text | ||
| The league's goal clips, condensed games and stories | ok | measured | links to the league's own clips and stories; counts of stories | links that play on the league's own player, and counts | rehosted video or audio; frames sampled for a model read are deleted after the read; story text | ||
| Sportradar NHL feed (trial) | ok | licensed | roster transactions, injury listings, depth charts, starting goalies; base salary per player (team profile), kept as a salary reference, never a cap hit | the feed's facts, named as a licensed feed, while the trial runs | anything from the feed after the trial ends without a contract | ||
| Public pages read by the contract desk | ok | researched | contract terms, cap hits and clauses stated on the page | the fact, its tier and a link to the page it was seen on | the article's text beyond the short quote that carries the fact | ||
| Other leagues' public statistics | ok | measured | season totals by player in the leagues prospects and free agents play in | statistics computed from them, with the league named | media and text | ||
| Attention counts (Wikimedia page views, public social posts, news volume) | ok | measured | how many views, posts and stories, by day | counts and indices only | the posts and articles themselves | ||
| Broadcast audio (the ear) | not-connected | judgement | counts of mentions in broadcasts | nothing until written permission exists; then counts only, never words | transcripts, quotes, audio | ||
| Betting market prices | not-connected | licensed | closing prices, as a benchmark for the game model | nothing until a licence exists | prices without a licence that allows display | ||
| ESPN core API (contracts collection) | ok | licensed | per-athlete contracts collection (populated for the NBA; empty for the NHL when checked 2026-09-29) | nothing: undocumented API, terms do not licence commercial display; used only to raise disagreements | every value | ||
| TheSportsDB (contracts lookup) | ok | licensed | crowd-sourced player contracts (lookupcontracts) | nothing on the free test key (non-commercial); reference only | every value until a commercial key and a check of its accuracy |
Sourcing rule: commercial cap sites are never scraped or cited, and an article that credits one of them for a fact is not a source for that fact. Their data may appear only through a paid licensed API whose licence allows display, named as the provider where the licence requires it. Every published file is scanned each morning and again by each deploy; any other mention closes the gate. Fine for finding leads, never cited for a fact: aggregators, fan blogs, cap tables.
- src/data/injuries.json: mentions
Budgets against their ceilings
A job that would pass its ceiling is stopped and the stop is logged. Model work by any desk refuses to start while the account reads exhausted or the hub does not allow spend.
| Budget | State | Used | Ceiling | Note |
|---|---|---|---|---|
| Licensed feed calls (whole trial) | ok | |||
| Model account credit | ok |
Géré depuis le hub BaldwIndustries
L'onglet Analyse de cette entreprise dans le hub est l'interrupteur principal et le plafond de dépenses ; sa file de décisions contient chaque choix qui exige une personne ; le résultat du matin arrive comme notification dans l'application et, quand une action est requise, comme note dans la boîte de réception du hub.
Ouvrir l'onglet Analyse dans le hub. Les approbations permanentes du propriétaire (le déploiement quotidien des données, les récupérations de flux sous licence) ne relèvent pas de cet interrupteur ; il régit les nouvelles actions automatisées listées ci-dessous.
- Interrupteur principal (autonomy_enabled). Détermine si l'analyse peut poser une action automatisée au-delà de mesurer et de publier l'état : dépenses de modèles, adoption de challengers, volume du vérificateur. Désactivé = mesurer et rapporter seulement.
- Pause. Arrête immédiatement toute action automatisée, avec la raison affichée sur cette page et dans la note du matin.
- Autorité. suggest-only : chaque adoption est une carte pour vous; low-risk : les calibrateurs peuvent être adoptés selon leur règle préenregistrée; all-except-email : les challengers peuvent être adoptés selon leur règle.
- Plafonds quotidien et mensuel en $. Les limites du gouverneur de coûts pour les appels de modèles (lectures vidéo, extraction, l'assistant). Les dépenses à ce jour sont affichées à côté.
- Cartes de la file de décisions. Entrées du registre avec résultats de preuve, billets de correction, lots d'identité et demandes de budget. Approuvez ou rejetez dans le hub; la tâche du matin l'applique et consigne qui a décidé.
En attente d'une décision :
- assay_source_review 13 cap-hit facts not shown on their cited page (source-review:2026-09-29, en file depuis le )
- assay_budget Model account exhausted: top up or leave dark? (budget:openrouter-2026-09, en file depuis le )
- assay_ledger_defects 29 contract rows contradict themselves (ledger-defects:0320e75814, en file depuis le )
- ledger_error_queue Ledger error queue 2026-W41: 4 misses, 1 information misses (ledger-errors:2026-W41, en file depuis le )
- assay_model_role Video detector: switch Gemini 2.5 Flash to GPT-6 Luna? (model-role:detectorA-gpt-6-luna, en file depuis le )
- assay_governance_switch Pause machine reads of condensed games until Gate E? (switch:condensed-machine-reads, en file depuis le )
- assay_model_challengers Measure 11 cheaper or newer models against the ones in use? (model-challengers:2026-10, en file depuis le )
- assay_adopt_measure Adopt WAR as the value currency (Worth = WAR x dollars per win)? (p5:p5-2-war-v1, en file depuis le )
- assay_adopt_measure Publish goalie freeze rate (2-second window)? (p5:p5-8-freeze-rate-v1, en file depuis le )
- assay_adopt_measure Publish goalie rebound control? (p5:p5-8-rebound-control-v1, en file depuis le )
- assay_adopt_measure Adopt the gradient-boosted expected-goals challenger? (p5:p5-9-xg-gbm-v1, en file depuis le )
- assay_adopt_measure Adopt Gaussian-process aging for goalies only (forwards and defence keep forecaster K)? (p5:p5-4-gp-aging-v1, en file depuis le )
- assay_adopt_measure Replace the 7x7 shot bins with smooth shot fields? (p5:p5-6-lgcp-fields-v1, en file depuis le )
- assay_adopt_measure Publish defence-in-front (shot quality a goalie faces)? (p5:p5-8-defence-in-front-v1, en file depuis le )
- assay_adopt_measure Publish goalie pull propensity? (p5:p5-8-pull-propensity-v1, en file depuis le )
- assay_model_adoption Fit backtest passed its rule, but the desk recommends NOT adopting it (P7.2) (fit:p7-2-adoption-v1, en file depuis le )
- assay_schedule_job Schedule the prospective fit ledger (P7.7) once a day (fit:schedule-ledger-v1, en file depuis le )
- assay_publish_findings Phase 7 fit results: publish the findings and the not-yet-validated surfaces (fit:p7-findings-v1, en file depuis le )
- assay_model_adoption Publish the arbitrage table (market pay vs wins per public stat) (caporcup-build:p5-10-arbitrage-v2, en file depuis le )
- assay_finding Position market fits: bar met, but not better than the champion (no adoption proposed) (caporcup-build:p6-5-market-fits-v1, en file depuis le )
- assay_data_adoption Contract archive: 855 deals, signing seasons back to 2005-06 (caporcup-build:p6-1b-archive-history, en file depuis le )
- assay_model_adoption Publish the relative flat-cap tax on contract pages (caporcup-build:p6-4b-relative-tax-v1, en file depuis le )
- assay_finding Buyer's-market discount: not distinguishable from zero (finding) (caporcup-build:p6-4b-buyers-market-v1, en file depuis le )
- assay_finding Release /market/<slot> pages as description (P6.5 fit not adopted) (caporcup-build:p6-5b-slot-pages, en file depuis le )
- assay_model_adoption Show the summer range on /market/cap-space (caporcup-build:p6-7b-summer-cap-space-v1, en file depuis le )
- assay_finding Win-now premium: standings do not explain rental prices (finding) (caporcup-build:p6-8b-win-now-v1, en file depuis le )
- assay_licence_decision Gate B: pay for Sportradar, or let the trial lapse on 2026-10-29? (caporcup-build:p10-6-gate-b-sportradar, en file depuis le )
- assay_model_challengers Measure the assistant's prompt v2 on Sonnet 5.5 and Sonnet 5? (assistant-prompt-v2:measure, en file depuis le )
- build_owner_gate P9.1: verify caporcup.com in Bing Webmaster Tools (p9:bing-webmaster, en file depuis le )
- build_owner_gate P9.1: start IndexNow pings after the next deploy (p9:indexnow-send, en file depuis le )
- build_spend P9.7: monthly 100-question AI citation panel (about $8 a run, estimated) (p9:citation-panel-spend, en file depuis le )
- build_owner_gate P9.7: list the CapOrCup MCP server in an assistant directory (p9:mcp-directory, en file depuis le )
- build_owner_gate P9.5: choose external channels for the five daily artefacts (p9:artefact-channels, en file depuis le )
- build_owner_gate P9.8/P9.9: apply migration 0007 (event counters, privacy requests, consent records) (p9:migration-0007, en file depuis le )
- market_backtest_purchase Buy one month of The Odds API 20K plan ($30) for a historical NHL closing-odds pull (option A 13380 or B 13880 credits)? (market:historical-backtest-v1, en file depuis le )
- assay_identity_review 5 player-identity pairs need a person (identity:0b05dc0a42, en file depuis le )
- assay_html_shift_repairs Replace 329 defective shift charts with the league's HTML reports? (html-shift-repairs:422e99a4ac, en file depuis le )
- owner_vault_key Create CAPORCUP_REVALIDATE_SECRET in the hub vault? (caporcup-revalidate-secret, en file depuis le )
- ledger_error_queue Ledger error queue 2026-W42: 4 misses, 0 information misses (ledger-errors:2026-W42, en file depuis le )
- assay_xg_clock Expected goals: repair the event clock the model reads? (xg-clock:7ef5afd2f8, en file depuis le )
- assay_adopt_prospect Prospects: formula blended with draft position? (prospect:prospect-pick-blend-v1, en file depuis le )
- assay_sourcing_rule Sourcing rule applied: 18 cap hits and 123 clause facts withdrawn (sourcing-rule:916acd966f, en file depuis le )
Décisions appliquées :
- prospect:prospect-pick-blend-v1 approved: register prospect-pick-blend-v1 -> adopted
- sourcing-rule:916acd966f approved: sourcing-rule 916acd966f -> approved (recorded for the desk in desk-decisions.json)
- xg-clock:7ef5afd2f8 approved: xg-clock 7ef5afd2f8 -> approved (recorded for the desk in desk-decisions.json)
Dépenses de modèles par rapport au plafond
Ce que l'analyse a trouvé dans le registre
Les défauts et lacunes réels des données sur disque, mesurés ce matin, avec l'effet de chacun sur les mesures.
- shift-sums (2020-21):
- shift-sums (2021-22):
- shift-sums (2023-24):
- exposure (2024-25):
- shift-sums (2025-26):
- events-gap (2025-26):
Couverture des lectures vidéo
Video-derived numbers rank no one across clubs until coverage is balanced; human verdicts are the ground truth for read precision. Couverture par club : .
Budgets de page et accessibilité
Chaque nuit, les pages clés sont mesurées sur téléphone et sur ordinateur : hauteur, mots de texte, onglets, position du premier chiffre qui répond, vitesse d'affichage du contenu principal et quantité de JavaScript chargée. Les mêmes pages sont vérifiées selon WCAG 2.2 AA avec axe-core. Les budgets sont des points de départ ; les vrais lecteurs les font bouger.
- / : 5.8 écrans de téléphone, 328 mots, 0 onglets, premier chiffre à 204 px, LCP 716 ms, 1139 Ko de JS · 1 au-dessus du budget
- /today : 3.8 écrans de téléphone, 212 mots, 0 onglets, premier chiffre à 310 px, LCP 132 ms, 9192 Ko de JS · 1 au-dessus du budget
- /teams/ottawa-senators : 5.7 écrans de téléphone, 519 mots, 9 onglets, premier chiffre à 528 px, LCP 464 ms, 9192 Ko de JS · 1 au-dessus du budget
- /teams/toronto-maple-leafs : 5.7 écrans de téléphone, 526 mots, 9 onglets, premier chiffre à 528 px, LCP 420 ms, 9192 Ko de JS · 1 au-dessus du budget
- /players/8482116-tim-stutzle : 6.4 écrans de téléphone, 385 mots, 7 onglets, premier chiffre à 246 px, LCP 276 ms, 9192 Ko de JS · 1 au-dessus du budget
- /players/8478402-connor-mcdavid : 5.4 écrans de téléphone, 419 mots, 7 onglets, premier chiffre à 241 px, LCP 276 ms, 9192 Ko de JS · 1 au-dessus du budget
- /rankings/players : 7.4 écrans de téléphone, 367 mots, 2 onglets, premier chiffre à 499 px, LCP 244 ms, 9192 Ko de JS · 1 au-dessus du budget
- /rankings/contracts : 6.4 écrans de téléphone, 240 mots, 0 onglets, premier chiffre à 191 px, LCP 140 ms, 9192 Ko de JS · 1 au-dessus du budget
- /contracts : 4.4 écrans de téléphone, 163 mots, 0 onglets, premier chiffre à 188 px, LCP 188 ms, 9192 Ko de JS · 1 au-dessus du budget
- /rankings/teams : 5.9 écrans de téléphone, 191 mots, 0 onglets, premier chiffre à 191 px, LCP 216 ms, 9192 Ko de JS · 1 au-dessus du budget
- /rankings/prospects : 18.4 écrans de téléphone, 510 mots, 0 onglets, premier chiffre à 191 px, LCP 172 ms, 9192 Ko de JS · 2 au-dessus du budget
- /teams : 7.6 écrans de téléphone, 277 mots, 0 onglets, premier chiffre à 405 px, LCP 216 ms, 9192 Ko de JS · 1 au-dessus du budget
- /players : 8.8 écrans de téléphone, 162 mots, 0 onglets, premier chiffre à 188 px, LCP 212 ms, 9192 Ko de JS · 1 au-dessus du budget
- /transactions : 9.3 écrans de téléphone, 695 mots, 0 onglets, premier chiffre à 232 px, LCP 284 ms, 9192 Ko de JS · 1 au-dessus du budget
- /games : 3.1 écrans de téléphone, 247 mots, 0 onglets, premier chiffre à 255 px, LCP 196 ms, 9192 Ko de JS · 1 au-dessus du budget
- /schedule : 5 écrans de téléphone, 281 mots, 0 onglets, premier chiffre à 191 px, LCP 264 ms, 9192 Ko de JS · 1 au-dessus du budget
- /draft : 6.7 écrans de téléphone, 218 mots, 3 onglets, premier chiffre à 191 px, LCP 212 ms, 9192 Ko de JS · 1 au-dessus du budget
- /stats : 5 écrans de téléphone, 775 mots, 5 onglets, premier chiffre à 191 px, LCP 188 ms, 9192 Ko de JS · 1 au-dessus du budget
- /ledger : 5.4 écrans de téléphone, 242 mots, 4 onglets, premier chiffre à 232 px, LCP 188 ms, 9192 Ko de JS · 1 au-dessus du budget
- /tools/ltir : 3.1 écrans de téléphone, 117 mots, 2 onglets, premier chiffre à 683 px, LCP 232 ms, 9192 Ko de JS · 1 au-dessus du budget
- /tools/buyout : 3.2 écrans de téléphone, 124 mots, 2 onglets, premier chiffre à 712 px, LCP 212 ms, 9192 Ko de JS · 1 au-dessus du budget
- /retained-salary : 2.9 écrans de téléphone, 118 mots, 2 onglets, premier chiffre à 660 px, LCP 188 ms, 9192 Ko de JS · 1 au-dessus du budget
- /tools/cap-space : 2.9 écrans de téléphone, 70 mots, 2 onglets, premier chiffre à 693 px, LCP 196 ms, 9192 Ko de JS · 1 au-dessus du budget
- / : aucune violation WCAG 2.2 AA · 26 cibles sur 136 sous 24 px
- /teams/ottawa-senators : aucune violation WCAG 2.2 AA · 11 cibles sur 142 sous 24 px
- /players/8482116-tim-stutzle : aucune violation WCAG 2.2 AA · 10 cibles sur 124 sous 24 px
- /stats : aucune violation WCAG 2.2 AA · 10 cibles sur 130 sous 24 px
- /stats/drive : aucune violation WCAG 2.2 AA · 58 cibles sur 233 sous 24 px
- /rankings/contracts : aucune violation WCAG 2.2 AA · 60 cibles sur 297 sous 24 px
- /rankings/players : aucune violation WCAG 2.2 AA · 58 cibles sur 237 sous 24 px
- /ledger : aucune violation WCAG 2.2 AA · 11 cibles sur 188 sous 24 px
- /contracts : aucune violation WCAG 2.2 AA · 42 cibles sur 177 sous 24 px
- /transactions : aucune violation WCAG 2.2 AA · 63 cibles sur 133 sous 24 px
Quelle part de ce que montre le site est sourcée et concorde avec ses données
Chaque nuit, un robot lit les pages en ligne. La santé est la part des nombres mesurés qui s'ouvrent sur leur source, multipliée par la part des nombres liés à un fichier de données qui concordent avec lui. Un chiffre par type de page et pour l'ensemble du site.
- hub : 0,7 % (3 893 nombres sur 66 pages ; sourcés 0,7 %, concordants 99,2 %)
- team : 0 % (4 390 nombres sur 32 pages ; sourcés 0 %, concordants 100 %)
- player : 7,9 % (13 192 nombres sur 120 pages ; sourcés 7,9 %, concordants 100 %)
- game : 0 % (309 nombres sur 60 pages ; sourcés 0 %, concordants 100 %)
- prospect : 8,7 % (1 330 nombres sur 40 pages ; sourcés 8,7 %, concordants 100 %)
- other : 0 % (2 961 nombres sur 60 pages ; sourcés 0 %, concordants 79,6 %)
- Site entier : 4,3 % (26 075 nombres sur 378 pages ; sourcés 4,5 %, concordants 94,4 %)
Changements de statistiques après le match
Chaque match terminé est relu 1, 3 et 14 jours après avoir été joué, puis une fois après la saison. Quand la ligue a modifié son registre (une aide déplacée, un but réattribué, un tir reclassé), le changement est listé ici et le match est récupéré de nouveau pour que chaque mesure soit reconstruite à partir du registre corrigé.
- 2026020117 (2026-10-15, vérification du jour 3) : avant missed-shot 2-04:19 by 8479977 · maintenant shot-on-goal 2-19:59 by 8477951
- 2026020116 (2026-10-15, vérification du jour 3) : avant blocked-shot 2-11:59 by 8478864; missed-shot 2-15:48 by 8482077; missed-shot 3-15:31 by 8478864 · maintenant shot-on-goal 2-15:48 by 8482077; shot-on-goal 3-15:31 by 8478864
- 2026020110 (2026-10-15, vérification du jour 3) : avant missed-shot 2-00:34 by 8482078; shot-on-goal 2-15:45 by 8477429 · maintenant shot-on-goal 2-00:34 by 8482078
- 2026020113 (2026-10-15, vérification du jour 3) : avant missed-shot 1-08:26 by 8476468
- 2026020112 (2026-10-15, vérification du jour 3) : avant missed-shot 2-06:56 by 8484136; missed-shot 3-08:58 by 8483476; missed-shot 3-09:01 by 8478444 · maintenant shot-on-goal 3-09:01 by 8478444
- 2026020111 (2026-10-15, vérification du jour 3) : avant missed-shot 3-12:40 by 8474151; shot-on-goal 2-04:13 by 8478519 · maintenant missed-shot 2-04:12 by 8478519; shot-on-goal 3-12:40 by 8474151
- 2026020109 (2026-10-15, vérification du jour 3) : avant missed-shot 1-09:59 by 8482092; missed-shot 2-15:30 by 8477950 · maintenant shot-on-goal 1-09:59 by 8482092
- 2026020108 (2026-10-15, vérification du jour 3) : avant blocked-shot 3-02:54 by 8482803; missed-shot 3-14:09 by 8482803 · maintenant shot-on-goal 3-14:09 by 8482803
- 2026020107 (2026-10-14, vérification du jour 3) : avant blocked-shot 3-11:03 by 8475768 · maintenant missed-shot 3-11:03 by 8475768
- 2026020106 (2026-10-14, vérification du jour 3) : avant missed-shot 1-14:16 by 8484186; shot-on-goal 1-17:16 by 8475184 · maintenant missed-shot 1-17:16 by 8475184; shot-on-goal 1-14:16 by 8484186
- 2026020103 (2026-10-13, vérification du jour 3) : avant goal 3-18:38 team 20 scorer 8481068 a1 8474150 a2 8480797 type wrist · maintenant goal 3-18:38 team 20 scorer 8481068 a1 8474150 a2 8483495 type wrist
- 2026020102 (2026-10-13, vérification du jour 3) : avant blocked-shot 3-12:24 by 8479369 · maintenant missed-shot 3-12:24 by 8479369
- 2026020101 (2026-10-13, vérification du jour 3) : avant blocked-shot 3-15:01 by 8482482; missed-shot 2-19:45 by 8476869 · maintenant missed-shot 3-15:01 by 8482482; shot-on-goal 2-19:45 by 8476869
- 2026020098 (2026-10-13, vérification du jour 3) : avant blocked-shot 1-08:49 by 8474578
- 2026020097 (2026-10-13, vérification du jour 3) : maintenant missed-shot 1-05:30 by 8484136
- 2026020096 (2026-10-13, vérification du jour 3) : avant missed-shot 1-18:25 by 8481528 · maintenant shot-on-goal 1-18:25 by 8481528
- 2026020095 (2026-10-13, vérification du jour 3) : avant blocked-shot 1-16:05 by 8477404
- 2026020092 (2026-10-13, vérification du jour 3) : avant shot-on-goal 1-08:42 by 8484145
- 2026020091 (2026-10-13, vérification du jour 3) : avant blocked-shot 3-17:03 by 8481716; missed-shot 2-14:22 by 8477933 · maintenant blocked-shot 2-14:22 by 8479314; missed-shot 3-17:03 by 8478856
- 2026020090 (2026-10-13, vérification du jour 3) : avant missed-shot 1-05:23 by 8479407; missed-shot 1-08:53 by 8477488 · maintenant blocked-shot 1-08:53 by 8477488
- 2026020089 (2026-10-12, vérification du jour 3) : avant blocked-shot 1-11:48 by 8481557; shot-on-goal 3-09:48 by 8475913 · maintenant blocked-shot 3-09:48 by 8475913; missed-shot 1-11:48 by 8481557
- 2026020088 (2026-10-12, vérification du jour 3) : avant blocked-shot 1-04:08 by 8481596; blocked-shot 1-06:31 by 8473512; blocked-shot 1-08:44 by 8480188
- 2026020077 (2026-10-10, vérification du jour 3) : avant blocked-shot 1-10:37 by 8481527 · maintenant shot-on-goal 1-10:37 by 8481527
- 2026020073 (2026-10-10, vérification du jour 3) : maintenant blocked-shot 2-10:33 by 8481557
- 2026020071 (2026-10-10, vérification du jour 3) : maintenant blocked-shot 1-16:36 by 8482684
- 2026020069 (2026-10-09, vérification du jour 3) : avant missed-shot 3-16:56 by 8476480 · maintenant shot-on-goal 3-16:56 by 8476480
- 2026020068 (2026-10-09, vérification du jour 3) : avant missed-shot 2-01:03 by 8478460; missed-shot 3-00:31 by 8479671 · maintenant shot-on-goal 2-01:03 by 8478460; shot-on-goal 3-00:31 by 8479671
- 2026020067 (2026-10-09, vérification du jour 3) : avant missed-shot 3-08:37 by 8481656
- 2026020066 (2026-10-09, vérification du jour 3) : avant missed-shot 1-06:11 by 8482802 · maintenant blocked-shot 1-06:11 by 8475279
- 2026020062 (2026-10-08, vérification du jour 3) : avant penalty 3-18:27 team 16 on 8483493 major 5
- 2026020061 (2026-10-08, vérification du jour 3) : avant shot-on-goal 3-17:16 by 8476921 · maintenant missed-shot 3-17:16 by 8476921
- 2026020058 (2026-10-08, vérification du jour 3) : avant shot-on-goal 1-10:11 by 8480865
Nombres signalés
N'importe qui peut signaler un nombre à partir de sa fenêtre de provenance ou de la page des corrections ; le billet va dans la boîte de réception du hub et apparaît ici avec sa résolution.
Aucun signalement au dossier. Signaler un nombre.
The citation panel has not run
100 questions people ask assistants about NHL contracts, cap space, moves and rules; each answer is scored for a link to the CapOrCup page that holds the answer.
Non disponible (Not run: a live panel needs owner approval for model spend.) Estimated cost per run: across claude, openai, perplexity (rates are assumptions; confirm before any run).
La chaîne d'analyse
Chaque matin : récupérer la politique du hub et appliquer les décisions → passeports de match → contrats de données → cartes de contrôle → rejeu de référence → tests de mutation → identité, matrice de concordance, vérificateur, horodatage → audit des biais et dérive → la barrière → fiches statistiques, fiches de modèle, cette page → cartes du hub et notification → le déploiement des données, qui lit la barrière. Saisons sur disque : 2010-11, 2011-12, 2012-13, 2013-14, 2014-15, 2015-16, 2016-17, 2017-18, 2018-19, 2019-20, 2020-21, 2021-22, 2022-23, 2023-24, 2024-25, 2025-26, 2026-27.