From 032aaa9ad55ba0327f27c1a7f7a0862dfad7d0bc Mon Sep 17 00:00:00 2001 From: devRaGonSa <97627393+devRaGonSa@users.noreply.github.com> Date: Tue, 19 May 2026 09:34:15 +0200 Subject: [PATCH] fix: restore historical rcon-first fallback policy Restore historical RCON-first policy with public scoreboard as fallback only. Keep Elo/MMR paused and server 3 out of default targets. --- README.md | 23 +- ai/architecture-index.md | 4 +- ai/repo-context.md | 3 +- ...e-historical-rcon-first-fallback-policy.md | 206 ++++++++++++++++++ backend/.env.example | 2 +- backend/README.md | 31 +-- backend/app/config.py | 2 +- backend/app/historical_runner.py | 1 - docker-compose.yml | 2 +- docs/decisions.md | 12 + 10 files changed, 252 insertions(+), 34 deletions(-) create mode 100644 ai/tasks/done/TASK-110-restore-historical-rcon-first-fallback-policy.md diff --git a/README.md b/README.md index 158fc24..e8b9453 100644 --- a/README.md +++ b/README.md @@ -77,19 +77,18 @@ El repositorio ya incluye: - `docker-compose.yml` - `backend/.env.example` -Selección de proveedor por entorno hoy: +Seleccion de proveedor por entorno hoy: - desarrollo: - - `HLL_BACKEND_LIVE_DATA_SOURCE=a2s` - - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` -- producción realista en esta fase: - `HLL_BACKEND_LIVE_DATA_SOURCE=rcon` - - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` + - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` +- produccion realista en esta fase: + - `HLL_BACKEND_LIVE_DATA_SOURCE=rcon` + - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` -Esto refleja el estado real de la repo: el proveedor RCON ya existe para el -estado live de `/api/servers`, pero el histórico sigue dependiendo del -scoreboard público porque no hay todavía una canalización persistente basada -en eventos/logs RCON. +Esto refleja la politica operativa actual: RCON es la fuente primaria para +live e historico. El scoreboard publico queda como fallback historico cuando +RCON falla, no cubre una operacion concreta o aun no tiene cobertura suficiente. Modo normal recomendado: @@ -160,7 +159,7 @@ Modo live con RCON en Docker Compose: ```powershell $env:HLL_BACKEND_LIVE_DATA_SOURCE='rcon' -$env:HLL_BACKEND_HISTORICAL_DATA_SOURCE='public-scoreboard' +$env:HLL_BACKEND_HISTORICAL_DATA_SOURCE='rcon' $env:HLL_BACKEND_RCON_TARGETS='[ { "name": "Comunidad Hispana #01", @@ -181,8 +180,8 @@ Buenas practicas: - no versionar credenciales reales en `backend/.env.example` - preferir exportarlas como variables de entorno del host o del secreto del despliegue -- mantener `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` hasta tener - una ingesta historica RCON realmente persistida +- mantener `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` como valor normal y usar + `public-scoreboard` solo como fallback historico controlado - no reintroducir Comunidad Hispana #03 en `HLL_BACKEND_RCON_TARGETS` salvo que una task nueva valide su disponibilidad diff --git a/ai/architecture-index.md b/ai/architecture-index.md index 0f391fd..2b1f83c 100644 --- a/ai/architecture-index.md +++ b/ai/architecture-index.md @@ -70,13 +70,13 @@ Community website repository with a static landing in the current phase and a pl - The phased source strategy for that provisional block is documented in `docs/current-hll-servers-source-plan.md`. - The ingestion strategy for converting that provisional block into normalized server snapshots is documented in `docs/current-hll-data-ingestion-plan.md`. - The logical storage foundation for persisting server snapshots is documented in `docs/stats-database-schema-foundation.md`. -- Historical match and player statistics must come from the public CRCON scoreboard JSON layer, not from A2S or the `/games` HTML shell. +- Historical ingestion defaults to RCON-first; the public CRCON scoreboard JSON layer is a fallback for operations where RCON fails or lacks coverage, not the normal primary historical source. - The validated discovery for those historical sources is documented in `docs/historical-crcon-source-discovery.md`. - The persisted historical domain model for CRCON matches, players and ingestion runs is documented in `docs/historical-domain-model.md`. - The V1 monthly MVP scoring proposal for persisted historical player metrics is documented in `docs/monthly-mvp-ranking-scoring-design.md`. - The audited boundary between direct live RCON and future event-driven RCON metrics is documented in `docs/rcon-data-capability-audit.md`. - The first V2 player-event foundation now lives in dedicated `player_event_*` backend modules and starts from CRCON match-detail summaries, not from live RCON. - The default operational deployment is simplified to `backend` + `frontend`; historical workers and RCON historical capture are advanced/manual services. -- Comunidad Hispana #03 is disabled from default RCON targets, while existing historical/Elo code and persisted data remain available for explicit future reintroduction. +- Comunidad Hispana #03 is disabled from default RCON targets, while existing historical/Elo code and persisted data remain available for explicit future reintroduction. Elo/MMR remains paused and decoupled from backend startup. - Frontend data consumption should remain progressive, endpoint by endpoint, with static fallbacks preserved during migration. - The frontend integration strategy is documented in `docs/frontend-data-consumption-plan.md`. diff --git a/ai/repo-context.md b/ai/repo-context.md index a2d4c82..d7777d5 100644 --- a/ai/repo-context.md +++ b/ai/repo-context.md @@ -20,7 +20,8 @@ This repository is in foundation stage. The objective is to grow in a controlled - AI Platform: integrated to coordinate planning and task execution - Product goal in current phase: maintain a clean landing and repository structure - Default deployment: `backend` + `frontend`; historical workers are advanced/manual only. -- Comunidad Hispana #03 is not part of default RCON targets. Historical/Elo code and persisted data are preserved but paused operationally. +- Live and historical defaults are RCON-first, with public-scoreboard kept only as historical fallback. +- Comunidad Hispana #03 is not part of default RCON targets. Historical/Elo code and persisted data are preserved, while Elo/MMR remains paused and decoupled from backend startup. ## Repository Areas diff --git a/ai/tasks/done/TASK-110-restore-historical-rcon-first-fallback-policy.md b/ai/tasks/done/TASK-110-restore-historical-rcon-first-fallback-policy.md new file mode 100644 index 0000000..7994fc7 --- /dev/null +++ b/ai/tasks/done/TASK-110-restore-historical-rcon-first-fallback-policy.md @@ -0,0 +1,206 @@ +--- +id: TASK-110 +title: Restore historical RCON-first fallback policy +status: pending +type: backend +team: Backend Senior +supporting_teams: ["Arquitecto Python", "PM"] +roadmap_item: foundation +priority: high +--- + +# TASK-110 - Restore historical RCON-first fallback policy + +## Goal + +Correct repository defaults and documentation so historical ingestion is RCON-first, with public-scoreboard used only as a fallback when RCON fails. + +Keep the simplified deployment posture intact: + +- Live data source: `rcon` +- Historical data source: `rcon` +- Historical fallback: `public-scoreboard` when RCON fails +- Elo/MMR: paused and decoupled from backend startup +- Comunidad Hispana #03: removed from default targets +- Comunidad Hispana #01 and #02: active in default RCON targets + +## Context + +HLL Vietnam recently simplified deployment and removed Comunidad Hispana #03 from default operational targets. The intended historical data policy has now been clarified: historical ingestion must not be disabled, and public-scoreboard must not be the normal primary historical source. + +The desired policy is RCON-first historical ingestion with public-scoreboard fallback when RCON fails. Documentation and defaults that currently imply "historical source is public-scoreboard" need to be corrected to "historical source is RCON-first with public-scoreboard fallback." + +This task is implementation-ready for branch: + +- `fix/historical-rcon-first-fallback-policy` + +## Steps + +1. Work on branch `fix/historical-rcon-first-fallback-policy`. +2. Inspect the listed files before changing anything. +3. Restore the historical default policy to RCON-first where appropriate: + - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` +4. Keep public-scoreboard documented and configured only as fallback, not as the normal primary historical source. +5. Ensure `docker-compose.yml` defaults and backend example env files do not include Comunidad Hispana #03. +6. Ensure Comunidad Hispana #01 and #02 remain in default RCON targets. +7. Keep advanced historical workers under the advanced profile if they are already configured that way. +8. Keep Elo/MMR paused and decoupled from backend startup. +9. Do not delete code, migrations, persisted data, or historical ingestion modules. +10. Update documentation and decisions to correct the historical source wording. +11. Do not add real credentials, secrets, passwords, or local `.env` values. +12. Run the required validation before committing. +13. Move this task file to `ai/tasks/done/` only after validation is complete and the outcome is documented. +14. Stage only intended files, commit, and push the branch to origin. + +## Files to Read First + +- `docker-compose.yml` +- `backend/.env.example` +- `backend/app/config.py` +- `backend/app/data_sources.py` +- `backend/app/historical_runner.py` +- `backend/app/rcon_historical_worker.py`, if present +- `README.md` +- `backend/README.md` +- `docs/decisions.md` +- `ai/repo-context.md` +- `ai/architecture-index.md` + +## Expected Files to Modify + +- `docker-compose.yml` +- `backend/.env.example` +- `backend/app/config.py` +- `README.md` +- `backend/README.md` +- `docs/decisions.md` +- possibly `ai/repo-context.md` +- possibly `ai/architecture-index.md` +- this task file moved from `ai/tasks/pending/` to `ai/tasks/done/` + +If additional files become necessary, explain why in the task outcome and commit message. + +## Expected Files Not to Modify + +- `frontend/**` +- database migrations +- persisted data +- Elo/MMR algorithm implementation files +- unrelated backend modules +- local `.env` + +## Constraints + +- Do not reintroduce Comunidad Hispana #03. +- Do not reactivate Elo/MMR. +- Do not delete historical ingestion code. +- Do not delete database migrations or persisted data. +- Do not modify frontend behavior. +- Do not add real secrets, passwords, tokens, or credentials. +- Keep advanced historical workers under the advanced profile if already configured. +- Keep the default Compose services limited to `backend` and `frontend`. +- Keep the change focused on defaults, source policy, and documentation wording. +- Do not modify unrelated files. +- Do not leave completed work only in local; commit and push after validation. + +## Validation + +Before completing the task, run and document: + +- `git status` +- `powershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1` +- `docker compose config --services` +- `docker compose config` + +Also confirm and document: + +- default services are still only `backend` and `frontend` +- default historical source resolves to `rcon` +- `HLL_BACKEND_RCON_TARGETS` default includes only `comunidad-hispana-01` and `comunidad-hispana-02` +- `comunidad-hispana-03` is not present in default RCON targets +- documentation says public-scoreboard is fallback, not primary, for historical mode +- no frontend files changed +- no database migrations or persisted data changed +- `backend/runtime/` is not created or committed +- `git diff --name-only` matches the expected scope + +If integration tests are relevant and `scripts/run-integration-tests.ps1` exists, use it. If a configured test cannot be run, document the exact reason in the outcome. + +## Commit And Push Requirements + +- Run all validation before committing. +- Run `git status`. +- Stage only intended files. +- Commit with a clear message, for example: `fix: restore historical rcon-first fallback policy`. +- Push the branch to origin. +- Do not leave completed work only in local. + +## Outcome + +Completed for branch `fix/historical-rcon-first-fallback-policy`. + +Validation performed: + +- `git status --short --branch` +- `powershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1` + - Passed. + - The script reported no product integration tests are configured for this platform-only scope. + - Backend startup import check passed. +- `docker compose config --services` + - Passed and returned only `backend` and `frontend` for the default profile. +- `docker compose config` + - Passed. + - The local machine had Compose environment overrides, so default policy was confirmed again with an empty env file to avoid local values. +- `docker compose --env-file config --services` + - Returned only `backend` and `frontend`. +- `docker compose --env-file config --format json` + - Confirmed `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon`. + - Confirmed default `HLL_BACKEND_RCON_TARGETS` includes only `comunidad-hispana-01` and `comunidad-hispana-02`. + - Confirmed `comunidad-hispana-03` is not present in default RCON targets. +- `python -c "from backend.app.config import DEFAULT_HISTORICAL_DATA_SOURCE; print(DEFAULT_HISTORICAL_DATA_SOURCE)"` + - Returned `rcon`. +- `git diff --name-only` + - Matched the expected backend/defaults/docs scope plus `backend/app/historical_runner.py`. +- `Test-Path backend/runtime` + - Returned `False`. + +Final source policy: + +- Historical ingestion defaults to RCON-first. +- `public-scoreboard` is fallback only for historical operations where RCON fails, lacks coverage or lacks parity for the requested competitive operation. +- Live data remains `rcon`. +- Elo/MMR remains paused and decoupled from backend startup. +- Comunidad Hispana #03 remains absent from default targets. +- Comunidad Hispana #01 and #02 remain active in default RCON targets. + +Changed files: + +- `docker-compose.yml` +- `backend/.env.example` +- `backend/app/config.py` +- `backend/app/historical_runner.py` +- `README.md` +- `backend/README.md` +- `docs/decisions.md` +- `ai/repo-context.md` +- `ai/architecture-index.md` +- this task file moved from `ai/tasks/pending/` to `ai/tasks/done/` + +Notable decision: + +- `backend/app/historical_runner.py` was updated because its default advanced historical scope still included `comunidad-hispana-03`. Leaving that default in code would contradict the task's default-target policy and the updated documentation, even though the worker remains under the advanced Compose profile. + +Scope confirmations: + +- No frontend files changed. +- No database migrations or persisted data changed. +- No real credentials were added; repository defaults continue to use placeholder RCON passwords. +- `backend/runtime/` was not created or committed. +- No follow-up task is needed for this scope. +- The branch was pushed to origin after validation and commit. + +## Change Budget + +- Prefer fewer than 5 modified files when feasible. +- Prefer changes under 200 lines when feasible. +- Split follow-up work into a new task if the scope grows beyond defaults, documentation, and source-policy correction. diff --git a/backend/.env.example b/backend/.env.example index f07a3dd..f4f5c3d 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -4,7 +4,7 @@ HLL_BACKEND_STORAGE_PATH=/app/data/hll_vietnam_dev.sqlite3 HLL_BACKEND_ALLOWED_ORIGINS=http://127.0.0.1:8080,http://localhost:8080 HLL_BACKEND_REFRESH_INTERVAL_SECONDS=120 HLL_BACKEND_LIVE_DATA_SOURCE=rcon -HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard +HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon HLL_BACKEND_RCON_TIMEOUT_SECONDS=20 HLL_BACKEND_RCON_TARGETS=[{"name":"Comunidad Hispana #01","slug":"comunidad-hispana-01","external_server_id":"comunidad-hispana-01","host":"152.114.195.174","port":7779,"password":"replace-me-01","source_name":"community-hispana-rcon","region":"ES","game_port":null,"query_port":null},{"name":"Comunidad Hispana #02","slug":"comunidad-hispana-02","external_server_id":"comunidad-hispana-02","host":"152.114.195.150","port":7879,"password":"replace-me-02","source_name":"community-hispana-rcon","region":"ES","game_port":null,"query_port":null}] HLL_HISTORICAL_CRCON_PAGE_SIZE=50 diff --git a/backend/README.md b/backend/README.md index d99b2c5..ab98277 100644 --- a/backend/README.md +++ b/backend/README.md @@ -273,12 +273,12 @@ Valores soportados en esta fase: - `a2s` como fallback legacy o override explicito - historico: - `rcon` como camino primario recomendado para captura y writer path primario - - `public-scoreboard` como fallback legacy o override explicito + - `public-scoreboard` como fallback legacy controlado Defaults actuales: - `HLL_BACKEND_LIVE_DATA_SOURCE=rcon` -- `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` +- `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` La seleccion efectiva se resuelve en `app/data_sources.py` y en adapters dedicados dentro de `app/providers/`: @@ -297,7 +297,7 @@ Proveedores operativos en esta fase: - live `rcon` - live `a2s` - historico `rcon` solo para read model minimo y captura prospectiva -- historico `public-scoreboard` +- historico `public-scoreboard` como fallback para cobertura competitiva sin paridad RCON Politica funcional actual: @@ -399,15 +399,15 @@ Runbook operativo minimo: - modo recomendado por defecto: - `HLL_BACKEND_LIVE_DATA_SOURCE=rcon` - - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` + - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` - usar solo `comunidad-hispana-01` y `comunidad-hispana-02` en los targets RCON por defecto - modo historico/RCON avanzado: - iniciar workers solo de forma explicita - no reintroducir `comunidad-hispana-03` salvo validacion nueva -- override legacy completo: +- override legacy live/A2S: - `HLL_BACKEND_LIVE_DATA_SOURCE=a2s` - - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=public-scoreboard` + - `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon` Verificacion minima del proveedor activo: @@ -422,7 +422,8 @@ Captura historica prospectiva por RCON: - se ejecuta fuera del request path HTTP - persiste muestras live hacia delante en tablas `rcon_historical_*` -- no sustituye todavia el historico competitivo basado en `public-scoreboard` +- usa RCON como camino historico primario y mantiene `public-scoreboard` solo + como fallback para operaciones competitivas que aun no tienen paridad RCON - no promete backfill retroactivo de matches ya perdidos Comandos manuales desde `backend/`: @@ -638,7 +639,7 @@ Ejemplos: - `backend/data/snapshots/comunidad-hispana-01/server-summary.json` - `backend/data/snapshots/comunidad-hispana-01/weekly-kills.json` -- `backend/data/snapshots/comunidad-hispana-03/recent-matches.json` +- `backend/data/snapshots/comunidad-hispana-02/recent-matches.json` - `backend/data/snapshots/all-servers/weekly-support.json` - `backend/data/snapshots/all-servers/monthly-mvp.json` @@ -1088,7 +1089,7 @@ docker compose exec backend python -m app.historical_runner --interval 1800 Flags utiles: - `--server comunidad-hispana-01` para limitar a un servidor -- `--server comunidad-hispana-03` para validar solo el tercer scoreboard historico +- `--server comunidad-hispana-02` para validar solo el segundo servidor activo - `--overlap-hours 48` para releer una ventana reciente mayor sin relanzar bootstrap - `--max-pages 2` para validacion local acotada - `--page-size 25` para ajustar paginacion @@ -1191,7 +1192,7 @@ fallback clasico entra de forma controlada. Por defecto: periodica de fallback para mantener rankings y snapshots clasicos - refresca cada `900` segundos - prewarmea en cada ciclo: - - `server-summary` para `comunidad-hispana-01`, `comunidad-hispana-02`, `comunidad-hispana-03` y `all-servers` + - `server-summary` para `comunidad-hispana-01`, `comunidad-hispana-02` y `all-servers` - `weekly-leaderboard` de la metrica por defecto `kills` para esos mismos alcances - `monthly-leaderboard` de la metrica por defecto `kills` para esos mismos alcances - `recent-matches` para esos mismos alcances @@ -1226,7 +1227,6 @@ Sin `--server`, ese runner refresca: - `comunidad-hispana-01` - `comunidad-hispana-02` -- `comunidad-hispana-03` Despues de cada fallback clasico correcto, recompone snapshots para los servidores afectados y vuelve a alinear el agregado `all-servers`. Si el ciclo @@ -1251,7 +1251,7 @@ Operativa local minima: en archivos bajo `backend/data/snapshots/`, por ejemplo: - `backend/data/snapshots/comunidad-hispana-01/server-summary.json` - `backend/data/snapshots/comunidad-hispana-02/recent-matches.json` - - `backend/data/snapshots/comunidad-hispana-03/weekly-kills.json` + - `backend/data/snapshots/comunidad-hispana-02/weekly-kills.json` - `backend/data/snapshots/all-servers/monthly-kills.json` Operativa avanzada con Docker Compose: @@ -1536,9 +1536,10 @@ Estado real a fecha de esta fase: - leaderboards semanales/mensuales, MVP V1/V2 y player-events siguen teniendo fallback a `public-scoreboard` mientras RCON no disponga de señal competitiva por jugador con paridad suficiente -- Elo/MMR pasa a consumir primero contexto competitivo RCON-backed para - cobertura y calidad de match cuando existe, pero sigue necesitando - `public-scoreboard` como suplemento para estadisticas por jugador +- Elo/MMR permanece pausado y desacoplado del arranque del backend; cuando se + reactive mediante una task explicita, debera respetar el contexto + RCON-backed primario y usar `public-scoreboard` solo como suplemento/fallback + para estadisticas por jugador sin paridad RCON ## Elo/MMR Monthly Ranking diff --git a/backend/app/config.py b/backend/app/config.py index 4584381..a76ff36 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -11,7 +11,7 @@ DEFAULT_PORT = 8000 DEFAULT_STORAGE_FILENAME = "hll_vietnam_dev.sqlite3" DEFAULT_REFRESH_INTERVAL_SECONDS = 300 DEFAULT_LIVE_DATA_SOURCE = "rcon" -DEFAULT_HISTORICAL_DATA_SOURCE = "public-scoreboard" +DEFAULT_HISTORICAL_DATA_SOURCE = "rcon" DEFAULT_RCON_TIMEOUT_SECONDS = 20.0 DEFAULT_HISTORICAL_CRCON_PAGE_SIZE = 50 DEFAULT_HISTORICAL_CRCON_TIMEOUT_SECONDS = 15.0 diff --git a/backend/app/historical_runner.py b/backend/app/historical_runner.py index 5ba8908..d822286 100644 --- a/backend/app/historical_runner.py +++ b/backend/app/historical_runner.py @@ -32,7 +32,6 @@ HOURLY_INTERVAL_SECONDS = 3600 DEFAULT_HISTORICAL_SERVER_SCOPE = ( "comunidad-hispana-01", "comunidad-hispana-02", - "comunidad-hispana-03", ) diff --git a/docker-compose.yml b/docker-compose.yml index e37d141..4ff58cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: - ./backend/.env.example environment: HLL_BACKEND_LIVE_DATA_SOURCE: ${HLL_BACKEND_LIVE_DATA_SOURCE:-rcon} - HLL_BACKEND_HISTORICAL_DATA_SOURCE: ${HLL_BACKEND_HISTORICAL_DATA_SOURCE:-public-scoreboard} + HLL_BACKEND_HISTORICAL_DATA_SOURCE: ${HLL_BACKEND_HISTORICAL_DATA_SOURCE:-rcon} HLL_BACKEND_RCON_TIMEOUT_SECONDS: ${HLL_BACKEND_RCON_TIMEOUT_SECONDS:-20} HLL_BACKEND_RCON_TARGETS: >- ${HLL_BACKEND_RCON_TARGETS:-[{"name":"Comunidad Hispana #01","slug":"comunidad-hispana-01","external_server_id":"comunidad-hispana-01","host":"152.114.195.174","port":7779,"password":"replace-me-01","source_name":"community-hispana-rcon","region":"ES","game_port":null,"query_port":null},{"name":"Comunidad Hispana #02","slug":"comunidad-hispana-02","external_server_id":"comunidad-hispana-02","host":"152.114.195.150","port":7879,"password":"replace-me-02","source_name":"community-hispana-rcon","region":"ES","game_port":null,"query_port":null}]} diff --git a/docs/decisions.md b/docs/decisions.md index 6ce9ce2..7e040f8 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -139,3 +139,15 @@ porque ya no es una fuente operativa vigente. El codigo historico, los datos persistidos, las migraciones y las piezas Elo/MMR no se eliminan; quedan pausadas operativamente para esta fase y pueden reintroducirse mediante una task futura si se valida de nuevo la fuente y el coste de mantenimiento. + +## Decision 015: historico RCON-first con fallback publico + +La politica por defecto para historico vuelve a ser RCON-first: +`HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon`. El scoreboard publico de CRCON se +mantiene como fallback controlado cuando RCON falla, no tiene cobertura util o +no soporta todavia una operacion competitiva concreta. + +Esta decision no reactiva Elo/MMR dentro del arranque normal del backend. Las +piezas Elo/MMR, migraciones, datos persistidos y modulos historicos se +conservan, pero su operativa compleja sigue pausada y desacoplada salvo task +explicita.