Skip to content

symfonic.agent.cutover.governance_surfaces

governance_surfaces

TA8.43's three rows, as data. The contract that reads them is next door.

Data only. Why C1-K is a REPLACE lives in :mod:~symfonic.agent.cutover.authority, and what a governance surface is lives in :mod:~symfonic.agent.cutover.governance_contract. Read those first -- this is the table they publish. It also holds :data:REPLACED_GOVERNANCE_SETTINGS, the two configuration rows in the shape :data:~symfonic.agent.cutover.retired_settings.RETIRED_SETTINGS folds in -- derived here, from the surfaces above, so the refusal an adopter reads and the contract cannot drift apart.

The three shared names -- :data:GOVERNANCE_POLICY_GROUP, :data:ADMIN_AUTHORITY_PATH and :data:EXECUTION_AUTHORITY_REASON -- are re-exported here at the address importers already hold, the way :mod:~symfonic.agent.cutover.pause_policy re-exports its own table's names.

GovernanceSurface dataclass

GovernanceSurface(path: str, subgroup: str, owner: str, kind: 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 C1-K row, and what 11.0 does with it on each entry point.

served_by / refused_by / inert_on partition :data:~symfonic.agent.cutover.lifecycle_contract.PUBLIC_ENTRY_POINTS exactly, for the reason LifecycleRow gives: an unmeasured third entry point is the gap that made two thirds of this programme's earlier evidence unusable, and a row with a hole in its surface would reintroduce it as a data structure.

replaced_by and override_argument are mutually exclusive and one is required, so this table cannot hold a row that was neither replaced nor argued about -- "the triage recommended REPLACE and the code is silent" is then not a state anybody has to infer from an absence. A replaced_by without an adopter_break is refused for the reason this lane's acceptance gives in as many words: collapsing REPLACE into MIGRATE ships a breaking change as a migration note.

governance_surfaces_for_subgroup

governance_surfaces_for_subgroup(subgroup: str) -> tuple[GovernanceSurface, ...]

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 row at a time rather than reporting a single verdict.

Source code in src/symfonic/agent/cutover/governance_surfaces.py
def governance_surfaces_for_subgroup(subgroup: str) -> tuple[GovernanceSurface, ...]:
    """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 row at a time rather than reporting a single verdict.
    """
    return tuple(
        surface
        for surface in GOVERNANCE_SURFACES.values()
        if surface.subgroup == subgroup
    )