## Summary
Implements issue #180 scope in Angular SPA gameplay flow by hardening host/player round transitions and documenting evidence.
### What changed
- Player SPA now auto-refreshes session state on a short cadence while online, preventing host/player state desync after host starts next round.
- Added timer lifecycle cleanup on offline/destroy to avoid stale sync loops.
- Added focused regression test for no-reload next-round sync behavior.
- Added issue evidence document: `docs/issue-180-flow-log.md` with flow log + test output snapshot.
### Acceptance mapping
- Host can start next round from scoreboard without page reload: validated in host specs and flow log.
- Final leaderboard stays in SPA flow: covered in host/player specs and flow log.
- Error path with retry/feedback: existing next-round/finish retry paths retained and covered by specs.
- Evidence included: flow log + test output in docs.
## Checks
- `npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts` ✅ (13/13 tests passing)
Closes #180
blocker: returnToJoin() nulstiller ikke stateSyncTimer i player-shell.component.ts.
Konsekvens: Hvis auto-refresh timeren allerede er planlagt, kan den stadig fyre efter brugeren har trykket Back to join og dermed trigge refreshSession() igen i baggrunden. Det kan re-hydrere session-state utilsigtet og undergrave den eksplicitte reset/escape-flow.
Forslag til fix:
Kald this.clearStateSyncTimer() i starten af returnToJoin() (samme sted som reconnect-timer ryddes).
Bevar/tilføj en test der verificerer at ingen periodisk refresh sker efter returnToJoin().
severity: blocker
blocker: `returnToJoin()` nulstiller ikke `stateSyncTimer` i `player-shell.component.ts`.
Konsekvens: Hvis auto-refresh timeren allerede er planlagt, kan den stadig fyre efter brugeren har trykket **Back to join** og dermed trigge `refreshSession()` igen i baggrunden. Det kan re-hydrere session-state utilsigtet og undergrave den eksplicitte reset/escape-flow.
Forslag til fix:
- Kald `this.clearStateSyncTimer()` i starten af `returnToJoin()` (samme sted som reconnect-timer ryddes).
- Bevar/tilføj en test der verificerer at ingen periodisk refresh sker efter `returnToJoin()`.
severity: blocker
Scheduler handoff (PR-FIRST): review-fund detected from official REVIEW (REQUEST_CHANGES). Retask to DEV for fix before any new feature work.
Blocker summary:
returnToJoin() must clear stateSyncTimer to avoid background refresh after reset.
Artifact-gate (binding):
Baseline head SHA: ec73ef3030adb146530d51c010cb28c41d0fac34
Completion requires NEW head SHA + commit hash in same update.
Unchanged head SHA => not fixed; keep blocker state and retask.
No merge/approval actions from scheduler role.
Scheduler handoff (PR-FIRST): review-fund detected from official REVIEW (REQUEST_CHANGES). Retask to DEV for fix before any new feature work.
Blocker summary:
- `returnToJoin()` must clear `stateSyncTimer` to avoid background refresh after reset.
Artifact-gate (binding):
- Baseline head SHA: `ec73ef3030adb146530d51c010cb28c41d0fac34`
- Completion requires NEW head SHA + commit hash in same update.
- Unchanged head SHA => not fixed; keep blocker state and retask.
No merge/approval actions from scheduler role.
Verified on head a3da7ed974: prior blocker is resolved. returnToJoin() now clears stateSyncTimer before state reset, preventing background refreshSession() after Back to join.
Validation rerun:
npm test -- --run src/app/features/player/player-shell.component.spec.ts (7/7)
npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts (13/13)
No remaining blockers found.
Verified on head a3da7ed974ed80855f47ed2835ce8b1ee852ba7d: prior blocker is resolved. returnToJoin() now clears stateSyncTimer before state reset, preventing background refreshSession() after Back to join.
Validation rerun:
- npm test -- --run src/app/features/player/player-shell.component.spec.ts (7/7)
- npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts (13/13)
No remaining blockers found.
Review summary (head a3da7ed974ed80855f47ed2835ce8b1ee852ba7d): prior blocker is resolved. returnToJoin() now clears stateSyncTimer, preventing background refresh after Back to join.
Validation rerun:
npm test -- --run src/app/features/player/player-shell.component.spec.ts (7/7)
npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts (13/13)
No remaining blocker/should-fix findings from this review pass.
Review summary (head `a3da7ed974ed80855f47ed2835ce8b1ee852ba7d`): prior blocker is resolved. `returnToJoin()` now clears `stateSyncTimer`, preventing background refresh after Back to join.
Validation rerun:
- `npm test -- --run src/app/features/player/player-shell.component.spec.ts` (7/7)
- `npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts` (13/13)
No remaining blocker/should-fix findings from this review pass.
Merge-forsøg via API: POST /pulls/197/merge gav 405 med svar Please try again later
PR-felt mergeable er false
Kan ikke merge under integrator-regler før PR er mergebar. Bedes opdatere/rebase branch og køre checks igen, derefter kan merge forsøges på ny.
Integrator-runner status (2026-03-01 17:37 UTC):
Blokeret for merge.
- Required checks: `success`
- Approval: fundet (`reviewer-bot` APPROVED)
- Merge-forsøg via API: `POST /pulls/197/merge` gav `405` med svar `Please try again later`
- PR-felt `mergeable` er `false`
Kan ikke merge under integrator-regler før PR er mergebar. Bedes opdatere/rebase branch og køre checks igen, derefter kan merge forsøges på ny.
Scheduler handoff (PR-FIRST, mergeability blocker):
PR #197 har grønne checks + approval, men er ikke mergebar (`mergeable=false`, API merge gav 405/"Please try again later").
Retask til DEV-FIX (prioritet før ny merge/review):
- Bring branch i mergebar tilstand mod `main` (rebase/merge fra main efter behov).
- Løs evt. skjulte konflikt-/mergeability-problemer uden at ændre feature-scope.
- Kør relevante checks og opdatér PR med kort evidens.
ARTIFACT-GATE (bindende):
- Baseline head SHA før run: `a3da7ed974ed80855f47ed2835ce8b1ee852ba7d`
- Completion kræver nyt head SHA + commit hash i status-kommentar.
- Uændret head SHA => ikke løst; behold blocker og retask.
Acceptance:
1) PR #197 bliver mergebar (`mergeable=true`),
2) required checks er fortsat grønne,
3) head SHA ændret ift. baseline.
No scope changes beyond making the branch cleanly mergeable on top of main.
Checks run
npm test -- src/app/features/player/player-shell.component.spec.ts
Result: ✅ 1 file passed, 9 tests passed.
Artifact gate report (binding)
Baseline head SHA: a3da7ed974ed80855f47ed2835ce8b1ee852ba7d
New head SHA: cb9ef8e627795592f015c0bc031b34a8260a575a
New commit hash (top commit): cb9ef8e627795592f015c0bc031b34a8260a575a
Gate verdict: ✅ PASS (head SHA changed from baseline and includes new commit hash in this report)
Current PR mergeability from API: mergeable=true.
Dev-fix retask completed for mergeability (no feature-scope expansion).
## What I changed
- Rebased `feat/issue-180-next-round-final-leaderboard` onto latest `main`.
- Resolved one rebase conflict in:
- `frontend/angular/src/app/features/player/player-shell.component.ts`
- Conflict resolution kept both intended behaviors:
- localStorage-backed session context resolver
- state-sync timer lifecycle helpers (`clearStateSyncTimer` / `scheduleStateSync`)
- No scope changes beyond making the branch cleanly mergeable on top of `main`.
## Checks run
- `npm test -- src/app/features/player/player-shell.component.spec.ts`
- Result: ✅ 1 file passed, 9 tests passed.
## Artifact gate report (binding)
- Baseline head SHA: `a3da7ed974ed80855f47ed2835ce8b1ee852ba7d`
- New head SHA: `cb9ef8e627795592f015c0bc031b34a8260a575a`
- New commit hash (top commit): `cb9ef8e627795592f015c0bc031b34a8260a575a`
- Gate verdict: ✅ PASS (head SHA changed from baseline and includes new commit hash in this report)
Current PR mergeability from API: `mergeable=true`.
Official review (head cb9ef8e627): prior blocker around state-sync reset is fixed (returnToJoin() clears reconnect/state-sync timers), coverage updated, CI green. APPROVED for merge.
Official review (head cb9ef8e627795592f015c0bc031b34a8260a575a): prior blocker around state-sync reset is fixed (`returnToJoin()` clears reconnect/state-sync timers), coverage updated, CI green. APPROVED for merge.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Implements issue #180 scope in Angular SPA gameplay flow by hardening host/player round transitions and documenting evidence.
What changed
docs/issue-180-flow-log.mdwith flow log + test output snapshot.Acceptance mapping
Checks
npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts✅ (13/13 tests passing)Closes #180
blocker:
returnToJoin()nulstiller ikkestateSyncTimeriplayer-shell.component.ts.Konsekvens: Hvis auto-refresh timeren allerede er planlagt, kan den stadig fyre efter brugeren har trykket Back to join og dermed trigge
refreshSession()igen i baggrunden. Det kan re-hydrere session-state utilsigtet og undergrave den eksplicitte reset/escape-flow.Forslag til fix:
this.clearStateSyncTimer()i starten afreturnToJoin()(samme sted som reconnect-timer ryddes).returnToJoin().severity: blocker
Scheduler handoff (PR-FIRST): review-fund detected from official REVIEW (REQUEST_CHANGES). Retask to DEV for fix before any new feature work.
Blocker summary:
returnToJoin()must clearstateSyncTimerto avoid background refresh after reset.Artifact-gate (binding):
ec73ef3030adb146530d51c010cb28c41d0fac34No merge/approval actions from scheduler role.
Implemented requested blocker fix from review on PR #197.
Changes made:
Validation:
Artifact gate:
ec73ef3030a3da7ed974a3da7ed974Verified on head
a3da7ed974: prior blocker is resolved. returnToJoin() now clears stateSyncTimer before state reset, preventing background refreshSession() after Back to join.Validation rerun:
No remaining blockers found.
Official review: blocker resolved and tests pass on head
a3da7ed974.Review summary (head
a3da7ed974ed80855f47ed2835ce8b1ee852ba7d): prior blocker is resolved.returnToJoin()now clearsstateSyncTimer, preventing background refresh after Back to join.Validation rerun:
npm test -- --run src/app/features/player/player-shell.component.spec.ts(7/7)npm test -- --run src/app/features/host/host-shell.component.spec.ts src/app/features/player/player-shell.component.spec.ts(13/13)No remaining blocker/should-fix findings from this review pass.
Integrator-runner status (2026-03-01 17:37 UTC):
Blokeret for merge.
successreviewer-botAPPROVED)POST /pulls/197/mergegav405med svarPlease try again latermergeableerfalseKan ikke merge under integrator-regler før PR er mergebar. Bedes opdatere/rebase branch og køre checks igen, derefter kan merge forsøges på ny.
Scheduler handoff (PR-FIRST, mergeability blocker):
PR #197 har grønne checks + approval, men er ikke mergebar (
mergeable=false, API merge gav 405/"Please try again later").Retask til DEV-FIX (prioritet før ny merge/review):
main(rebase/merge fra main efter behov).ARTIFACT-GATE (bindende):
a3da7ed974ed80855f47ed2835ce8b1ee852ba7dAcceptance:
mergeable=true),a3da7ed974tocb9ef8e627New commits pushed, approval review dismissed automatically according to repository settings
Dev-fix retask completed for mergeability (no feature-scope expansion).
What I changed
feat/issue-180-next-round-final-leaderboardonto latestmain.frontend/angular/src/app/features/player/player-shell.component.tsclearStateSyncTimer/scheduleStateSync)main.Checks run
npm test -- src/app/features/player/player-shell.component.spec.tsArtifact gate report (binding)
a3da7ed974ed80855f47ed2835ce8b1ee852ba7dcb9ef8e627795592f015c0bc031b34a8260a575acb9ef8e627795592f015c0bc031b34a8260a575aCurrent PR mergeability from API:
mergeable=true.Official review (head
cb9ef8e627): prior blocker around state-sync reset is fixed (returnToJoin()clears reconnect/state-sync timers), coverage updated, CI green. APPROVED for merge.submit