Skip to content

docs: rewrite the ties page around who actually reads it - #1553

Open
masiarek wants to merge 1 commit into
Equal-Vote:mainfrom
masiarek:docs/ties-rewrite
Open

masiarek wants to merge 1 commit into
Equal-Vote:mainfrom
masiarek:docs/ties-rewrite

Conversation

@masiarek

Copy link
Copy Markdown
Collaborator

Description

The ties page is reached four different ways and currently serves one of them. This rewrites it for all four — without moving the page or changing the anchor the app links to.

## Random Tie-breakers is preserved character-for-character. en.yaml sends voters to ties.html#random-tie-breakers when a tie is broken, so that heading is load-bearing and the section has to stand alone — a voter arriving from the results page reads it cold, with nothing above it.

What changed

The shuffle is now explained rather than deferred. The old page said ties are broken "randomly" and pointed at the source tree. But shuffleCandidatesForRandomTiebreak.ts opens with "I'm putting this in a separate file so that the documentation is easy to reference" — the mechanism was written up for the docs and never picked up. The truth is much better than the summary:

  • the shuffle is deterministic by design — re-running the count always gives the same order
  • the full order, not just the winner, is shown on the results page and included in the download
  • the algorithm was chosen to be language-agnostic specifically so results can be reproduced

That turns a contested tie from something a candidate must accept into something they can check.

Adds the raw-vs-tally caveat from the same source comment — the shuffle uses the raw ballot count, while the results page shows a tally count excluding uncountable ballots. Anyone verifying a tie-break needs to know which applies.

New section: ties in small and test elections. Where nearly everyone meets their first tie. One point is documented nowhere: the tie-break order changes with every ballot cast, because the ballot count feeds the shuffle — so an order seen while testing is not the order the real election produces. And test ballots are deleted at finalize, so the real election starts from zero regardless. Also warns that a deliberately tied test election is a poor test, since it exercises the tie-breaking path rather than the count.

Widens it past STAR. It was titled "STAR Voting Ties", but BetterVoting offers seven methods and the most common tie in practice is the last seat in a multi-winner race.

Not documented, deliberately: the break_ties_randomly setting. It appears in one place — a display toggle for the results title — and does not control whether ties are broken randomly. Documenting it would mean guessing at intent. Flagging it here instead.

Verification. Local build: page renders, and id="random-tie-breakers" is present in the output, so the in-app link keeps working.

Screenshots / Videos (frontend only)

n/a — documentation.

Related Issues

None.

The page is reached four different ways and served one of them. Rewrites it
for all four, without moving the page or changing the anchor the app links to.

The `## Random Tie-breakers` heading is preserved exactly. en.yaml sends voters
to ties.html#random-tie-breakers when a tie is broken, so that heading text is
load-bearing and the section has to stand alone -- a voter arriving from the
results page reads it cold, with nothing above it.

What changed and why:

- The old page described the shuffle as breaking the tie "randomly" and pointed
  readers at the source tree for details. shuffleCandidatesForRandomTiebreak.ts
  opens with "I'm putting this in a separate file so that the documentation is
  easy to reference" -- the mechanism was written up for the docs and never
  picked up. The page now explains it, because the truth is much better than
  the summary: the shuffle is DETERMINISTIC by design, re-running the count
  always gives the same order, the full order (not just the winner) is shown on
  the results page and included in the download, and the algorithm was chosen
  to be language-agnostic so anyone can reproduce it. That turns a contested
  tie from something a candidate must accept into something they can check.

- Adds the raw-vs-tally caveat from the same source comment: the shuffle uses
  the RAW ballot count, while the results page shows a tally count that excludes
  uncountable ballots. Anyone checking the result needs to know which number
  applies.

- New section on ties in small and test elections, which is where nearly
  everyone meets their first tie. Three things, one of which is documented
  nowhere: the tie-break order changes with EVERY ballot cast, because the
  ballot count feeds the shuffle -- so an order seen while testing is not the
  order the real election will produce. And since test ballots are deleted at
  finalize, the real election starts from zero ballots regardless. Also warns
  that a deliberately tied test election is a poor test, since it exercises the
  tie-breaking path rather than the count.

- Widens the page past STAR. It was titled "STAR Voting Ties", but BetterVoting
  offers seven methods and the most common tie in practice is for the last seat
  in a multi-winner race.

- States plainly that a rule agreed in advance is what makes a tie-break
  defensible -- any rule chosen beforehand beats the best rule chosen after the
  votes are in.

Deliberately NOT documented: the break_ties_randomly setting. It appears in one
place, a display toggle for the results title, and does not control whether ties
are broken randomly. Documenting it would require guessing at intent.

Verified with a local build: the page renders, and id="random-tie-breakers" is
still present in the output so the in-app link keeps working.

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 1e7f0d0
🔍 Latest deploy log https://app.netlify.com/projects/bettervoting/deploys/6a82706d7e915a00082169f9
😎 Deploy Preview https://deploy-preview-1553--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: 26 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: 2ae59a4a-860a-4256-adc2-7ed342a31234

📥 Commits

Reviewing files that changed from the base of the PR and between 7bc75a8 and 1e7f0d0.

📒 Files selected for processing (1)
  • docs/help/ties.md

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.

1 participant