Input hardening from a full security review (bandit, pip-audit, wheel inspection, manual exploit-class review, live stdio probing):
- Reject non-finite floats (
Infinity/NaN, which JSON parsers accept) on ballot weights and score values — these previously reached the rules and produced nan/inf scores or a silently-wrong winner. - Cap ballot weights at 1e12 so no within-bounds sum can overflow to infinity.
- Bound profile size (1,000 candidates / 100,000 ballots) — the pairwise tally is O(candidates²), an OOM vector.
- Add SECURITY.md documenting the pure-compute posture.
No known vulnerabilities in dependencies (pip-audit clean); wheel ships only voting_mcp/.