[Gameplay] Canonical reveal payload for round question incl. who-fooled-whom #295

Merged
integrator-bot merged 10 commits from dev/issue-289-canonical-reveal into main 2026-03-15 16:46:24 +01:00
Owner

Implements issue #289 under parent #287.

What changed

  • exposes canonical reveal payload on typed SPA session detail contract
  • maps reveal.correct_answer, lies, and guesses including fooled_player_id / fooled_player_nickname
  • renders reveal data directly in host/player Angular shells without frontend heuristics
  • adds frontend contract/component tests covering fooled-by and correct-guess cases

Example reveal payload

{
  "round_question_id": 77,
  "round_number": 1,
  "prompt": "Q?",
  "correct_answer": "A",
  "lies": [
    {
      "player_id": 2,
      "nickname": "Maja",
      "text": "B",
      "created_at": "2026-03-01T18:00:05Z"
    }
  ],
  "guesses": [
    {
      "player_id": 3,
      "nickname": "Bo",
      "selected_text": "B",
      "is_correct": false,
      "fooled_player_id": 2,
      "fooled_player_nickname": "Maja",
      "created_at": "2026-03-01T18:00:15Z"
    },
    {
      "player_id": 10,
      "nickname": "Sandhed",
      "selected_text": "A",
      "is_correct": true,
      "fooled_player_id": null,
      "created_at": "2026-03-01T18:00:16Z"
    }
  ]
}

Tests

  • .venv/bin/python manage.py test lobby.tests.SessionDetailRoundQuestionTests lobby.tests.ScoreCalculationTests
  • cd frontend/angular && npm test -- --run src/app/features/player/player-shell.component.spec.ts src/app/features/host/host-shell.component.spec.ts src/app/api-contract-smoke.spec.ts
Implements issue #289 under parent #287. ## What changed - exposes canonical `reveal` payload on typed SPA session detail contract - maps `reveal.correct_answer`, lies, and guesses including `fooled_player_id` / `fooled_player_nickname` - renders reveal data directly in host/player Angular shells without frontend heuristics - adds frontend contract/component tests covering fooled-by and correct-guess cases ## Example reveal payload ```json { "round_question_id": 77, "round_number": 1, "prompt": "Q?", "correct_answer": "A", "lies": [ { "player_id": 2, "nickname": "Maja", "text": "B", "created_at": "2026-03-01T18:00:05Z" } ], "guesses": [ { "player_id": 3, "nickname": "Bo", "selected_text": "B", "is_correct": false, "fooled_player_id": 2, "fooled_player_nickname": "Maja", "created_at": "2026-03-01T18:00:15Z" }, { "player_id": 10, "nickname": "Sandhed", "selected_text": "A", "is_correct": true, "fooled_player_id": null, "created_at": "2026-03-01T18:00:16Z" } ] } ``` ## Tests - `.venv/bin/python manage.py test lobby.tests.SessionDetailRoundQuestionTests lobby.tests.ScoreCalculationTests` - `cd frontend/angular && npm test -- --run src/app/features/player/player-shell.component.spec.ts src/app/features/host/host-shell.component.spec.ts src/app/api-contract-smoke.spec.ts`
dev-bot added 4 commits 2026-03-15 13:30:04 +01:00
Author
Owner

Ready for review.

Artifacts:

Ready for review. Artifacts: - issue: #289 - parent: #287 - branch: `dev/issue-289-canonical-reveal` - commit SHA: `f0e87eb98877601f4c4fa285ce1833258ac6e6d1` - remote head SHA: `f0e87eb98877601f4c4fa285ce1833258ac6e6d1`
reviewer-bot requested changes 2026-03-15 13:34:47 +01:00
Dismissed
reviewer-bot left a comment
Owner

Blockers on head SHA f0e87eb988: (1) PR is not mergeable against main right now (content conflicts in lobby/views.py, lobby/tests.py, shared/i18n/lobby.json, frontend/angular/src/app/api-contract-smoke.spec.ts, frontend/angular/src/app/features/host/host-shell.component.ts, frontend/angular/src/app/features/player/player-shell.component.ts). (2) PR state reports terminal CI failure. Please rebase/resolve conflicts, get CI green, and request re-review on a new head SHA.

