Skip to content

symfonic.agent.cutover.prompting_surfaces

prompting_surfaces

TA8.38's twenty-five rows, and what each one does on all three entry points.

The lane's ledger. C1-F and C1-O (fourteen prompt_blocks rows), C1-G (ten prompt assembly rows) and C1-Q (the domain container) share a branch because they share files; they do not share evidence, so every row is a row here and the tests drive each one separately.

Two things live here and nowhere else. :data:PROMPT_SOURCE_LIFTS and :data:PROMPT_BEARING_DOMAIN_FIELDS are the admission this lane actually made, and both are conditional: they widen the envelope only for an invocation whose authorised bundle carries a system prompt source, the same condition enable_hms_prompt itself lifts on. Unconditional entries on ALLOWED_FRAMEWORK_FIELDS would have claimed the migrated path honours these values on every turn, and on a turn with no prompt source it honours none of them -- the silent drop this lane exists to refuse. :data:PROMPTING_SURFACES is all twenty-five rows, by name.

The row shape -- and the rule that a divergence from the triage must carry an argument -- is :class:~symfonic.agent.cutover.prompting_rows.PromptingSurface. The eight replaced rows publish their contract in :mod:~symfonic.agent.cutover.prompt_assembly_policy, the fourteen block rows theirs in :mod:~symfonic.agent.cutover.prompt_block_contract.

PromptingSurface dataclass

PromptingSurface(path: str, subgroup: str, owner: str, recorded: str, applied: str, served_by: tuple[str, ...], refused_by: tuple[str, ...], inert_on: tuple[str, ...], consumer: str, observable: str, condition: str | None = None, override_argument: str | None = None)

One TA8.38 row: what the triage recommended, and what this lane did.

served_by / refused_by / inert_on partition :data:~symfonic.agent.cutover.lifecycle_contract.PUBLIC_ENTRY_POINTS exactly, for the reason :class:~symfonic.agent.cutover.admission_surfaces.AdmissionSurface 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.

recorded and applied are separate fields, and that is the whole point of the type. Every row must carry the disposition this lane actually applied; a row whose applied disposition differs from the recorded recommendation must carry an argument as well. Silence is the one state that cannot be expressed.

overridden property

overridden: bool

True when this lane did not apply the recorded recommendation.

NORMALISED_PER_ROW and REPLACE name a decision; the inventory vocabulary names an outcome, so the two are compared through the one pairing that means "applied as written" for each.

prompting_rows_for_subgroup

prompting_rows_for_subgroup(subgroup: str) -> tuple[PromptingSurface, ...]

Every row of one TA8.25 subgroup, in declaration order.

Parity is asserted per field and never aggregated across the lane, so the tests read the lane one subgroup at a time rather than iterating the whole mapping and reporting a single verdict.

Source code in src/symfonic/agent/cutover/prompting_surfaces.py
def prompting_rows_for_subgroup(subgroup: str) -> tuple[PromptingSurface, ...]:
    """Every row of one TA8.25 subgroup, in declaration order.

    Parity is asserted per field and never aggregated across the lane, so the
    tests read the lane one subgroup at a time rather than iterating the whole
    mapping and reporting a single verdict.
    """
    return tuple(
        row for row in PROMPTING_SURFACES.values() if row.subgroup == subgroup
    )