diff --git a/internal/ctxmgr/semantic_summary.go b/internal/ctxmgr/semantic_summary.go index d8ab6e58..de8d72ab 100644 --- a/internal/ctxmgr/semantic_summary.go +++ b/internal/ctxmgr/semantic_summary.go @@ -253,7 +253,9 @@ func applySemanticShadow(ctx context.Context, sum *ChatSummary, msgs []ChatMessa if report.Protocol == "" { report.Protocol = semanticProtocolV1 } - // Explicitly do NOT swap sum.Narrative even if REPLACE env is true. + // Explicitly do NOT swap sum.Narrative even if REPLACE env is true + // (Wave 5 X-2 sealed; see wave5-deadcode-decisions.md#x-2). + // Keep the call so envBool parsing stays covered; do not "fix" by wiring REPLACE. _ = SemanticSummaryReplaceEnabled() sum.Shadow = report } diff --git a/internal/ctxmgr/summary_flags.go b/internal/ctxmgr/summary_flags.go index 31bf2764..c6d43a26 100644 --- a/internal/ctxmgr/summary_flags.go +++ b/internal/ctxmgr/summary_flags.go @@ -7,12 +7,18 @@ import ( ) const ( - EnvSemanticSummaryShadow = "SEMANTIC_SUMMARY_SHADOW" + EnvSemanticSummaryShadow = "SEMANTIC_SUMMARY_SHADOW" + // SEALED (Wave 5 X-2, 2026-09-18): REPLACE must stay unwired indefinitely per + // system-health-remediation-plan.md Wave5 + red-line "SEMANTIC_SUMMARY_REPLACE + // 不接线". Enabling REPLACE to swap served narrative requires a separate + // explicit user authorization + fail-closed rollout design; do not wire it as + // a side effect of an unrelated change. See .doc/ops/short-term/2026-09-18- + // wave5-deadcode-decisions.md#x-2. EnvSemanticSummaryReplace = "SEMANTIC_SUMMARY_REPLACE" ) // SummaryFeatureFlags controls semantic summary rollout. -// REPLACE is reserved and must remain unwired in PU6 shadow delivery. +// REPLACE is reserved and must remain unwired in PU6 shadow delivery (Wave 5 X-2 sealed). type SummaryFeatureFlags struct { Shadow bool Replace bool @@ -51,7 +57,8 @@ func SemanticSummaryShadowEnabled() bool { } // SemanticSummaryReplaceEnabled reports the REPLACE env bit. -// PU6 must not use this to swap the served deterministic narrative. +// SEALED (Wave 5 X-2): PU6 must not use this to swap the served deterministic narrative. +// See .doc/ops/short-term/2026-09-18-wave5-deadcode-decisions.md#x-2. func SemanticSummaryReplaceEnabled() bool { return CurrentSummaryFlags().Replace }