Bruins, Oilers each get pair of Germany games

Methodology

The Edgework value model gives every on-ice action a goal-value — by how much it shifts the odds of the next goal — then sums those values per player. It adapts VAEP, an action-value framework from soccer analytics, to hockey, and splits the result by rink zone. The payoff is a defensive metric that repeats year over year better than the expected-goals-against rate every public model uses.

The Headline Result

The only test that matters for a player rating is whether it predicts the future. We measure that with year-over-year persistence: rate every player in season T, again in season T+1, and correlate the two. A metric that repeats is a metric that forecasts.

Our defensive-zone contribution rate (v_in_dz_per_60) repeats at 0.54 and 0.60 across the two season-pairs we can measure. The standard public defensive metric — on-ice expected goals against (xga_per60_on_ice) — repeats at only 0.42 and 0.37 over the same pairs. Our action-credited defense is a stronger predictor of a player’s future defense than the rate everyone else cites.

The full table is in Validation below. The sections in between explain how each metric is built, at an intuition level.

How the Metrics Work

Everything starts from the NHL’s public play-by-play feed — the recorded stream of shots, hits, faceoffs, takeaways, giveaways, blocks, penalties, and goals, with coordinates and game state. Two foundation models read that stream. An expected-goals model scores every unblocked shot by quality alone — location, angle, rebound, rush — deliberately ignoring who took it, so shooter skill is measured later rather than baked in. A pair of state-value models then estimate, from the game state at any moment, the probability the team scores — or concedes — within the next ten events.

Action value is the change in those probabilities across each event, credited to the player who caused it. A dangerous shot that raises scoring odds earns positive value; a turnover that raises the opponent’s odds earns negative value. Goals carry a realized +1 reward split across the scorer and assisters (0.55 / 0.30 / 0.15), so playmaking is credited, not just finishing.

Zone Contribution

v_in_oz_per_60 · v_in_dz_per_60

Each action happens somewhere on the ice, so its goal-value is filed by zone from the acting player’s perspective: offensive, neutral, or defensive. Summed over a season and divided by 5v5 ice time, that yields a per-60 rate for each zone. v_in_oz_per_60 measures offensive-zone contribution — the value a player generates attacking; v_in_dz_per_60 measures defensive-zone contribution — value generated defending, including credit for blocked shots.

The defensive rate is the model’s headline: it lands in the skill-stable 0.40–0.65 persistence band and out-predicts the public xGA rate. The offensive rate persists higher (0.86) but is honestly role-confounded — offensive deployment (who gets the offensive-zone starts and the minutes) is itself extremely sticky season to season, so the offensive number repeats partly through usage rather than isolated skill. Read it as informative, not pure.

v_net_per_60(Net Contribution) is a position-adjusted, weighted z-score index. Its base is a player’s offensive-zone value (60% weight) and defensive-zone value (40% weight); as of 2026-06-12 (v2 — see the changelog) the published number blends that zone composite with a chance-creation-for-others term: net = 0.9 · z(0.6 · z(OZ) + 0.4 · z(DZ)) + 0.1 · z(C1), where C1 is the chance-creation-for-others RAPM described below. Each component is measured as standard deviations above or below the average for that position-and-season cohort, then combined. The asymmetric zone weighting reflects that offensive actions generate more total value per minute in hockey, while still giving defensive performance enough weight to materially affect rankings. Pure offensive stars rank near the top; elite two-way players — defensemen who drive offense, forwards who defend — surface high; pure defensive specialists rank in the middle, because their offensive contributions are below the cohort average. The result is a relative index (it carries a + or − sign), not a count of goals.

One framing matters when reading net against the scoring race: net is a strength-matched 5v5 rate— 5v5 value over 5v5 ice time. That is deliberate: 5v5 rates are what repeat year over year (the validation table below is built on them), while power-play production rides heavily on deployment. The cost is that all-strength value — a power-play playmaker’s specialty — is out of the headline number’s scope by design. So the leaderboard and player pages show v_total_season(“Season impact”, cumulative action value across all strengths) alongside net: a player can lead the league in season impact while sitting mid-pack on the 5v5 rate, and both statements are true at once.

