Captures all brainstormed decisions: - Pluggable game cartridge platform (GameDriver interface) - Celery + Redis timer-driven phase transitions - Session owner play/pause/exit controls (no skip) - Escalating scoring per round, incremental reveal scoring - Emoji reactions during guess phase → post-game awards - Relational per-user config presets with game-specific models - Ephemeral game state (no persistence after exit/finish) - Full WebSocket event reference and data lifecycle Also: updated TODO.md (WebSocket done, persisted answers done), created CLAUDE.md, and PROMPT.md for ralph-loop. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
125 lines
5.4 KiB
Markdown
125 lines
5.4 KiB
Markdown
# TODO — Weirsøe Party Protocol (Django)
|
|
|
|
## Projektmål
|
|
Byg **Weirsøe Party Protocol**: en dansk party-webapp platform ala Jackbox, hvor spil vises på storskærm/web, og spillere deltager via mobil.
|
|
|
|
## Navne
|
|
- **Platform/repo:** `weirsoe-party-protocol`
|
|
- **Spil 1 (inspireret af Fibbage):** `Fup og Fakta` (django-app slug: `fupogfakta`)
|
|
|
|
## Teknologivalg (besluttet)
|
|
- Backend: **Django 6.0.2**
|
|
- Realtid: Django Channels + Redis (websocket til host + telefoner)
|
|
- DB: MySQL (test + prod databaser i samme MySQL LXC)
|
|
- Deployment: Proxmox LXC (ikke Docker)
|
|
|
|
## Midlertidige defaults (kan finjusteres senere)
|
|
- Spillere: min 3, default max 5 (MVP)
|
|
- Løgntid (X): 45 sek
|
|
- Gættetid (Z): 30 sek
|
|
- Login: username/password for host/admin
|
|
- Join i kørende spil: session-kode
|
|
|
|
## Arbejdsaftale (kommunikation)
|
|
- Giv korte progress updates intermitterende under udvikling (ikke spam).
|
|
- Hvis der opdages nice-to-have eller need-to-have, skriv dem ind i TODO.md med tydelig markering.
|
|
|
|
## Faseplan
|
|
|
|
### Fase 0 — Scope + regler
|
|
- [x] Fastlæg MVP for Spil 1 (`Fup og Fakta`) — se `docs/F0_MVP_FUP_OG_FAKTA.md`
|
|
- [x] Midlertidige defaults sat (X/Z, spillerantal)
|
|
- [x] Fastlæg anti-cheat regler (fx ingen identiske løgne) — se docs/F0_ANTI_CHEAT_RULES.md
|
|
|
|
### Fase 1 — Monorepo + Django skelet
|
|
- [x] Opret Django-projekt (`partyhub`)
|
|
- [x] Opret apps:
|
|
- [x] `core_admin` (global administration)
|
|
- [x] `fupogfakta` (Spil 1)
|
|
- [x] `lobby` (room/session/player join flow)
|
|
- [x] `realtime` (app-skelet oprettet — consumers/routing IKKE implementeret endnu)
|
|
- [x] `voice` (fælles voice-acting interface — stub)
|
|
- [x] Miljøfiler (`.env.test`, `.env.prod` skabeloner)
|
|
- [x] Konfig for MySQL test/prod
|
|
|
|
### Fase 2 — Domænemodel (MVP)
|
|
- [x] `GameSession` (kode, host, status)
|
|
- [x] `Player` (nickname, session, score)
|
|
- [x] `RoundConfig` (kategori, K spørgsmål, point korrekt, point bluff)
|
|
- [x] `Category`
|
|
- [x] `Question` (prompt + korrekt svar + kategori)
|
|
- [x] `LieAnswer` (spillers løgn)
|
|
- [x] `Guess` (hvilket svar spiller valgte)
|
|
- [x] `ScoreEvent` (auditérbar pointslog)
|
|
|
|
### Fase 3 — Spilflow `Fup og Fakta`
|
|
- [x] Lobby: host opretter session, spillere joiner via kode (REST)
|
|
- [x] Runde starter med kategori (REST)
|
|
- [x] Spørgsmål vises -> alle skriver løgn inden X sek (REST)
|
|
- [x] System blander korrekt svar + løgne (persisted i JSONField, anti-cheat dedup)
|
|
- [x] Guessfase: alle gætter inden Z sek (REST)
|
|
- [x] Pointudregning (konfigurerbar pr. runde, ScoreEvent audit trail)
|
|
- [x] Scoreboard + næste spørgsmål/runde (REST)
|
|
- [x] Slutresultat (REST)
|
|
- [x] **WebSocket push af phase-events til host + spillere** (GameConsumer + broadcast.py, InMemoryChannelLayer i tests)
|
|
|
|
### Fase 4 — Voice-acting (platformkrav)
|
|
- [ ] Definér TTS provider-interface
|
|
- [ ] Voice-queue pr. game session
|
|
- [ ] Per-spil hooks for voice lines
|
|
- [ ] Konfigurerbare stemmer/sprog/hastighed
|
|
|
|
### Fase 5 — Admin & content management
|
|
- [x] Django admin til kategorier/spørgsmål (grundregistrering)
|
|
- [ ] Bulk-import spørgsmål (CSV/JSON)
|
|
- [ ] Validering af spørgsmål
|
|
- [ ] Rundeopsætning i admin (Y/K/point)
|
|
|
|
### Fase 6 — Drift/admin-app (`core_admin`)
|
|
- [ ] Miljø-checks (DB, Redis, websockets)
|
|
- [ ] Port/host sanity checks (read-only)
|
|
- [ ] DB indeks-checks
|
|
- [ ] Brugeroprettelse (username/password)
|
|
|
|
### Fase 7 — Test og kvalitet
|
|
- [ ] Enhedstests for scoring/rules engine
|
|
- [ ] Integrationstest for fuld runde
|
|
- [ ] Reconnect-scenarier for mobilklient
|
|
|
|
### Fase 8 — Dokumentation (Gitea wiki)
|
|
- [ ] Arkitektur-overblik
|
|
- [ ] Setup guide (test/prod)
|
|
- [ ] Spilflow for `Fup og Fakta`
|
|
- [ ] Driftsguide + fejlsøgning
|
|
|
|
### Fase 9 — Secrets og DB-oprettelse
|
|
- [ ] Opret databaser + brugere (`wpp_test`, `wpp_prod`)
|
|
- [ ] Gem credentials i `https://gitea.weircon.dk/agw/Secrets/src/branch/main/secrets.csv`
|
|
- [ ] Verificér least-privilege
|
|
|
|
### Fase 10 — Deployment i Proxmox LXC
|
|
- [ ] Opret dedikeret LXC
|
|
- [ ] Installér Python/venv + services
|
|
- [ ] Reverse proxy/NPM + TLS
|
|
- [ ] Migrations + static + health checks
|
|
|
|
### Backlog — Need-to-have / Nice-to-have
|
|
- [x] (Need-to-have) Persistér mixed svarrækkefølge pr. round question — DONE (JSONField + migration 0003 + test)
|
|
- [x] (Need-to-have) Tilføj spiller-auth/session-token for submit_lie (pt. baseret på player_id i payload)
|
|
- [ ] (Nice-to-have) Endpoint til status/progress i løgnfasen (antal indsendt ud af total)
|
|
- [ ] (Need-to-have) Fjern ubrugte scaffold-imports i core_admin/*, realtime/*, voice/*, fupogfakta/views.py (kør `ruff check --fix`) så CI quality gate er grøn
|
|
- [x] (Need-to-have) [Issue #251] Release-often lane: SPA MVP opdelt i 3 merge-klare micro-PR batches (plan + acceptance criteria dokumenteret i `docs/ISSUE-251-RELEASE-OFTEN-SPA-MVP-BATCH-PLAN.md`).
|
|
- [ ] (Need-to-have) Rate limiting på join/submit endpoints
|
|
- [ ] (Need-to-have) Session-kode brute-force beskyttelse
|
|
- [ ] (Need-to-have) Audit-log for host-handlinger (start/stop/skip)
|
|
- [ ] (Nice-to-have) Runde-tema musik/lyd-cues
|
|
- [ ] (Nice-to-have) Hurtig onboarding-skærm for nye spillere
|
|
|
|
## PO-beslutninger (2026-02-27)
|
|
- MVP: Første spil (Fup og Fakta) skal være spilbart end-to-end og stabilt.
|
|
- Realtime: WebSocket er krav i MVP (ingen polling).
|
|
- Join: kun i LOBBY i MVP (viewers senere).
|
|
- Sikkerhed: sanitised inputs + server-side validering + fairness logging er hard requirement.
|
|
- Spillere: default max 5, minimum 3 for start (konfigurerbart).
|
|
- Se detaljer: coordination/PO_DECISIONS_2026-02-27.md.
|