Files
HomeAgent/internal/agent/core
JianFeeeee ed61a8d604 test(core): ID:12 嵌套压力用例改「等状态」,不再赌 300ms 固定窗口
根因(-race 实测定性,非竞争):a.cancelLLM 的装配在进入 Chat 之前,
因此「任务已被选中运行」与「cancelLLM 已装上」之间存在一个空档。中断若
恰好落在空档里,registerInterrupt 已经打印 preempt 并置位让位信号,但
cancelCurrentLLM() 读到的 cancel 仍是 nil ⇒ 取消不生效,受害者跑满延迟后以
outcomeDone 结束(runTaskSteps 在 outcomeDone 处直接返回,不再经过安全点)
⇒ 栈深永远达不到目标值,「第 N 级注入后栈深未达 N:0」。

改法:把判据从「等固定时间」换成「等状态」——
  · gatedProvider:Chat 进入即发 entered token 并阻塞到 ctx 取消或 gate 关闭,
    使「受害者正处于一次可取消的 LLM 调用中」成为可等待的状态;
  · 注入前 waitEntered 等该状态,注入后 waitStackDepth 轮询等到栈深真的达成;
  · 排空阶段 close(gate) 让仍在运行的 L4 自然收尾。
延迟参数 300ms 未动,未改调度器参数,未加 skip,未改被测行为。

证据(internal/agent/core 下连跑 -race 10 轮):10/10 PASS;
另在 12 路 CPU 满载(改点前同条件下实测 12/30 轮失败)下 3/3 PASS。

Co-authored-by: pi <pi@local>
2026-10-24 14:34:24 +08:00
..