The goals companion. Under the Net Contribution headline the player page shows a plain-language conversion: “≈ +X goals vs positional average at 5v5”. It is the rate-times-time algebra on the same underlying quantities — ((OZ/60 + DZ/60) − cohort average) × 5v5 TOI — so it prices a player’s 5v5 zone value in goals against the average player at his position, over his own minutes. What it excludes, deliberately: the chance-creation (C1) term, which is an xG-rate coefficient with no goals identity, and everything outside 5v5 — all-strength goal value lives in Season impact. And one approximation is owned: the companion weights offense and defense equally in goal units, while the z-score headline weights them 60/40 in standardized units, so the two can order players slightly differently. The baseline is the positional average, which means roughly half the league’s companions read negative — that is the honest arithmetic of an average baseline, not a defect.

Goals to wins. The secondary phrase (“~Y wins”) divides the goals figure by ≈5.9 goals per win — measured, not folklore: perturbation experiments in our own season-simulation engine (shifting a team’s scoring environment by ±0.05 and ±0.10 goals per game and simulating full seasons at the frozen, validated parameters) put one win at 5.75–6.05 goals of goal differential across strong, median, and weak teams. The classic rule-of-thumb of ~6 happens to be right; we cite our measurement of it.

Action-Type Breakouts

v_from_shots · v_from_assists · v_from_blocks

The same per-action value also splits by what the player did. v_from_shots is sniping value — value created by taking shots and scoring. v_from_assists is playmaking value, the assist share of goal credit; because the play-by-play feed records no passes, assists are the only window into setup work, so crediting them separately keeps playmakers from being under-rated. v_from_blocks is pure shot-suppression value: a blocked shot earns the blocker a small fixed credit (about the average quality of the attempt it prevented), defensive value a shot-only model never sees.

RAPM

rapm_net — single & multi-season

Action value only sees the player who touched the puck. RAPM — Regularized Adjusted Plus-Minus — is the complement: a ridge regression over every 5v5 shift that isolates each player’s per-60 impact on expected goals while controlling for the quality of teammates and opponents on the ice with them. rapm_net is their net effect on expected goals for minus against.

Single-season RAPM is noisy — one season is not enough lineup variety to separate players who are almost always on the ice together — so the production metric pools multiple seasons of shifts into one regression. Pooling lifts stars who were collinearity-bound (McDavid climbs roughly 25 spots across two seasons of pooling), but it does not fully resolve players whose linemate pairings barely change year to year. Treat rapm_net as a useful, regression-isolated second opinion, not a final word.

Goalie GSAx

gsax_shrunk · gsax_per_60

Goalies are rated by Goals Saved Above Expected. Sum the expected-goal value of every unblocked shot a goalie faced, subtract the goals they actually allowed, and the residual is performance above (or below) what an average goalie would manage on that shot load. Because the expected-goals model is shooter-agnostic and calibrated over the full shot universe, the league average sits at zero, so positive GSAx is genuinely above-average.

Small samples — backups, call-ups — can post wild rates on a handful of starts, so the production figure (gsax_shrunk) is pulled toward the league average by a Bayesian weight: a goalie’s raw GSAx is scaled by shots / (shots + 200). A goalie with thousands of shots is barely moved; one with a few hundred is regressed hard toward zero.

Validation

Every metric below is a strength-matched 5v5 per-60 rate, correlated between the 2023-24 and 2024-25 seasons across the 602 players with at least 200 minutes of 5v5 in both. We read the result in three bands: below 0.30 is noise; 0.30–0.65 is skill-stable (real signal that persists); above 0.85 is role- and usage-confounded (it measures sticky deployment more than individual skill).

