chore: add current match navigation tasks
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
---
|
||||
id: TASK-150
|
||||
title: Server card history and current match entrypoints
|
||||
status: pending
|
||||
type: frontend
|
||||
team: Frontend Senior
|
||||
supporting_teams: []
|
||||
roadmap_item: rcon-full-data
|
||||
priority: high
|
||||
---
|
||||
|
||||
# TASK-150 - Server card history and current match entrypoints
|
||||
|
||||
## Goal
|
||||
|
||||
Add server-specific navigation buttons to the home page and make the internal
|
||||
historical page accept an initial server filter through the URL.
|
||||
|
||||
## Background
|
||||
|
||||
The home page currently renders live server cards in
|
||||
`frontend/assets/js/main.js`. Each server card currently has a single
|
||||
"Historico" action built through `renderServerAction(server)`.
|
||||
|
||||
We need clearer per-server actions for the active Comunidad Hispana servers:
|
||||
|
||||
- Open the public current scoreboard.
|
||||
- Open our internal historical page already filtered by that server.
|
||||
- Open our future internal live/current match page already filtered by that
|
||||
server.
|
||||
|
||||
Important URL correction:
|
||||
|
||||
The current public scoreboard URLs are the base scoreboard URLs, without
|
||||
`/games`:
|
||||
|
||||
- `comunidad-hispana-01` -> `https://scoreboard.comunidadhll.es`
|
||||
- `comunidad-hispana-02` -> `https://scoreboard.comunidadhll.es:5443`
|
||||
|
||||
The `/games` URLs are only for the external public historical scoreboard, if
|
||||
needed later:
|
||||
|
||||
- `comunidad-hispana-01` -> `https://scoreboard.comunidadhll.es/games`
|
||||
- `comunidad-hispana-02` -> `https://scoreboard.comunidadhll.es:5443/games`
|
||||
|
||||
## Constraints / DO NOT BREAK
|
||||
|
||||
- Do not change backend storage.
|
||||
- Do not change RCON ingestion.
|
||||
- Do not change scoreboard correlation logic.
|
||||
- Do not depend on server #03.
|
||||
- Do not expose arbitrary URLs received from API payloads.
|
||||
- Do not remove existing server card live status rendering.
|
||||
- Do not implement the full live match page in this task.
|
||||
- Keep the change frontend-focused and minimal.
|
||||
- Preserve existing responsive layout.
|
||||
|
||||
## Allowed Changes
|
||||
|
||||
- `frontend/assets/js/main.js`
|
||||
- `frontend/assets/css/main.css` or equivalent home CSS file
|
||||
- historical page JS/CSS/HTML files needed to support `?server=`
|
||||
- optionally add a minimal placeholder `partida-actual.html` if needed to
|
||||
avoid a broken link
|
||||
- docs only if needed
|
||||
|
||||
## Implementation Requirements
|
||||
|
||||
1. Replace the current single "Historico" server-card action with a small
|
||||
action group.
|
||||
2. For each active supported server, render these actions:
|
||||
- "Scoreboard público"
|
||||
- "Nuestro histórico"
|
||||
- "Partida actual"
|
||||
3. "Scoreboard público" must open the current public scoreboard base URL:
|
||||
- `comunidad-hispana-01` -> `https://scoreboard.comunidadhll.es`
|
||||
- `comunidad-hispana-02` -> `https://scoreboard.comunidadhll.es:5443`
|
||||
It must NOT append `/games`.
|
||||
4. "Nuestro histórico" must open the internal historical page with a server
|
||||
query parameter:
|
||||
- `historico.html?server=comunidad-hispana-01`
|
||||
- `historico.html?server=comunidad-hispana-02`
|
||||
5. "Partida actual" must open:
|
||||
- `partida-actual.html?server=comunidad-hispana-01`
|
||||
- `partida-actual.html?server=comunidad-hispana-02`
|
||||
6. Add trusted frontend mappings for supported active servers only:
|
||||
- `comunidad-hispana-01`
|
||||
- `comunidad-hispana-02`
|
||||
Do not add server #03.
|
||||
7. The server identifier should be resolved from the server payload using
|
||||
`external_server_id` or another already existing stable server slug. If the
|
||||
server cannot be resolved to a trusted known server, do not render
|
||||
public/current-match actions for it.
|
||||
8. Update the historical page initialization so that:
|
||||
- `?server=comunidad-hispana-01` selects Comunidad Hispana #01 instead of
|
||||
defaulting to all servers.
|
||||
- `?server=comunidad-hispana-02` selects Comunidad Hispana #02 instead of
|
||||
defaulting to all servers.
|
||||
- unknown or missing server query values fall back to the current default
|
||||
behavior.
|
||||
9. If `partida-actual.html` does not exist yet, create a minimal placeholder
|
||||
page that:
|
||||
- reads `?server=`
|
||||
- displays "Partida actual"
|
||||
- displays the selected server slug/name
|
||||
- explains that the live detail view will be implemented in the next task
|
||||
- includes a safe link back to the home page and historical page
|
||||
Do not implement live data polling yet.
|
||||
10. Ensure all generated URLs are built from trusted constants, not directly
|
||||
from API-provided arbitrary values.
|
||||
|
||||
## Files to Read First
|
||||
|
||||
- `AGENTS.md`
|
||||
- `ai/architecture-index.md`
|
||||
- `ai/repo-context.md`
|
||||
- `ai/orchestrator/frontend-senior.md`
|
||||
- `frontend/assets/js/main.js`
|
||||
- historical page files used for the existing server filter flow
|
||||
|
||||
## Expected Files to Modify
|
||||
|
||||
- `frontend/assets/js/main.js`
|
||||
- home CSS only if the new action group needs layout styling
|
||||
- historical page files needed for `?server=` initialization
|
||||
- `partida-actual.html` only if a placeholder is needed
|
||||
|
||||
## Validation
|
||||
|
||||
- Run `node --check` on every modified frontend JS file.
|
||||
- Review `git diff --name-only` and confirm the changed files match this task.
|
||||
|
||||
## Manual Verification
|
||||
|
||||
1. Open the home page.
|
||||
2. Verify Comunidad Hispana #01 card shows:
|
||||
- Scoreboard público
|
||||
- Nuestro histórico
|
||||
- Partida actual
|
||||
3. Verify Comunidad Hispana #02 card shows:
|
||||
- Scoreboard público
|
||||
- Nuestro histórico
|
||||
- Partida actual
|
||||
4. Click "Scoreboard público" for Comunidad Hispana #01 and verify it opens:
|
||||
`https://scoreboard.comunidadhll.es`
|
||||
5. Click "Scoreboard público" for Comunidad Hispana #02 and verify it opens:
|
||||
`https://scoreboard.comunidadhll.es:5443`
|
||||
6. Click "Nuestro histórico" for Comunidad Hispana #01 and verify the
|
||||
historical page loads with Comunidad Hispana #01 selected.
|
||||
7. Click "Nuestro histórico" for Comunidad Hispana #02 and verify the
|
||||
historical page loads with Comunidad Hispana #02 selected.
|
||||
8. Click "Partida actual" for both servers and verify the page opens with the
|
||||
correct server query parameter.
|
||||
9. Verify no server #03 action is introduced.
|
||||
|
||||
## Commit Message
|
||||
|
||||
`feat: add current match server entrypoints`
|
||||
|
||||
## Expected Outcome
|
||||
|
||||
The home page exposes clear per-server navigation actions, and the internal
|
||||
historical page can open directly filtered by server.
|
||||
|
||||
## Outcome
|
||||
|
||||
Document the validation performed, URL trust boundary decisions, historical
|
||||
filter initialization behavior, and any follow-up task instead of expanding
|
||||
scope.
|
||||
|
||||
## Change Budget
|
||||
|
||||
- Prefer fewer than 5 modified files.
|
||||
- Prefer changes under 200 lines when feasible.
|
||||
- Split the work into follow-up tasks if the scope grows.
|
||||
169
ai/tasks/pending/TASK-151-current-match-page-base.md
Normal file
169
ai/tasks/pending/TASK-151-current-match-page-base.md
Normal file
@@ -0,0 +1,169 @@
|
||||
---
|
||||
id: TASK-151
|
||||
title: Current match page base
|
||||
status: pending
|
||||
type: frontend
|
||||
team: Frontend Senior
|
||||
supporting_teams:
|
||||
- Backend Senior
|
||||
roadmap_item: rcon-full-data
|
||||
priority: high
|
||||
---
|
||||
|
||||
# TASK-151 - Current match page base
|
||||
|
||||
## Goal
|
||||
|
||||
Create the first functional internal "Partida actual" page for active
|
||||
Comunidad Hispana servers.
|
||||
|
||||
## Background
|
||||
|
||||
The home page will link to
|
||||
`partida-actual.html?server=<server_slug>`. We need the first real version of
|
||||
our internal current-match page.
|
||||
|
||||
This page should be visually aligned with the existing historical match detail
|
||||
page, but it represents a live match instead of a closed historical match.
|
||||
|
||||
Important public scoreboard URLs:
|
||||
|
||||
- `comunidad-hispana-01` -> `https://scoreboard.comunidadhll.es`
|
||||
- `comunidad-hispana-02` -> `https://scoreboard.comunidadhll.es:5443`
|
||||
|
||||
These are base URLs for the current public scoreboard and must not include
|
||||
`/games`.
|
||||
|
||||
## Constraints / DO NOT BREAK
|
||||
|
||||
- Do not break the existing historical page.
|
||||
- Do not break the existing match detail page.
|
||||
- Do not change scoreboard correlation logic.
|
||||
- Do not implement the live kill feed in this task unless there is already a
|
||||
safe endpoint that can be reused trivially.
|
||||
- Do not fabricate closed-match data.
|
||||
- Do not show final winner/duration/closed_at for a live match.
|
||||
- Do not depend on server #03.
|
||||
- Do not expose untrusted public scoreboard URLs.
|
||||
- Keep polling moderate and safe.
|
||||
|
||||
## Allowed Changes
|
||||
|
||||
- `partida-actual.html`
|
||||
- new frontend JS/CSS for current match page
|
||||
- backend API endpoint only if needed
|
||||
- backend read-model code only if needed for current live state
|
||||
- tests where practical
|
||||
|
||||
## Implementation Requirements
|
||||
|
||||
1. Create or upgrade `partida-actual.html` as a real live-current-match page.
|
||||
2. The page must read `?server=` from the URL.
|
||||
3. Supported server values:
|
||||
- `comunidad-hispana-01`
|
||||
- `comunidad-hispana-02`
|
||||
4. Unknown server values must show a safe error/empty state and must not build
|
||||
external URLs from the unknown value.
|
||||
5. Add trusted current public scoreboard links:
|
||||
- `comunidad-hispana-01` -> `https://scoreboard.comunidadhll.es`
|
||||
- `comunidad-hispana-02` -> `https://scoreboard.comunidadhll.es:5443`
|
||||
6. Add a "Ver scoreboard público" button using the trusted base URL for that
|
||||
server.
|
||||
7. The page should display a live-match header with:
|
||||
- server name
|
||||
- live/online status
|
||||
- current map
|
||||
- game mode if available
|
||||
- `started_at` if available
|
||||
- current players / max players if available
|
||||
- last updated/captured timestamp
|
||||
8. The page should display a scoreboard panel:
|
||||
- allied score if available
|
||||
- axis score if available
|
||||
- neutral state if scores are unavailable
|
||||
9. Do not display:
|
||||
- final duration
|
||||
- final winner
|
||||
- `closed_at`
|
||||
- any copy implying that the match has finished
|
||||
10. Add a placeholder section for future live kill feed:
|
||||
- title: "Feed de combate"
|
||||
- text explaining that live kill events will appear here when enabled
|
||||
- no fake kill rows
|
||||
11. Add a player table section if current player stats are already available
|
||||
from existing APIs. If they are not available, show a clean placeholder:
|
||||
- "Las estadísticas en vivo aparecerán cuando haya datos suficientes."
|
||||
12. Add frontend polling with safe in-flight protection:
|
||||
- default interval: 30 seconds
|
||||
- avoid overlapping requests
|
||||
- show stale/error states clearly
|
||||
13. If no backend endpoint exists for current match state, add a minimal
|
||||
endpoint that derives the current server state from existing live/RCON
|
||||
snapshot data. Keep it read-only.
|
||||
14. The endpoint response should be stable and minimal:
|
||||
- server slug/name
|
||||
- status
|
||||
- map
|
||||
- `game_mode`
|
||||
- `started_at`
|
||||
- `allied_score`
|
||||
- `axis_score`
|
||||
- players
|
||||
- `max_players`
|
||||
- `captured_at`/`updated_at`
|
||||
- `public_scoreboard_url` from trusted mapping
|
||||
|
||||
## Files to Read First
|
||||
|
||||
- `AGENTS.md`
|
||||
- `ai/architecture-index.md`
|
||||
- `ai/repo-context.md`
|
||||
- `ai/orchestrator/frontend-senior.md`
|
||||
- current historical match detail frontend files
|
||||
- live server backend/read-model files used by the existing server cards
|
||||
|
||||
## Expected Files to Modify
|
||||
|
||||
- `partida-actual.html`
|
||||
- new current-match frontend JS/CSS files as needed
|
||||
- minimal live-state backend endpoint/read-model files only if existing APIs
|
||||
cannot supply the page state
|
||||
- focused tests where practical
|
||||
|
||||
## Validation
|
||||
|
||||
- `python -m compileall backend/app`
|
||||
- Run backend tests relevant to live server/read model if available.
|
||||
- Run `node --check` on modified/new frontend JS files.
|
||||
- Review `git diff --name-only` and confirm the changed files match this task.
|
||||
|
||||
## Manual Verification
|
||||
|
||||
1. Open `partida-actual.html?server=comunidad-hispana-01`.
|
||||
2. Open `partida-actual.html?server=comunidad-hispana-02`.
|
||||
3. Verify the public scoreboard button opens:
|
||||
- `https://scoreboard.comunidadhll.es`
|
||||
- `https://scoreboard.comunidadhll.es:5443`
|
||||
4. Verify `/games` is not used for the current public scoreboard button.
|
||||
5. Verify no final/closed-match fields are shown.
|
||||
6. Verify unknown server query values do not create unsafe links.
|
||||
|
||||
## Commit Message
|
||||
|
||||
`feat: add current match page base`
|
||||
|
||||
## Expected Outcome
|
||||
|
||||
A safe first version of the internal current-match page exists and can display
|
||||
live server/match state without pretending the match is closed.
|
||||
|
||||
## Outcome
|
||||
|
||||
Document the live-state source, polling behavior, validation performed, and any
|
||||
follow-up task instead of expanding scope.
|
||||
|
||||
## Change Budget
|
||||
|
||||
- Prefer fewer than 5 modified files.
|
||||
- Prefer changes under 200 lines when feasible.
|
||||
- Split the work into follow-up tasks if the scope grows.
|
||||
149
ai/tasks/pending/TASK-152-current-match-live-kill-feed.md
Normal file
149
ai/tasks/pending/TASK-152-current-match-live-kill-feed.md
Normal file
@@ -0,0 +1,149 @@
|
||||
---
|
||||
id: TASK-152
|
||||
title: Current match live kill feed
|
||||
status: pending
|
||||
type: backend
|
||||
team: Backend Senior
|
||||
supporting_teams:
|
||||
- Frontend Senior
|
||||
roadmap_item: rcon-full-data
|
||||
priority: high
|
||||
---
|
||||
|
||||
# TASK-152 - Current match live kill feed
|
||||
|
||||
## Goal
|
||||
|
||||
Expose recent current-match kill events and render them as a live visual feed
|
||||
on `partida-actual.html`.
|
||||
|
||||
## Background
|
||||
|
||||
The current-match page will exist at
|
||||
`partida-actual.html?server=<server_slug>`. The backend already stores/parses
|
||||
RCON AdminLog data and materializes kill/player stats for historical matches.
|
||||
|
||||
Existing materialization logic uses AdminLog kill payload fields such as:
|
||||
|
||||
- `killer_id`
|
||||
- `killer_name`
|
||||
- `killer_team`
|
||||
- `victim_id`
|
||||
- `victim_name`
|
||||
- `victim_team`
|
||||
- `weapon`
|
||||
|
||||
We now want a live/current-match kill feed similar to a FPS kill feed: killer,
|
||||
weapon, victim, teamkill distinction, timestamp.
|
||||
|
||||
## Constraints / DO NOT BREAK
|
||||
|
||||
- Do not query RCON directly from the frontend.
|
||||
- Do not expose raw AdminLog lines.
|
||||
- Do not expose admin-only/sensitive fields.
|
||||
- Do not break existing historical materialization.
|
||||
- Do not break existing match detail player stats.
|
||||
- Do not depend on server #03.
|
||||
- Do not fabricate kill events.
|
||||
- Do not duplicate kill rows on repeated polling.
|
||||
- Keep polling safe.
|
||||
|
||||
## Allowed Changes
|
||||
|
||||
- backend endpoint for current match kill feed
|
||||
- backend read-model/helper for current/open match event window
|
||||
- frontend current-match JS/CSS
|
||||
- tests for event normalization/filtering where practical
|
||||
|
||||
## Implementation Requirements
|
||||
|
||||
1. Add a backend endpoint for recent current-match kill events by server.
|
||||
2. Supported servers:
|
||||
- `comunidad-hispana-01`
|
||||
- `comunidad-hispana-02`
|
||||
3. Unknown server values must return a safe 400/404 style response and must
|
||||
not query arbitrary targets.
|
||||
4. The endpoint should return normalized event rows:
|
||||
- `event_id`
|
||||
- `event_timestamp` or `server_time`
|
||||
- `killer_name`
|
||||
- `killer_team`
|
||||
- `victim_name`
|
||||
- `victim_team`
|
||||
- `weapon`
|
||||
- `is_teamkill`
|
||||
- confidence/source if needed
|
||||
5. The endpoint should only return events belonging to the current/open match
|
||||
if that can be determined.
|
||||
6. If the current/open match window cannot be determined reliably, return a
|
||||
safe recent window and include a clear confidence marker, for example:
|
||||
- scope: `"recent-admin-log-window"`
|
||||
- confidence: `"partial"`
|
||||
7. Do not return raw AdminLog text.
|
||||
8. Add frontend rendering for a kill feed:
|
||||
- newest events visible at top or bottom consistently
|
||||
- killer name
|
||||
- weapon label/icon placeholder
|
||||
- victim name
|
||||
- timestamp
|
||||
- teamkill visual distinction
|
||||
9. Prevent duplicate rendering:
|
||||
- track `event_id` values already rendered
|
||||
- update existing rows only if needed
|
||||
10. Poll every 15-30 seconds.
|
||||
11. Add an empty state:
|
||||
- "Todavía no se han detectado bajas en esta partida."
|
||||
12. Add an error/stale state:
|
||||
- "No se pudo actualizar el feed de combate."
|
||||
13. Do not show fake/sample kill events in production UI.
|
||||
|
||||
## Files to Read First
|
||||
|
||||
- `AGENTS.md`
|
||||
- `ai/architecture-index.md`
|
||||
- `ai/repo-context.md`
|
||||
- `ai/orchestrator/backend-senior.md`
|
||||
- current-match page files created by TASK-151
|
||||
- AdminLog materialization/read-model files that already normalize kill data
|
||||
|
||||
## Expected Files to Modify
|
||||
|
||||
- backend current-match kill feed endpoint/read-model files
|
||||
- current-match frontend JS/CSS files
|
||||
- focused tests for event normalization/filtering where practical
|
||||
|
||||
## Validation
|
||||
|
||||
- `python -m compileall backend/app`
|
||||
- Run backend tests related to AdminLog/materialization/current-match feed.
|
||||
- Run `node --check` on current-match frontend JS.
|
||||
- Review `git diff --name-only` and confirm the changed files match this task.
|
||||
|
||||
## Manual Verification
|
||||
|
||||
1. Open `partida-actual.html?server=comunidad-hispana-01`.
|
||||
2. Open `partida-actual.html?server=comunidad-hispana-02`.
|
||||
3. Verify kill feed renders only normalized events.
|
||||
4. Verify repeated polling does not duplicate rows.
|
||||
5. Verify teamkills are visually distinguishable.
|
||||
6. Verify raw AdminLog lines are never displayed.
|
||||
|
||||
## Commit Message
|
||||
|
||||
`feat: add current match live kill feed`
|
||||
|
||||
## Expected Outcome
|
||||
|
||||
The current-match page can show a safe, normalized, non-duplicated live kill
|
||||
feed based on RCON/AdminLog data.
|
||||
|
||||
## Outcome
|
||||
|
||||
Document the feed scope and confidence behavior, event normalization choices,
|
||||
polling validation, and any follow-up task instead of expanding scope.
|
||||
|
||||
## Change Budget
|
||||
|
||||
- Prefer fewer than 5 modified files.
|
||||
- Prefer changes under 200 lines when feasible.
|
||||
- Split the work into follow-up tasks if the scope grows.
|
||||
Reference in New Issue
Block a user