Skip to content

symfonic.services.shadow.cutover

cutover

The cutover-criteria recorder.

Two kinds of capability reach cutover by two different roads, and the point of this recorder is that a capability cannot quietly take the wrong one.

  • A capability whose extensions are all port-mediated may present shadow evidence: a comparison report from an effect-suppressed run.
  • A capability that depends on an opaque tool, plugin, or contributed stage is non-shadowable. Its evidence must come through the non-shadow path โ€” parity suites, characterization, and live cutover criteria โ€” and filing shadow evidence for it is refused, not warned about.

Every port-mediated trust assignment is recorded here too, with its named human reviewer, because that is where the acceptance criterion says the approval must live.

CutoverCriteriaRecorder

CutoverCriteriaRecorder(trust: ExtensionTrustRegistry)

Files cutover evidence and enforces which path a capability may use.

Source code in src/symfonic/services/shadow/cutover.py
def __init__(self, trust: ExtensionTrustRegistry) -> None:
    self._trust = trust
    self._evidence: dict[str, CutoverEvidence] = {}
    self._approvals: list[TrustApproval] = []

CutoverEvidence dataclass

CutoverEvidence(capability: str, path: CutoverPath, recorded_at: datetime, criteria: dict[str, Any] = dict(), opaque_dependencies: tuple[str, ...] = (), comparison: ComparisonReport | None = None)

One capability's cutover evidence, filed under exactly one path.

TrustApproval dataclass

TrustApproval(extension_id: str, capability: str, reviewer: str, approved_at: str, proof_method: str)

A port-mediated assignment, its reviewer, and its capability.