1. How the forecasts did
10 settled games. Average absolute error per player who played; lower is better, best in bold.
| Metric | Production (published) | Local base | Local challenger |
|---|---|---|---|
| Points | 4.38 | 4.46 | 4.38 |
| Rebounds | 1.78 | 1.78 | 1.78 |
| Assists | 1.35 | 1.35 | 1.35 |
| Minutes | 5.30 | 5.30 | 5.30 |
| Threes | 0.85 | 0.86 | 0.85 |
| Team score error | 8.90 | 8.90 | 8.90 |
| Game total error | 13.40 | 13.40 | 13.40 |
| Game margin error | 12.60 | 12.60 | 12.60 |
| Winner picks | 7/9 | 7/9 | 7/9 |
Team scores
| Game | Team | Local base | Challenger | Real | Base miss | Learning change | Gain |
|---|---|---|---|---|---|---|---|
| BOS@TOR | TOR | 112 | 112 | 93 | 19 | 0.0 | 0.0 |
| BOS@TOR | BOS | 112 | 112 | 98 | 14 | 0.0 | 0.0 |
| CLE@NY | NY | 111 | 111 | 107 | 4 | 0.0 | 0.0 |
| CLE@NY | CLE | 106 | 106 | 115 | 9 | 0.0 | 0.0 |
| WAS@IND | IND | 119 | 119 | 114 | 5 | 0.0 | 0.0 |
| WAS@IND | WAS | 113 | 113 | 101 | 12 | 0.0 | 0.0 |
| BKN@NO | NO | 119 | 119 | 111 | 8 | 0.0 | 0.0 |
| BKN@NO | BKN | 106 | 106 | 145 | 39 | 0.0 | 0.0 |
| DEN@MEM | MEM | 113 | 113 | 118 | 5 | 0.0 | 0.0 |
| DEN@MEM | DEN | 116 | 116 | 123 | 7 | 0.0 | 0.0 |
| LAL@MIL | MIL | 98 | 98 | 112 | 14 | 0.0 | 0.0 |
| LAL@MIL | LAL | 128 | 128 | 123 | 5 | 0.0 | 0.0 |
| SA@CHI | CHI | 103 | 103 | 119 | 16 | 0.0 | 0.0 |
| SA@CHI | SA | 129 | 129 | 124 | 5 | 0.0 | 0.0 |
| ORL@UTA | UTA | 108 | 108 | 108 | 0 | 0.0 | 0.0 |
| ORL@UTA | ORL | 114 | 114 | 123 | 9 | 0.0 | 0.0 |
| GS@HOU | HOU | 115 | 115 | 115 | 0 | 0.0 | 0.0 |
| GS@HOU | GS | 107 | 107 | 108 | 1 | 0.0 | 0.0 |
| OKC@POR | POR | 114 | 114 | 118 | 4 | 0.0 | 0.0 |
| OKC@POR | OKC | 106 | 106 | 108 | 2 | 0.0 | 0.0 |
2. Biggest player misses and why
Local base, players who played. The point miss is split into a playing-time part (wrong minutes) and a scoring-rate part (wrong points per minute).
| Game | Player | Points fc / real | Minutes fc / real | Miss | From minutes | From rate | Main cause |
|---|---|---|---|---|---|---|---|
| CLE@NY | James Harden CLE | 11 / 32 | 28 / 33 | -21 | -2.0 | -19.0 | scoring rate |
| GS@HOU | Stephen Curry GS | 23 / 3 | 28 / 6 | 20 | 18.1 | 1.9 | playing time |
| ORL@UTA | Franz Wagner ORL | 23 / 38 | 31 / 39 | -15 | -5.9 | -9.1 | scoring rate |
| BKN@NO | Egor Demin BKN | 8 / 22 | 27 / 23 | -14 | 1.2 | -15.2 | scoring rate |
| SA@CHI | Nicolas Claxton CHI | 3 / 17 | 14 / 16 | -14 | -0.4 | -13.6 | scoring rate |
| LAL@MIL | Sandro Mamukelashvili LAL | 10 / 23 | 21 / 26 | -13 | -2.4 | -10.6 | scoring rate |
| SA@CHI | Jalen Smith CHI | 10 / 23 | 25 / 30 | -13 | -2.0 | -11.0 | scoring rate |
| OKC@POR | Isaiah Hartenstein OKC | 7 / 20 | 28 / 34 | -13 | -1.5 | -11.5 | scoring rate |
| DEN@MEM | Cameron Johnson DEN | 11 / 23 | 27 / 30 | -12 | -1.2 | -10.8 | scoring rate |
| ORL@UTA | Brice Sensabaugh UTA | 7 / 19 | 9 / 23 | -12 | -10.9 | -1.1 | playing time |
| BOS@TOR | Jamal Shead TOR | 14 / 3 | 26 / 22 | 11 | 2.2 | 8.8 | scoring rate |
| WAS@IND | Ivica Zubac IND | 9 / 20 | 25 / 31 | -11 | -2.2 | -8.8 | scoring rate |
| DEN@MEM | Jaylen Wells MEM | 11 / 22 | 26 / 31 | -11 | -2.1 | -8.9 | scoring rate |
| LAL@MIL | Jaime Jaquez Jr. MIL | 14 / 25 | 30 / 30 | -11 | 0.0 | -11.0 | scoring rate |
| GS@HOU | Brandin Podziemski GS | 11 / 22 | 30 / 37 | -11 | -2.6 | -8.4 | scoring rate |
| CLE@NY | Miles McBride NY | 9 / 19 | 26 / 27 | -10 | -0.3 | -9.7 | scoring rate |
| WAS@IND | Aaron Nesmith IND | 12 / 2 | 26 / 22 | 10 | 1.8 | 8.2 | scoring rate |
| BKN@NO | Noah Clowney BKN | 6 / 16 | 14 / 19 | -10 | -2.1 | -7.9 | scoring rate |
| BKN@NO | Dejounte Murray NO | 15 / 5 | 31 / 28 | 10 | 1.5 | 8.5 | scoring rate |
| BKN@NO | Karlo Matkovic NO | 14 / 4 | 30 / 22 | 10 | 3.7 | 6.3 | scoring rate |
Forecast rows by outcome
| Variant | Played | Did not play (availability) | Participation not verified |
|---|---|---|---|
| Production (published) | 209 | 35 | 13 |
| Local base | 209 | 35 | 13 |
| Local challenger | 209 | 35 | 13 |
3. Day over day
Every settled local slate under the timing policy. Points / minutes error per player.
| Date | Games | Production (published) | Local base | Local challenger |
|---|---|---|---|---|
| 20261028 | 12 | 5.22 / 7.75 | 5.26 / 7.71 | 5.07 / 7.71 |
| 20261029 | 3 | 6.14 / 7.02 | 6.05 / 6.33 | 6.00 / 6.33 |
| 20261030 | 2 | 6.18 / 5.61 | 6.12 / 4.91 | 6.00 / 4.91 |
| 20261031 | 7 | 5.86 / 8.31 | 5.92 / 6.57 | 5.68 / 6.57 |
| 20261101 | 4 | 5.46 / 6.63 | 4.41 / 5.41 | 4.34 / 5.41 |
| 20261102 | 15 | 5.00 / 7.41 | 4.41 / 5.75 | 4.38 / 5.75 |
| 20261104 | 14 | 4.68 / 4.89 | 4.74 / 5.09 | 4.70 / 5.09 |
| 20261105 | 2 | 5.30 / 4.57 | 4.79 / 4.36 | 4.49 / 4.36 |
| 20261106 | 9 | 4.87 / 5.04 | 4.85 / 4.98 | 4.74 / 4.98 |
| 20261107 | 7 | 4.53 / 5.18 | 4.51 / 5.38 | 4.34 / 5.38 |
| 20261108 | 2 | 3.85 / 3.85 | 3.93 / 3.85 | 3.85 / 3.85 |
| 20261109 | 1 | 4.48 / 9.19 | 4.38 / 9.19 | 4.48 / 9.19 |
| 20261110 | 1 | 4.09 / 4.22 | 4.09 / 4.22 | 4.09 / 4.22 |
| 20261111 | 10 | 4.38 / 5.30 | 4.46 / 5.30 | 4.38 / 5.30 |
4. What each learning stage did
| Stage | State | Detail |
|---|---|---|
| Settlement | done | 10 games scored against final box scores |
| Luna review | received | model gpt-5.6-luna; 3 findings accepted, 1 rejected by the numeric check; 2026-11-12T23:12:53.466792+00:00 |
| Luna proposals | 4 admitted | 0 refused, 0 expired; proposals only enter as shadow hypotheses |
| Calibration for next slate | eligible | KPI effect scale 1.268 from 1776 rows / 14 slates, applies to 20261112 |
| Automatic activation | off | Luna text never changes a forecast; only promoted candidates do |
| Action: data_quality | requested | inspect unverified participation |
| Action: model | requested | collect prospective evidence |
| Action: code | requested | review separately |
Run 20261111T223002Z_eb7c6034.
5. KPI model used for this slate
Trained through 2026-11-02, weights chosen through 2026-11-06, checked through 2026-11-10. Policy v7.1_live_daily_refit.
| Target | Weight | Rows | Error without KPI | KPI alone | Blended | Gain interval | Gate |
|---|---|---|---|---|---|---|---|
| pts | 0.45 | 620 | 4.535 | 4.505 | 4.473 | 0.023 to 0.136 | passed |
| reb | 0.00 | 620 | 1.887 | 1.881 | 1.887 | 0.000 to 0.000 | not passed |
| ast | 0.45 | 620 | 1.369 | 1.366 | 1.352 | 0.000 to 0.042 | passed |
Features: projected_mins, mins_mean, minutes_trend, pts_mean, reb_mean, ast_mean, fga_per_min, tptfga_per_min, fta_per_min, history_rows_capped. A weight of 0 means the KPI is not applied to that stat.
6. Luna review of this slate
Accepted findings
| Category | Finding | Evidence |
|---|---|---|
| availability | Some forecasted participants have no recorded participation, so their projected production should be separated from played-player accuracy. The evidence does not establish why those players did not participate or whether the pregame availability state was correct. | 20261111_WAS@IND:baseline:IND:946647301869 20261111_ORL@UTA:production:ORL:94364276527 20261111_BOS@TOR:baseline:BOS:94624472047 20261111_CLE@NY:production:CLE:28268539499 |
| minutes | Several played-player rows show substantial divergence between projected and actual minutes, including both underestimation and overestimation. This is consistent with rotation uncertainty, but one slate cannot identify whether the cause is availability information, role changes, or model calibration. | 20261111_GS@HOU:production:GS:28046691632 20261111_ORL@UTA:production:ORL:94614279027 20261111_OKC@POR:production:OKC:28338669069 20261111_CLE@NY:production:CLE:28116891632 |
| rate | Multiple played-player scoring misses are accompanied by actual shot volume or free-throw volume above projection. The supplied decomposition attributes most of these examples to the rate component rather than minutes, but the examples include unusual individual performances and do not establish a stable calibration defect. | 20261111_BKN@NO:production:BKN:949143631189 20261111_CLE@NY:production:CLE:28116891632 20261111_SA@CHI:production:CHI:28568879869 20261111_OKC@POR:production:OKC:28338669069 |
Findings rejected by the numeric check
Luna's claims are compared with the exact saved values; any mismatch rejects the finding.
| Category | Finding | Why rejected |
|---|---|---|
| data_quality | Production input identity is unverified for several reviewed rows, and the validation result did not pass because of a source-quality issue. These limitations reduce confidence in attributing observed errors to the model rather than to input or source reconciliation. | Measurement does not equal its cited evidence: 20261111_LAL@MIL:production:LAL:28128827869:projected_pts |
Proposed hypotheses
| Target | Feature | Hypothesis |
|---|---|---|
| pts | fga_per_min | When projected shot volume per minute understates a player's opportunity, a bounded scoring adjustment using fga_per_min may reduce points misses for played players. Test prospectively while separating rotation and availability errors. |
| pts | fta_per_min | Free-throw opportunity per minute may be underrepresented in some scoring forecasts, particularly where actual free-throw attempts materially exceed projection. Test with safeguards against single-game foul-drawing outliers. |
| pts | projected_mins | Points forecasts may benefit from a rotation-aware interaction between projected minutes and scoring rate, because large minutes misses can dominate the resulting points error. Evaluate separately for played players and nonparticipants. |
| pts | history_rows_capped | Sparse or capped player histories may produce unstable scoring-rate estimates and understate role changes. Test whether history depth changes points calibration, with production provenance and qualification status retained as stratification fields. |
7. Luna hypotheses and their promotion gate
A hypothesis changes forecasts only after it improves later games it never saw. Gate: at least 60 later player rows over 1 slate(s) with the gain interval above zero. Gain = points of error removed per player row (positive is better). 24 hypotheses tracked across 23 families; 2598 evidence rows.
| Id | Stat | Feature | Status | Coefficient | Later rows | Slates | Mean gain | Gain interval | Last slate | Verdict |
|---|---|---|---|---|---|---|---|---|---|---|
| 49a8a744 | pts | tptfga_per_min | shadow | 0.0047 | 1072 | 8 | -0.004 | -0.009 to -0.002 | -0.002 | hurts |
| 761fef5b | pts | opp_pos_ast | shadow | 0.0063 | 1589 | 11 | -0.004 | -0.024 to 0.009 | -0.000 | hurts |
| 3bfd01d0 | ast | ast_mean | shadow | 0.0126 | 1589 | 11 | -0.006 | -0.022 to 0.011 | 0.014 | hurts |
| fa747049 | pts | opp_pos_pts | shadow | 0.0118 | 1589 | 11 | -0.007 | -0.061 to 0.011 | -0.003 | hurts |
| e2faa0a7 | pts | fta_per_min | shadow | 0.0021 | 729 | 6 | -0.007 | -0.020 to 0.010 | -0.003 | hurts |
| 83dfc1b6 | ast | opp_pos_reb | shadow | 0.0037 | 1589 | 11 | -0.010 | -0.013 to 0.001 | 0.001 | hurts |
| ec1bba64 | pts | fga_per_min | shadow | -0.0042 | 1777 | 12 | -0.017 | -0.024 to -0.001 | -0.004 | hurts |
| 87c5fb77 | pts | opp_pos_reb | shadow | 0.0212 | 1589 | 11 | -0.022 | -0.098 to -0.005 | 0.018 | hurts |
| 34c173ba | pts | pts_mean | shadow | -0.0140 | 1821 | 13 | -0.022 | -0.040 to 0.013 | -0.042 | hurts |
| 17f277ca | ast | opp_pos_ast | shadow | 0.0067 | 1589 | 11 | -0.023 | -0.029 to -0.002 | 0.003 | hurts |
| 3d05bb53 | reb | opp_pos_ast | shadow | 0.0046 | 1589 | 11 | -0.024 | -0.033 to -0.011 | -0.001 | hurts |
| 205dcef8 | reb | opp_pos_pts | shadow | 0.0052 | 1589 | 11 | -0.025 | -0.034 to -0.014 | -0.003 | hurts |
| 62ba1a50 | pts | minutes_trend | shadow | 0.0108 | 1821 | 13 | -0.025 | -0.034 to 0.008 | -0.050 | hurts |
| 3e2f2dc0 | ast | opp_pos_pts | shadow | 0.0043 | 1589 | 11 | -0.028 | -0.037 to 0.003 | -0.004 | hurts |
| ff33879b | ast | own_team_off | shadow | 0.0013 | 1589 | 11 | -0.030 | -0.034 to -0.012 | -0.001 | hurts |
| a1054f0e | ast | opp_team_def | shadow | 0.0013 | 1589 | 11 | -0.031 | -0.035 to -0.011 | -0.001 | hurts |
| 2400aa71 | pts | projected_mins | shadow | -0.0222 | 1821 | 13 | -0.034 | -0.077 to 0.010 | -0.067 | hurts |
| b8845ee9 | reb | opp_pos_reb | shadow | 0.0139 | 1589 | 11 | -0.035 | -0.077 to -0.024 | -0.012 | hurts |
| c5813244 | pts | history_rows_capped | shadow | 0.0118 | 1072 | 8 | -0.036 | -0.090 to 0.006 | -0.024 | hurts |
| 1147d39e | reb | own_team_off | shadow | 0.0063 | 1589 | 11 | -0.052 | -0.080 to -0.040 | 0.003 | hurts |
| ed5c3099 | reb | opp_team_def | shadow | 0.0073 | 1589 | 11 | -0.057 | -0.090 to -0.046 | -0.008 | hurts |
| 0f45c0d3 | pts | own_team_off | shadow | 0.0146 | 1589 | 11 | -0.077 | -0.182 to -0.020 | 0.010 | hurts |
| 9578e14f | pts | opp_team_def | shadow | 0.0159 | 1589 | 11 | -0.090 | -0.207 to -0.028 | -0.015 | hurts |
| d61fdf87 | pts | mins_mean | shadow | – | 0 | 0 | – | – | hurts |
8. Calibration produced for the next slate
| Item | Value |
|---|---|
| Applies to | 20261112 |
| KPI effect scale | 1.268 |
| Interval | 1.051 to 1.500 |
| Eligible | yes |
| Evidence | 1776 rows, 14 slates |
| New KPI supplements | 0 |
| Built from | 20261028, 20261029, 20261030, 20261031, 20261101, 20261102, 20261104, 20261105, 20261106, 20261107, 20261108, 20261109 |
The scale multiplies the KPI change only when its interval excludes 1.0; it applies to later slates with a compatible policy.
9. Shadow recipe (v9) on the same games
No v9 shadow run for this date.
10. Fixes and changes to the system
From config/nba_change_log.json, newest first.
| Date | Area | What was found | What changed | State |
|---|---|---|---|---|
| 20261111 | Luna in production | Production regenerates hourly, so the active run was always post-tip and never eligible; Luna was not requested since Nov 10. | Settlement requests the Luna review on the newest run locked 5+ minutes before the first tip (PR #4). | deployed |
| 20261111 | KPI team budget | The exact team budget reverted 15 of 43 KPI point changes on Nov 10. | v9: 5% per-team bound instead of the exact budget. | shadow |
| 20261111 | Last-ten blend | The v9 blend halved every KPI/Luna correction. | v9.2: blend applies to the base only; learned change added back. | shadow |
| 20261111 | Luna in v9 | v9 forced Luna supplements off. | v9 reads the shared Luna store; only promoted candidates apply. | shadow |
| 20261111 | Data writers | Rankings from June; ESPN injuries/depth TLS failures on Windows; one optional failure stopped the refresh. | Browser-free rankings download, trusted roots, optional steps keep the previous file. | active |