Fix historical data identity and weekly ranking quality

This commit is contained in:
devRaGonSa
2026-03-20 22:24:02 +01:00
parent 5788c11ad7
commit f346084c5f
4 changed files with 652 additions and 40 deletions

View File

@@ -0,0 +1,119 @@
# TASK-032-historical-data-quality-and-ranking-validation
## Goal
Validar la calidad del historico ingerido y la correccion del ranking semanal de kills para los 2 servidores reales de la comunidad, detectando y corrigiendo problemas de integridad, duplicados, naming o rango temporal antes de construir UI historica propia.
## Context
El proyecto ya dispone de:
- estado actual en vivo via A2S
- capa historica separada via CRCON scoreboard JSON
- persistencia historica propia
- ingesta historica funcional
- endpoint `GET /api/historical/weekly-top-kills`
Antes de exponer estos datos en una UI propia del proyecto, hay que asegurar que la base historica tiene calidad suficiente y que el ranking semanal devuelve resultados coherentes, consistentes y trazables.
## Steps
1. Revisar la implementacion actual de:
- almacenamiento historico
- ingesta historica
- modelos historicos
- endpoint `GET /api/historical/weekly-top-kills`
2. Verificar la calidad de los datos historicos persistidos para ambos servidores. Comprobar al menos:
- numero de partidas ingeridas
- numero de jugadores ingeridos
- presencia de datos relevantes por partida
- distribucion por servidor
3. Detectar posibles duplicados o inconsistencias en:
- partidas
- jugadores
- estadisticas por jugador y partida
4. Revisar la estrategia actual de identidad y deduplicacion:
- ids de partida
- ids de jugador o claves degradadas
- relacion entre servidor y match
5. Validar que el calculo de "ultima semana" usado por el ranking sea correcto y consistente.
6. Validar que el ranking de kills:
- sume correctamente kills por jugador
- no mezcle datos entre servidores
- no use partidas fuera del rango temporal esperado
- no devuelva duplicados de jugador por mala consolidacion
7. Revisar si los nombres de jugador y nombres de mapa se almacenan y devuelven de forma suficientemente limpia.
8. Si se detectan problemas, corregir unicamente lo necesario en:
- almacenamiento
- consultas
- normalizacion
- endpoint historico
9. Anadir validaciones o utilidades minimas si ayudan a reforzar la fiabilidad del historico.
10. Documentar brevemente los hallazgos y el estado final de calidad historica.
11. No crear todavia paginas o bloques UI historicos.
12. Al completar la implementacion:
- dejar el repositorio consistente
- hacer commit
- hacer push al remoto si el entorno lo permite
## Files to Read First
- AGENTS.md
- ai/repo-context.md
- ai/architecture-index.md
- docs/decisions.md
- docs/historical-crcon-source-discovery.md
- docs/historical-domain-model.md
- backend/README.md
- backend/app/historical_models.py
- backend/app/historical_storage.py
- backend/app/historical_ingestion.py
- backend/app/routes.py
- backend/app/payloads.py
- cualquier consulta o helper historico adicional ya creado
## Expected Files to Modify
- backend/README.md
- backend/app/historical_storage.py
- backend/app/historical_ingestion.py
- backend/app/routes.py
- backend/app/payloads.py
- opcionalmente nuevos modulos auxiliares si mejoran validacion o normalizacion, por ejemplo:
- backend/app/historical_queries.py
- backend/app/historical_validation.py
- opcionalmente un documento tecnico breve, por ejemplo:
- docs/historical-data-quality-notes.md
## Constraints
- No crear todavia UI historica.
- No basar correcciones historicas en A2S.
- No acoplar el frontend a URLs de la comunidad.
- No introducir complejidad innecesaria.
- No romper el flujo actual de live status.
- No hacer cambios destructivos.
- Mantener el trabajo centrado en calidad, consistencia y fiabilidad del historico.
## Validation
- Se ha revisado la calidad del historico para ambos servidores.
- Se han detectado y corregido, si existen, duplicados o inconsistencias relevantes.
- El endpoint `GET /api/historical/weekly-top-kills` devuelve resultados coherentes.
- El rango temporal de "ultima semana" queda validado.
- Los datos no se mezclan entre servidores.
- Los cambios quedan committeados y se hace push al remoto si el entorno lo permite.
## Change Budget
- Preferir menos de 7 archivos modificados o creados.
- Preferir menos de 260 lineas cambiadas.
## Outcome
- Se corrigio la estrategia de identidad historica en `backend/app/historical_storage.py` para priorizar SteamID real y usar `player_id` como clave `crcon-player:*` cuando no existe SteamID.
- La inicializacion del storage ahora fusiona jugadores duplicados y partidas duplicadas persistidas con id sintetico frente a id CRCON final.
- El ranking `GET /api/historical/weekly-top-kills` paso a usar solo partidas cerradas con `ended_at`, evitando contar sesiones en curso o duplicadas.
- Se documentaron los hallazgos y el estado final en `docs/historical-data-quality-notes.md` y se alineo `backend/README.md`.
## Validation Result
- Validado con inicializacion real sobre `backend/data/hll_vietnam_dev.sqlite3`.
- Tras la correccion, el dataset local quedo en `12` partidas, `510` jugadores y `914` filas de estadisticas por jugador y partida.
- Comprobado que no quedan duplicados por `steam_id`, `source_player_id`, nombre normalizado ni por la combinacion `(servidor, started_at, mapa)`.
- Comprobado que ya no quedan partidas abiertas (`ended_at IS NULL`) en el dataset local actual.
- Validado con `list_weekly_top_kills()` para ambos servidores, confirmando separacion por servidor y uso exclusivo de partidas cerradas dentro de la ventana movil de 7 dias.
## Decision Notes
- `steaminfo.id` deja de tratarse como `steam_id` real porque en los datos observados funcionaba como identificador corto auxiliar y fragmentaba la identidad del jugador.
- Para resolver duplicados de partida se usa una heuristica conservadora por `(historical_server_id, started_at, mapa normalizado)`, priorizando la fila cerrada, numerica y con mas jugadores.
- No se eliminaron partidas con muy pocos jugadores porque eso es una decision de calidad de producto futura, no un problema de integridad estructural.