Files
weirsoe-party-protocol/TODO.md
Asger Geel Weirsøe d2dbd8c802
Some checks failed
CI / test-and-quality (push) Has been cancelled
CI / test-and-quality (pull_request) Successful in 2m43s
docs: design doc for fup og fakta game engine + platform architecture
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>
2026-03-09 07:35:55 +01:00

5.4 KiB

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

  • Fastlæg MVP for Spil 1 (Fup og Fakta) — se docs/F0_MVP_FUP_OG_FAKTA.md
  • Midlertidige defaults sat (X/Z, spillerantal)
  • Fastlæg anti-cheat regler (fx ingen identiske løgne) — se docs/F0_ANTI_CHEAT_RULES.md

Fase 1 — Monorepo + Django skelet

  • Opret Django-projekt (partyhub)
  • Opret apps:
    • core_admin (global administration)
    • fupogfakta (Spil 1)
    • lobby (room/session/player join flow)
    • realtime (app-skelet oprettet — consumers/routing IKKE implementeret endnu)
    • voice (fælles voice-acting interface — stub)
  • Miljøfiler (.env.test, .env.prod skabeloner)
  • Konfig for MySQL test/prod

Fase 2 — Domænemodel (MVP)

  • GameSession (kode, host, status)
  • Player (nickname, session, score)
  • RoundConfig (kategori, K spørgsmål, point korrekt, point bluff)
  • Category
  • Question (prompt + korrekt svar + kategori)
  • LieAnswer (spillers løgn)
  • Guess (hvilket svar spiller valgte)
  • ScoreEvent (auditérbar pointslog)

Fase 3 — Spilflow Fup og Fakta

  • Lobby: host opretter session, spillere joiner via kode (REST)
  • Runde starter med kategori (REST)
  • Spørgsmål vises -> alle skriver løgn inden X sek (REST)
  • System blander korrekt svar + løgne (persisted i JSONField, anti-cheat dedup)
  • Guessfase: alle gætter inden Z sek (REST)
  • Pointudregning (konfigurerbar pr. runde, ScoreEvent audit trail)
  • Scoreboard + næste spørgsmål/runde (REST)
  • Slutresultat (REST)
  • 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

  • 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

  • (Need-to-have) Persistér mixed svarrækkefølge pr. round question — DONE (JSONField + migration 0003 + test)
  • (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
  • (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.