symfonic.agent.cutover.pause_surfaces¶
pause_surfaces ¶
TA8.42's four rows, as data. The contract that reads them is next door.
Data only. What a pause surface is, why C1-B is a REPLACE and why C1-T was
declined live in :mod:~symfonic.agent.cutover.pause_policy, with the rule that
refuses the nested spelling. Read that module first -- this is the table it
publishes. The same split settings_contract / retired_settings /
config_retirement already make, for the same two reasons: the published
surface reads end to end without the raise sites in the way, and each piece
stays inside the repository's module budget. It also holds
:data:REPLACED_PAUSE_SETTINGS, the two flat C1-B rows in the shape
RETIRED_SETTINGS folds in -- derived here, from the surfaces above, so
the refusal an adopter reads and the contract cannot drift apart.
PauseSurface
dataclass
¶
PauseSurface(path: str, subgroup: str, owner: str, disposition: str, served_by: tuple[str, ...], refused_by: tuple[str, ...], inert_on: tuple[str, ...], consumer: str, observable: str, replaced_by: str | None = None, adopter_break: str | None = None, override_argument: str | None = None)
One row of this lane, and what 11.0 does with it on each entry point.
served_by / refused_by / inert_on partition the public entry
points exactly. inert_on describes only the migrated route at those
entry points: it does not claim the legacy fallback lost the behaviour
recorded by consumer and observable. An unmeasured third entry
point is the gap that made earlier evidence unusable, and a row with a hole
would reintroduce it. replaced_by and override_argument are
mutually exclusive and one is required, so the table cannot hold a row
that was neither replaced nor argued about.
pause_surfaces_for_subgroup ¶
Every row of one TA8.25 subgroup, in declaration order.
Parity is asserted per field and never aggregated, so the tests read the lane one subgroup at a time rather than reporting a single verdict.