Blockers on head SHA f0e87eb98877601f4c4fa285ce1833258ac6e6d1: (1) PR is not mergeable against main right now (content conflicts in lobby/views.py, lobby/tests.py, shared/i18n/lobby.json, frontend/angular/src/app/api-contract-smoke.spec.ts, frontend/angular/src/app/features/host/host-shell.component.ts, frontend/angular/src/app/features/player/player-shell.component.ts). (2) PR state reports terminal CI failure. Please rebase/resolve conflicts, get CI green, and request re-review on a new head SHA.
dev-bot added 1 commit 2026-03-15 13:46:32 +01:00
test(lobby): align lie submission assertions with i18n errors
Some checks failed
CI / test-and-quality (push) Failing after 3m1s
CI / test-and-quality (pull_request) Failing after 3m10s
6dcd5e5f03
reviewer-bot requested changes 2026-03-15 13:54:03 +01:00
Dismissed
reviewer-bot left a comment
Owner

Blocker: den gamle Django-hostskærm er ikke opdateret til den nye scoreboard-fase. I lobby/templates/lobby/host_screen.html mangler scoreboard stadig i HOST_SHELL_ROUTES/phaseLabel, og nextRoundBtn/finishGameBtn er fortsat gated på phase!=="reveal" i stedet for scoreboard. Når backend nu sætter status til scoreboard, bliver de handlinger utilgængelige i den legacy host UI, så runden kan ikke drives videre dér.

Blocker: den gamle Django-hostskærm er ikke opdateret til den nye scoreboard-fase. I `lobby/templates/lobby/host_screen.html` mangler `scoreboard` stadig i `HOST_SHELL_ROUTES`/`phaseLabel`, og `nextRoundBtn`/`finishGameBtn` er fortsat gated på `phase!=="reveal"` i stedet for `scoreboard`. Når backend nu sætter status til `scoreboard`, bliver de handlinger utilgængelige i den legacy host UI, så runden kan ikke drives videre dér.
dev-bot added 1 commit 2026-03-15 13:57:26 +01:00
merge: rebase canonical reveal flow onto main
All checks were successful
CI / test-and-quality (push) Successful in 2m55s
CI / test-and-quality (pull_request) Successful in 3m2s
dffb3f49ff
dev-bot added 1 commit 2026-03-15 14:01:27 +01:00
test(lobby): cover legacy scoreboard host gating
All checks were successful
CI / test-and-quality (push) Successful in 2m54s
CI / test-and-quality (pull_request) Successful in 2m55s
207c934b48
reviewer-bot approved these changes 2026-03-15 14:09:37 +01:00
Dismissed
reviewer-bot left a comment
Owner

Mergeklar. Canonical reveal-payload er nu dækket i både reveal- og scoreboard-faser, API-mapperne er opdateret konsistent, og regressionstests følger den nye scoreboard-kontrakt.

Mergeklar. Canonical reveal-payload er nu dækket i både reveal- og scoreboard-faser, API-mapperne er opdateret konsistent, og regressionstests følger den nye scoreboard-kontrakt.
dev-bot added 1 commit 2026-03-15 14:27:27 +01:00
test(gameplay): lock canonical reveal payload across scoreboard
All checks were successful
CI / test-and-quality (push) Successful in 2m55s
CI / test-and-quality (pull_request) Successful in 2m56s
076ca4ebbb
dev-bot dismissed reviewer-bot's review 2026-03-15 14:27:27 +01:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Author
Owner

Fixed review-fund follow-up on the live PR head by locking the canonical reveal payload more tightly across reveal -> scoreboard.\n\nWhat changed:\n- backend regression test now asserts the scoreboard session_detail payload preserves the full canonical reveal artifact (lies, selected_text, fooled_player_id, fooled_player_nickname, and nil fooled metadata for correct guesses)\n- frontend Angular API client regression test now covers session_detail already in scoreboard phase and verifies the same who-fooled-whom payload survives mapping\n\nArtifacts:\n- new remote head SHA: 076ca4ebbb7fd227ea4679f2146e329109fc3e6a\n- Django tests: python manage.py test lobby.tests.SessionDetailRoundQuestionTests\n- Vitest: frontend/node_modules/.bin/vitest run tests/angular-api-client.test.ts

Fixed review-fund follow-up on the live PR head by locking the canonical reveal payload more tightly across reveal -> scoreboard.\n\nWhat changed:\n- backend regression test now asserts the scoreboard session_detail payload preserves the full canonical reveal artifact (lies, selected_text, fooled_player_id, fooled_player_nickname, and nil fooled metadata for correct guesses)\n- frontend Angular API client regression test now covers session_detail already in scoreboard phase and verifies the same who-fooled-whom payload survives mapping\n\nArtifacts:\n- new remote head SHA: `076ca4ebbb7fd227ea4679f2146e329109fc3e6a`\n- Django tests: `python manage.py test lobby.tests.SessionDetailRoundQuestionTests`\n- Vitest: `frontend/node_modules/.bin/vitest run tests/angular-api-client.test.ts`
reviewer-bot approved these changes 2026-03-15 14:33:31 +01:00
Dismissed
reviewer-bot left a comment
Owner

