Changelog
This page summarizes the latest parser, validation, and report changes that materially affect how gem behaves today.
It is intentionally short-range for now. It is not backfilled with older release history.
March 2026
Roshan Conversion Report
There is now a dedicated Roshan Conversion report tab and a matching Experimental Features page.
The new report separates:
- the conversion label
Low Conversion,Fight Conversion,Objective Conversion,Map Squeeze,Game-Closing Rosh - the Aegis outcome
Consumed In Fight,Expired After Use,Expired Unused,Denied,Window Lost,Game Ended,Unknown
Recent refinements
- labels and Aegis outcomes are documented directly in the report
- the old single score was removed from the UI
- the report now explains how
Presence Deltais calculated - Roshan-fight timing now uses
first_death_tickinstead of the padded teamfight window start
This remains experimental because it is a replay-derived interpretation layer, not a native replay fact.
Game-End Sampling Fix
PlayerExtractor now forces one final snapshot at the exact game-end tick and stops sampling after that point.
Why this mattered
- some player time series were drifting into the postgame scoreboard window
- this could inflate late sampled values such as
net_worth_t - it created false mismatches when validating against OpenDota
Concrete impact
- the sampled end state now reflects the actual replay game-end boundary
- the Tusk mismatch discovered during OpenDota validation was resolved by this fix
Gold Series Split
gold_t and gold_t_min now mean current unspent gold only.
total_earned_gold_t and total_earned_gold_t_min now mean cumulative earned gold.
Why this mattered
- the older fallback path could mix current gold and cumulative gold into the same field
- that made economy analysis harder to reason about
- buyback, purchase timing, and “cash on hand” questions need current unspent gold
- advantage curves and lane-economy summaries need cumulative earned gold
Current state
- current unspent gold is exposed
- cumulative earned gold is exposed
- reliable and unreliable gold are not exposed separately yet
OpenDota Validation Harness
The OpenDota validator now supports more than a few pinned fixtures.
It can now
- randomly sample candidate matches from OpenDota feeds
- download missing replays automatically
- validate in
scalar,parsed, orfullmode - request OpenDota replay parsing when richer fields are missing
- write manifests and JSON result files for repeatable checks
Important validator clarification
- final scalar checks use end-of-game values
[min]fields are now treated as informational only- the last whole-minute sample can legitimately precede game end by up to 59 seconds
Farming Patterns Context
The experimental Farming Patterns work now has an explicit map-context layer.
That layer uses
- tower state
- Roshan and Aegis timing
- ward counts
- net-worth and XP advantage
- recent enemy presence by region
Recent refinements
- labels were made easier to read
- the old border/river special case was removed as a standalone category
- formulas, thresholds, drivers, and caveats are documented explicitly
- the report now treats route segments as useful farming-pattern evidence even when the support signals are noisy
This feature is still experimental by design.
Replay Edge Cases
There is now a dedicated deep-dive page for replay-specific pitfalls, including:
- duplicate hero entities vs the canonical hero handle
- within-tick sampling caveats
- truncated or incomplete replays
- schema drift across builds
- inference limits for higher-level analytics
If you are debugging parser behavior, read this together with the Deep Dives and Experimental Features sections.