symfonic.agent.cutover.continuation_window_refusals¶
continuation_window_refusals ¶
What a migration-window decision says to the adopter reading it (TA8.48).
Split from :mod:~symfonic.agent.cutover.continuation_window the way
lifecycle_refusals is split from lifecycle_contract: that module decides
whether a pause is inside the window, this one decides what the answer says.
Two questions, and the second is long enough that folding it into the first
would bury the rule under three paragraphs of message text.
The refusal is the guard's own. The class, the setting attribute, the
group and the retirement line are the three fresh doors' -- "a configuration
refused by name on run is refused by name on all four" is a claim about one
refusal rather than about four similar ones -- and what a redemption adds over
a fresh turn is appended rather than substituted.
It is actionable, and it is distinguishable. HK2 required three answers at a redemption to stay apart: an expired token, a missing checkpoint, and everything else. A configuration refusal is the "everything else", and it says so in the message rather than leaving an adopter to infer it from a class name they have not met before. Each refusing disposition then adds its own sentence: an adopter told "minted after the guards landed" about a token that was never dated would go looking for the wrong thing.
An admitted redemption is announced. A turn that quietly keeps working on a retired setting is how an adopter reaches the horizon unprepared, so the window says what it did, which setting it did it for, and the date it stops.
ContinuationWindowWarning ¶
Bases: DeprecationWarning
A redemption the migration window admitted, and the date it stops.
A DeprecationWarning rather than a log line alone because the audience
is the adopter running the upgrade, not the operator reading a dashboard,
and because -W error is how a deployment can opt into finding these at
test time instead of at the horizon.
announce ¶
What an admitted-under-the-window redemption says on its way through.
Source code in src/symfonic/agent/cutover/continuation_window_refusals.py
restated ¶
restated(refusal: RetiredConfigurationError, disposition: str, provenance: MintProvenance) -> BaseException
The guard's own error, re-raised with the window paragraph appended.
A subclass that ever stopped taking the four-argument shape falls back to
the original error rather than losing it: a refusal that cannot be reworded
is still a refusal, and dropping it to raise a TypeError from the
rewording would turn a named refusal into a bug report.
Source code in src/symfonic/agent/cutover/continuation_window_refusals.py
why ¶
The one sentence that separates this refusing case from the other two.