Source code for cadrumo.application.operations.persistence.events
"""Ordered, presentation-free event contracts for supervised operations."""from__future__importannotationsfromdatetimeimportdatetimefromtypingimportAnnotated,LiteralfrompydanticimportBaseModel,Field,NonNegativeInt,model_validatorfrom....core.errors.hierarchyimportpydantic_validation_boundaryfrom....core.heximportHex64Strfrom....core.identity.digestimportContentDigestfrom....core.modelsimportSTRICT_FROZEN_CONFIGfrom....core.operationsimportOperationEffect,OperationEventKindfrom....core.time.utcimportvalidate_utc_awarefrom..eventsimportOperationEventCode,OperationEventSequence,OperationLogSeverityfrom..modelsimport(OperationDiagnosticReference,OperationIdentity,OperationReconciliationOutcome,OperationRevision,OperationTerminalReceipt,)class_OperationEventBase(BaseModel):"""Identity and ordering shared by every operation event variant."""model_config=STRICT_FROZEN_CONFIGidentity:OperationIdentityrevision:OperationRevisionsequence:OperationEventSequencetimestamp:datetimecode:OperationEventCode@model_validator(mode="after")@pydantic_validation_boundarydef_validate_timestamp(self)->_OperationEventBase:validate_utc_aware(self.timestamp)returnself
[docs]classOperationPhaseEvent(_OperationEventBase):"""Record an operation phase transition at one durable event sequence."""kind:Literal[OperationEventKind.PHASE]=OperationEventKind.PHASEphase_code:OperationEventCode
[docs]classOperationProgressEvent(_OperationEventBase):"""Record bounded progress for one operation revision."""kind:Literal[OperationEventKind.PROGRESS]=OperationEventKind.PROGRESScompleted:NonNegativeInttotal:Annotated[int,Field(gt=0)]unit_code:OperationEventCode|None=None@model_validator(mode="after")def_validate_progress(self)->OperationProgressEvent:ifself.completed>self.total:raiseValueError("operation progress completed count cannot exceed total")returnself
[docs]classOperationLogRecord(_OperationEventBase):"""Structured log event carrying no prose or exception payload."""kind:Literal[OperationEventKind.LOG]=OperationEventKind.LOGseverity:OperationLogSeveritydiagnostic_ref:OperationDiagnosticReference|None=None
[docs]classOperationEffectEvent(_OperationEventBase):"""Record the externally visible effect reached by an operation."""kind:Literal[OperationEventKind.EFFECT]=OperationEventKind.EFFECTeffect:OperationEffect
[docs]classOperationNoticeEvent(_OperationEventBase):"""Stable notice identity; localized message text is a projection."""kind:Literal[OperationEventKind.NOTICE]=OperationEventKind.NOTICEnotice_code:OperationEventCode
[docs]classOperationReconciliationEvent(_OperationEventBase):"""One credential-free durable classification of startup reconciliation."""kind:Literal[OperationEventKind.RECONCILIATION]=OperationEventKind.RECONCILIATIONoutcome:OperationReconciliationOutcomelease_evidence_ref:ContentDigest
[docs]classOperationDiagnosticEvent(_OperationEventBase):"""Reference existing redacted diagnostics without duplicating capture."""kind:Literal[OperationEventKind.DIAGNOSTIC]=OperationEventKind.DIAGNOSTICdiagnostic_ref:OperationDiagnosticReference
[docs]classOperationInteractionEvent(_OperationEventBase):"""Safe lifecycle fact that identifies a pending or consumed interaction."""kind:Literal[OperationEventKind.INTERACTION]=OperationEventKind.INTERACTIONinteraction_id:Hex64Str
[docs]classOperationTerminalEvent(_OperationEventBase):"""Record the terminal receipt that settles an operation."""kind:Literal[OperationEventKind.TERMINAL]=OperationEventKind.TERMINALreceipt:OperationTerminalReceipt@model_validator(mode="after")def_validate_receipt(self)->OperationTerminalEvent:ifself.receipt.identity!=self.identity:raiseValueError("terminal event receipt identity does not match event")ifself.receipt.revision!=self.revision:raiseValueError("terminal event receipt revision does not match event")ifself.receipt.settled_at!=self.timestamp:raiseValueError("terminal event timestamp must equal receipt settlement time")returnself