diff --git a/services/agent/governance/__init__.py b/services/agent/governance/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/services/agent/governance/audit.py b/services/agent/governance/audit.py new file mode 100644 index 00000000..afe35876 --- /dev/null +++ b/services/agent/governance/audit.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass, field +from datetime import datetime, UTC + + +@dataclass +class LearningAuditRecord: + agent_id: str + event: str + previous_score: float + new_score: float + reason: str + created_at: datetime = field( + default_factory=lambda: datetime.now(UTC) + ) + + +class LearningAuditTrail: + def __init__(self): + self.records = [] + + def record(self, audit: LearningAuditRecord): + self.records.append(audit) + + def latest(self): + return self.records[-1] if self.records else None diff --git a/services/agent/governance/policy.py b/services/agent/governance/policy.py new file mode 100644 index 00000000..32d4b3a8 --- /dev/null +++ b/services/agent/governance/policy.py @@ -0,0 +1,18 @@ +from dataclasses import dataclass + + +@dataclass +class LearningPolicy: + reward_threshold: float = 0.8 + allow_evolution: bool = True + + +class LearningPolicyEngine: + def __init__(self, policy: LearningPolicy | None = None): + self.policy = policy or LearningPolicy() + + def evaluate(self, reward: float) -> bool: + if not self.policy.allow_evolution: + return False + + return reward >= self.policy.reward_threshold diff --git a/tests/agent/test_learning_governance.py b/tests/agent/test_learning_governance.py new file mode 100644 index 00000000..9089486d --- /dev/null +++ b/tests/agent/test_learning_governance.py @@ -0,0 +1,31 @@ +from services.agent.governance.audit import ( + LearningAuditRecord, + LearningAuditTrail, +) +from services.agent.governance.policy import ( + LearningPolicyEngine, +) + + +def test_learning_audit_record(): + trail = LearningAuditTrail() + + record = LearningAuditRecord( + agent_id="AEON-001", + event="reward_update", + previous_score=0.8, + new_score=0.95, + reason="accuracy_improved", + ) + + trail.record(record) + + assert trail.latest().agent_id == "AEON-001" + assert trail.latest().new_score == 0.95 + + +def test_learning_policy(): + engine = LearningPolicyEngine() + + assert engine.evaluate(0.95) is True + assert engine.evaluate(0.5) is False