novaplan-decentralized-priv.../nova_plan/contracts.py

76 lines
2.0 KiB
Python

"""Simple data contracts used by NovaPlan MVP.
- PlanDelta: delta between local and global plans.
- SharedSchedule: aggregated schedule signals from agents.
- ResourceUsage: energy, time, or other resource consumptions.
- PrivacyBudget: basic DP-like budget for an agent (simulated).
- AuditLog: lightweight log entries for governance.
"""
from __future__ import annotations
from dataclasses import dataclass, asdict
from typing import Dict, Any, List
import json
@dataclass
class PlanDelta:
agent_id: str
delta: Dict[str, float]
timestamp: float
def to_json(self) -> str:
return json.dumps(asdict(self))
@dataclass
class SharedSchedule:
schedule: Dict[str, Any]
timestamp: float
@dataclass
class ResourceUsage:
agent_id: str
resources: Dict[str, float]
timestamp: float
@dataclass
class PrivacyBudget:
agent_id: str
budget: float
timestamp: float
@dataclass
class AuditLog:
entry_id: str
message: str
timestamp: float
def serialize(obj: object) -> str:
if hasattr(obj, "__dict__"):
return json.dumps(obj.__dict__)
return json.dumps(obj)
# Lightweight contract registry for versioning and interoperability
class ContractRegistry:
_registry: Dict[str, int] = {}
@classmethod
def register(cls, name: str, version: int) -> None:
cls._registry[name] = int(version)
@classmethod
def version_of(cls, name: str, default: int | None = None) -> int | None:
return cls._registry.get(name, default)
# Auto-register core contracts for quick interoperability in MVP workflows.
# This ensures a minimal, versioned contract surface is available as soon as
# the module is imported, which benefits tooling and adapters that rely on
# contract versioning without requiring explicit setup code in downstream
# components.
for _name, _ver in [
("PlanDelta", 1),
("SharedSchedule", 1),
("ResourceUsage", 1),
("PrivacyBudget", 1),
("AuditLog", 1),
]:
ContractRegistry.register(_name, _ver)