Skip to content

fix(release-vote-tally): keep email-only roster voters distinct - #28

Draft
MakerFlyFly wants to merge 1 commit into
mainfrom
fix/vote-tally-empty-apache-id
Draft

MakerFlyFly wants to merge 1 commit into
mainfrom
fix/vote-tally-empty-apache-id

Conversation

@MakerFlyFly

@MakerFlyFly MakerFlyFly commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Keep roster members without an Apache ID distinct by using the existing normalized-address identity. Primary-email binding continues to work, and members with nonempty IDs retain their roster identities.
  • Prevent both false failures (three approvals reduced to one) and false passes (three dissenting votes reduced to one).
  • Add seven regression cases for all mechanisms, repeated votes with different casing/display names, a mixed-roster tie, and the CLI reviews/login-map/result-render path.

Type of change

  • Python package (tools/release-management)
  • Skill change
  • Tool / bridge contract
  • Documentation
  • Project template
  • CI / dev loop

Test plan

  • All seven new regression cases fail on upstream 30ee18c2 before the fix and pass afterward.
  • Linux / Python 3.12: release-management package — 718 tests and 11 subtests pass.
  • Ruff check, Ruff format check, and mypy — pass for all 64 package source/test files.
  • prek run --all-files --skip workspace-pytest — passes, including lychee, symlink checks, and workspace-wide static checks.
  • prek run workspace-pytest --from-ref origin/main --to-ref HEAD — passes.
  • Standard commit hooks — pass without bypass.
  • Magpie pre-first-pr-check — all five categories PASS, ready, zero blockers.
  • Spec-sync check: the existing conservative tally contract remains applicable; this repairs its implementation without adding a capability.
  • Windows / Python 3.14: all seven new regression cases pass.
  • Skill prompts, CLI arguments, JSON fields, eligibility rules, and voting thresholds are unchanged; pytest is the regression-test layer for this deterministic change.

Independent follow-up verification

  • Vote-tally module: 102 tests and 3 subtests pass.
  • All seven new regression cases fail when the original identity function from PR base 30ee18c is restored in memory; the source files are not rewritten.
  • A separately generated, fixed-seed boundary check passes 3,000 cases / 42,764 vote records (seed 20261030). Its expected voter groups use synthetic person IDs and input order, independently of the implementation's identity resolver.

RFC-AI-0004 compliance

  • HITL — the result and next label remain proposals for RM confirmation.
  • Vendor neutrality — supported email-only rosters no longer require a fabricated Apache ID.

Linked issues

Closes #27.

Notes for reviewers

The two failure examples use synthetic identities. A missing ID does not remove binding status: eligibility is still resolved independently through the primary email.

Audit-report handle resolution is outside this PR. No release action or merge is performed by this change. Upstream submission is linked below.

Windows full-package validation limits

With UTF-8 enabled and Git Bash on the test process PATH, the full package reports 716 passed, 2 failed (11 subtests passed). The baseline checkout at 634ab08 reports 709 passed and the same two failures; Git comparison confirms the relevant packages are unchanged between that checkout and PR base 30ee18c.

  • The successful custom-build integration case expects an archive tree note of "identical to the repository tree", but receives "differs from the repository tree".
  • The shell round-trip case for a literal backslash followed by $HOME fails on the native Windows subprocess-to-sh -c argument path. Passing the same dq-generated command through sh -s standard input round-trips correctly; w succeeds through both paths.

These baseline failures do not involve voter identity. The Linux full-package run and the actual GitHub test task pass. Windows compatibility work is outside this counting fix.

AI disclosure and human audit

AI-assisted work prepared with Codex (GPT-6). The contributor has completed review of the patch and validation results and authorized upstream submission. This fork Draft PR is retained as the audit snapshot.

Upstream submission

Roster membership can resolve through Primary email without an Apache ID.
Using the empty ID as a shared identity let different members supersede
each other, causing both missing approvals and missing dissenting votes.

Use the existing normalized-address identity when the Apache ID is absent.
Keep roster-ID identities, binding resolution, and pass rules unchanged.

Generated-by: Codex (GPT-6)
@MakerFlyFly MakerFlyFly added bug Something isn't working capability:fix Implement code change to resolve an issue family:release-management release-* skills labels Oct 30, 2026 — with ChatGPT Codex Connector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working capability:fix Implement code change to resolve an issue family:release-management release-* skills family:tools substrate:release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

vote-tally: roster members without Apache IDs overwrite each other's votes

1 participant