Legacy default parity¶
This is the executable specification for issue #179. The rows live in symfonic.migration.LEGACY_DEFAULT_ROWS; tests/migration/test_legacy_defaults.py pins that every legacy field is present and that each one has either a same-turn legacy/native comparison or an existing owner.
FrameworkConfig defaults do not all start work. “Inert” means the field does not independently run a behaviour; it is recorded here so an adopter does not try to recreate a behaviour that the legacy agent did not run.
| Legacy field or active companion | Trigger | Kernel composition / result | Evidence or owner |
|---|---|---|---|
auto_hydrate |
bound store and scope | candidate: memory_capabilities + PromptingCapability |
gap, #188: native-only test |
auto_consolidate |
MemoryExtractorPort |
candidate: memory_capabilities(..., extractor=...) |
gap, #185: native-only test |
spreading_activation |
AssociationSource |
candidate: SpreadingActivation through memory factory |
gap, #188: native-only test |
lazy_tooling |
HMS prompt, procedural skills, tools | gap with memory composed. With no store and no memory row it cannot activate: compose_legacy_defaults composes nothing for it, and the agent offers every registered tool, as legacy does there. A SymfonicAgent host with this input is served by the kernel only with no procedural layer and enable_hms_prompt=False; either one keeps the turn on legacy. |
#185; storeless: CORE-20 native differential |
enabled_layers |
memory retrieval | candidate: default RetrievalPolicy |
gap, #188: default-value comparison only |
skill_auto_approve |
promotable skill in SymfonicAgent |
proposed native change: Agent does not read this legacy setting; native procedures are drafts pending explicit review. The FP-5 contract has not approved this row, and the legacy reader remains live. |
ProceduralLayer review journey / CORE-36 |
streaming_enabled |
always | Agent.stream() |
verified: same-turn deterministic stream completes on both paths |
experimental_tool_decorator |
never | retained no-op; @symfonic_tool is unconditional |
config source |
phase_12_action_type_from_tool_calls |
phase-12 extraction | gap | #185 |
messages_cache_policy |
legacy React node plus an Anthropic cache dialect | approved change: stock native history remains unmarked; callers can compose an explicit Anthropic history opt-in with one completed-boundary marker. It does not reproduce automatic selection or the rolling ladder. | native cache composition, two-turn Anthropic wire capture |
manifest_cache_position |
legacy stratigraphic tool-manifest path | gap: public L1/L2 regions and #221's explicit native manifest opt-in do not reproduce legacy selection or make this retired setting accepted. | region wire capture, #179, #221 |
system_prefix_cache_ttl |
compatible provider cache | gap | #187 |
tool_result_recall_mode |
tool-result history | gap | #188 |
activation_log_mode |
activation runs | gap | #188 |
prompt_layer_mode |
legacy prompt path | gap | #187 |
hms_budget_mode |
HMS prompt assembly | gap | #187 |
memory_extract_cadence |
every turn; default 1 |
no prompt-cadence consumer | gap, #187 |
entity_linker_extractor |
enable_entity_linker=True |
inactive until that flag | #186 |
nightly_nap_cron |
never | operator recommendation, not engine scheduling | config source |
phase_12_llm_model |
LLM phase-12 extraction | gap | #185 |
otel_service_name |
otel_enabled=True and an OTEL sink |
inactive until OTEL is composed | #191 |
working_memory_recent_turns |
ConversationSource |
candidate: memory factory conversation=/recent_turns= |
gap, #188: native-only test |
quick_nap_interval |
ConsolidationCoordinator |
candidate: memory factory consolidation= |
gap, #185: native-only test |
The verified subset contains only streaming. It deliberately has no memory, prompting, retrieval, write, or consolidation stages:
from symfonic.migration import SUPPORTED_DEFAULT_BEHAVIORS, compose_legacy_defaults
agent = compose_legacy_defaults(
provider,
behaviors=SUPPORTED_DEFAULT_BEHAVIORS,
)
The runnable import-shaped example is examples.migration_parity.composed_defaults.build_agent. A bare compose_legacy_defaults(provider) reports every unresolved field and all missing deployment dependencies in one error. Neither outcome means issue #179 is ready to close.