171 lines
5.9 KiB
Markdown
171 lines
5.9 KiB
Markdown
---
|
|
id: TASK-218
|
|
title: Design player active seconds for real KPM
|
|
status: done
|
|
type: documentation
|
|
team: Arquitecto de Base de Datos
|
|
supporting_teams:
|
|
- Backend Senior
|
|
- Arquitecto Python
|
|
roadmap_item: foundation
|
|
priority: high
|
|
---
|
|
|
|
# TASK-218 - Design player active seconds for real KPM
|
|
|
|
## Goal
|
|
|
|
Analizar y disenar como calcular KPM real en HLL Vietnam sin implementar cambios funcionales todavia.
|
|
|
|
KPM real se define como:
|
|
|
|
```text
|
|
kills / minutos_jugados_reales
|
|
```
|
|
|
|
No debe confundirse con `kills_per_match`, `Kills/partida` ni kills divididas por duracion completa de partida cuando el jugador no estuvo toda la partida.
|
|
|
|
## Context
|
|
|
|
`TASK-216` confirmo que hoy no existe tiempo jugado real por jugador materializado para ranking publico.
|
|
|
|
Campos encontrados:
|
|
|
|
- `rcon_player_profile_snapshots.play_time`: texto de perfil, no normalizado y no por jugador/partida.
|
|
- `rcon_match_player_stats.first_seen_server_time` y `last_seen_server_time`: presencia observada por eventos dentro de partida.
|
|
- `rcon_materialized_matches.started_at`, `ended_at`, `started_server_time` y `ended_server_time`: duracion de partida, no tiempo por jugador.
|
|
|
|
`TASK-217` dejo `kills_per_match` como `Kills/partida` y no implemento KPM real.
|
|
|
|
Esta task produce un diseno tecnico accionable para crear `player_active_seconds` o `rcon_match_player_presence` en tasks futuras, sin modificar codigo funcional ni esquema real.
|
|
|
|
Preserve the current product identity: Spanish-speaking HLL Vietnam community, military/Vietnam/tactical/sober visual direction and controlled repository evolution.
|
|
|
|
## Steps
|
|
|
|
1. Revisar fuentes de AdminLog, materializacion, read models y snapshots.
|
|
2. Evaluar eventos disponibles para presencia real o observada.
|
|
3. Clasificar calidad de datos: `exact`, `observed`, `estimated`, `unknown`.
|
|
4. Proponer opciones de modelo de datos.
|
|
5. Recomendar una estrategia de backfill y propagacion a read models.
|
|
6. Documentar plan de implementacion dividido en tasks.
|
|
7. Validar que solo se crearon documentos.
|
|
|
|
## Files to Read First
|
|
|
|
- `AGENTS.md`
|
|
- `ai/repo-context.md`
|
|
- `ai/architecture-index.md`
|
|
- `backend/app/rcon_admin_log_storage.py`
|
|
- `backend/app/rcon_admin_log_materialization.py`
|
|
- `backend/app/rcon_admin_log_parser.py`
|
|
|
|
Tambien se revisaron:
|
|
|
|
- `backend/app/postgres_rcon_storage.py`
|
|
- `backend/app/rcon_historical_player_stats.py`
|
|
- `backend/app/rcon_historical_leaderboards.py`
|
|
- `backend/app/rcon_annual_rankings.py`
|
|
- `backend/app/historical_runner.py`
|
|
- `backend/app/payloads.py`
|
|
- `docs/PERFORMANCE_PUBLIC_QUERY_AUDIT.md`
|
|
- `ai/tasks/done/TASK-216-clean-ranking-ui-and-fix-kpm-metric.md`
|
|
- `ai/tasks/done/TASK-217-add-annual-ranking-snapshots-for-supported-metrics.md`
|
|
|
|
## Expected Files to Modify
|
|
|
|
- `docs/REAL_KPM_PLAYER_ACTIVE_SECONDS_DESIGN.md`
|
|
- `ai/tasks/done/TASK-218-design-player-active-seconds-for-real-kpm.md`
|
|
|
|
## Constraints
|
|
|
|
- Keep the change minimal.
|
|
- Preserve HLL Vietnam project identity.
|
|
- Do not introduce unnecessary frameworks or dependencies.
|
|
- Do not implement backend functionality.
|
|
- Do not change endpoints.
|
|
- Do not change frontend.
|
|
- Do not change backend functional code.
|
|
- Do not change real schema yet.
|
|
- No ejecutar `ai-platform run`.
|
|
- No hacer push.
|
|
- 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 incluir cambios previos no relacionados.
|
|
|
|
## Validation
|
|
|
|
Before completing the task ensure:
|
|
|
|
- `git status --short --untracked-files=all`
|
|
- `git diff --name-only`
|
|
- Confirmar que solo se crean/modifican:
|
|
- `docs/REAL_KPM_PLAYER_ACTIVE_SECONDS_DESIGN.md`
|
|
- `ai/tasks/done/TASK-218-design-player-active-seconds-for-real-kpm.md`
|
|
|
|
## Outcome
|
|
|
|
Archivos creados:
|
|
|
|
- `docs/REAL_KPM_PLAYER_ACTIVE_SECONDS_DESIGN.md`
|
|
- `ai/tasks/done/TASK-218-design-player-active-seconds-for-real-kpm.md`
|
|
|
|
Conclusion:
|
|
|
|
- No se puede calcular KPM real publico hoy.
|
|
- La fuente recomendada para `player_active_seconds` es AdminLog con `connected`/`disconnected` cuando sea posible y ventana observada por eventos como fallback etiquetado.
|
|
- El modelo recomendado es Opcion C:
|
|
- crear `rcon_match_player_presence` como detalle auditable por jugador/partida;
|
|
- denormalizar `player_active_seconds` y `playtime_quality` en `rcon_match_player_stats` para agregaciones rapidas.
|
|
- KPM futuro debe calcularse en generacion de read models/snapshots como `kills / (player_active_seconds / 60)`, nunca en frontend y nunca usando `kills_per_match`.
|
|
|
|
Plan de implementacion propuesto:
|
|
|
|
1. `TASK-219-create-rcon-match-player-presence-schema`
|
|
2. `TASK-220-materialize-player-presence-from-adminlog`
|
|
3. `TASK-221-backfill-player-active-seconds`
|
|
4. `TASK-222-denormalize-player-active-seconds-into-match-stats`
|
|
5. `TASK-223-extend-player-period-stats-with-kpm`
|
|
6. `TASK-224-add-kpm-ranking-snapshots`
|
|
7. `TASK-225-expose-real-kpm-in-api-payloads`
|
|
8. `TASK-226-show-real-kpm-in-ranking-ui`
|
|
9. `TASK-227-validate-kpm-quality-and-performance`
|
|
|
|
Riesgos principales:
|
|
|
|
- Cobertura incompleta de eventos `connected`/`disconnected`.
|
|
- Presencia observada por eventos puede subestimar tiempo activo.
|
|
- Duracion completa de partida no representa tiempo por jugador y debe quedar `estimated`.
|
|
- Mezclar calidades sin metadata haria KPM enganoso.
|
|
- Backfill masivo puede competir con lecturas publicas si no se agenda bien.
|
|
|
|
Validacion ejecutada:
|
|
|
|
- `git status --short --untracked-files=all`
|
|
- `git diff --name-only`
|
|
|
|
Confirmacion de exclusiones:
|
|
|
|
- No se ejecuto `ai-platform run`.
|
|
- No se hizo push.
|
|
- 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 modifico frontend.
|
|
- No se modifico backend funcional.
|
|
- No se modificaron tests.
|
|
- No se modifico esquema real.
|
|
- No se incluyeron cambios previos no relacionados.
|
|
|
|
## Change Budget
|
|
|
|
- Archivos modificados por esta task: 2.
|
|
- Sin cambios funcionales.
|