MetricPearsonSpearmanQ4 persistReading
v_score_delta_per_600.9360.9230.90Math component of state-value change — tracks role/usage, not skill
v_concede_delta_per_600.9280.7920.58Math component — role/usage, not skill
vaep_per_600.8760.8760.71Total action rate — role/usage-dominated
v_in_oz_per_600.8550.8520.65Offensive-zone contribution — role-confounded but informative
xgf_per60_on_ice0.6290.5670.55Public on-ice xGF — the cleanest repeatable public skill signal
v_in_dz_per_600.5370.5250.50Defensive-zone contribution — skill-stable, and beats public xGA
v_in_nz_per_600.4590.3590.44Neutral-zone contribution — skill-stable, no public analog
xga_per60_on_ice0.4210.4250.47Public on-ice xGA — the standard benchmark v_in_dz beats
rapm_net0.3130.2690.42Single-season RAPM ≈ the raw control (noise-bound)
goal_share_5v50.3110.3140.42Raw 5v5 on-ice goal share — the control
rapm_off0.2680.2430.36Below 0.30 — noise
rapm_def0.1470.1200.31Individual defense barely repeats year to year

The two all-strength delta components are omitted; the strength-matched 5v5 columns shown are the primary skill-comparison rates.

v_in_dz_per_60 (0.54) clears the public on-ice xGA benchmark (0.42) — and on the second, noisier season-pair (2024-25 → 2025-26, measured on the complete recovered 2025-26 season with real full-season ice-time denominators) the gap widens to 0.60 vs 0.37. Single-season RAPM, by contrast, barely matches the raw goal-share control, which is exactly why the production RAPM pools seasons. The math components near the top of the table (0.93+) repeat because they track role and usage, not because they are the best player ratings — read them with that caveat.

Known Limitations

The model is honest about what it cannot see. The most important constraints:

Play-by-Play Only

The NHL feed records discrete events — shots, hits, faceoffs, takeaways, giveaways, blocks, penalties, goals — but no passes, controlled zone entries, zone exits, or sustained possession. So the model cannot directly credit the cross-ice feeds, carries, and entries that drive much of elite-player value. Assists are the only proxy for playmaking, and the partial divergence between action value and RAPM is one symptom of this blind spot. The same constraint cuts on defense: positioning, gap control, and lane denial that never produce a recorded event are invisible to action data, so defensive-zone value rewards players who defend by doing recordable things (blocks, takeaways) over those who defend by being in the right place. Closing either side would need tracking data (NHL EDGE) or licensed microstats.

Chance-creation credit — tested, not shipped

Because no passes are recorded, the value of an unconverted scoring chance goes entirely to the shooter; playmakers are credited only when a chance becomes a goal. We built and tested the obvious repair: redistributing part of each chance’s value to teammates whose recorded actions (takeaways, earlier shots) built the possession. Candidate parameters were evaluated blind against a pre-registered two-part test, with bootstrap confidence intervals on every comparison: the adjusted metric had to predict the next season’s on-ice goal differential at least as well as the unadjusted one, and had to improve year-over-year repeatability by a margin set before any results were seen. It passed the first part — the adjustment carried a real but tiny predictive gain, about +0.002 correlation — and failed the second outright: repeatability slightly declined rather than improving. It was rejected under that pre-set bar. The per-event credit asymmetry itself still stands and is not repaired here, pending passing or tracking data. A separately-constructed term — chance-creation RAPM (C1), evaluated the same blind way — cleared its out-of-sample prediction bar and ships in the net definition; see “Chance creation for others (C1)” below. It earns its place by improving prediction, not by repairing per-event shooter credit. One experiment rejected, one shipped, under the same pre-registered standard.

Teammate Collinearity in RAPM

Players who share almost all of their ice time cannot be cleanly separated by the regression. The canonical case is McDavid and Hyman in Edmonton, on the ice together for roughly 85% of their 5v5 minutes year after year; some of McDavid’s credit leaks to his linemate. Pooling seasons reduces this but does not eliminate it.

