from typing import List, Optional from pydantic import BaseModel, Field from datetime import datetime class Source(BaseModel): type: str uri: str confidence: Optional[float] = None class Signal(BaseModel): name: str value: float provenance: Optional[dict] = None class Provenance(BaseModel): trace_id: str signer: Optional[str] = None ledger_anchor: Optional[str] = None class NarrativeBlock(BaseModel): id: str topic: str timestamp: datetime sources: List[Source] = Field(default_factory=list) signals: List[Signal] = Field(default_factory=list) sentiment: Optional[float] = None risk_factors: List[str] = Field(default_factory=list) scenario_flags: List[str] = Field(default_factory=list) provenance: Optional[Provenance] = None class Config: # make JSON serialization deterministic for replay json_sort_keys = True