{
  "schema": 1,
  "provenance": {
    "revision": "cd12d688a19f73f34995c9af6b86e72f5f6d7886",
    "base": "fix/fp1-metacognition-preservation",
    "date": "2026-09-11",
    "scope": "FP-2 source inventory; no runtime behavior was changed"
  },
  "flat": [
    {"id":"extraction_template_path","status":"unresolved","legacy":"with enable_hms_prompt, a nonempty path selects MemoryExtractionSection's in-prompt extraction directive","observable":"model-visible MEMORY_EXTRACT/GRAPH_OPERATIONS directive and resulting extraction operations","target":"legacy MemoryExtractionSection(template_path=...); no verified migrated consumer","wiring":"the old reader is engine construction, not LearningPolicy or phase-12 consolidation","source":"src/symfonic/agent/engine.py","test":"MISSING: public custom-directive extraction journey on the target composition","risk":"a custom directive can be lost or change without a native mapping","action":"trace a compiled target prompt and extraction result before deciding replacement/removal","owner":"FP-3"},
    {"id":"phase_12_action_type_from_tool_calls","status":"replacement-unverified","legacy":"tool-call action-type switch","observable":"draft action type","target":"LearningPolicy.promotion_use_tool_calls_fallback","wiring":"policy -> consolidation","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_phase_12_tool_calls_fallback.py","risk":"name/semantics differ","action":"compare public nap outputs","owner":"FP-3"},
    {"id":"phase_12_llm_max_drafts_per_run","status":"replacement-unverified","legacy":"LLM draft cap","observable":"draft count","target":"LearningPolicy.phase_12_llm_max_drafts_per_run","wiring":"policy -> native extractor","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public cap journey","risk":"cap not composed","action":"cap boundary fixture","owner":"FP-3"},
    {"id":"phase_12_llm_max_episodes_per_run","status":"replacement-unverified","legacy":"LLM episode cap","observable":"episodes in request","target":"LearningPolicy.phase_12_llm_max_episodes_per_run","wiring":"policy.as_kwargs -> extractor","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_llm_procedural_extractor.py","risk":"field exists but end-to-end path unproved","action":"public candidate-count fixture","owner":"FP-3"},
    {"id":"phase_12_llm_model","status":"replacement-unverified","legacy":"extractor model name","observable":"selected model","target":"LearningPolicy.phase_12_llm_model","wiring":"as_phase_kwargs.procedural_model_name -> nightly_phases","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public selected-model assertion","risk":"provider choice can drift","action":"capture configured model","owner":"FP-3"},
    {"id":"phase_12_promote_assistant_content","status":"replacement-unverified","legacy":"assistant-content promotion switch","observable":"assistant draft admitted","target":"LearningPolicy.promotion_promote_assistant_content","wiring":"policy -> promotion phase","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_learning_policy.py","risk":"mapping-only proof","action":"assistant-only nap","owner":"FP-3"},
    {"id":"phase_12_use_llm_extractor","status":"replacement-unverified","legacy":"LLM/heuristic extractor selector","observable":"called extractor","target":"LearningPolicy.phase_12_use_llm_extractor","wiring":"requires extractor collaborator; no flag alone","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: composed selector journey","risk":"accepted flag may do nothing","action":"fixture both branches","owner":"FP-3"},
    {"id":"promotion_max_drafts_per_run","status":"replacement-unverified","legacy":"promotion draft cap","observable":"promoted drafts","target":"LearningPolicy.promotion_max_drafts_per_run","wiring":"policy -> promotion","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_learning_policy.py","risk":"no public cap proof","action":"over-cap journey","owner":"FP-3"},
    {"id":"promotion_min_pattern_count","status":"replacement-unverified","legacy":"recurrence floor","observable":"promotion at N","target":"LearningPolicy.promotion_min_pattern_count","wiring":"policy -> promotion","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: N-1/N public test","risk":"threshold drift","action":"boundary journey","owner":"FP-3"},
    {"id":"promotion_recency_days","status":"replacement-unverified","legacy":"promotion lookback","observable":"record included","target":"LearningPolicy.promotion_recency_days","wiring":"policy -> promotion","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: date-boundary journey","risk":"lookback drift","action":"inside/outside fixture","owner":"FP-3"},
    {"id":"synthetic_link_min_co_count","status":"replacement-unverified","legacy":"synthetic-link co-occurrence floor","observable":"link created","target":"LearningPolicy.synthetic_link_min_co_count","wiring":"policy -> synthetic phase","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_synthetic_min_co_count_config.py","risk":"composition unproved","action":"public link boundary","owner":"FP-3"},
    {"id":"nightly_nap_cron","status":"legacy-inert","legacy":"operator-facing recommended cron metadata; the engine never parsed it","observable":"operator scheduler may consume the recommendation, but no engine scheduling changes","target":"operator-owned scheduler metadata","wiring":"an operator chooses how to schedule nightly_nap; no engine loop or parser","source":"src/symfonic/agent/config.py","test":"MISSING: explicit operator-scheduler integration contract","risk":"retirement prose previously implied an engine loop","action":"keep operator-scheduler compatibility separate from engine feature claims","owner":"FP-4"},
    {"id":"nightly_nap_enabled","status":"legacy-inert","legacy":"optional metadata for callers that invoke nightly_nap; it never started an engine loop","observable":"no engine-owned background scheduling behavior","target":"operator-owned scheduler metadata","wiring":"callers wire scheduler and nightly work explicitly","source":"src/symfonic/agent/config.py","test":"MISSING: explicit operator-scheduler integration contract","risk":"retirement prose previously described a legacy automatic loop","action":"keep operator-scheduler compatibility separate from engine feature claims","owner":"FP-4"},
    {"id":"quick_nap_interval","status":"replacement-unverified","legacy":"positive N schedules quick nap; nonpositive disables","observable":"cadence and disable semantics","target":"ConsolidationSchedule.quick_every_turns","wiring":"compose coordinator and memory capability; no old-field adapter","source":"src/symfonic/capabilities/memory/schedule.py","test":"tests/platform/test_nap_after_the_turn.py","risk":"native cadence tested but old disable/per-scope semantics uncharacterized","action":"legacy/native cadence matrix","owner":"FP-3"},
    {"id":"metacognition_confidence_threshold","status":"behavior-changed","legacy":"selective gate confidence input","observable":"critic invocation","target":"SelectiveMetacognitionPolicy","wiring":"governance(reflector, confidence, trigger_policy)","source":"src/symfonic/capabilities/governance/stages/metacognition_policy.py","test":"tests/platform/test_metacognition_preservation.py","risk":"threshold is supplemental to hard floors","action":"document policy migration","owner":"FP-1"},
    {"id":"metacognition_gate","status":"behavior-changed","legacy":"custom CriticGateContext predicate","observable":"review decision","target":"trigger_policy protocol","wiring":"governance(trigger_policy=...)","source":"src/symfonic/capabilities/governance/stages/metacognition.py","test":"tests/platform/test_metacognition_preservation.py","risk":"signature/context migration","action":"custom-policy migration example","owner":"FP-1"},
    {"id":"metacognition_selective_gate","status":"behavior-changed","legacy":"selective gate flag","observable":"review/skip decision","target":"SelectiveMetacognitionPolicy default","wiring":"governance capability","source":"src/symfonic/capabilities/governance/stages/metacognition_policy.py","test":"tests/platform/test_metacognition_preservation.py","risk":"old config spelling rejected","action":"explicit migration guidance","owner":"FP-1"},
    {"id":"metacognition_sensitive_tags","status":"behavior-changed","legacy":"recalled tag forces review","observable":"critic invocation","target":"SelectiveMetacognitionPolicy recalled-tag evidence","wiring":"caller state -> subject properties + sensitive_tags","source":"src/symfonic/capabilities/governance/stages/metacognition_policy.py","test":"tests/platform/test_metacognition_preservation.py","risk":"requires actual caller evidence","action":"verify retrieval caller carries tags","owner":"FP-3"},
    {"id":"metacognition_trivial_ack_patterns","status":"replacement-unverified","legacy":"custom trivial-ack patterns","observable":"review skipped","target":"SelectiveMetacognitionPolicy.trivial_ack_patterns","wiring":"construct policy explicitly","source":"src/symfonic/capabilities/governance/stages/metacognition_policy.py","test":"tests/platform/test_metacognition_preservation.py","risk":"custom-pattern parity untested","action":"custom-pattern public test","owner":"FP-1"},
    {"id":"activation_log_mode","status":"removed-without-equivalent","legacy":"activation-log footer mode","observable":"prompt bytes","target":"no activation-log consumer","wiring":"none","source":"src/symfonic/agent/cutover/retired_settings.py","test":"MISSING: compiled-prompt comparison","risk":"provenance footer loss","action":"product decision","owner":"FP-4"},
    {"id":"prompt_block_self_edit","status":"legacy-inert","legacy":"self-edit tool gate","observable":"tool registration","target":"none required","wiring":"no legacy construction reader","source":"src/symfonic/agent/cutover/retired_settings.py","test":"tests/agent/cutover/test_retired_configuration.py","risk":"stale docs only","action":"remove stale guidance","owner":"FP-4"},
    {"id":"dev_sqlite_checkpoint_path","status":"behavior-changed","legacy":"SQLite checkpoint path","observable":"restart/resume payload","target":"human_interaction plus AgentHost continuation","wiring":"durable checkpoint/consumption ports plus authenticated claim-to-scope resolver","source":"src/symfonic/services/conversation/checkpoint.py","test":"tests/platform/test_fp3_public_preservation_journeys.py","risk":"a bare path is rejected; supported recovery is host-level at-most-once","action":"use human_interaction(...) and human_continuation(...); verify scope resolver","owner":"FP-4"},
    {"id":"scorer_on_hot_path","status":"replacement-unverified","legacy":"legacy ranking route switch","observable":"recall ordering","target":"RetrievalCoordinator","wiring":"compose retrieval capability","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"tests/agent/cutover/test_memory_retrieval_lane.py","risk":"rank semantics unproved","action":"ordered-recall comparison","owner":"FP-3"},
    {"id":"state_class","status":"removed-without-equivalent","legacy":"LangGraph state replacement","observable":"state shape","target":"no kernel state-class seam","wiring":"none","source":"src/symfonic/agent/cutover/retired_settings.py","test":"MISSING: adopter inventory","risk":"extension break","action":"survey usages","owner":"FP-4"},
    {"id":"experimental_tool_decorator","status":"legacy-inert","legacy":"decorator feature gate","observable":"tool availability","target":"always-public decorator","wiring":"none","source":"src/symfonic/agent/cutover/retired_settings.py","test":"tests/agent/cutover/test_retired_configuration.py","risk":"stale configuration","action":"remove docs","owner":"FP-4"},
    {"id":"ask_user_pause_ttl_seconds","status":"behavior-changed","legacy":"pause TTL","observable":"token expiry","target":"TTLPolicy","wiring":"HumanInteractionCapability.compile(ttl=...)","source":"src/symfonic/agent/cutover/pause_surfaces.py","test":"tests/agent/cutover/test_pause_policy_lane.py","risk":"new maximum rejects instead of clamps","action":"expiry/restart journey","owner":"FP-3"},
    {"id":"ask_user_tool_descriptions","status":"equivalent-proven","legacy":"ask-user tool description","observable":"model-visible description","target":"InteractionToolSpec.description","wiring":"compose interaction spec","source":"src/symfonic/agent/cutover/pause_surfaces.py","test":"tests/agent/cutover/test_pause_policy_lane.py","risk":"localized text not scaffold-tested","action":"scaffold check","owner":"FP-4"},
    {"id":"procedural_force_first_action_tool","status":"replacement-unverified","legacy":"force first tool","observable":"tool choice each iteration","target":"procedural_force_tool_choice=soft","wiring":"resolver plus live tool loop","source":"src/symfonic/agent/cutover/force_lever.py","test":"tests/agent/cutover/test_tools_policy_lane.py","risk":"replacement spelling may still be refused","action":"stateful iteration journey","owner":"FP-3"},
    {"id":"credential_patterns","status":"behavior-changed","legacy":"custom/disable credential regexes","observable":"scrubbed call arguments","target":"CredentialHygieneStage","wiring":"governance composition","source":"src/symfonic/agent/cutover/governance_surfaces.py","test":"tests/platform/test_governance_amends.py","risk":"custom/disable semantics lost","action":"adopter secret format matrix","owner":"FP-4"},
    {"id":"fabrication_refuse_min_confidence","status":"behavior-changed","legacy":"single refusal threshold","observable":"refuse/allow","target":"FabricationStage grades","wiring":"governance composition","source":"src/symfonic/agent/cutover/governance_surfaces.py","test":"tests/capabilities/governance/test_egress_stages.py","risk":"two-threshold semantics","action":"public boundary matrix","owner":"FP-1"},
    {"id":"hms_budget_mode","status":"behavior-changed","legacy":"warn/strict overflow","observable":"continue/fail and prompt bytes","target":"PromptBudget","wiring":"prompt composition root","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"tests/agent/cutover/test_prompt_assembly_lane.py","risk":"drop order differs","action":"optional/pinned replay","owner":"FP-3"},
    {"id":"hms_system_prompt_token_budget","status":"behavior-changed","legacy":"HMS-string token cap","observable":"model-visible prompt","target":"PromptBudget.max_total_tokens","wiring":"prompt composition root","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"tests/agent/cutover/test_prompt_assembly_lane.py","risk":"region scope differs","action":"prompt-byte replay","owner":"FP-3"},
    {"id":"on_hms_budget_exceeded","status":"removed-without-equivalent","legacy":"overflow callback","observable":"observer call","target":"no public callback","wiring":"internal result only","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"MISSING: public observer","risk":"operational blind spot","action":"event hook decision","owner":"FP-4"},
    {"id":"jit_manifest_token_budget","status":"behavior-changed","legacy":"JIT-manifest cap","observable":"manifest/prompt allocation","target":"shared PromptBudget","wiring":"prompt composition root","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"MISSING: region-cap journey","risk":"manifest starvation change","action":"large-manifest fixture","owner":"FP-3"},
    {"id":"manifest_cache_position","status":"behavior-changed","legacy":"fixed cache marker","observable":"provider cache marker","target":"derived region plan","wiring":"cache planner","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"MISSING: provider request capture","risk":"provider behavior differs","action":"outbound marker capture","owner":"FP-3"},
    {"id":"memory_extract_cadence","status":"removed-without-equivalent","legacy":"N-turn prompt extraction directive","observable":"directive cadence","target":"no prompt cadence consumer","wiring":"schedule controls maintenance, not directive","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"MISSING: cadence contract","risk":"different user-visible prompt","action":"separate product decision","owner":"FP-4"},
    {"id":"messages_cache_policy","status":"removed-without-equivalent","legacy":"rolling history cache policy","observable":"multi-turn provider cache behavior","target":"prompt contribution cache only","wiring":"no history-cache replacement","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"MISSING: multi-turn outbound capture","risk":"cost/latency regression","action":"provider serialization journey","owner":"FP-3"},
    {"id":"system_prefix_cache_ttl","status":"equivalent-proven","legacy":"system-prefix cache TTL","observable":"provider TTL marker","target":"stable PromptContribution cache directive","wiring":"prompt assembly preserves region annotations through the Anthropic serializer","source":"src/symfonic/agent/cutover/prompt_assembly_policy.py","test":"tests/platform/test_fp3_public_preservation_journeys.py","risk":"proof is Anthropic system-prefix serialization only; it is not a history-cache or cost claim","action":"use explicit provider-system cache regions and separately evaluate other providers","owner":"FP-4"}
  ],
  "partial": [
    {"id":"self_reflection","status":"admitted-but-inactive","legacy":"post-consolidation insight extraction","observable":"reflection output","target":"explicit native reflection phase","wiring":"no admitted-route reader","source":"src/symfonic/agent/cutover/admission_surfaces.py","test":"tests/agent/cutover/test_reflection_and_scheduler_surfaces.py","risk":"admission changes route only","action":"compose/test native phase","owner":"FP-4"},
    {"id":"reflection_prompt","status":"admitted-but-inactive","legacy":"reflection prompt","observable":"critic prompt bytes","target":"native reflection phase","wiring":"no admitted-route reader","source":"src/symfonic/agent/cutover/admission_surfaces.py","test":"tests/agent/cutover/test_reflection_and_scheduler_surfaces.py","risk":"custom prompt lost","action":"native-phase test","owner":"FP-4"},
    {"id":"domain.core_preferences","status":"admitted-but-inactive","legacy":"legacy review guardrails","observable":"review policy","target":"governance policy","wiring":"old middleware unavailable on admitted route","source":"src/symfonic/agent/cutover/admission_surfaces.py","test":"MISSING: native policy input","risk":"silently inactive","action":"supported policy decision","owner":"FP-4"},
    {"id":"read_only_tools","status":"admitted-but-inactive","legacy":"read-only review exclusion","observable":"critic decision","target":"governance(read_only_tools=...)","wiring":"old field not mapped into capability","source":"src/symfonic/agent/cutover/tools_surfaces.py","test":"tests/platform/test_metacognition_preservation.py","risk":"old configuration inert though new port works","action":"migration adapter/guide","owner":"FP-4"},
    {"id":"skill_auto_approve","status":"admitted-but-inactive","legacy":"extracted-skill status","observable":"draft/approved","target":"native promotion policy","wiring":"legacy consolidation reader unreachable","source":"src/symfonic/agent/cutover/tools_surfaces.py","test":"MISSING: native approval journey","risk":"silent status drift","action":"policy composition","owner":"FP-4"},
    {"id":"domain","status":"behavior-changed","legacy":"full nested domain template","observable":"system-prompt bytes","target":"HmsSystemSource description","wiring":"system prompt source","source":"src/symfonic/agent/cutover/prompting_surfaces.py","test":"tests/agent/cutover/test_prompt_assembly_lane.py","risk":"only description substituted","action":"bound supported fields","owner":"FP-4"},
    {"id":"domain_description_max_chars","status":"behavior-changed","legacy":"JIT/non-JIT limits","observable":"description truncation","target":"_resolve_domain_description[0]","wiring":"system prompt source","source":"src/symfonic/agent/cutover/prompting_surfaces.py","test":"tests/agent/cutover/test_continuation_cutover.py","risk":"JIT [1] unreachable","action":"define JIT contract","owner":"FP-4"},
    {"id":"hydration_min_relevance","status":"behavior-changed","legacy":"raw similarity floor","observable":"record passes gate","target":"RetrievalCoordinator._gate","wiring":"memory bundle","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"tests/agent/cutover/test_memory_retrieval_lane.py","risk":"composite score","action":"weak/high-salience boundary","owner":"FP-3"},
    {"id":"episodic_telemetry_sink","status":"admitted-but-inactive","legacy":"episodic write events","observable":"sink receives record","target":"native lifecycle writer","wiring":"admitted turns do not write legacy consolidation","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"MISSING: native write sink journey","risk":"missing telemetry","action":"wire lifecycle","owner":"FP-4"},
    {"id":"working_memory_recent_turns","status":"behavior-changed","legacy":"recent-turn count; zero disables","observable":"window size","target":"WorkingWindow.read","wiring":"memory bundle","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"tests/agent/cutover/test_memory_retrieval_lane.py","risk":"zero refused","action":"disabled-window contract","owner":"FP-4"},
    {"id":"working_layer_exclude_speakers","status":"behavior-changed","legacy":"speaker filter all recall","observable":"assistant text absent","target":"WorkingWindow.read only","wiring":"memory bundle","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"tests/agent/cutover/test_memory_retrieval_lane.py","risk":"episodic quotes remain","action":"two-source public test","owner":"FP-3"},
    {"id":"stm_summary_mode","status":"admitted-but-inactive","legacy":"dropped-turn summary mode","observable":"summary contribution","target":"no native JIT summary consumer","wiring":"JIT path refused","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"MISSING: native summary contribution","risk":"silently inactive","action":"define composition","owner":"FP-4"},
    {"id":"scope_blend_mode","status":"behavior-changed","legacy":"ancestor weighting","observable":"hierarchical recall rank","target":"retrieval engine when constructed","wiring":"injected orchestrator wins","source":"src/symfonic/agent/cutover/memory_retrieval_rows.py","test":"tests/agent/cutover/test_memory_retrieval_lane.py","risk":"backfill equals blend; precedence differs","action":"built/injected hierarchy test","owner":"FP-3"},
    {"id":"enabled_layers","status":"behavior-changed","legacy":"hydration layer selection","observable":"searched layers","target":"constructed orchestrator config","wiring":"injected orchestrator retains own layers","source":"src/symfonic/agent/cutover/memory_orchestrator_rows.py","test":"tests/agent/cutover/test_continuation_cutover.py","risk":"construction precedence","action":"both paths test","owner":"FP-3"},
    {"id":"phase1_spreading_weight","status":"replacement-unverified","legacy":"strengthen BFS/direct weight","observable":"strengthened weight","target":"LearningPolicy.phase1_spreading_weight","wiring":"policy -> phase factory","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_phase1_spreading_decomposition.py","risk":"no public composition proof","action":"nap boundary","owner":"FP-3"},
    {"id":"enable_entity_linker","status":"replacement-unverified","legacy":"entity-link phase switch","observable":"MENTIONS edges","target":"LearningPolicy.enable_entity_linker","wiring":"requires extractor collaborator","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_entity_linker_model_wiring.py","risk":"flag alone insufficient","action":"off/on journey","owner":"FP-3"},
    {"id":"entity_linker_extractor","status":"replacement-unverified","legacy":"extractor selection","observable":"called extractor","target":"entity_linker_extractor_kind","wiring":"policy + collaborator","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_entity_linker_model_wiring.py","risk":"runtime composition unproved","action":"each-kind journey","owner":"FP-3"},
    {"id":"entity_linker_min_mention_count","status":"replacement-unverified","legacy":"mention floor","observable":"edge at N","target":"LearningPolicy.entity_linker_min_mention_count","wiring":"policy -> entity phase","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public N-1/N","risk":"threshold drift","action":"boundary fixture","owner":"FP-3"},
    {"id":"entity_linker_max_episodics_per_run","status":"replacement-unverified","legacy":"scan cap","observable":"candidate count","target":"LearningPolicy.entity_linker_max_episodics_per_run","wiring":"policy -> entity phase","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public over-cap","risk":"cost cap unproved","action":"candidate capture","owner":"FP-3"},
    {"id":"entity_linker_confidence_threshold","status":"replacement-unverified","legacy":"confidence floor","observable":"mention accepted","target":"LearningPolicy.entity_linker_confidence_threshold","wiring":"policy -> entity phase","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public threshold","risk":"score boundary","action":"below/equal/above","owner":"FP-3"},
    {"id":"episodic_summarization_max_entries","status":"replacement-unverified","legacy":"summarization threshold","observable":"summary starts","target":"LearningPolicy.episodic_summarization_max_entries","wiring":"policy -> quick phase","source":"src/symfonic/capabilities/memory/policy.py","test":"tests/core/learning/test_phase_10_threshold_plumbing.py","risk":"no Agent lifecycle proof","action":"post-turn boundary","owner":"FP-3"},
    {"id":"episodic_summarization_batch_size","status":"replacement-unverified","legacy":"entries per summary","observable":"retained/consumed count","target":"LearningPolicy.episodic_summarization_batch_size","wiring":"policy -> quick phase","source":"src/symfonic/capabilities/memory/policy.py","test":"MISSING: public batch journey","risk":"batch drift","action":"exact count fixture","owner":"FP-3"},
    {"id":"enable_semantic_merge","status":"replacement-unverified","legacy":"duplicate merge switch","observable":"merged duplicate","target":"quick_phases collaborator composition","wiring":"no LearningPolicy field; provide merge collaborators","source":"src/symfonic/capabilities/memory/phases/quick.py","test":"tests/capabilities/memory/test_learning_phase_parity.py","risk":"do not mistake field absence for no capability","action":"off/on composed journey","owner":"FP-3"}
  ],
  "continuation_contexts": ["enabled_layers","domain","hydration_min_relevance","working_memory_recent_turns","domain_description_max_chars","working_layer_exclude_speakers","scope_blend_mode"],
  "exclusions": ["nested agent.ask_user_pause_ttl_seconds", "per-call is_admin", "other nested and per-call configuration is outside these two inventories"]
}