Goalie Year-over-Year Noise

Goalie GSAx barely repeats season to season (persistence near zero on adjacent seasons with a high shot floor). This is largely real — goaltending is genuinely volatile, the qualifying sample is small, and our shot model has no traffic/screen features — so single-season GSAx is descriptive, not a projection.

2025-26 season status — promoted to stable, one documented deviation

The 2025-26 regular season is complete and was promoted out of provisional status on 2026-06-12. Two facts worth keeping on the record. First, the NHL’s JSON feed remains permanently missing shift charts for 505 of 1,312 games — re-checked at the source after season’s end; those shifts were recovered in full from the league’s legacy HTML time-on-ice reports, validated with an exact per-shift match against the JSON feed on games both sources carry, so every 2025-26 metric is built on complete, real shift data. Second, the season’s expected-goals model failed our strict held-out calibration gate (−5.2% on the final tenth of the season) — we investigated rather than waved it through. Full-season calibration is −0.5%, comfortably inside our ±2% standard; the miss is confined to the temporal tail, where league scoring jumped about 7% relative to the rest of the season, with no concentration by team, arena, or feed era. That is a genuine scoring-environment shift the gate punishes by construction, not a data defect — so the season ships as stable with this deviation documented instead of hidden. The gate design itself is queued for review before the 2026-27 build, since it currently cannot distinguish calibrator failure from real late-season scoring drift.

Chance creation for others (C1)

Our action values are built from NHL play-by-play, which records shots but not passes — every non-goal scoring chance is credited entirely to the shooter, and the pass that created it is invisible. That per-event asymmetry is a structural limitation we keep on the record. C1 is not a proven fix for it: it ships because it improved out-of-sample prediction under a pre-registered blind test — the same standard as the rejected chain-credit experiment — not because a playmaking deficit in Net has been demonstrated.

C1: chance creation for others. Standard RAPM asks: when this player is on the ice, does his team generate more expected goals? C1 asks a sharper question: when this player is on the ice, do his teammates — excluding the player himself— generate more shot quality? Every 5v5 stint (a stretch with both lineups unchanged) is expanded ten ways, once per skater. In the copy where a given skater is the “focal” player, the target is the expected-goal total of shots taken by the other four teammates, and the focal player’s own column is zeroed out. A ridge regression over ~1.35 million such rows then estimates each player’s marginal effect on teammates’ shot quality — chance-creation influence with the player’s own shot volume removed by construction. (Without the focal exclusion, the design collapses algebraically into ordinary offensive RAPM.) C1 is moderately related to offensive RAPM (r ≈ 0.55–0.68 across seasons, far below our pre-registered 0.85 redundancy threshold) and repeats within a season at a split-half reliability of ~0.60 after Spearman-Brown adjustment, in all three seasons tested.

This is distinct from the “Playmaking” figure shown on the leaderboards and player pages: that one is realized assist credit (the share of a player’s goal value coming from his actual primary and secondary assists), whereas chance creation for others is a regression-isolated estimate of how much a skater lifts his on-ice teammates’ shot quality, whether or not it ever shows up as a recorded assist.

The blind test and what shipped. Every decision was registered before any result existed. The candidates: the current net definition (baseline), C1 alone, and small fixed blends (10/20/30% C1, plus two variants adding box-score primary assists). The criterion: cross-prediction of next-season on-ice 5v5 goal differential per 60, over two season pairs, with bootstrap confidence intervals — the same out-of-sample standard everything else on this page is held to. The ship bar: at least +0.010 pooled improvement over the baseline with the confidence interval excluding zero, no degradation on a secondary team-level check, and — among everything that cleared — the smallest admixture wins. No names, no ranks, and no player-level numbers were examined until the choice was frozen from the aggregate table. Every blend cleared the bar; the smallest-weight rule selected the 10% blend now published as net v2 (formula above). C1 alone predicted worse than the existing net — it is a complement, not a replacement, which is exactly what a small admixture is for.

