智能体死循环熔断 #122
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/117-agent-loop-breaker"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #117
实现
per-chat 连续智能体源(
is_bot)输入计数 + 阈值拦截,防两个机器人账号互相触发无限对话循环——落点在两级门控之前(级一门控对事件触发恒+inf直通,拦不住)。agent_loop_breaker.py:next_consecutive_bot_count/should_break纯函数。_consecutive_bot_message_counts落在runtime_state.py(跨簇,反应式消息与环境信号编排共用)。entry_reactive.py::_handle_reactive_message)与环境信号侧(environment_pipeline.py::_process_environment_signal)都接了线;EnvironmentSignal新增is_bot: bool = False字段,为真时跳过 tier-1/tier-2、只计入熔断计数。arise_agent_loop_breaker_threshold(默认 5)归静态 config(ADR-0011 阈值三层分类表已列出这一项)。design.md真人感层补条目,ADR-0011/ADR-0014 各补一个更新节。两轴 review 发现与修正
两轴 review(sonnet)跑出 3 条发现,adversarial verify 后 2 条确认、1 条证伪:
_handle_interaction_event(戳一戳/表情回应,target_is_self=True分支)当初完全没有接线到熔断——它走的是to_interaction返回的ConversationInput.is_bot,与反应式消息共用同一份状态,但只有消息那一条入口真的读了它。两个 bot 账号互相戳一戳、其中一个绑了"戳回去"的工具调用,就是这条要防的无限循环,之前完全没有防护。修法:抽出_loop_breaker_tripped供两条反应式入口共用,避免再出现"只写了一处"的半截落地;同时改掉已被证伪的"这里是唯一能在两级门控前拦截的位置"注释。补了三条回归测试(单独触发拦截、真人戳一戳不受影响、消息侧与交互侧共享同一份计数)。environmental_awareness.py里EnvironmentSignal.is_bot文档一处拼写缺分隔符("messageis_bot")。environment_pipeline.py里should_break()只影响日志、不产生行为分支——核实后是有意为之(bot 源信号无条件跳过 tier-1/tier-2,不看阈值),函数自己的 docstring 已经写明,也有测试钉住,未改动。已知缺口(记录在案,非本票范围)
第三方交互原语(
target_is_self=False)转成的EnvironmentSignal目前恒is_bot=False——InteractionEvent没有携带"发起方是不是机器人账号"这个信息。要补上需要先扩InteractionEvent的契约,超出本片范围,留给后续按真实需求评估(EnvironmentSignal.is_bot文档与 ADR-0014 更新节均已写明)。测试
test_debounce_e2e.py一个测试仅在满负载下偶发 flaky,隔离运行必过,与本票改动无关,是已知的 pre-existing flake)。ruff check通过。