Contract
4.1.0
Tool contract 4.1.0
The 3.13.0 guards, landed on the field that needed them (feedback #61, #62, #63, the 2026-09-19 regression run: every 3.13.0 item held, and three new defects were a guard sitting beside the number rather than on it).
battles_performance(group_by: week) andbattles_trendsweeks carrytrophy_mode_battles(the Trophy Road and Path of Legends battles played) besidetrophy_battles, which counts only the ones the game reported a trophy delta for. A loss standing on an arena floor reports none, sotrophy_battleswas lower than the ladder games played, only losses dropped out, and a rate over it flattered exactly the floored player the response had already named. The docs now list it among the denominators, and a note names the weeks where the two counts differ.battles_levelslists EVERY step ofmonthly_trendwhere the modal arena changes or the mean starting trophies move by 200 or more underplayer.population_changes[]({from_month, to_month, arena_changed, from_arena, to_arena, from_trophies, to_trophies, trophy_delta}; empty when the population held), and the note names all of them. It named the earliest step only and stayed quiet on a later arena crossing, the harder confound and the one #55 was filed for.battles_deckscarriesexcluded {duels, no_deck}: a duel has no single deck and was silently outsidetotal_battles_in_windowand everyshare_of_battles(the docs listed the duel-excluding tools and left this one out). The identitytotal_battles_in_window + excluded.duels + excluded.no_deck = battles_performance.battlesnow holds over the same window,total_battles_in_windowis summed over every deck-bearing battle rather than the first hundred decks, and a note says what sits outside the rows whenever the window held a duel.
Additive; no migration.