External validation against tracked passing — including the miss. We also tested C1 against ground truth it was never trained on: All Three Zones’ manually tracked passes that lead to shots (“shot assists”), a few hundred games per season. We registered one validation variable (primary shot assists per 60 of tracked 5v5 time), one coverage floor, and one bar — pooled Spearman ≥ 0.50 with the confidence interval excluding 0.30 — before computing anything, with no alternative columns permitted regardless of outcome. The result: pooled Spearman +0.479, CI [+0.441, +0.518], across ~1,580 player-seasons (per season: +0.53 / +0.42 / +0.49). The interval excludes 0.30 decisively — C1 genuinely tracks real passing — but the point estimate missed our bar. By the registered rule, C1 therefore does not ship as a standalone chance-creation metric; it ships only inside net v2, where its predictive value was established directly. For context, raw primary assists per 60 correlate at +0.621 with the same tracked-passing variable on the same panel — unsurprising, since both are realized-pass counts, while C1 estimates on-ice influence(pre-pass movement, retrievals, and sequence play that tracking attributes to no one). We report the miss rather than re-litigating it, and we deliberately call C1 chance creation rather than playmaking: the validation shows it tracks real passing only moderately, because it measures the on-ice lift in teammates’ shot quality however it arises, not realized passes. One re-test is registered for when fuller tracking coverage publishes; the spec is frozen.

The entanglement caveat. RAPM-family estimates separate players by seeing them in different lineups. A handful of pairs are nearly inseparable — skaters sharing more than 90% of their 5v5 minutes (permanent lines and defense pairings; roughly 5–10 pairs per season). For those players, C1’s split of chance-creation credit within the pair is statistically under-determined, and the 10% C1 component of net v2 should be read with that grain of salt. The affected pairs move very little under v2 in practice (within about ±4 ranks in almost all cases), but the caveat is structural and we flag it rather than hide it.

Contract Surplus

The contract-surplus board asks a different question: what does the model think a contract is worth? For every signed player on the value panel we fit a within-position regression of cap hit on the player’s value, his contract status (ELC / RFA / UFA), and his signing age. The fitted value is the expected cost, and surplus = expected cost − AAV — positive is a team-friendly deal, negative is an overpay. Two specification choices matter enough to state up front: the cap hit being fitted is the AAV restated to current-cap dollars, and the fit is trained without growth-priced deals (both below).

The value input is a recency-weighted (5:4:3) blend of the all-strengths total action value — the same metric as the leaderboard’s “Season impact” — expressed as a z-score vs position peers. It replaced an earlier 5v5-only input (see the changelog): the market demonstrably prices special-teams production — refitting the cost model with the 5v5 and non-5v5 components separated, the market pays roughly $1.9M per unit of non-5v5 value against $0.8M per unit of 5v5 value among forwards — so a 5v5-only cost model systematically read power-play-heavy stars as overpays. The added component is as repeatable year over year as the 5v5 base (Pearson ~0.78–0.81), so pricing it is measurement, not optimism. One honest caveat carried from the metric itself: season totals repeat partly through stable deployment, and a contract market pays for exactly that usage-plus-production bundle.

Cap-era restatement. Nominal AAVs from different cap eras are not the same money. Drew Doughty’s $11M, signed in 2018 against a $79.5M Upper Limit, consumed 13.8%of his team’s cap — the same nominal figure signed today would consume 10.6%. So before anything is fitted, every AAV is restated to current-cap (2026-27) dollars by the ratio of today’s cap to the cap of the league year the deal was signed in: Doughty’s deal meets the curve at $14.4M, not $11M. All surplus dollars on these surfaces are current-cap dollars, and every card shows the chain — nominal AAV, share of cap at signing, restated AAV — so the arithmetic visibly adds up. One documented convention caveat: an extension signed up to a year before it takes effect is restated against its signing-year cap, which slightly overstates its restated AAV; the affected verdicts are robust to this.

