89 lines
1.8 KiB
Python
89 lines
1.8 KiB
Python
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))
|