Skip to content

fix(i18n): stop promising BetterVoting emails the voting links - #1559

Open
masiarek wants to merge 1 commit into
Equal-Vote:mainfrom
masiarek:fix/wizard-email-list-copy
Open

masiarek wants to merge 1 commit into
Equal-Vote:mainfrom
masiarek:fix/wizard-email-list-copy

Conversation

@masiarek

Copy link
Copy Markdown
Collaborator

Description

Fixes #1558 — option 1, the smallest change that makes the product honest.

The email-list option in the election wizard currently tells admins:

BetterVoting will create private voting links and send them by email once the election starts

It doesn't. Nothing is sent automatically — not on finalize, not on opening.

Changed to describe what actually happens, keeping the parallel shape of the neighbouring id_list_description ("Provide X. <what happens>"):

Provide voter emails. BetterVoting creates a private voting link for each voter, ready for you to send from the Voters tab

Why this matters more than a wording nit

An admin who believes the wizard finalizes, waits for the start time, and runs the entire voting window without a single voter being told. Nothing warns them — there's no error, and the Voters tab shows the roll exactly as expected throughout. The failure is only visible once the election is over.

Verified against source

  • finalizeElectionController.ts changes state, defaults max_rankings, deletes draft ballots. No email call.
  • No scheduler exists — no cron, node-schedule or interval anywhere under packages/backend/src — so nothing could fire "once the election starts" either.
  • The only send paths are sendInvitesController.ts / sendEmailController.ts, both admin-invoked.

Scope

en.yaml only. es, pl and pt-BR don't define this key and fall back to English, so no translation is left promising the old behaviour.

The string is consumed in two places — the wizard's voter-access step, and the security-option card via $t(wizard.email_list_description) — and reads correctly in both. YAML validated.

Notes for the reviewer

Not fixed here, deliberately: the card renders as …from the Voters tab Recommended to maximize security. — no separator, because the string has no trailing period and $t() concatenates directly. That run-on exists today with the old copy, and identically on the sibling id_list_description card. It's a pre-existing formatting quirk affecting both cards, so it seemed better as its own small change than smuggled into a copy fix. Happy to include it if you'd prefer.

#1558 also raises two larger options — sending on finalize, or prompting to send as part of the finalize flow (probably the best UX, since the flow already routes admins to the Voters tab). This change doesn't preclude either; it just stops the UI making a promise nothing keeps in the meantime.

Screenshots / Videos (frontend only)

Text-only i18n change, no layout impact. The string appears in two places during election creation: the voter-access step of the wizard, and the "Email list" security-option card. Happy to add screenshots if useful.

Related Issues

Fixes #1558. Context in #1556 — two help pages had transcribed this copy faithfully and stated invitations are sent automatically; both are now corrected.

The email-list option in the election wizard told admins:

  'BetterVoting will create private voting links and send them by email once
   the election starts'

BetterVoting does not send them. Nothing goes out automatically -- not on
finalize, not on opening. finalizeElectionController changes state, defaults
max_rankings and deletes draft ballots; it contains no email call. There is no
cron, node-schedule or interval anywhere in packages/backend/src, so nothing
could fire 'once the election starts' either. The only send paths are the
admin-invoked sendInvites / sendEmail routes.

An admin who believes the wizard finalizes, waits for the start time, and runs
the entire voting window without a single voter being told. Nothing warns them:
there is no error, and the Voters tab looks exactly as expected throughout.

Changes the string to describe what actually happens, keeping the parallel
shape of the neighbouring id_list_description ('Provide X. <what happens>'):

  'Provide voter emails. BetterVoting creates a private voting link for each
   voter, ready for you to send from the Voters tab'

en.yaml only -- es, pl and pt-BR do not define this key and fall back to
English, so no translation is left promising the old behaviour. The string is
consumed in two places (the wizard step, and the security-option card via
(wizard.email_list_description)) and reads correctly in both.

This is option 1 from Equal-Vote#1558, the smallest change that makes the product honest.
That issue also raises two larger alternatives -- sending on finalize, or
prompting to send as part of the finalize flow -- which are worth considering
separately; this does not preclude either.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@netlify

netlify Bot commented Aug 17, 2026

Copy link
Copy Markdown

Deploy Preview for bettervoting ready!

Name Link
🔨 Latest commit 9bd582d
🔍 Latest deploy log https://app.netlify.com/projects/bettervoting/deploys/6a82e05f1833e100081a849b
😎 Deploy Preview https://deploy-preview-1559--bettervoting.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@masiarek, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 13 minutes

Limit details: You’ve used all 1 included review currently available under your plan.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 552ff935-144d-402a-bc74-fd7759c33573

📥 Commits

Reviewing files that changed from the base of the PR and between 7bc75a8 and 9bd582d.

📒 Files selected for processing (1)
  • packages/frontend/src/i18n/en.yaml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Election wizard promises BetterVoting will email voting links automatically; nothing is ever sent

1 participant