The growth-deal exclusion. Some contracts are priced on the player a team expects, not the one it has — long-term deals signed before age 24 (five-plus years, the young max-extension class). Those deals are excluded from training the cost curve by that criterion (age and term only, no names) and are still scored against it, so a curve meant to price current production is never taught by prices set for projected production. Honesty note: the measured effect of this exclusion on the curve is small (~$0.1M at the top — we tested the hypothesis that growth deals flattened the market slope, and it failed); it ships because it is principled, and because scoring those deals against a production-priced curve reads them the honest direction — more negative, “the production hasn’t arrived yet.”

What surplus does not price. The model prices current production in today’s cap dollars only: no term structure, no projected growth, no negotiation or marquee premium. Growth and term-loaded deals read negative here by design — the young max-money extensions are the canonical case — and even after restatement the very top of the market compresses (the fitted cost curve tops out near $17.4M while restated contracts run to $18.5M). Read those rows as a statement about what the production is worth today, not a verdict on the deal’s logic. The per-player PP share still appears in board tooltips as information, but the old PP-heavy warning chip is retired — special-teams value is now in the price.

The market-rate bands. Every contract is classified by its surplus into a triptych: ≤ −$1M reads overpaid, ≥ +$1M reads underpaid, and anything in between reads market rate — priced about right by the model. The thresholds are in current-cap dollars, like the surplus itself. The bands are display classification only, on the unchanged surplus values. They exist for honesty of framing: the training residuals sum to zero within each position group by construction (scoring the excluded growth deals then shifts the scored total negative — that offset is exactly the growth class’s aggregate overpayment, disclosed rather than rebalanced away), but the board’s old headline counted every negative contract as an “overpay” while holding bargains to a quality floor — an accounting asymmetry, not a model claim. A gap inside ±$1M is within the cost model’s noise and is not asserted as a verdict either way.

The bargain floor. The cost curve is roughly linear, so it over-credits cheap depth contracts — without a floor the “bargains” are dominated by minimum-salary bodies whose surplus is just the model intercept. Headline bargains must therefore clear both an AAV floor ($1.5M) and a value floor (0.25 SD above positional average on the Season-impact z), applied within the underpaid band. The regression still fits on every contract and each player keeps his computed surplus; the floor only governs the headline bargain board. The overpay board lists the whole overpaid band by magnitude — no value filter, so the star-contract negatives stay visible. The snapshot is hand-maintained, refreshed manually rather than nightly.

Player Projections

The projections board and the team-page projection panels show a projected 5v5 zone-rate value vs position peersfor the upcoming season, built from each player’s prior seasons and age curve. Zero means positional average; the number is a per-60 rate, not a season total.

Not total player value. Like the headline net metric it projects, this is 5v5-only by design — a power-play-driven or heavy-usage star can rate below average here while remaining an elite overall contributor. (The contract-surplus model once shared this blind spot; it now prices all-strengths production — see the changelog.)

A projection, not a proven forecast. It beats naive carry-forward decisively, but its edge over the existing stability blend is unproven at one fold — the 2026-27 season resolves it. Until then, read projected values as the model’s best estimate, not a validated forecast.

Season Forecast & Projected Standings

The projected standings are a true forward forecast. Team strength is composed from the current roster: each rostered skater carries his projected value (the same Marcel-plus-age-curve projection behind the player projections), weighted by expected ice time from his prior-season minutes, with an 18-skater dress cut; rookies and other players with no projectable history enter at a stated replacement level rather than being silently dropped. Goaltending enters as a start-share-weighted tandem of multi-year shrunk GSAx. Each game of the real schedule gets a win probability from that strength gap, and the season is simulated thousands of times: the headline is median projected points, the bar is the P10–P90 range. Because the input is the roster, the forecast updates when rosters move — trades and signings show up at the next refresh (weekly until puck drop), stamped on the page.

