"""Governance primitives for BeXProof policy changes.""" from __future__ import annotations from typing import Dict, Set class Governance: def __init__(self, signers: Set[str] = None, required: int = 2): self.signers = set(signers or {"alice", "bob", "carol"}) self.required = max(1, min(len(self.signers), required)) self.proposals: Dict[str, Dict] = {} self.approvals: Dict[str, Set[str]] = {} def propose(self, policy_id: str, policy_text: str) -> None: self.proposals[policy_id] = {"policy": policy_text, "approved": False} self.approvals[policy_id] = set() def approve(self, policy_id: str, signer: str) -> bool: if signer not in self.signers: return False if policy_id not in self.proposals: return False self.approvals[policy_id].add(signer) if len(self.approvals[policy_id]) >= self.required: self.proposals[policy_id]["approved"] = True return True def is_approved(self, policy_id: str) -> bool: return bool(self.proposals.get(policy_id, {}).get("approved", False))