from __future__ import annotations import json from dataclasses import dataclass, asdict, field from typing import Any, Dict, List, Optional def to_json(obj: Any) -> str: return json.dumps(obj, default=lambda o: o.__dict__, sort_keys=True) @dataclass class Signal: venue: str timestamp: int # unix epoch ms metrics: Dict[str, Any] # privacy-budget bounded features version: int = 1 def to_json(self) -> str: return to_json(asdict(self)) @dataclass class SignalDelta: venue: str timestamp: int delta: Dict[str, Any] version: int = 1 def to_json(self) -> str: return to_json(asdict(self)) @dataclass class ProvenanceProof: venue: str timestamp: int merkle_root: str proof_path: List[str] = field(default_factory=list) def to_json(self) -> str: return to_json(asdict(self)) @dataclass class PrivacyBudget: venue: str limit: float # e.g., max entropy to reveal used: float = 0.0 def to_json(self) -> str: return to_json(asdict(self)) @dataclass class AuditLog: event: str timestamp: int details: Dict[str, Any] = field(default_factory=dict) def to_json(self) -> str: return to_json(asdict(self))