Anchored to last season’s results. The roster-composed strength is a per-minute average of projected 5v5 value: on its own it rewards a roster with no weak regulars over a stars-and-holes roster, and it says nothing about special teams. So it is shrunk toward each team’s actual points from the most recent completed season— a regression toward what teams have actually done. The blend weight is not eyeballed: it is calibrated out-of-sample, choosing the mix that best predicts the following season’s point totals across the seasons available (a roughly 60/40 tilt toward the roster model). The effect is to pull teams whose recent results diverged from their roster profile back toward their results, while still letting a genuinely improved or declined roster move.

The goalie weight, honestly. Goaltending is the input that most decides a single game and the least predictable thing we measure year over year, so a predictive model must down-weight it — it enters at a weight of about 0.065, reflecting its measured reliability. The consequence is owned rather than hidden: teams whose recent point totals were driven by elite goaltending project lower here than their standings history suggests. When such a team’s goaltending repeats, this forecast will have been wrong about them — that is the position the model takes, on the record, rather than quietly trusting the least repeatable signal in hockey.

Point ranges are compressed by design. The model separates teams conservatively — a measured low-discrimination property of the underlying game model — so a tight league spread reflects the model, not a lack of confidence. Forecast probabilities are tracked against results on the calibration curve: they follow the predicted line, with a disclosed mild over-confidence in the 0.6–0.8 band. The roster-composed strength was backtested through the same harness (playoff-odds log-loss 0.4243 vs the prior chain’s 0.4372) — with a stated caveat: historical “preseason rosters” were approximated from each season’s early dressed lineups, a mildly hindsighted proxy, and the 2026-27 season is the registered binding test.

Seed vs playoff odds. Seed is a league-wide points ranking; playoff odds fold in each team’s division and wild-card path — so a team can seed above another yet carry lower playoff odds.

The score layer (2026-27 forward). The forecast now simulates scores, not just winners. Win probabilities are unchanged — the fitted win-probability link retains sole authority over who wins each simulated game, an identity verified to machine precision when the layer shipped. Beneath that, a separately validated score layer generates each game’s margin and goal totals conditionally on the drawn outcome, and a calibrated empty-net application then adds the late empty-net goals real games contain — so the projected GF / GA / GD columns are comparable to official NHL totals (empty-net goals are about 6.5% of all goals, roughly 16 for and 16 against per team over a season). Standings order is resolved by the NHL’s own tiebreak chain — head-to-head record before goal differential — computed on those simulated, empty-net-applied scores, replacing the earlier stand-in that broke median-point ties by mean points. All totals are stated over the full 84-game 2026-27 schedule.

One-time shift at switchover, on the record. When the score layer shipped, projected points moved up by roughly 1.5–2 league-wide against the prior week’s table. That shift is a tie-rate correction, not a team-strength change: the earlier tie layer used an overtime/shootout rate pooled over 2023-24 and 2024-25 (about 0.213), while the score layer’s adaptive target starts each season at the most recent completed season’s actual rate — 0.2485 per 2025-26 — and more overtime/shootout games mean more loser points for everyone. No team’s strength, win probability, or relative standing moved from this correction; bubble-adjacent seeds that changed did so because real tiebreaks replaced the mean-points stand-in.

Linemates

What the player-page Linemates section measures. Linemate strength is seconds of shared 5v5 ice time between a player pair — the overlap of shift intervals, strength-filtered to true 5v5 (five skaters a side, both goalies in net). Not points, not shift counts, not event co-occurrence: actual shared seconds, computed from the NHL’s shift-level data.

Windows are the player’s own games. The selector offers the full season, the player’s last 10 games, and last 5 — and defaults to the last 10, because a full-season view blends line shuffles away; the recent window is what “current linemates” actually means. The percentage next to each linemate is the share of the player’s own 5v5 ice time in that same window they spent together.

