A candidate is a comparison that survived sample size, shared feasible alternatives, pre-decision balance, precision, false-discovery-rate control, matching sensitivity, and patch compatibility. Surviving all of that makes it worth inspecting. It does not make it a proven cause, and nothing here feeds coaching output.
| Design | Cohorts | Sample ok | Feasible | Balanced | Rate | Median N | Total N | Median span | Worst covariate |
|---|---|---|---|---|---|---|---|---|---|
| old phase (0-8 min bands) | 3,136 | 100 | 100 | 24 | 24% | 74 | 9,404 | 261s | decision_time_s ×28, existing_spend ×25, team_soul_advantage ×16 |
| fine phase (9 strata) | 3,258 | 103 | 103 | 24 | 23% | 73 | 9,239 | 237s | decision_time_s ×25, existing_spend ×25, team_soul_advantage ×21 |
| continuous +/-30s | 9,261 | 9 | 9 | 7 | 78% | 99 | 1,090 | 30s | decision_time_s ×1, team_soul_advantage ×1 |
| continuous +/-60s | 6,897 | 23 | 23 | 12 | 52% | 75 | 2,364 | 60s | team_soul_advantage ×6, existing_spend ×2, net_worth ×2 |
| continuous +/-90s | 5,724 | 43 | 43 | 18 | 42% | 64 | 3,832 | 89s | team_soul_advantage ×9, decision_time_s ×7, existing_spend ×5 |
Judged before any outcome was inspected. A design that balances everything by shrinking every cohort below the sample gate has not improved comparability — both numbers are shown so the trade is visible. The old 0–8 minute band failed on decision_time_s; under time matching that covariate stops being the binding problem.
| Stage | Reached | Lost here | Rejected |
|---|---|---|---|
| observed | 270 | — | — |
| sample sufficient | 198 | 72 | 72 |
| feasible shared | 198 | 0 | — |
| balanced | 99 | 99 | 99 |
| precise | 58 | 41 | 41 |
| survives fdr | 0 | 58 | 58 |
| survives sensitivity | 0 | 0 | — |
| patch compatible | 0 | 0 | — |
| strategic candidate | 0 | 0 | — |
Every candidate comparison is one cohort paired with one outcome metric. Each stage is a strict subset of the one above it, so a rejection lands in exactly one bucket and the counts subtract cleanly. A system that showed only its survivors could not tell you whether it found nothing or is quietly broken at one stage.
| Era | Dates | Versions | Matches | Decisions | Opened by |
|---|---|---|---|---|---|
| h19-v6614 | Jul 03 – Jul 09 | 6614–6624 (4) | 30 | 491 | first snapshot |
| h19-v6627 | Jul 09 – Jul 28 | 6627–6640 (11) | 409 | 6,654 | item:Scourge value 2.6->2.5 |
| h19-v6642 | Jul 28 – Jul 28 | 6642–6642 (1) | 0 | 0 | item:Frenzy css_class None->healing; item:Frenzy icon None->https://assets-bucket.deadlock |
| h19-v6643 | Jul 28 → now | 6643–6679 (20) | 2,954 | 47,679 | item:Spiritual Overflow value 15->13; item:Spiritual Overflow value 32->30 |
A new era opens at any version carrying a change material to this hero: its own stats, its abilities, or an item its players actually buy. Materiality is relative to the research question on purpose — treating every numeric wobble across all 251 items as material would put each version in its own era and leave nothing poolable at all. 0 hydrated matches have no era (their client version was never snapshotted) and are excluded from era-controlled analysis rather than guessed at.
| Client versions known | 807 (latest 6684) |
|---|---|
| Versions snapshotted for this hero | 36 |
| Patch notes indexed | 31 — labels only, not the diff source |
| Asset changes detected | 108 |
| Material to this hero | 84 (hero 1, abilities 0, items 83) |
Version-to-time comes from /v1/assets/steam-info/all, which carries a version_datetime per client version. Asset endpoints accept client_version and honour it. Hero stats live under starting_stats as {value, display_stat_name} pairs; there is no explicit dash-slot field, so dash charges are read from starting_stats.stamina.value. Abilities have no endpoint of their own — hero.items maps slot names to class names which resolve through /v1/assets/items/{class_name}.
| Version | Kind | Entity | Field | Change | Direction |
|---|---|---|---|---|---|
| 6643 | item | Spiritual Overflow | value | 32 → 30 | decreased |
| 6643 | item | Spiritual Overflow | value | 15 → 13 | decreased |
| 6642 | hero | Shiv | stamina_regen_per_second | 0.18181 → 0.166667 | decreased nerf |
| 6642 | item | Weighted Shots | value | 40 → 30 | decreased |
| 6642 | item | Decay | scaling_stats[1] | ETechPower → ETechRange | changed |
| 6642 | item | Decay | scaling_stats[0] | ETechRange → ETechPower | changed |
| 6642 | item | Cursed Relic | value | -14 → -25 | decreased |
| 6642 | item | Cursed Relic | tooltip_section | innate → active | changed |
| 6642 | item | Ethereal Shift | value | 35.0 → 37.0 | increased |
| 6642 | item | Scourge | value | 17 → 20 | increased |
| 6642 | item | Scourge | usage_flags[0] | None → ConditionallyApplied | changed |
| 6642 | item | Scourge | tooltip_section | innate → active | changed |
| 6642 | item | Scourge | tooltip_is_important | False → True | changed |
| 6642 | item | Scourge | value | 2.5 → 2.3 | decreased |
| 6642 | item | Spiritual Overflow | value | None → 10 | changed |
| 6642 | item | Spiritual Overflow | usage_flags[0] | None → IntrinsicallyProvidedInAbility | changed |
| 6642 | item | Spiritual Overflow | tooltip_section | None → passive | changed |
| 6642 | item | Spiritual Overflow | tooltip_is_important | None → True | changed |
| 6642 | item | Spiritual Overflow | tooltip_is_elevated | None → False | changed |
| 6642 | item | Spiritual Overflow | subclass_name | None → BonusSpiritLifesteal_scale_function | changed |
| 6642 | item | Spiritual Overflow | specific_stat_scale_type | None → EHealingOutput | changed |
| 6642 | item | Spiritual Overflow | class_name | None → scale_function_single_stat | changed |
| 6642 | item | Spiritual Overflow | provided_property_type | None → MODIFIER_VALUE_TECH_LIFESTEAL | changed |
| 6642 | item | Spiritual Overflow | prefix | None → {s:sign} | changed |
| 6642 | item | Spiritual Overflow | postvalue_label | None → Spirit Lifesteal | changed |
| 6642 | item | Spiritual Overflow | postfix | None → % | changed |
| 6642 | item | Spiritual Overflow | label | None → Spirit Lifesteal | changed |
| 6642 | item | Spiritual Overflow | icon | None → https://assets-bucket.deadlock-api.com/assets-api-res/icons/heal.svg | changed |
| 6642 | item | Spiritual Overflow | css_class | None → healing | changed |
| 6642 | item | Restorative Locket | stat_scale | 0.32 → 0.5 | increased |
Direction is neutral. A buff/nerf label appears only where the direction of benefit is unambiguous — more health is better, a lower cost is better. A larger radius or a longer duration can be either, so those carry no label rather than a guessed one.
| balance floor version | floors-v1 |
|---|---|
| balance version | balance-v1 |
| choice set version | choiceset-v1 |
| era version | era-v1 |
| estimator version | estimator-v2 |
| extraction version | ext-v1 |
| fdr version | fdr-v1 |
| matching version | matching-v2 |
| outcome version | outcome-v1 |
| patch mapping version | patchmap-v1 |
| phase strata version | phase-v2 |
| research schema version | schema-v2 |
| sensitivity version | sens-v3 |
| state version | state-v1 |
| time matching version | timematch-v1 |
| funnel version | funnel-v1 |
A change to any of these invalidates results derived under the old one. Conclusions are never served under a methodology they were not computed with.
Matching specification
time-cal60s_nw15_adv5k_spend30_rank3_era · gates: cohort ≥ 50,
per choice ≥ 15, per metric ≥ 10
· sensitivity grid sens-v3
(12 specifications, fixed before the sweep ran).