The epic now has backend-first canonical round flow, but dev still needs a concrete child task for ensuring the client only exposes actions that are legal in the current canonical phase. Without this, the backend may be correct while the UX still permits invalid or confusing interactions.
Expected value / why now
This creates the next mergeable slice directly after backend canonicalisation: align client behaviour with the server-driven phase model so the game loop becomes predictably playable rather than only internally consistent.
Acceptance criteria
Host/player UI derives allowed actions from canonical phase state rather than ad hoc local assumptions.
During , , , and , the client hides or disables actions that are illegal for that phase.
A narrow automated test (component/integration/contract as appropriate) proves at least one illegal action is blocked in each non-matching phase.
No regression to the existing reveal/scoreboard payload contract merged under #289/#298.
PR references #287 and documents which UI actions are intentionally gated in each phase.
Scope boundary
Not a visual redesign.
Not copy/i18n polish unless required by touched views.
Not websocket/protocol redesign outside the phase-action contract already exposed by backend state.
Parent epic: #287
## Problem statement
The epic now has backend-first canonical round flow, but dev still needs a concrete child task for ensuring the client only exposes actions that are legal in the current canonical phase. Without this, the backend may be correct while the UX still permits invalid or confusing interactions.
## Expected value / why now
This creates the next mergeable slice directly after backend canonicalisation: align client behaviour with the server-driven phase model so the game loop becomes predictably playable rather than only internally consistent.
## Acceptance criteria
- Host/player UI derives allowed actions from canonical phase state rather than ad hoc local assumptions.
- During , , , and , the client hides or disables actions that are illegal for that phase.
- A narrow automated test (component/integration/contract as appropriate) proves at least one illegal action is blocked in each non-matching phase.
- No regression to the existing reveal/scoreboard payload contract merged under #289/#298.
- PR references #287 and documents which UI actions are intentionally gated in each phase.
## Scope boundary
- Not a visual redesign.
- Not copy/i18n polish unless required by touched views.
- Not websocket/protocol redesign outside the phase-action contract already exposed by backend state.
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.
Parent epic: #287
Problem statement
The epic now has backend-first canonical round flow, but dev still needs a concrete child task for ensuring the client only exposes actions that are legal in the current canonical phase. Without this, the backend may be correct while the UX still permits invalid or confusing interactions.
Expected value / why now
This creates the next mergeable slice directly after backend canonicalisation: align client behaviour with the server-driven phase model so the game loop becomes predictably playable rather than only internally consistent.
Acceptance criteria
Scope boundary
Resolved: delivered via merged PR #303 (client action gating from canonical phase state). Closing the task issue to reduce stale READY noise.