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)) @dataclass class AggregatedSignal: """Cross-venue aggregated signal with privacy budgeting.""" venue_set: List[str] feature_vector: Dict[str, float] privacy_budget_used: float nonce: int = 0 merkle_proof: List[str] = field(default_factory=list) def to_json(self) -> str: return to_json(asdict(self)) @dataclass class PlanDelta: """Incremental updates to analytics plans (e.g., reweighting, windows).""" delta_id: str venue: str timestamp: int delta: Dict[str, Any] version: int = 1 def to_json(self) -> str: return to_json(asdict(self))