from typing import Dict, List, Optional, Any from pydantic import BaseModel, Field, constr from datetime import datetime class PoeticCert(BaseModel): """Compact PoeticCert schema. Fields: - invariants: free-form list of invariant descriptors (strings or structured) - resource_limits: optional resource constraints - replica_intent_hash: hex string hash of the intent being certified - expected_receipt: optional acceptance witness - attester_signatures: mapping signer_id -> signature (base64 or hex) - issued_at: timestamp """ invariants: List[Any] resource_limits: Optional[Dict[str, Any]] = None replica_intent_hash: constr(min_length=1) expected_receipt: Optional[Dict[str, Any]] = None attester_signatures: Dict[str, str] = Field(default_factory=dict) issued_at: datetime = Field(default_factory=datetime.utcnow) class TraceEvent(BaseModel): seq: int timestamp: datetime message: str meta: Optional[Dict[str, Any]] = None class ReplayBundle(BaseModel): """Deterministic ReplayBundle reference format. Fields: - trace: sequence of TraceEvent - monitors: signed attestations produced by monitors - evidence_root: a top-level digest (hex) that represents merkle/root of evidence - artifacts: optional dict of artifact_name -> digest """ trace: List[TraceEvent] monitors: Dict[str, str] = Field(default_factory=dict) evidence_root: constr(min_length=1) artifacts: Optional[Dict[str, str]] = None class BondRecord(BaseModel): escrow_id: str issuer: str stake_amount: float policy_hash: Optional[str] = None ttl: Optional[datetime] = None created_at: datetime = Field(default_factory=datetime.utcnow) status: str = "active" # active, settled, cancelled class ClaimSubmission(BaseModel): claim_id: str evidence_root: str claimant: str timestamp: datetime = Field(default_factory=datetime.utcnow) details: Optional[Dict[str, Any]] = None