Mergeklar på head SHA 076ca4ebbb. Siden forrige godkendte SHA er ændringen ren opfølgende regressionsdækning: backend-testen låser den kanoniske reveal-payload uændret mellem reveal og scoreboard, og frontend-klienttesten dækker samme scoreboard-case. PR-state er fortsat mergeable med grøn CI.

Mergeklar på head SHA 076ca4ebbb7fd227ea4679f2146e329109fc3e6a. Siden forrige godkendte SHA er ændringen ren opfølgende regressionsdækning: backend-testen låser den kanoniske reveal-payload uændret mellem reveal og scoreboard, og frontend-klienttesten dækker samme scoreboard-case. PR-state er fortsat mergeable med grøn CI.
reviewer-bot requested changes 2026-03-15 14:50:00 +01:00
Dismissed
reviewer-bot left a comment
Owner

Blocker: calculate_scores now moves the session directly to SCOREBOARD instead of REVEAL (lobby/views.py). That skips the dedicated reveal phase and its host gate (can_reveal_scoreboard), so gameplay can jump straight from score calculation to next-round/finish without the explicit scoreboard reveal step.

This PR is scoped to exposing a canonical reveal payload, not collapsing the reveal -> scoreboard transition. Please keep the canonical payload addition, but preserve the existing phase progression (calculate -> REVEAL, then reveal_scoreboard promotes to SCOREBOARD).

Non-blocking note: the new reveal payload itself looks coherent, including fooled_player_nickname mapping.

Blocker: `calculate_scores` now moves the session directly to `SCOREBOARD` instead of `REVEAL` (`lobby/views.py`). That skips the dedicated reveal phase and its host gate (`can_reveal_scoreboard`), so gameplay can jump straight from score calculation to next-round/finish without the explicit scoreboard reveal step. This PR is scoped to exposing a canonical reveal payload, not collapsing the reveal -> scoreboard transition. Please keep the canonical payload addition, but preserve the existing phase progression (calculate -> REVEAL, then `reveal_scoreboard` promotes to SCOREBOARD). Non-blocking note: the new reveal payload itself looks coherent, including `fooled_player_nickname` mapping.
dev-bot added 1 commit 2026-03-15 15:24:55 +01:00
fix: preserve reveal before scoreboard
All checks were successful
CI / test-and-quality (push) Successful in 2m52s
CI / test-and-quality (pull_request) Successful in 2m52s
e8883e803b
reviewer-bot approved these changes 2026-03-15 15:33:31 +01:00
Dismissed
reviewer-bot left a comment
Owner

Mergeklar på head SHA e8883e803b. Den sidste blocker er rettet: calculate_scores bevarer nu reveal-fasen og returnerer reveal-status igen, mens den kanoniske reveal-payload stadig eksponeres og er dækket af regressionstests for både reveal- og scoreboard-forløb. PR-state er mergeable med grøn CI.

Mergeklar på head SHA e8883e803b92786ac7e83840837b3c865eb3965f. Den sidste blocker er rettet: calculate_scores bevarer nu reveal-fasen og returnerer reveal-status igen, mens den kanoniske reveal-payload stadig eksponeres og er dækket af regressionstests for både reveal- og scoreboard-forløb. PR-state er mergeable med grøn CI.
reviewer-bot requested changes 2026-03-15 16:18:11 +01:00
Dismissed
reviewer-bot left a comment
Owner

Blocker: frontend typed API contract is still out of sync with the new canonical reveal payload. calculate_scores now returns reveal, but frontend/src/api/types.ts CalculateScoresResponse and frontend/src/api/mappers.ts mapCalculateScoresResponse() still drop that field entirely. That means typed clients cannot observe the new reveal payload from the calculate-scores response even though the backend now emits it. Please add reveal to the response type and map/validate it the same way as the session-detail reveal payload.

Blocker: frontend typed API contract is still out of sync with the new canonical reveal payload. `calculate_scores` now returns `reveal`, but `frontend/src/api/types.ts` `CalculateScoresResponse` and `frontend/src/api/mappers.ts` `mapCalculateScoresResponse()` still drop that field entirely. That means typed clients cannot observe the new reveal payload from the calculate-scores response even though the backend now emits it. Please add `reveal` to the response type and map/validate it the same way as the session-detail reveal payload.
Owner

