Skip to content

Feature-preservation matrix

FP-2 review artifact, inspected at cd12d688a19f73f34995c9af6b86e72f5f6d7886 on fix/fp1-metacognition-preservation. It is an outcome inventory, not a declaration that the 11.0 migration preserves every feature. The companion machine-readable inventory is the row-level source of truth; it records the legacy trigger, observable, live owner, required wiring, exact source file, named meaningful public test (or MISSING), risk, next action, and owning FP ticket for every row.

Run the checked-in verifier from a source checkout so imports resolve to the reviewed tree:

PYTHONPATH=src python \
  scripts/validate_feature_preservation_inventory.py

It derives the 38 flat names from RETIRED_SETTINGS, cross-checks the selected partial rows against live cutover tables, requires all evidence fields, and derives the seven continuation contexts from RECONCILED_ROWS. Its high-risk check only detects a missing cited source anchor; the source audit, rather than a marker search, assigns the behavior class. It deliberately does not turn a passing inventory check into behavioral parity.

Reading a classification

Classification Meaning
equivalent-proven A supported public observable has meaningful evidence.
replacement-unverified A live capability/port exists, but automatic composition or old/new outcome parity is not proved.
behavior-changed The replacement has a verified, intentional, or structural semantic difference.
removed-without-equivalent No supported owner currently expresses the old behavior.
legacy-inert The legacy input had no reachable behavior to preserve.
admitted-but-inactive An admitted cutover control does not configure a reachable admitted-route consumer. This says nothing about whether legacy behavior was inert.
unresolved The evidence is insufficient.

Admission, rejection, imports, and a similarly named field are not evidence of parity. A missing proof stays visible as MISSING, with a bounded next action.

The , approved suffix reports a row-specific APPROVE CHANGE or APPROVE REMOVAL decision in the FP-5 contract. FP-5 separately validates its owner and transition evidence; the suffix does not establish parity, migration closure, fallback unreachability, or retirement.

Flat retired/replaced settings (38)

The source column below is a readable routing label. The linked JSON carries the exact repository-relative source and test paths, along with the full legacy trigger and observable, without making this table unreasonably wide.

