- setProjectTiming stores per-project overrides in round config; phase starts
resolve: explicit input > project override > round default
- Run Order rows get m:ss inputs per project; PhaseControls one-off overrides
now also m:ss (shared parseClock: '7:30', '12:05', plain '7')
- CRITICAL: round.update now MERGES validated form config over the existing
configJson — saving the Config tab was wiping projectOrder (would have
destroyed a running ceremony) and the finals-docs upload toggle
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Found by driving the full ceremony end-to-end in the browser:
- live.start + startPresentation sync LiveVotingSession (status/currentProjectId)
— jury votes silently failed when the admin never used sendToScreens
- LiveVotingForm no longer shows 'submitted' on a failed mutation; pages
re-key on votedAt so async vote data renders the right state after refresh
- reveal compose prefers DELIB_LOCKED deliberation results over jury score
order (listSessions now includes results); Arm unlocks right after save
- deliberation jury page review cards re-key on revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- submitVote resolves the caller's JuryGroupMember participant row server-side
(was comparing JuryGroupMember id to User id — every juror got FORBIDDEN)
- getSessionWithVotes now includes category projects so the ranking form has
data before finalize
- liveVoting.vote accepts any finale-ordered project (revision during
deliberation); timed window still applies to the live project
- live.sendToScreens keeps LiveVotingSession.currentProjectId/status in sync
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>