Changelog
This page is a curated narrative summary of the parser, validation, and report changes that materially affect how gem behaves today.
It is intentionally short-range. The full per-release SemVer history lives in the canonical CHANGELOG.md.
September 2026 — In-game clock and match end
Replay ticks keep running while a match is paused, and many replays keep
recording for minutes after the Ancient falls. ParsedMatch.game_clock now
records observed pauses and converts ticks to the in-game clock exactly as
OpenDota reports it, and ParsedMatch.post_game_tick marks when the match ended.
OpenDota-compatible objective, ward-expiry, lane-window, and teamfight-XP times
are pause-aware; reports show the in-game clock and the real match duration; and
Roshan, smoke, and ward-impact windows end with the match. This let
game_closing fire on real replays for the first time, so the Roshan
calibration corpus and tag frequencies were re-audited.
See Match data and the Roshan calibration record.
September 2026 — Farming route evidence
Farming Patterns now reconstructs camp-local routes with explicit zone, sample-gap, movement-discontinuity, and micro-exit rules. Public route, segment, and point records preserve neutral interaction, fresh cumulative XP/gold deltas, sampled coverage, strength, and missing-evidence reasons; four flat DataFrames expose the same route facts. Dense player records retain total-earned XP separately from level-local XP, and report downsampling preserves route discontinuities. A comparative context layer adds explicit camp topology, bounded local presence, modeled observer coverage, lane towers, objective and territory provenance, composable tags, and a fourth normalized tag table. The report exposes why each tag appeared; the older safety/pressure scorer remains available only as a compatibility API and collapsed formula reference.
See Farming Patterns and the calibration record.
September 2026 — Roshan evidence calibration
Roshan conversion now records protocol/fallback team provenance, explicit Aegis fate sources, and engagement-aware fight associations. Unknown structures and Tormentors remain visible and uncredited. The report cross-links Roshan windows with fight positioning and no longer renders the deprecated aggregate score or exclusive label. Flat DataFrame exports and a reproducible real-replay corpus support downstream analysis; the tag ruleset remains explicitly provisional.
See Roshan Conversion and the calibration record.
June 2026 — v0.4.x
The 0.4 line is an OpenDota match-API parity effort plus report asset-cache
tooling. The supported top-level API (gem.parse, gem.ParsedMatch, gem.find_player, …)
is unchanged — everything here is additive.
June 2026 — v0.3.0
A structural + correctness release. The supported top-level API (gem.parse, gem.ParsedMatch, gem.find_player, …) is unchanged.