fix(loop): 工具调用 arguments 损坏时丢弃重试 + 非流式兜底,断投毒级联
deepseek-v4-flash 大参数工具调用(大 write/run_python,≈7K+ 字符)偶发把内容
碎片错位粘进 arguments 开头致 JSON 解析失败,或退化成空 {} 缺参。隔离批量验证
(干净上下文)非流式 8/8、流式 8/8 全干净 → 上游间歇抖动,概率低;真正放大成
灾的是 loop 把损坏的 assistant 消息入库 + 每轮重发,诱导模型继续学坏(投毒级联)。
- core/loop.py:_stream_llm 拉一轮后用 _malformed_tool_calls 校验 tool_call
arguments 能否 json.loads,不能则丢弃整轮(不 append/不记账)重 roll(≤3 次),
最后一次降级 _nonstream_once(provider 服务端拼,绕开流式错位)。流式收集逻辑
抽成 _collect_stream_once,正常路径不变。
- core/executor_host.py / core/sandbox/tool_runner.py:缺必填参数早返
「缺少必填参数 [...];请带齐 [...] 重新调用」,替掉暴露内部签名的
TypeError missing N required positional arguments(host + docker 两路覆盖)。
- 文档:PROGRESS.md 加 2026-06-06 条;RUN.md 故障兜底加一行。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>