11 KiB
id, title, status, type, team, supporting_teams, roadmap_item, priority
| id | title | status | type | team | supporting_teams | roadmap_item | priority | |||
|---|---|---|---|---|---|---|---|---|---|---|
| TASK-216 | Clean ranking UI and fix KPM metric | done | frontend | Frontend Senior |
|
foundation | high |
TASK-216 - Clean ranking UI and fix KPM metric
Goal
Limpiar la UX de frontend/ranking.html, eliminar estados y controles redundantes, corregir el uso conceptual de KPM y ampliar el ranking anual solo para metricas soportadas por snapshots/read models seguros sin introducir lecturas runtime pesadas en requests publicos.
Context
Despues de TASK-213, la vista de ranking ya carga rapido y concentra filtros + tabla dentro de una sola card. Sin embargo, la revision visual detecto varios residuos de UX y un problema funcional serio: la interfaz seguia mostrando mensajes redundantes, mantenia un boton Actualizar ranking innecesario y exponia KPM usando un valor que correspondia a kills_per_match.
En paralelo, TASK-211 dejo la lectura publica annual optimizada para snapshots anuales, pero backend/app/rcon_annual_rankings.py sigue restringiendo annual a kills. Esta task revisa ese limite sin introducir lecturas publicas runtime sobre rcon_match_player_stats.
Preserve the current product identity: Spanish-speaking HLL Vietnam community, military/Vietnam/tactical/sober visual direction and controlled repository evolution.
Steps
- Leer primero los archivos listados y confirmar el estado actual de UI, payloads y snapshots de ranking.
- Auditar si existe tiempo jugado real por jugador antes de tocar la UI.
- Limpiar la UI de
ranking.htmlyranking.js:- eliminar del DOM visible el texto
El ranking expone los resultados de los lideres. Para busqueda individual usa Estadisticas. - eliminar el estado informativo tipo
Kills listo en semanal para Todos los servidores. - mantener solo estados utiles de loading, error y metadatos compactos
- quitar el boton
Actualizar ranking - cargar automaticamente al entrar y al cambiar periodo, servidor, metrica o limite
- mover
Buscar jugador en Estadisticaspor encima de los filtros dentro de la misma card
- eliminar del DOM visible el texto
- Ajustar el modo annual en frontend:
- no mostrar input de ano
- usar
2026internamente en JS - no mostrar mensaje de limitacion anual a kills
- No exponer metricas annual que no tengan snapshots propios y seguros.
- Documentar la decision final sobre KPM y el diseno futuro de
player_active_seconds.
Files to Read First
AGENTS.mdai/repo-context.mdai/architecture-index.mdfrontend/ranking.htmlfrontend/assets/js/ranking.jsbackend/app/rcon_annual_rankings.py
Tambien se revisaron:
frontend/assets/css/styles.cssbackend/app/payloads.pybackend/app/postgres_rcon_storage.pybackend/app/rcon_historical_leaderboards.pybackend/app/rcon_historical_player_stats.pybackend/app/rcon_admin_log_storage.pybackend/app/rcon_admin_log_materialization.pybackend/app/historical_runner.pyai/tasks/done/TASK-211-optimize-annual-ranking-read-path.mdai/tasks/done/TASK-213-fix-ranking-layout-and-loading-state.mdai/tasks/done/TASK-215-optimize-weekly-monthly-ranking-read-path.mddocs/PERFORMANCE_PUBLIC_QUERY_AUDIT.md
Expected Files to Modify
frontend/ranking.htmlfrontend/assets/js/ranking.jsfrontend/assets/css/styles.cssai/tasks/done/TASK-216-clean-ranking-ui-and-fix-kpm-metric.md
Constraints
- Keep the change minimal.
- Preserve HLL Vietnam project identity.
- Do not introduce unnecessary frameworks or dependencies.
- Do not overwrite repository-specific context with generic platform template text.
- No ejecutar
ai-platform run. - No tocar
frontend/assets/img/weapons/. - No tocar SVGs.
- No modificar imagenes fisicas.
- No tocar
ai/system-metrics.md. - No reactivar Elo/MMR.
- No reintroducir Comunidad Hispana #03.
- No hacer
push. - No hacer
commiten esta task. - No introducir runtime pesado ni fallback publico sobre
rcon_match_player_stats. - La lectura publica annual debe seguir leyendo unicamente:
rcon_annual_ranking_snapshotsrcon_annual_ranking_snapshot_items
- Weekly/monthly/annual deben seguir priorizando read models/snapshots con
fallback_used = falseen la ruta publica normal. - No aceptar que
kills_per_matchse muestre comoKPM. - Si no existe tiempo jugado fiable materializado, no inventar
KPM. - Mantener compatibilidad con apertura directa en navegador cuando aplique.
Validation
Before completing the task ensure:
node --check frontend/assets/js/ranking.js- validar endpoints:
/api/ranking?timeframe=weekly&metric=kills&limit=20/api/ranking?timeframe=monthly&metric=kills&limit=20/api/ranking?timeframe=annual&metric=kills&limit=20&year=2026
- por inspeccion visual o revision DOM:
- no aparece boton
Actualizar ranking Buscar jugador en Estadisticasqueda encima de filtros y dentro de la misma card- no aparecen los textos redundantes eliminados
- annual no muestra input de ano
- annual no muestra mensaje de limitacion a kills
- la columna
KPMno aparece si no existe KPM real - si no hay minutos reales, aparece
Kills/partida
- no aparece boton
git diff --name-onlymatches the expected scope- no unrelated files were modified
Outcome
Archivos modificados por esta task:
frontend/ranking.htmlfrontend/assets/js/ranking.jsfrontend/assets/css/styles.cssai/tasks/done/TASK-216-clean-ranking-ui-and-fix-kpm-metric.md
Resultado de auditoria KPM:
- No existe hoy un campo materializado y fiable de tiempo jugado real por jugador listo para el ranking publico.
- Se encontro
rcon_player_profile_snapshots.play_time, pero es texto procedente de snapshots de perfil, no un campo numerico normalizado por jugador/partida ni agregado en los read models publicos de ranking. - Se encontraron
rcon_match_player_stats.first_seen_server_timeyrcon_match_player_stats.last_seen_server_time, pero representan presencia observada por eventos dentro de una partida, no minutos reales jugados materializados como contrato estable de ranking. - Se encontraron
rcon_materialized_matches.started_at,ended_at,started_server_timeyended_server_time, pero son duracion de partida o ventana de partida, no tiempo real por jugador. - Las tablas
ranking_snapshot_items,rcon_annual_ranking_snapshot_itemsyplayer_period_statsno tienenplayer_active_seconds,minutes_played,seconds_playedni equivalente fiable.
Decision final sobre KPM:
- No se implemento KPM real.
- Se elimino el uso visible de
KPMenranking.htmlyranking.js. kills_per_matchse conserva solo bajo el nombreKills/partida.- No se reutilizo
kills_per_matchcomo kills por minuto.
Propuesta para KPM real futuro:
- Crear
player_active_secondscomo campo numerico base por jugador y partida. - Ubicacion preferida:
rcon_match_player_stats, si se acepta extender la tabla materializada principal. - Alternativa: nueva tabla derivada
rcon_match_player_presencecontarget_key,match_key,player_id,first_seen_server_time,last_seen_server_time,active_seconds,quality. - Relleno exacto: eventos
connectedydisconnecteddentro de limitesmatch_start/match_end. - Relleno razonable: presencia observada por eventos
kill,team_switch,chat,message, acotada porfirst_seen_server_timeylast_seen_server_time. - Relleno estimado: duracion completa de partida solo como calidad
estimated, no apta para publicar como KPM real sin etiqueta. - Criterios de calidad propuestos:
exact: join/leave real dentro de partida.observed: presencia inferida por eventos del jugador.estimated: duracion completa de partida.unknown: no calcular.
- Read models a extender cuando exista el campo:
player_period_statsranking_snapshot_itemsrcon_annual_ranking_snapshot_items
- Task futura recomendada:
TASK-XXX-materialize-player-active-seconds-for-real-kpm.
Decision sobre metricas annual:
- No se ampliaron metricas annual en esta task.
- Annual sigue exponiendo solo
killsporque es la unica metrica con snapshot anual seguro ya soportado porrcon_annual_rankings.py. - No se usa snapshot top kills para representar
deaths,teamkills,matches_considered,kd_rationikills_per_match. - No se introdujo runtime publico pesado ni fallback sobre
rcon_match_player_stats.
Cambios de UI aplicados:
- Se elimino el texto redundante de introduccion dentro de la card.
- Se elimino el boton
Actualizar ranking. - La tabla sigue cargando automaticamente al entrar y al cambiar periodo, servidor, metrica o limite.
Buscar jugador en Estadisticasqueda encima de los filtros dentro de la misma card.- En annual no hay input visible de ano.
ranking.jsusa2026internamente para annual.- Se elimino el mensaje visible de annual limitado a kills.
- Se elimino el estado de exito tipo
Kills listo en semanal para Todos los servidores. - La metrica
kills_per_matchse muestra comoKills/partida.
Comandos de produccion:
- No hace falta regenerar snapshots para este cambio de UI.
- Si falta el snapshot anual existente de kills para 2026, regenerarlo con:
docker compose exec backend python -m app.rcon_annual_rankings generate --year 2026 --server-key all-servers --metric kills --limit 30 --replace-existing
- No ejecutar comandos de metricas annual adicionales hasta que existan snapshots propios por metrica.
Validaciones ejecutadas:
node --check frontend/assets/js/ranking.js- Revision por busqueda de que
frontend/ranking.htmlyfrontend/assets/js/ranking.jsya no contienenKPM,Actualizar ranking,ranking-year,ranking-submit,ranking-filter-note,El ranking exponenilisto en. - Intento de validacion HTTP local contra:
/api/ranking?timeframe=weekly&metric=kills&limit=20/api/ranking?timeframe=monthly&metric=kills&limit=20/api/ranking?timeframe=annual&metric=kills&limit=20&year=2026
- El backend local no estaba disponible en
http://127.0.0.1:8000; las tres peticiones fallaron conNo es posible conectar con el servidor remoto. - Revision de alcance con
git status --shortygit diff --name-only.
Validaciones no ejecutadas:
- No se ejecuto
compileallniunittestporque no se tocaron archivos backend.
Tiempos obtenidos:
- No se obtuvieron tiempos nuevos de endpoint porque el backend local no estaba escuchando.
- Intentos HTTP fallidos por conexion:
- weekly kills top 20:
2156.7 ms - monthly kills top 20:
2033.7 ms - annual kills top 20 2026:
2046.1 ms
- weekly kills top 20:
- Referencia previa de
TASK-213: annual kills 2026 ~39 ms, weekly/monthly kills < 130 ms.
Confirmacion de exclusiones:
- No se ejecuto
ai-platform run. - No se hizo push.
- No se hizo commit.
- No se tocaron assets de armas.
- No se tocaron SVGs.
- No se modificaron imagenes fisicas.
- No se toco
ai/system-metrics.md. - No se reactivo Elo/MMR.
- No se reintrodujo Comunidad Hispana #03.
- No se incluyeron cambios previos no relacionados.
Change Budget
- Archivos de producto modificados: 3.
- Sin cambios backend.
- El alcance se mantuvo dentro de la limpieza UI y documentacion de task.