symfonic.agent.cutover.switchboard¶
switchboard ¶
Per-capability routing and metadata-only fallback accounting.
CutoverSwitchboard ¶
CutoverSwitchboard(*, criteria: Mapping[str, SwitchCriteria] | None = None, fallback_sink: FallbackTelemetrySink | None = None, recorder: CutoverCriteriaRecorder | None = None, pin: LegacyPin | None = None)
Per-capability routing between the migrated and the dormant paths.
Source code in src/symfonic/agent/cutover/switchboard.py
legacy_pin
property
¶
The build's pin, as a value. NO_LEGACY_PIN when none was set.
describe ¶
One line per switch. Names and citations only โ never a credential.
Source code in src/symfonic/agent/cutover/switchboard.py
file ¶
File this capability's criteria; flips the switch when complete.
Source code in src/symfonic/agent/cutover/switchboard.py
restore ¶
Undo this board's rollback. Refused while the criteria are incomplete.
Also refused while a process-wide override is in force: clearing the
instance flag would return LEGACY anyway, and a restore that
reports success without moving the route is how an operator concludes
the rollback lever is broken.
Source code in src/symfonic/agent/cutover/switchboard.py
rollback ¶
Refused since 11.0: the board-rollback lever is retired.
Still present, still accepting the arguments it always took, and it
raises :class:~symfonic.agent.cutover.retirement.RetiredLeverError
naming the line and the capability. reason is optional only so
that a call written from muscle memory refuses by name instead of
raising TypeError at the operator โ it is not read.
switch_for runs first on purpose. A mistyped capability is a
different mistake from a retired lever, and answering "that lever is
gone" to rollback("invocaton.run") would send the operator looking
for a migration note about a capability that does not exist.
Source code in src/symfonic/agent/cutover/switchboard.py
rollback_reason ¶
Why this capability is on legacy: process-wide reason wins.
route_for ¶
The implementation that serves capability in this process.
The process-wide override is read first and cannot be outvoted by an
instance: a host that builds one agent per request would otherwise
answer KERNEL on every board constructed after the operator rolled
the capability back, which is the failure the lever exists to prevent.
Source code in src/symfonic/agent/cutover/switchboard.py
FallbackTelemetryEvent
dataclass
¶
Safe projection of one fallback; never carries its raw reason.
SwitchDecision
dataclass
¶
Why one capability is on the route it is on.