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.
Semantic Changes
6 symbols
Files Changed
+1
~3
1100 in snapshot
0 comments
muse hub commit comment sha256:4461d2674257c5b59a460e0ec23d3680462662e9837ef25b675489d2e42cb994 --body "your comment"
No comments yet. Be the first to start the discussion.