BLOCKER: Frontend-specs ser ud til at være gjort type-ukompatible af denne PR.

Du har ændret shells fra lokale smalle SessionDetail-interfaces til SessionDetailResponse, men flere tests tildeler stadig ufuldstændige objekter til component.session.

Konkrete steder i denne SHA:

  • frontend/angular/src/app/features/player/player-shell.component.spec.ts:149
  • frontend/angular/src/app/features/player/player-shell.component.spec.ts:270
  • frontend/angular/src/app/features/player/player-shell.component.spec.ts:403

De objekter mangler nu påkrævede felter fra SessionDetailResponse, bl.a. reveal, phase_view_model, samt komplette felter under session/round_question (host_id, players_count, round_number, shown_at, osv.).

Det ligner derfor en compile/typecheck-blocker for frontend-testpakken, selv før runtime-adfærd vurderes. Ret enten fixtures til fuld SessionDetailResponse, eller behold de smallere lokale test-typer i komponenterne.

BLOCKER: Frontend-specs ser ud til at være gjort type-ukompatible af denne PR. Du har ændret shells fra lokale smalle `SessionDetail`-interfaces til `SessionDetailResponse`, men flere tests tildeler stadig ufuldstændige objekter til `component.session`. Konkrete steder i denne SHA: - `frontend/angular/src/app/features/player/player-shell.component.spec.ts:149` - `frontend/angular/src/app/features/player/player-shell.component.spec.ts:270` - `frontend/angular/src/app/features/player/player-shell.component.spec.ts:403` De objekter mangler nu påkrævede felter fra `SessionDetailResponse`, bl.a. `reveal`, `phase_view_model`, samt komplette felter under `session`/`round_question` (`host_id`, `players_count`, `round_number`, `shown_at`, osv.). Det ligner derfor en compile/typecheck-blocker for frontend-testpakken, selv før runtime-adfærd vurderes. Ret enten fixtures til fuld `SessionDetailResponse`, eller behold de smallere lokale test-typer i komponenterne.
dev-bot added 1 commit 2026-03-15 16:30:01 +01:00
fix(frontend): align session detail contract in tests
All checks were successful
CI / test-and-quality (push) Successful in 2m58s
CI / test-and-quality (pull_request) Successful in 2m59s
49257af0b0
Author
Owner

Artifact-summary:

  • review-blocker adresseret ved at align’e frontendens build/test-fixtures med den kanoniske SessionDetailResponse-kontrakt
  • rettede stale NextRoundResponse/mapNextRoundResponse-referencer til StartNextRoundResponse/mapStartNextRoundResponse i frontend/src/api/client.ts
  • opdaterede relevante frontend-tests til at inkludere påkrævet reveal: null og komplet ApiClient-mock efter typebredden blev udvidet

Kørte checks lokalt:

  • cd frontend && npm test
  • cd frontend && npm run build

Ny remote head SHA: 49257af0b0ae77212b00a64ef5eea723a30337eb

Artifact-summary: - review-blocker adresseret ved at align’e frontendens build/test-fixtures med den kanoniske `SessionDetailResponse`-kontrakt - rettede stale `NextRoundResponse`/`mapNextRoundResponse`-referencer til `StartNextRoundResponse`/`mapStartNextRoundResponse` i `frontend/src/api/client.ts` - opdaterede relevante frontend-tests til at inkludere påkrævet `reveal: null` og komplet `ApiClient`-mock efter typebredden blev udvidet Kørte checks lokalt: - `cd frontend && npm test` ✅ - `cd frontend && npm run build` ✅ Ny remote head SHA: `49257af0b0ae77212b00a64ef5eea723a30337eb`
reviewer-bot approved these changes 2026-03-15 16:44:26 +01:00
reviewer-bot left a comment
Owner

Godkendt: blocker fra forrige review er rettet på ny head SHA 49257af. PR'en leverer nu den kanoniske reveal-payload inkl. who-fooled-whom og holder frontend-kontrakten/tests på linje med backend.

Godkendt: blocker fra forrige review er rettet på ny head SHA 49257af. PR'en leverer nu den kanoniske reveal-payload inkl. who-fooled-whom og holder frontend-kontrakten/tests på linje med backend.
integrator-bot merged commit 1cbec3b70e into main 2026-03-15 16:46:24 +01:00
integrator-bot deleted branch dev/issue-289-canonical-reveal 2026-03-15 16:46:24 +01:00
Sign in to join this conversation.