Display rule. Forwards show their top 5 forward linemates and top 3 defensemen; defensemen show their top 3 D partners and top 5 forwards — ranked by shared seconds, nothing curated.

Data. The 2025-26 regular season — 1,311 of 1,312 games (one game produced no valid 5v5 segments and is excluded). Shift coverage is complete for the season: the mid-season gap in the NHL’s JSON shift feed was recovered in full from the league’s legacy HTML time-on-ice reports. The section will track 2026-27 once the new season’s games exist.

Data Sources

Where the numbers come from. Every figure on Edgework is pulled from the NHL’s public web API (api-web.nhle.com). The homepage leaderboards draw on the NHL EDGE tracking feed — the same puck-and-player tracking that powers broadcast graphics — while player profiles blend EDGE data with classic box-score stats. The value model runs on play-by-play and shift data from the same public API.

League leaders. The six homepage leaderboard cards each call a dedicated EDGE “top-10” endpoint — skating speed, speed bursts, skating distance, shot speed, offensive-zone time and 5-on-5 save percentage — fetched in parallel and normalized into one shape. Speed Bursts · 20+ MPH sums the 20–22 mph and 22-plus tracking buckets for a true count at or above 20 mph.

Scoring leaders. Top Forwards and Top Defensemen rank by points, split out of the league-wide scoring list. Top Goalies ranks by wins on the homepage; the value surfaces use our own GSAx (above), which the public NHL API does not provide.

Known gaps. The NHL does not expose public top-10 leaderboards for shots on goal or high-danger shots — that tracking lives only on individual player pages, so those boards are not shown. Anything that cannot be sourced cleanly is left out rather than estimated.

Freshness. Leaderboard data is cached for one hour; player profiles for twelve. The “last refreshed” timestamp in the home footer marks when the homepage last regenerated.

Changelog

2026-08-12 — Contract surplus: cap-era restatement + growth-deal exclusion (S4). Shipped combined with the regressor swap below. The cost model now fits AAV restated to current-cap (2026-27) dollars — a deal signed against an older, lower cap meets the curve at its true market weight (Doughty: 13.8% of the 2018 cap, $14.4M restated) — and training excludes long-term deals signed before age 24 (criterion-defined, still scored; they read negative by design). Surfaces show the restatement chain, and surplus is computed against the restated figure. A tested convexity term (steeper curve at the top) was null and did not ship; the growth-exclusion’s own effect on the curve measured small (~$0.1M at the top) and is disclosed as such. See Contract surplus.

2026-08-12 — Contract surplus: all-strengths regressor + market-rate bands. The cost model’s value input changed from the 5v5-only net to the all-strengths Season-impact z (the market prices special-teams production; the 5v5-only fit misread PP-heavy stars as overpays). The PP-heavy caveat chip is retired (PP is now in the price); guard text now reads “prices current production, not term or growth.” Contracts are also classified into overpaid / market rate / underpaid bands at ±$1M. See Contract surplus.

2026-06-29 — Contract surplus board. Added the contract-surplus surface (board + player-page card): expected cost from a within-position fit on 5v5 value vs actual AAV, with a derived PP-heavy flag and a prominent “estimate, not a verdict” caveat. See Contract surplus.

2026-06-12 — Net Contribution definition change (v2). Net is now 0.9 · z(0.6 · z(OZ) + 0.4 · z(DZ)) + 0.1 · z(C1) per position cohort and season, same qualification floor (500 events). Selected blind under a pre-registered bar (+0.010 pooled next-season predictive improvement, CI excluding zero; smallest admissible weight wins). Effect: rank correlation with v1 is 0.995 within season; the median absolute rank change is 3–4 spots; same-season agreement with on-ice goal differential improved in all three seasons. Historical seasons are restated under v2 — every season page and leaderboard reflects the new definition.