4.6 KiB
4.6 KiB
id, title, status, type, team, supporting_teams, roadmap_item, priority
| id | title | status | type | team | supporting_teams | roadmap_item | priority | ||
|---|---|---|---|---|---|---|---|---|---|
| TASK-168 | Add annual ranking snapshot generator | done | backend | Arquitecto de Base de Datos |
|
foundation | medium |
TASK-168 - Add annual ranking snapshot generator
Goal
Implementar un generador backend para snapshots anuales top 20 de jugadores sobre datos RCON materializados.
Context
TASK-166 definió el diseño de persistencia, y TASK-167 ya añadió las tablas:
rcon_annual_ranking_snapshotsrcon_annual_ranking_snapshot_items
Ahora se necesita el generador que rellene esas tablas desde
rcon_materialized_matches y rcon_match_player_stats con source_basis = admin-log-match-ended.
Debe mantenerse separado de frontend y sin introducir una API pública todavÃa.
Files to Read First
AGENTS.mdai/repo-context.mdai/architecture-index.mddocs/annual-ranking-snapshot-schema-plan.mdbackend/app/rcon_admin_log_materialization.pybackend/app/rcon_historical_leaderboards.pybackend/app/rcon_historical_player_stats.pybackend/app/postgres_rcon_storage.pybackend/app/sqlite_to_postgres_migration.py
Expected Files to Modify
backend/app/rcon_annual_rankings.py(crear)backend/app/rcon_admin_log_materialization.py(si hace falta reutilizar inicialización o alcance)backend/app/postgres_rcon_storage.py(solo si detecta ajustes de soporte SQLite/Postgres)backend/app/sqlite_to_postgres_migration.py(solo si detecta ajustes migratorios necesarios)
Steps
- Seguir los archivos de
Files to Read Firsty respetar el contrato de datos existente. - Implementar
generate_annual_ranking_snapshotcon:year,server_key,metric,limit,replace_existing.- Soporte inicial para
metric='kills'.
- Agregar una ruta CLI opcional (
python -m app.rcon_annual_rankings generate --year ...). - Reusar conexión SQLite/Postgres con
connect_sqlite_readonly/connect_postgres_compaty placeholders?. - Validar la función con datos existentes y con BD vacÃa sin crash.
- Preparar la Outcome con validación, comportamiento con vacÃo y limitaciones.
Constraints
- No crear API pública en esta task.
- Mantener el cambio pequeño y verificable.
- No tocar frontend ni archivos
frontend/assets/js/partida-actual.js. - No tocar
frontend/assets/img/clans/bxb.png. - No reactivar Elo/MMR.
- No reintroducir Comunidad Hispana #03.
- No ampliar workers históricos salvo que sea imprescindible y justificable.
- No incluir métricas adicionales a
killssalvo que no amplÃe el alcance de forma razonable y segura.
Validation
python -m compileall backend/appscripts/run-integration-tests.ps1cuando aplique.- Validación local con SQLite:
- inicializar storage,
- ejecutar generador con un año de prueba (si hay datos),
- verificar que se inserta el snapshot y hasta
limititems.
- Verificar comportamiento sin datos: debe terminar sin excepción y crear snapshot vacÃo o sin items cuando corresponda.
git diff --name-onlyy confirmar que no se tocó frontend.
Outcome
- Archivos modificados:
backend/app/rcon_annual_rankings.py(nuevo)
- Función/comando generado:
generate_annual_ranking_snapshot(year: int, server_key: str | None = None, metric: str = "kills", limit: int = 20, replace_existing: bool = True, db_path: Path | None = None) -> dict[str, object].- CLI opcional:
python -m app.rcon_annual_rankings generate --year <year> [--server-key <server>] [--metric kills] [--limit <n>] [--replace-existing].
- Validaciones ejecutadas y resultados:
python -m compileall backend/app(sin errores).scripts/run-integration-tests.ps1(pasado).initialize_rcon_materialized_storage()+generate_annual_ranking_snapshot(year=2026, metric='kills', limit=10)con datos existentes: snapshot creado (source_matches_count> 0),items <= 10.generate_annual_ranking_snapshot(year=1990, metric='kills', limit=20)con ventana sin datos: snapshot creado yitems: []sin excepción.replace_existing=Falsedevuelveskipped_regeneration: Truey reutiliza snapshot existente.- CLI manual ejecutada:
python -m app.rcon_annual_rankings generate --year 1990 --metric kills --limit 3.
- Limitaciones conocidas:
- Soporte inicial exclusivamente para
metric='kills'. - No se implementó API pública ni refresco programado.
- No se modificón workers históricos.
- No se tocó frontend ni archivos preexistentes
frontend/assets/js/partida-actual.jsyfrontend/assets/img/clans/bxb.png.
- Soporte inicial exclusivamente para
- Siguiente task recomendada: API pública de ranking anual snapshot.