gabriel / musehub public
fix BREAKING fix/227-i3-naming-collision #1 / 1
AI Agent gabriel · 2 days ago · Oct 22, 2026 · Diff

fix: resolve "I3" naming collision between push_validator.py and quorum.py (musehub#227)

Companion to #225 (dead-code cleanup) and #226 (I2 hard-error question), surfaced during the same identity-domain invariant investigation.

Two non-reconciled definitions of "I3" existed for the identity domain:

A) musehub/graph/push_validator.py — per-edge signature authorization. Does the right party's Ed25519 signature appear in authorized_by for a spawns/member_of edge, with a bootstrap exception for an org's founding member and a min(quorum, prior_members) signature-count rule for subsequent joins. Real, wired into wire_push, actually rejects bad pushes.

B) musehub/graph/quorum.py — recursive weighted-vote tallying. An org's vote inside a parent org counts only if that org's own quorum is independently satisfied. Real, tested, never called by anything outside its own module/tests (#225).

A third "quorum" (musehub/services/musehub_governance.py::check_quorum — proposal-review approval counting against governance config) was audited and confirmed NOT to collide: it shares the English word but no number or label with A/B, and was never actually confused with either. No change needed there.

Resolution (per the ticket's own suggestion, since A is the one actually enforced): push_validator.py keeps the "I3" label. quorum.py's module docstring is renamed away from "I3" entirely — to "Recursive org-vote quorum tallying" — without deleting the code itself; whether this mechanism is kept, wired in, or deleted as dead code remains #225's decision, not this ticket's. Added a cross-reference note to push_validator.py's own docstring naming it as the canonical I3 definition, and noting quorum.py no longer claims that label.

tests/test_graph_quorum.py's own module docstring (which also claimed "I3") updated to match.

New tests/test_quorum_naming_collision.py (3 tests): push_validator.py's docstring claims I3+Authorization; quorum.py's docstring no longer claims I3 as its own label (explanatory prose mentioning "I3" while describing the resolution is fine — only a leading-line label claim counts, so the test doesn't choke on its own cross-reference text); the two modules never both claim I3 at once.

Confirmed genuine RED: before the fix, 2 of 3 tests failed exactly reproducing the reported collision (quorum.py's docstring claimed I3; both modules claimed it simultaneously) — restored, all 3 green.

Regression: 161 tests across the full identity/graph/quorum test suites (cycle, depth, quorum, service, push_validator, quorum_enforcement, belt_and_suspenders, integration) — all green, no regressions.

musehub/plugins/identity/plugin.py's docstring (which pointed at the WRONG definition — "I3 Quorum soundness," i.e. definition B, the dead one) ships separately in the muse repo as part of the same musehub#227 ticket.

sha256:4461d2674257c5b59a460e0ec23d3680462662e9837ef25b675489d2e42cb994 sha
+6 symbols
4 changed · 1100 in snapshot files
sha256:c9f2c040e0d9f7ef51c3be19cef1460e1df7c0790bbba60d05b263660d31a2b5 snapshot
+6
symbols added
4
files changed
1100
files in snapshot
0
dead code introduced
Semantic Changes 6 symbols
+ _claims_label function function _claims_label L22–33
+ annotations import import annotations L17–17
+ re import import re L19–19
+ test_push_validator_module_docstring_claims_i3_authorization function function test_push_validator_module_docstring_claims_i3_authorization L36–42
+ test_quorum_and_push_validator_docstrings_do_not_both_claim_i3 function function test_quorum_and_push_validator_docstrings_do_not_both_claim_i3 L63–73
+ test_quorum_module_no_longer_claims_i3 function function test_quorum_module_no_longer_claims_i3 L45–60
Files Changed
+1 ~3
1100 in snapshot
← Older Oldest on fix/227-i3-naming-collision
All commits
Newer → Latest on fix/227-i3-naming-collision

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:4461d2674257c5b59a460e0ec23d3680462662e9837ef25b675489d2e42cb994 --body "your comment"