Checklist

9 of 12 complete
  • Generalize the Rust ballot model to binary voting over one typed proposal/point source and selection voting over two to 100 ordered typed sources. Support the internal choice name `abstain` for both families, disabled by default and presented with simpler localized UI wording. Support pointwise voting as sequential binary point runs and the legacy choose-one-of-several-points ballot without separate ballot variants, while retaining immutable per-run electorates and one open run per meeting.
  • Implement and verify the Rails start-run boundary: every Start voting action computes a fresh electorate and casting-voter subset from current VotingRight records; two sequential runs in the same case may receive different electorates, while each Rust run remains immutable until End voting. Do not capture electorate at case/meeting start or add post-start synchronization.
  • Implement and verify idempotent secretary lifecycle operations for manual votes with voter override, unanimous outcomes without fabricated ballots, open-run cancellation, closed-run supersession, casting-weight apply/reset, proposal/point reset/end state, audit visibility, and proposal/speaker locks that can be reopened between runs.
  • Expose the typed ballot model in the existing secretary and politician UI: selectable points support single-point, proposal-versus-point, point-versus-point and choose-one-of-several-points starts; ordered typed source payloads, shared checkbox rendering, responsive selection state, voting controls and lifecycle refreshes work without duplicating proposal/point flows.
  • Restore shared politician, confidential, public-info and big-screen presentation with correct visibility, audience-safe best-effort broadcasts and reload recovery.
  • Enable only valid single-proposal binary bias runs through the shared Rust ballot path; validate and freeze the Rails bias intent; reconcile decided Rust outcomes into Rails voting-right/declaration state through one transactional durable receipt, honoring immediate and wait-for-all settings; reconcile before every later run so its electorate is rebuilt; allow cancellation/unresolved supersession but reject supersession or casting reset after a bias result is decided; verify lost-response/reload retries, duplicate reconciliation, ties/unanimous outcomes, replacement/vacancy/rejection chains, delayed batches, and subsequent electorates.
  • Restore protocol, interactive report, DOCX and research exports from Rust and complete a restartable verified migration of the agreed legacy voting history.
  • Pass Rust/PostgreSQL concurrency and constraint tests, Rails/JS/reporting/migration regressions, authenticated browser parity/recovery checks, translations, documentation, observability and representative capacity/release gates.
  • Ensure secretary close/cancel refreshes Rust run discovery at the mutation boundary so a stale request-local list cache cannot report `no_active_voting`; cover the failed-first-attempt regression.
  • Prevent proposal lifecycle callbacks from broadcasting transient unavailable voting controls before a terminal Rust bias outcome is reconciled; retain normal proposal broadcasts and genuine outage warnings.
  • Restore the exact legacy bigscreen voting presentation from Rust snapshots, with one 500 ms server-side revision poller per open run, coalesced broadcasts, terminal shutdown, authenticated reload recovery, and no per-vote or browser polling.
  • Restore public-page ongoing and completed voting from Rust snapshots, including signed anonymous public-reader scope, legacy public poll cards, visibility-safe live broadcasts through the existing 500 ms revision poller, terminal lifecycle updates, outage handling, and reload recovery.
Area
Kaukus
Kind
Feature
Priority
High
Task ID
tsk_86ysxcpr3h
Updated