7.3 KiB
id, title, status, type, team, supporting_teams, roadmap_item, priority
| id | title | status | type | team | supporting_teams | roadmap_item | priority | ||
|---|---|---|---|---|---|---|---|---|---|
| TASK-185-add-ranking-extra-metrics-backend-support | Add ranking extra metrics backend support | done | backend | Backend Senior |
|
foundation | high |
TASK-185-add-ranking-extra-metrics-backend-support - Add ranking extra metrics backend support
Goal
Add backend support for additional Ranking global metrics by reusing the existing RCON materialized read model, while preserving the current Ranking route and avoiding unsafe annual recomputation.
Context
TASK-183 confirmed that GET /api/ranking currently supports only metric=kills, with weekly/monthly reading from the RCON materialized leaderboard and annual reading from snapshots. The next backend step is to extend metric support safely for weekly/monthly and keep annual constrained to snapshot-safe behavior only.
Preserve the current product identity: Spanish-speaking HLL Vietnam community, military/Vietnam/tactical/sober visual direction and controlled repository evolution.
Steps
- Read the listed files first.
- Keep the public endpoint as:
GET /api/ranking?timeframe=weekly|monthly|annual&server_id=<server-or-all>&metric=<metric>&limit=<limit>&year=<year>
- Extend weekly/monthly support for:
killsdeathsteamkillsmatches_consideredkd_ratiokills_per_match
- Preserve
metric=killsbehavior and compatibility for existing Ranking requests. - Reuse the materialized RCON read model and avoid introducing a new ranking architecture.
- Keep annual support safe:
- support
kills - only support additional annual metrics if they are snapshot-backed without public full-year recomputation
- otherwise return a controlled
400for unsupported annual metrics
- support
- Update route validation and payload normalization only where necessary.
- Extend validation coverage for the new metrics and failure cases.
Files to Read First
AGENTS.mdai/repo-context.mdai/architecture-index.mddocs/global-ranking-page-plan.mdbackend/app/routes.pybackend/app/payloads.pybackend/app/rcon_historical_leaderboards.pybackend/app/rcon_annual_rankings.pyscripts/run-stats-validation.ps1scripts/run-integration-tests.ps1ai/tasks/done/TASK-183-review-global-ranking-implementation.mdai/tasks/done/TASK-184-define-ranking-metric-expansion-contract.md
Expected Files to Modify
backend/app/rcon_historical_leaderboards.pybackend/app/routes.pybackend/app/payloads.pybackend/app/rcon_annual_rankings.pyscripts/run-stats-validation.ps1ai/tasks/done/TASK-185-add-ranking-extra-metrics-backend-support.md
Constraints
- Do not create migrations.
- Do not introduce a new architecture.
- Do not recalculate the annual full-year ranking on public requests.
- Do not reactivate Elo/MMR.
- Do not reintroduce Comunidad Hispana #03.
- Do not use public scoreboard as the normal primary source.
- Do not modify frontend files.
- Do not break Stats endpoints.
- Do not break the existing Ranking route for
metric=kills.
Validation
Before completing the task ensure:
powershell -ExecutionPolicy Bypass -File scripts/run-stats-validation.ps1powershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1- validate
GET /api/rankingfor:timeframe=weekly&metric=killstimeframe=weekly&metric=deathstimeframe=weekly&metric=teamkillstimeframe=weekly&metric=matches_consideredtimeframe=weekly&metric=kd_ratiotimeframe=weekly&metric=kills_per_matchtimeframe=monthly&metric=kd_ratiotimeframe=monthly&metric=kills_per_matchtimeframe=annual&metric=kills- unsupported metric
- unsupported timeframe
limit=3limit=101or invalid limit according to the current contract
- confirm annual behavior is still snapshot-safe
- confirm
git diff --name-onlystays within scope
Outcome
Metrics added for GET /api/ranking weekly/monthly reads:
killsdeathsteamkillsmatches_consideredkd_ratiokills_per_match
Backend formulas and ordering applied:
kills = SUM(kills)ordered bykillsdesc,matches_considereddesc,player_nameascdeaths = SUM(deaths)ordered bydeathsdesc,matches_considereddesc,player_nameascteamkills = SUM(teamkills)ordered byteamkillsdesc,matches_considereddesc,player_nameascmatches_considered = COUNT(DISTINCT match_key)ordered bymatches_considereddesc,killsdesc,player_nameasckd_ratio = SUM(kills) / SUM(deaths)withdeaths=0 -> kills, ordered bykd_ratiodesc,killsdesc,matches_considereddesc,player_nameasckills_per_match = SUM(kills) / COUNT(DISTINCT match_key)withmatches_considered=0 -> 0, ordered bykills_per_matchdesc,killsdesc,matches_considereddesc,player_nameasc
Implementation summary:
backend/app/rcon_historical_leaderboards.pynow supports the V1.1 ranking metrics while preserving the existing materialized RCON read model.backend/app/routes.pynow validates the expanded public Ranking metric set without changing the endpoint shape.backend/app/payloads.pynow preserves decimalmetric_valuewhen needed and exposeskills_per_matchin normalized ranking items.backend/app/rcon_annual_rankings.pyremains snapshot-safe and returns a controlled annual-specific400for unsupported annual metrics.scripts/run-stats-validation.ps1now covers the new happy paths and annual guardrail failures.
Annual metric behavior and limitations:
- annual remains snapshot-backed only
metric=killsremains supported- extra annual metrics currently return controlled
400 - no runtime full-year recomputation was introduced
Validations executed:
python -m compileall backend/app/routes.py backend/app/payloads.py backend/app/rcon_historical_leaderboards.py backend/app/rcon_annual_rankings.pypowershell -ExecutionPolicy Bypass -File scripts/run-stats-validation.ps1powershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1
Validation notes:
- live backend HTTP validation at
http://127.0.0.1:8000was not available during execution - route-contract validation still passed through local Python imports
Scope notes:
- task-owned modifications stayed within:
backend/app/rcon_historical_leaderboards.pybackend/app/routes.pybackend/app/payloads.pybackend/app/rcon_annual_rankings.pyscripts/run-stats-validation.ps1
git diff --name-onlyalso showed pre-existing or previous-task changes outside this task:- moved task files from
TASK-184/TASK-185 docs/global-ranking-page-plan.mdfromTASK-184- unrelated existing workspace change
frontend/assets/img/weapons/black/gewehr_black.svg
- moved task files from
- those files were not modified as part of this backend task.
Known limitations:
- annual extra metrics are intentionally blocked until an explicit snapshot-backed implementation exists
- ranking item decimals are validated through route-contract checks, not through a running backend HTTP instance in this run
Recommended next task:
- expose the new metrics safely in the Ranking frontend UX.
Change Budget
- Prefer fewer than 5 modified files.
- Prefer changes under 200 lines when feasible.
- Split the work into follow-up tasks if limits are exceeded.