Previously sqKps = sumAllPlayerKills / games, inflating the value ~8x
since all 8 players' kills were summed before dividing by game count.
Now computed as the mean of each active player's individual kills/games.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
WT tags are always exactly one decorator char on each side, so a
simple s[1:-1] is clearer than a regex strip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
squadron_raw from old saved replays still has raw tags (-DSPLA-) but
winning_team is now stripped (DSPLA) by _strip_tag in process_session.
squadron_short is set by per-team DB resolution so it matches for both
old and new replays.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The old regex [^A-Za-z0-9_-] whitelisted dashes and underscores, so
-DSPLA- and _APS_ passed through untouched. All downstream code that
reads team["squadron"] then saw the raw tag instead of the bare short
name, causing NULL clan_ids in player_games_hist/match_summary and
broken lookups throughout. Fixing at the source means every consumer
gets a clean name without individual patches.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
guild_squadron is the clean short name from SQUADRONS.json (e.g. DSPLA)
but winning_team_squadron in the replay is the raw tagged value (-DSPLA-).
They never matched for dash/underscore-tagged squads so bar_color was
always not_involved instead of win/loss on the guild's own scoreboard.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Squads with dash or underscore tags (e.g. -DSPLA-, _APS_) had their raw
replay team.squadron value written directly to COMPS filenames, producing
-DSPLA-.json / _APS_.json. The /comp autocomplete returns the clean DB
short_name (DSPLA) so the file lookup never matched.
Fix: strip leading/trailing non-alphanumeric characters and uppercase in
both the writer and the /comp command lookup. Also renamed the 8 existing
decorated COMPS files to their clean equivalents on disk.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
My earlier change to use squadron_short (resolved clean name, e.g. DSPLA)
for display broke the win/loss header colour: winning_team is the raw
replay value (e.g. -DSPLA-) so the comparison never matched, rendering
both teams as losers. Split into squadron_raw (comparison) vs
squadron_short (display text) so each uses the right value.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Same order-inversion bug as build_scoreboard_context existed in
process_session's resolve_clans call. The inverted squadron_long
caused the scoreboard renderer to find the opponent's diff entry
for a dash-tagged squad's players, producing ??? for every player
since their UIDs weren't in the wrong squad's points_diff dict.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When one team has a dash-tag (e.g. -DSPLA-) and the opponent has a normal
tag (e.g. ALUN2), batching both into resolve_clans caused the short-name
pass to place the normal team first in results and the tag pass to append
the dash-tagged team second — inverting the mapping vs. the teams array.
Each team's players were then looked up against the wrong squadron's API,
yielding curr=0 for everyone and diffs=0 on the scoreboard.
Fix: resolve each team concurrently and independently so results are always
index-aligned with the teams list regardless of which resolution path fires.
Also propagates squadron_short to the scoreboard renderer so display names
are clean (DSPLA not -DSPLA-).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Squads with dash-wrapped tags (e.g. -DSPLA-) store the full tag in the
replay's team.squadron field rather than the bare short name. The short
lookup fails and returns a placeholder whose short_name blocks the tag
lookup, leaving squadron_long as "<unresolved>" and producing no point
diffs on scoreboards. Fix: only include successfully resolved clans
(clan_id is not None) in results and resolved_shorts so the tag pass
still runs for any failed short lookup. Affects all 186 dash-tagged squads.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* update homepage
* fix webhook missing restarts on PR merge (empty commits payload)
When GitHub fires a push event for a PR merge, the commits array is
sometimes empty, leaving changed_files as [] and skipping all restarts.
Fall back to git diff --name-only using the before/after SHAs from the
payload so changed files are always derived correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>