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 | #185 |
enabled_layers |
memory retrieval | candidate: default RetrievalPolicy |
gap, #188: default-value comparison only |
skill_auto_approve |
promotable skill | gap | #185 |
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 |
provider cache dialect | gap | #187 |
manifest_cache_position |
stratigraphic prompt mode | gap | #187 |
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.