[Need-to-have][Gameplay] Canonical FupOgFakta/WPP round flow aligned to bluff/guess/reveal loop #287
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Målret FupOgFakta/WPP gameplay-flowet, så det følger den klassiske bluff/guess/reveal-rytme tættere, men med egen formulering, egen struktur og egen identitet.
Mål
Spillet skal i praksis føles som dette overordnede forløb:
Vigtigt
Produktretning
Det vigtigste er ikke 1:1 feature-paritet, men at WPP's kerneforløb bliver tydeligt og sammenhængende:
Konkret leverance
Afklar og dokumentér:
Acceptance
Foreslået opdeling
Relateret:
PO-præcisering:
ARCHI-output for #287 — canonical WPP/FupOgFakta round-flow spec
Problem
Nuværende gameplay har de rigtige byggesten, men round loopet er stadig semantisk uklart som canonical WPP-flow:
lobby -> lie -> guess -> reveal -> finishedscoreboard-fasecalculate_scores+reveal_scoreboardstart round,show question,mix answers,calculate scores) fremfor tydeligt fase-drevetDet gør det sværere at bruge state/API som fælles source-of-truth for host, player og SPA-sync.
Expected value
En canonical round-flow-spec skal give:
Why now
Issue #287 er markeret need-to-have og epic. Repoet har allerede en del gameplay-API, men mismatch er synlig nu:
scoreboard-status, mens frontend allerede tester for densession_detaileksponerer kun blandede svar, ikke reveal-data om hvem der narrede hvemHvis flowet ikke canonicaliseres nu, vil host/player-SPA og videre gameplay-arbejde sandsynligvis cementere forskellige sandheder.
Canonical MVP round loop
Canonical WPP-rounden skal være:
Det skal opleves som én fast rytme for alle runder.
Canonical state/API-faser
0.
lobbyFormål:
Tilladt host-action:
start_round(category_slug)Tilladt player-action:
join_session(code, nickname)Udgangsbetingelse:
Resultat:
current_roundopretteslie1.
lieFormål:
Tilladt host-actions:
show_question()hvis round question ikke findes endnulock_lies / mix_answers()når host vil afslutte lie-vinduetTilladt player-actions:
submit_lie(round_question_id, text)præcis én gang pr. spillerObligatorisk state-data:
round_questionUdgangsbetingelse:
Resultat:
guess2.
guessFormål:
Tilladt host-action:
lock_guesses / calculate_scores()når guess-vinduet er slutTilladt player-action:
submit_guess(round_question_id, selected_text)præcis én gang pr. spillerObligatorisk state-data:
Udgangsbetingelse:
Resultat:
reveal3.
revealFormål:
Tilladt host-action:
advance_to_scoreboard()/ equivalent explicit transitionTilladt player-action:
Obligatoriske reveal-steps i MVP:
round_questionObligatorisk output-model:
correct_answerplayer_id/nickname + textplayer_id/nickname + selected_text + is_correct + fooled_player_idUdgangsbetingelse:
Resultat:
scoreboard4.
scoreboardFormål:
Tilladt host-actions:
start_next_round()finish_game()Tilladt player-action:
Obligatoriske scoreboard-steps i MVP:
Udgangsbetingelse:
Resultat:
lobbymedcurrent_round + 1finished5.
finishedFormål:
Tilladt host/player-action:
Host-actions pr. fase
lobby: start roundlie: show question, derefter lock lies / mix answersguess: lock guesses / calculate scoresreveal: fortsæt til scoreboardscoreboard: start næste runde eller afslut spilfinished: ingen gameplay-mutationPlayer-actions pr. fase
lobby: joinlie: submit lieguess: submit guessreveal: se korrekt svar + hvem der narrede hvemscoreboard: se stillingfinished: se slutresultatReveal/score: obligatorisk separation
Canonical WPP skal skelne mellem reveal og scoreboard.
Reveal er ikke det samme som scoreboard
Reveal svarer på:
Scoreboard svarer på:
MVP-beslutning
MVP må gerne beregne score inden reveal vises, men den samlede stilling må først præsenteres i
scoreboard-fasen.Det betyder:
calculate_scores()må gerne skabe score-events som del af overgangenguess -> revealreveal -> scoreboardsession.statusskal derfor kunne bære begge faserMVP vs senere polish
MVP (need-to-have)
lobby,lie,guess,reveal,scoreboard,finishedrevealtilscoreboardSenere polish
Kort gap-analyse mod nuværende implementation
Det der allerede matcher godt
RoundConfig,RoundQuestion,LieAnswer,Guess,ScoreEventlobby -> lie -> guess -> revealfindes alleredemix_answers()flytter fra lie til guesscalculate_scores()beregner både korrekte gæt og bluff-point og flytter til revealstart_next_round()ogfinish_game()findes alleredeDe vigtigste gaps
Ingen canonical
scoreboard-status i backendFrontend phase-machine bruger
scoreboard, menGameSession.Statusgør ikke.Reveal-payload er utilstrækkelig
session_detailgiver prompt og evt. mixed answers, men ikke canonical reveal-data om korrekt svar, løgne og hvem der narrede hvem.reveal_scoreboarder et sidekald, ikke en faseovergangScoreboard findes som GET-endpoint i
reveal, men ikke som selvstændig state med egen host-gating.Host-flowet er teknisk men ikke canonical
Handlinger er API-tekniske (
show question,mix answers,calculate scores) i stedet for tydeligt knyttet til canonical faseansvar og obligatoriske output.Frontend/backend phase drift er allerede synlig i tests
frontend/src/spa/gameplay-phase-machine.tskenderscoreboard; backendsession.statusgør ikke. Det bør stoppes nu, ikke senere.Arkitekturbeslutning / source-of-truth
Jeg anbefaler, at WPP canonicaliseres som:
lobby | lie | guess | reveal | scoreboard | finishedguess -> reveal= lock guesses + beregn score-events + fastfrys reveal-datareveal -> scoreboard= eksplicit host-transitionscoreboard -> lobby= næste rundescoreboard -> finished= afslut spilDet er den mindste model, der bevarer bluff/guess/reveal-rytmen tydeligt uden at gøre MVP for tung.
READY dev-opgaver oprettet
Staging smoke-status (2026-03-15 22:17 UTC)
infra/staging/smoke_suite.sh: PASSmanage.py smoke_staging), session:5TV9CFBemærkning: der var ingen tidligere smoke-artifacts i staging før denne kørsel, så testen blev kørt som første smoke efter den observerede deploy.
Proposed canonical source-of-truth for #287 after local code review (
lobby/views.py,fupogfakta/models.py, SPA host/player shells, gameplay-phase-machine, MVP docs).Decision
Vi bør låse ét canonical round flow for Fup og Fakta/WPP:
LOBBY -> BLUFF -> GUESS -> REVEAL -> SCOREBOARD -> (NEXT_ROUND -> BLUFF) | FINISHEDDet vigtige er, at "round" betyder bluff/guess/reveal/scoreboard-loopet. Lobby er kun pre-round setup. Scoreboard er post-round recap. Reveal + score er ikke valgfri host-knapper; det er en obligatorisk del af loopet.
Canonical phase model
0. LOBBY / ROUND SETUP
Formål: få spillere ind, vælge kategori/konfiguration, og starte næste spørgsmål.
Host actions
Player actions
Server invariants
Canonical exit condition
BLUFFmed aktivt spørgsmål.1. BLUFF
Formål: alle spillere indsender præcis én løgn til det aktive spørgsmål.
Host actions
Player actions
Server invariants
correct answer + gyldige løgne, dedupet/canonicalized.Canonical exit condition
GUESS.2. GUESS
Formål: alle spillere vælger ét svar fra den blandede svarliste.
Host actions
Player actions
Server invariants
Canonical exit condition
REVEAL.3. REVEAL (mandatory)
Formål: vise udfaldet af runden i fast rækkefølge og gøre score-ændringer forklarlige.
Dette er en obligatorisk canonical del af loopet. Ingen runde må hoppe direkte fra GUESS til SCOREBOARD uden reveal.
Minimum mandatory reveal/score steps (MVP)
Host actions
Player actions
Server invariants
Canonical exit condition
SCOREBOARD.MVP note
Polish note
REVEAL_LIE_n+REVEAL_TRUTHmed timers/animationer.4. SCOREBOARD
Formål: vise den opdaterede leaderboard efter den afsluttede round.
Host actions
Player actions
Server invariants
Canonical exit conditions
Next round-> nyt spørgsmål/runde starter tilbage iBLUFF(ikke tilbage til en diffus mellemtilstand i samme runde-loop).Finish game->FINISHED.5. FINISHED
Formål: vise endelig leaderboard/winner og afslutte sessionen.
Host actions
Player actions
Canonical action ownership by phase
Det centrale designvalg her er: host driver kun round boundaries, ikke interne bluff/guess/reveal/score transitions.
MVP vs polish
MVP (need-to-have for #287)
Start roundfor at gå fra lobby/setup til aktiv BLUFF med valgt spørgsmål.Next roundogFinish gameer de eneste post-scoreboard host-valg.Polish / senere iteration
REVEAL_LIE_1..nogREVEAL_TRUTH.Gap analysis vs current implementation
Kort version: nuværende kode er tæt på den rigtige grovform, men den er stadig host-step/manual-control-orienteret i stedet for canonical round-loop-orienteret.
1.
show_questioner en ekstra host-gate som ikke bør være canonicalstart_round()sætter status tillie, men spørgsmålet oprettes først i separatshow_question().Start roundskal aktivere BLUFF med et konkret spørgsmål i samme flow.2.
mix_answerser stadig en host-manuel overgangmix_answers()for at gå fralietilguess.3.
calculate_scoreser stadig en host-manuel overgangcalculate_scores()for at gå fraguesstilreveal.4.
reveal_scoreboardgør scoreboard til en fetch/host-step i stedet for stateGET /scoreboard.5. Current status machine afspejler ikke hele den ønskede source-of-truth
lobby/lie/guess/reveal/scoreboard/finished, hvilket er brugbart, men semantics er stadig manuelle.6. Host/player UI bærer stadig developer-control-panel spor
show question,mix answers,calculate scores,load scoreboardsom primære handlinger.start,next,finish) + read-only progress i mellem-faserne.7. MVP docs og runtime implementation er ikke helt aligned om round semantics
docs/F0_MVP_FUP_OG_FAKTA.mdsiger i praksis “system vælger/spørgsmål -> spillere lyver -> system mixer -> spillere gætter -> scoreboard”.docs/UI_SMOKE.mdog nuværende kode beskriver derimod et mere manuelt host-koreograferet flow.8. Constraint drift: spillerantal matcher ikke docs
3-12 spillere._build_phase_view_model()håndhæver aktueltmin=3,max=5i UI surface.Concrete outcome for downstream dev/review
Når nogen efterfølgende bygger/reviewer mod #287, bør de bruge denne testbare regel:
Suggested dev lanes (max 2)
Lane A — Backend/server phase ownership
Scope
Flyt canonical ownership af transitions fra host-manual endpoints til server-side round lifecycle.
Acceptance
Start roundaktiverer konkret spørgsmål + BLUFF uden separatshow_question-krav.mix_answerssom canonical path.calculate_scores/load_scoreboardsom canonical path.Required artifact
#287.Lane B — Host/player UX alignment to canonical flow
Scope
Fjern developer-panel semantics fra host/player shells og align UI til canonical phase ownership.
Acceptance
Start round,Next round,Finish game.show/mix/calculate/load.Required artifact
#287.Hvis vi vil holde WIP lav, vil jeg anbefale at tage Lane A først, fordi den låser source-of-truth i server-state og gør efterfølgende UI-review langt mindre tvetydig.
Architect status sync: the epic is no longer blocked on missing executable decomposition. Child tasks were created as #300/#301/#302; delivery has landed via merged PRs #305, #303, and #304. Remaining work on #287 should now be tracked as new follow-up child tasks only, not by reusing stale blocker issues.
Architect status sync: created a new READY follow-up wave under #287 after the previous child tasks (#300/#301/#302) were exhausted. New executable work:
Older stale blockers/governance artifacts (#290, #292, #293, #294, #307) were closed to reduce backlog noise and make the live queue reflect actual next work.
Architecture safeguard: #311 is now an explicit companion issue to this gameplay epic. The canonical round flow work must not further entrench FupOgFakta-specific phase logic inside
lobby/. New gameplay changes under #287 should preserve or improve the cartridge boundary, not deepen the drift.Architect fast-progress wave added for immediate pickup:
These are intentionally small, mergeable slices aimed at reducing coupling and speeding up current gameplay/architecture progress.