diff --git a/internal/runtime/memory/preinsert_recall_test.go b/internal/runtime/memory/preinsert_recall_test.go index edeeb58..9639c26 100644 --- a/internal/runtime/memory/preinsert_recall_test.go +++ b/internal/runtime/memory/preinsert_recall_test.go @@ -76,6 +76,30 @@ func reviewTimeoutEnvUnset(t *testing.T) { // 照样绿)—— 那条防线在下面的 TestReviewTimeoutEffectiveValueIsTheOnlyDefault。 // // embedding 侧同一口径也有一条钉值测试(api_url_test.go),两边互为护栏。 +func TestEmbeddingTimeoutFitsReviewBudget(t *testing.T) { + t.Parallel() + + if embedding.DefaultRequestTimeout <= 0 { + t.Fatalf("embedding.DefaultRequestTimeout = %s, 必须为正", embedding.DefaultRequestTimeout) + } + if embedding.DefaultRequestTimeout >= defaultReviewTimeout { + t.Fatalf("embedding 单次超时 %s 必须严格小于审查总预算 %s", + embedding.DefaultRequestTimeout, defaultReviewTimeout) + } + // 第 2 条:预算必须盖得住实测最坏链长,还要留得下 T1 那一步自己的超时 + // (T1 在召回**之后**跑,同一条 ctx)。空闲余量倍数由 budget.go 的注释列明, + // 这里只钉住「盖得住」这条下界。 + worst := measuredReviewChainLoaded + defaultT1Timeout + if defaultReviewTimeout <= worst { + t.Fatalf("审查单条预算 %s 必须严格大于「实测最坏召回链 %s + T1 超时 %s = %s」—— "+ + "否则链还没跑完预算就用光(2026-10-13 的 2274 条超时降级正是这条)", + defaultReviewTimeout, measuredReviewChainLoaded, defaultT1Timeout, worst) + } + if measuredReviewChainIdle >= defaultReviewTimeout { + t.Fatalf("空闲实测链长 %s 已不小于审查预算 %s(余量必须为正)", + measuredReviewChainIdle, defaultReviewTimeout) + } +} // TestReviewTimeoutExplicitEnvValueWins 钉住另一半口径(M16):`.env` / 进程环境 // **显式写了**这个键时,它必须**原样到达生效值**(不被 memory 侧的默认值顶掉)。 @@ -200,29 +224,3 @@ func TestReviewTimeoutEffectiveValueIsTheOnlyDefault(t *testing.T) { t.Fatalf("启动行没有打印生效值 timeout=%s:%q", effective, line) } } - -// embedding 侧同一口径也有一条钉值测试(api_url_test.go),两边互为护栏。 -func TestEmbeddingTimeoutFitsReviewBudget(t *testing.T) { - t.Parallel() - - if embedding.DefaultRequestTimeout <= 0 { - t.Fatalf("embedding.DefaultRequestTimeout = %s, 必须为正", embedding.DefaultRequestTimeout) - } - if embedding.DefaultRequestTimeout >= defaultReviewTimeout { - t.Fatalf("embedding 单次超时 %s 必须严格小于审查总预算 %s", - embedding.DefaultRequestTimeout, defaultReviewTimeout) - } - // 第 2 条:预算必须盖得住实测最坏链长,还要留得下 T1 那一步自己的超时 - // (T1 在召回**之后**跑,同一条 ctx)。空闲余量倍数由 budget.go 的注释列明, - // 这里只钉住「盖得住」这条下界。 - worst := measuredReviewChainLoaded + defaultT1Timeout - if defaultReviewTimeout <= worst { - t.Fatalf("审查单条预算 %s 必须严格大于「实测最坏召回链 %s + T1 超时 %s = %s」—— "+ - "否则链还没跑完预算就用光(2026-10-13 的 2274 条超时降级正是这条)", - defaultReviewTimeout, measuredReviewChainLoaded, defaultT1Timeout, worst) - } - if measuredReviewChainIdle >= defaultReviewTimeout { - t.Fatalf("空闲实测链长 %s 已不小于审查预算 %s(余量必须为正)", - measuredReviewChainIdle, defaultReviewTimeout) - } -}