Skip to content

symfonic.agent.cutover.prompt_assembly_policy

prompt_assembly_policy

C1-G: the eight prompt-layout spellings replaced on the 11.0 line (TA8.38).

TA8.25's subgroup C1-G holds ten rows and recommends REPLACE: "These controls describe legacy prompt layout/cache mechanics. Preserve supported budget and freshness outcomes under a prompting policy, but remove the old mechanical keys." Eight of the ten are replaced here. Two are not, for different reasons, and both arguments live in :mod:~symfonic.agent.cutover.prompting_surfaces beside the rows they belong to:

  • domain_description_max_chars has a live kernel consumer, which is the one fact that makes a REPLACE wrong. It is admitted instead.
  • procedural_render_preflight_in_l1 is not a layout knob at all: it switches on a synthesiser that reads the procedural memory layer and generates the PRE-FLIGHT text. Nothing in the prompting contract generates content, so a REPLACE would hand an adopter the placement and none of the capability. It stays refused to legacy, where it is still served.

The mechanism is TA8.26's, deliberately. These eight are RetiredSetting rows folded into :data:~symfonic.agent.cutover.retired_settings.RETIRED_SETTINGS under one group, so they refuse by name before dispatch on run, stream and stream_typed through the guard the engine already calls. A second spelling of "refuse by name" would be a second chance to disagree about the wording, the ancestry and the line -- the reason pause_surfaces, force_lever and governance_surfaces all fold into the same table.

What was actually there before. Every one of the eight falls to legacy today: the envelope is default-deny and no allowlist entry names them. That is the absence of a decision, and it is what the inventory recorded as refused-to-legacy with disposition MISSING CONTRACT.

Why REPLACE rather than MIGRATE. Not one of the eight has a reader on the kernel route. SymfonicAgent._cutover_delegate passes instructions=None and its own docstring says why; the kernel's system prompt is compiled from the bundle's single HmsSystemSource contribution by :class:~symfonic.capabilities.prompting.capability.PromptingCapability. The readers that exist -- _build_hms_prompt_for_strategy, _build_jit_prompt_for_strategy, _maybe_apply_stratigraphic, _enforce_hms_budget, _maybe_build_preflight_contribs, and the MessagesRegionCacheStrategy only core/nodes/react.py looks up -- are all on the legacy body. configuration/compat/fragments.py::_prompt reads them too, and reads them for the diagnostics probe, not for a turn.

The capability survives; the spelling does not. Each row's instead names the live surface an adopter moves to and the break they see when they move. That break is real and it is stated per row rather than once, because "budget" and "cache TTL" mean different things on a compiler that derives regions from a volatility ladder than they did on a builder that spliced strings at fixed positions.

The composition move is the break they share. All eight were spelled on FrameworkConfig; their replacements are composed -- fold_retrieval_bundle(context_window=..., prompt_share=...) and PromptContribution(...) -- which is the same shape of migration TA8.42's pause pair published: a value change becomes a composition change. It is stated once here and referenced rather than repeated eight times.