Control Classification Live owner and required wiring Source; evidence Risk → action (owner)
extraction_template_path behavior-changed, approved ExtractionDirectiveSource(template_path=..., scope_path=scope.path) beside LegacyGraphOperationsAdapter(MemoryExtractionService(...)) for bundled templates public Agent and AgentHost directive journeys; validated legacy-to-native persistence and fallback journeys approved change: adapter handles documented operations; unsupported operations and retractions use extraction-model fallback, not full legacy parity (CORE-1)
phase_12_action_type_from_tool_calls behavior-changed, approved explicit LearningPolicy(promotion_use_tool_calls_fallback=True) → deep_phases → persisted draft memory/policy.py; test_fp_class_b_native_observables.py::test_the_tool_call_fallback_decides_whether_a_draft_exists_at_all; test_fp_class_b_native_observables.py::test_native_and_legacy_config_defaults_do_not_select_the_same_fallback tool-derived call deploy_staging draft proven; stock native false versus FrameworkConfig true, with route-dependent legacy effective default; owner approved explicit opt-in (FP-3); approved change recorded in CORE-1 comment 5596490f (not universal parity)
phase_12_llm_max_drafts_per_run equivalent-proven LearningPolicy → extractor memory/policy.py; test_deep_roster.py verifies one persisted draft from three model candidates composed LLM draft cap is independent of the regex cap (FP-3)
phase_12_llm_max_episodes_per_run equivalent-proven LearningPolicy.as_kwargs() → extractor memory/policy.py; test_deep_roster.py verifies two model-visible episodes composed episode cap bounds the extractor input (FP-3)
phase_12_llm_model behavior-changed, approved explicit deep_phases(procedural_extractor=...); policy name is telemetry only test_the_configured_procedural_model_reaches_telemetry_not_selection approved change: caller-composed extractor selects its own model; the legacy name does not select it (CORE-1)
phase_12_promote_assistant_content equivalent-proven LearningPolicy → promotion memory/policy.py; test_deep_roster.py measures persisted assistant turns with the switch off and on only the enabled branch promotes those turns (FP-3)
phase_12_use_llm_extractor equivalent-proven policy plus extractor collaborator memory/policy.py; test_deep_roster.py measures both composed selector branches false keeps regex promotion and makes no model call (FP-3)
promotion_max_drafts_per_run equivalent-proven LearningPolicy → promotion memory/policy.py; test_deep_roster.py verifies one persisted draft from two eligible patterns regex output cap is independent of the LLM cap (FP-3)
promotion_min_pattern_count equivalent-proven LearningPolicy → promotion memory/policy.py; test_deep_roster.py verifies the N-1/N persisted-record boundary below threshold produces no draft (FP-3)
promotion_recency_days equivalent-proven LearningPolicy → promotion memory/policy.py; test_deep_roster.py verifies old and fresh persisted records at the lookback boundary old records cannot satisfy the minimum (FP-3)
synthetic_link_min_co_count equivalent-proven LearningPolicy → synthetic phase memory/policy.py; test_composed_synthetic_floor_reaches_persisted_edge_creation marker-bearing episodics create the persisted boundary edge (FP-3)
nightly_nap_cron legacy-inert Operator scheduler metadata; engine never parsed cron src/symfonic/agent/config.py; MISSING operator-scheduler contract stale retirement prose implied an engine loop → keep operator compatibility separate (FP-4)
nightly_nap_enabled legacy-inert Operator scheduler metadata; engine never started a loop src/symfonic/agent/config.py; MISSING operator-scheduler contract stale retirement prose described automatic scheduling → keep operator compatibility separate (FP-4)
quick_nap_interval behavior-changed, approved positive ConsolidationSchedule + coordinator + memory capability; omit coordinator to disable test_fp_class_b_native_observables.py: positive, nonpositive, omission, per-scope tests approved change: N-positive cadence is per scope; 0/negative refuse instead of disabling (CORE-1)
metacognition_confidence_threshold behavior-changed, approved default SelectiveMetacognitionPolicy governance/stages/metacognition_policy.py; test_subject_confidence_precedes_reporter_and_an_invalid_subject_stays_loud approved change: subject/reporter confidence supplements hard evidence; no legacy activation-log score (CORE-1)
metacognition_gate behavior-changed, approved governance(trigger_policy=...) governance/stages/metacognition.py; test_public_custom_policy_is_the_explicit_opt_out_seam approved change: migrate callable to native trigger contract (CORE-1)
metacognition_selective_gate behavior-changed, approved governance capability default policy governance/stages/metacognition_policy.py; test_public_selective_policy_preserves_the_three_regression_probes approved change: composed reflector uses selective policy; old flag rejected (CORE-1)
metacognition_sensitive_tags behavior-changed, approved native recall tag projection plus caller state evidence memory/recall_evidence.py; test_public_agent_distinguishes_native_recalled_tags_from_draft_terms; test_core21_sensitive_tags_differential.py compares native stream review with compatibility refusal approved change: retrieved tag classification triggers review without copying private text into governance state or public stage reasons; the retired compatibility field refuses before dispatch (CORE-1, CORE-21)
metacognition_trivial_ack_patterns behavior-changed, approved explicit trivial_ack_patterns policy governance/stages/metacognition_policy.py; test_public_custom_ack_patterns_replace_the_default_set approved change: supplied patterns replace defaults; hard signals still review (CORE-1)
activation_log_mode behavior-changed, approved native HMS default footer; no never/complex policy prompting/hms.py; test_native_compiler_preserves_the_default_footer_but_has_no_mode_switch approved change: retain default; do not reimplement modes (FP-4)
prompt_block_self_edit legacy-inert None cutover/retired_settings.py; test_retired_configuration.py stale docs → remove guidance (FP-4)
dev_sqlite_checkpoint_path behavior-changed, approved human_interaction(...) plus AgentHost(continuation_factory=human_continuation(...)) with adopter-owned durable checkpoint/consumption ports platform/human_continuation.py; test_public_host_continues_a_durable_pause_in_a_fresh_process; test_legacy_sqlite_path_refuses_before_dispatch CORE-1 APPROVE CHANGE: no import of legacy LangGraph SQLite files, paused runs, transcripts, or working deque data; new-port recovery, scope binding, payload isolation, and single use are measured, not legacy-file parity; pin published 9.12 for legacy files (FP-4)
scorer_on_hot_path behavior-changed, approved Explicit public RetrievalCoordinator memory/factory.py; test_public_agent_same_scenario_uses_scorer_or_pre_ranked_order the legacy boolean is unsupported; compose native scoring or a source-owned pre-ranked order (FP-3); approved change recorded in CORE-1 comment 5596490f (not universal parity)
state_class behavior-changed, approved typed per-turn Agent.run(state=...) mapping read by a composed capability agent/facade_turn.py; test_custom_state_is_per_turn_and_legacy_schema_refuses_before_dispatch no state-class conversion or automatic continuation persistence → keep durable app state deployment-owned (FP-4); approved change recorded in CORE-1 comment 5596490f (not universal parity)
experimental_tool_decorator legacy-inert Always-public @symfonic_tool cutover/retired_settings.py; test_retired_configuration.py stale config → remove docs (FP-4)
ask_user_pause_ttl_seconds behavior-changed, approved human_interaction(ttl=TTLPolicy(...)) plus AgentHost continuation human/values.py; test_public_host_continues_a_durable_pause_in_a_fresh_process below/equal/expired fresh-process recovery is measured; above maximum rejects rather than clamps; owner approved explicit TTL refusal (FP-3); approved change recorded in CORE-1 comment 5596490f (not universal parity)
ask_user_tool_descriptions equivalent-proven human_interaction(ask_user_description=...) → InteractionToolSpec.description human/factory.py; test_public_agent_binds_a_custom_or_localized_ask_user_description custom and Spanish localized text reach the model binding; composition selects one deployment locale (FP-4)
procedural_force_first_action_tool equivalent-proven ToolsCapability(stages=(ForcedChoiceStage(),)) plus per-round palette release tools/stages/forced.py; test_palette_force_release.py native composition is explicit rather than a legacy boolean → compose the stage with the procedural resolver (#189)
credential_patterns behavior-changed, approved CredentialHygieneStage governance(patterns=...); test_custom_credential_pattern_scrubs_its_configured_key_only; test_core21_credential_patterns_differential.py compares the two public doors with a shared tool request and disabled-pattern control approved change: native explicit replacement scrubs the selected key while compatibility use refuses before model or tool dispatch; matching tool results are redacted whole (CORE-1, CORE-21)
fabrication_refuse_min_confidence behavior-changed, approved FabricationStage grades → public egress verdict governance(min_confidence=..., refuse_min_confidence=...); test_public_fabrication_floor_withholds_the_draft_at_both_doors and test_intent_only_finding_uses_the_actionable_floor_without_detector_refusal public run/stream allow detector findings below 0.6, withhold at 0.6 via STEER, and refuse detector findings at 0.8 inclusive; action intent without tool calls can STEER at 0.6 but cannot itself trigger REFUSE; owner approved the changed two-floor policy in CORE-1 comment 5596490f (not full legacy parity or metacognition parity)
hms_budget_mode behavior-changed, approved PromptBudget cutover/prompt_assembly_policy.py; test_hms_budget_mode_native_observable.py owner approved the safer native default; opt-in regional warn/strict remains available (CORE-1)
hms_system_prompt_token_budget behavior-changed, approved RegionalPromptPolicy.hms_system_prompt_token_budget prompting/regional.py; test_hms_region_is_pinned_against_the_total_prompt_budget approved change: explicit regional HMS limit is separate from the total prompt budget; legacy config stays refused (CORE-1)
on_hms_budget_exceeded equivalent-proven RegionalPromptPolicy.on_hms_budget_exceeded prompting/regional.py; test_hms_overflow_reports_only_counts_and_strict_stops_before_provider observer carries only counts and fires before strict failure (FP-4)
jit_manifest_token_budget behavior-changed, approved RegionalPromptPolicy.jit_manifest_token_budget prompting/regional.py; test_public_agent_sends_bounded_domain_and_independent_manifest_bytes; test_core138_jit_body_differential.py::test_full_jit_hms_body_differential CORE-138 owner approved the native JIT placement: the template keeps a manifest marker and a separate L1 tool line follows TOOL DISCIPLINE. Caller-authorized manifest remains independently bounded; legacy keyword filtering and automatic selection are not restored. This does not sign the domain_description_max_chars row.
manifest_cache_position behavior-changed, approved Public L1/L2 regions plus #221's explicit native manifest opt-in cutover/prompt_assembly_policy.py; Anthropic region capture proves marker placement only owner approved native marker placement without reproducing legacy manifest selection (CORE-1)
memory_extract_cadence behavior-changed, approved ExtractionDirectiveSource(cadence=..., scope_path=scope.path) public Agent session-cadence journey approved change: isolated by full scope and session; anonymous cadence >1 omits directive; not extraction scheduling (CORE-1)
messages_cache_policy behavior-changed, approved explicit NativeCacheComposition history opt-in; no automatic default or rolling ladder cutover/prompt_assembly_policy.py; test_history_opt_in_changes_only_the_second_request_shape owner approved caller-directed Anthropic history caching; stock remains unmarked and cost/latency are unmeasured (CORE-1)
system_prefix_cache_ttl equivalent-proven Stable PromptContribution cache directive plus provider serializer prompting/assembly.py; test_public_two_turn_cache_reaches_anthropic_wire_with_ttl_marker Anthropic wire capture proves the 1h system marker; history is a separate, uncached contract (FP-4)

FP-1 metacognition update and enforcement boundary

FP-1 changed the reviewed target from the old scalar-only stage. SelectiveMetacognitionPolicy is the default, ConfidenceOnlyMetacognitionPolicy is an explicit opt-out, and tests/platform/test_metacognition_preservation.py covers public run and drained-stream triggers for claims, mutating tools, action/ambiguous intent, fabrication findings, caller-supplied tags, native recalled MemoryRecord.metadata["tags"], trivial acknowledgments, custom policy, and invalid confidence signals. The tag route carries classifications only and its public trace is redacted. This establishes critic-invocation coverage for the native public memory composition; it is not a blanket equivalence claim.

The exact owned evidence nodes are tests/platform/test_metacognition_preservation.py::test_subject_confidence_precedes_reporter_and_an_invalid_subject_stays_loud, tests/platform/test_metacognition_preservation.py::test_public_custom_policy_is_the_explicit_opt_out_seam, tests/platform/test_metacognition_preservation.py::test_public_selective_policy_preserves_the_three_regression_probes, tests/platform/test_metacognition_preservation.py::test_public_agent_distinguishes_native_recalled_tags_from_draft_terms, tests/platform/test_metacognition_preservation.py::test_public_custom_ack_patterns_replace_the_default_set, tests/platform/test_governance_amends.py::test_custom_credential_pattern_scrubs_its_configured_key_only, tests/capabilities/governance/test_egress_stages.py::TestFabrication::test_refusal_floor_includes_its_exact_boundary, tests/platform/test_governance_refusal_precedence.py::test_a_repair_does_not_swallow_a_refusal, and tests/platform/test_metacognition_preservation.py::test_public_tool_evidence_distinguishes_mutating_and_read_only.

This proves critic invocation coverage, not every historical amendment shape. platform/governance_verdict.py now turns a STEER or ANNOTATE with no amendment content into a typed GovernanceRefused before an egress draft reaches run, stream consumers, or event sinks. A reflector outage retains the pipeline's existing fail-open policy. The public journey proves this refusal contract; it does not claim that a prompt cache is a history cache or that every legacy verdict was textually revised.

PARTIALLY MIGRATED controls (23 unique)

The following controls are distinct from the flat 38. They are source-enumerated from the cutover contract. “Admitted but inactive” never means the legacy control was inert.

Control Classification Live owner/wiring Source; evidence Risk → action (owner)
self_reflection equivalent-proven memory_capabilities(..., reflection=MemoryReflectionService(...)) finalizer memory/reflection_phase.py; test_reflection_in_the_turn.py explicit collaborator replaces implicit response-provider selection → follow migration composition (#189)
reflection_prompt equivalent-proven MemoryReflectionService(prompt_template=...) memory/reflection.py; test_reflection_in_the_turn.py missing {conversation} is refused before a model call → use the composed prompt template (#189)
domain.core_preferences behavior-changed, approved explicit core_preference_migration(...) → native prompt guardrails/review-trigger terms; explicit per-app core_preference_governance(...) reviewer at egress platform/core_preferences.py; platform/core_preference_policy.py; TestMetacognitionEndToEnd::test_sensitive_tag_forces_reflection_and_refuse_replaces_response; test_legacy_critic_receives_the_preference_statement; test_public_core_preference_adapter_preserves_values_and_reaches_native_composition; test_a_migrated_core_preference_changes_no_executable_decision; test_core_preferences_causal_differential.py; test_core_preference_policy.py; test_generated_app_composes_preference_reviewer_at_public_egress legacy critic receives preference prose; native reflector does not automatically consume it, and the migrated preference alone does not change a governed decision; an explicit caller-supplied async reviewer does, and fails closed; owner approved the explicit per-app reviewer/policy instead of an automatic legacy critic in CORE-139 comment 49c841c8 (not safety parity, adoption frequency, or per-preference effectiveness)
read_only_tools behavior-changed, approved governance(read_only_tools=...); the admitted compatibility field is inactive when metacognition is off governance/stages/metacognition_policy.py; test_public_tool_evidence_distinguishes_mutating_and_read_only; test_core21_read_only_tools_differential.py replays one tool exchange at both doors approved change: explicit native names suppress only the tool-action signal; unclassified actions and substantive claims still review (CORE-1, CORE-21)
skill_auto_approve behavior-changed, approved Native Agent writes drafts; MemoryAdminService requires explicit human approval before activation ProceduralLayer; test_extraction_in_the_turn.py and test_procedural_chain.py cover drafts, explicit approval, prompt consumption, and tool enforcement CORE-1 owner approved no implicit auto-approval; SymfonicAgent remains a live legacy reader (CORE-28)
domain behavior-changed, approved hms_source_for_domain(...) projects description prompting/regional.py; test_public_agent_sends_bounded_domain_and_independent_manifest_bytes approved change: only description projects to HMS; tools and governance remain capability-owned (CORE-1)
domain_description_max_chars behavior-changed, approved RegionalPromptPolicy.domain_description_max_chars test_jit_domain_restores_legacy_directive_bytes; test_core1_full_hms_domain_cap_restore.py; test_core140_domain_cap_transition.py (public run/stream cap and empty fallback; construction-time notice on each of two Agents with no repeat across turns; first-read notice on each of two direct compositions from one source) CORE-1 comment 50509c6e approves native RegionalPromptPolicy wording and once-per-composition notice lifetime; the legacy FrameworkConfig notice remains once per SymfonicAgent. Direct composition tests distinguish the notice guard from an Agent-bound guard. Agent rejects a second prompting stage, so same-Agent multi-composition remains UNKNOWN through the public API; no general deployment reachability, whole-template parity, or engine-retirement claim.
hydration_min_relevance behavior-changed RetrievalPolicy.min_relevance memory/factory.py; test_issue188_public_retrieval_contracts.py; test_core134_hydration_relevance_differential.py; test_core1_relevance_root_audit.py Actual constructed RetrievalEngine produces composite scores; admitted kernel run/stream preserves below/equal/above admission. The pinned legacy default per-layer body admits unscored keyword matches; public legacy scorer-on-hot-path use is refused before provider. Native explicit composite floor preserves its own boundary and unscored admission. Synthetic mechanism evidence does not calibrate apps; row stays unsigned pending representative per-app corpus, accepted rollout bounds and owner approval (FP-3). Owner ruled CORE-432 (declared split, permanent): no scale wins, per-source scales stand, no tuned number moves.
episodic_telemetry_sink equivalent-proven memory_capabilities(..., episodic_telemetry_sink=sink) → native memory.lifecycle memory/telemetry.py; test_issue191_episodic_telemetry_contracts.py receipt contains scope/run ids and committed ids only; sink failure never rolls back publication (FP-4)
working_memory_recent_turns behavior-changed, approved memory_capabilities(conversation=..., recent_turns=...) → WorkingWindow.read test_public_agent_recent_turns_changes_model_prompt_and_zero_disables_window; tests/retirement/test_core29_working_window_evidence.py::test_direct_agent_zero_disables_window_but_still_retrieves; tests/retirement/test_core29_working_window_evidence.py::test_facade_zero_disables_window_and_retrieves_without_fallback; test_core135_working_window_differential.py (test_same_corpus_public_window_differential, test_hms_off_preserves_native_window_as_approved_change, test_typed_facade_cells_and_native_unknown); test_core135_window_prompt_and_scaffold.py (scaffold window tests) public factory accepts zero, skips conversation reads and retains ranked recall; the N-utterance recency prefix matches legacy in the seeded run/stream corpus for N=0,1,2 and native keeps it with HMS prompting off where legacy sends a bare query; scaffold N exchanges are 2N saved messages (a different unit); typed cells cover the compatibility facade, native stream_typed is UNKNOWN (Agent has no public stream_typed); owner approved in CORE-135 comment be4ee003 (not whole-prompt parity, byte parity, or engine retirement)
working_layer_exclude_speakers behavior-changed, approved Public working window and tagged recovered records test_public_agent_filters_tagged_recalled_speaker (run/stream); test_saturated_recall_exclusion_does_not_restore_legacy_selection (run/stream/stream_typed) CORE-133 owner approved native filter-before-top_k: in the measured 12-record episodic top_k=2 profile, one user hit reaches the native prompt versus zero on legacy; neither prompt includes tagged assistant hits. Unfiltered and singleton legacy controls confirm recall is live. No universal ranking parity or retirement is claimed.
stm_summary_mode equivalent-proven WorkingMemorySummaryService JIT-only contribution memory/summary_stage.py; test_stm_summary_in_the_turn.py explicit evicted-turn source replaces a legacy-owned working layer → compose the migration example (FP-4)
scope_blend_mode behavior-changed, approved Public RetrievalCoordinator + ScopeBlend memory/factory.py; test_public_agent_same_scenario_uses_scorer_or_pre_ranked_order; test_public_agent_scope_blend_off_and_blend_choose_different_order OFF, BLEND and BACKFILL produce distinct public Agent ranking; pre-ranked sources preserve their order; owner approved change (FP-3); approved change recorded in CORE-1 comment 5596490f (not universal parity)
enabled_layers behavior-changed, approved explicit RetrievalPolicy.enabled_layers in memory_capabilities(retrieval=...); an explicitly injected orchestrator keeps its own selector test_enabled_layers_same_turn_legacy_kernel_and_native_agent; test_public_agent_enabled_layers_reaches_source_and_model_prompt; test_core26_injected_orchestrator.py (test_injected_orchestrator_selects_layers_on_kernel_route, test_injected_orchestrator_matching_or_unset_selector_is_quiet) The same enabled/disabled markers reach the expected source layers and prompt on direct Agent and the admitted SymfonicAgent Kernel path across run/stream/stream_typed; native stream covers the latter two's plain-text dispatch, not a separate typed-output contract. A supplied orchestrator's selector is retained and an explicitly set disagreeing FrameworkConfig.enabled_layers only logs a diagnostic; legacy implicit precedence is not transferred to native composition; owner approved in CORE-26 comment 6db8a76e (not universal retrieval parity, byte parity, or engine retirement).
enable_entity_linker equivalent-proven Policy plus extractor collaborator memory/policy.py; test_entity_linking_requires_the_opt_in_and_enforces_thresholds_and_cap the disabled policy declines; enabled composition requires an extractor (FP-3)
phase1_spreading_weight behavior-changed, approved LearningPolicy → quick_phases(policy=...) memory/phases/quick.py; test_public_quick_nap_persists_phase1_spreading_weight_effect native nap is a replacement; the public quick nap persists the selected weighting (FP-3); approved change recorded in CORE-1 comment 5596490f (not universal parity)
entity_linker_extractor behavior-changed, approved explicit deep_phases(entity_extractor=...) collaborator test_the_extractor_that_runs_is_the_one_composed_not_the_one_named approved change: injected extractor runs; legacy regex/llm kind no longer selects it (CORE-1)
entity_linker_min_mention_count equivalent-proven LearningPolicy → entity phase memory/policy.py; test_entity_linking_requires_the_opt_in_and_enforces_thresholds_and_cap N-1 produces no MENTIONS edge; N does (FP-3)
entity_linker_max_episodics_per_run equivalent-proven LearningPolicy → entity phase memory/policy.py; test_entity_linking_requires_the_opt_in_and_enforces_thresholds_and_cap persisted extractor inputs stop at the cap (FP-3)
entity_linker_confidence_threshold equivalent-proven LearningPolicy → entity phase memory/policy.py; test_entity_linking_requires_the_opt_in_and_enforces_thresholds_and_cap equality accepts; below threshold is rejected (FP-3)
episodic_summarization_max_entries equivalent-proven LearningPolicy → quick phase memory/policy.py; test_composed_episodic_summary_starts_above_the_cap_and_consumes_exact_batch summary starts only above the cap (FP-3)
episodic_summarization_batch_size equivalent-proven LearningPolicy → quick phase memory/policy.py; test_composed_episodic_summary_starts_above_the_cap_and_consumes_exact_batch exactly the configured batch is consumed (FP-3)
enable_semantic_merge equivalent-proven explicit quick_phases(enable_semantic_merge=True, chat_model=...) memory/phases/quick.py; test_semantic_merge_is_explicitly_disabled_or_enabled_on_quick_nap disabled nap preserves duplicates; enabled judge merges them (FP-3)

Continuation boundary and exclusions

Seven continuation contexts are audited separately and are not seven additional controls: enabled_layers, domain, hydration_min_relevance, working_memory_recent_turns, domain_description_max_chars, working_layer_exclude_speakers, and scope_blend_mode. continuation_admission.RECONCILED_ROWS, tests/retirement/test_continuation_reconciliation.py, and tests/agent/cutover/test_continuation_cutover.py establish cutover context only. They do not establish durable process-restart recovery.

The inventory excludes nested agent.ask_user_pause_ttl_seconds (the same TTLPolicy behavior change), per-call is_admin (refused by governance authority), and all other nested/per-call options. This is an explicit scope boundary, not a claim that no other configuration needs review.

Derived totals and release implication

The validator prints totals directly from the checked-in rows. The current evidence leaves a large set of high-risk replacement-unverified, removed-without-equivalent, and behavior-changed controls. That blocks a blanket no-feature-loss claim. FP-3 owns the discriminating public journeys; FP-4 owns supported composition, explicit refusals, and deliberate product decisions. FP-1 owns the metacognition policy implementation and its remaining custom-pattern and verdict-enforcement evidence.