Files
smartmate/backend/newAgent/HANDOFF_工具研究与运行态重置.md
Losita 21b864390b Version: 0.9.9.dev.260408
后端:
1. 粗排后分流与顺序守卫落地,支持“无明确微调偏好时粗排后直接收口”,并新增 allow_reorder / needs_refine_after_rough_build 语义,打通 chat→rough_build→execute/order_guard→deliver 路由。
2. execute 工具执行链路修复:清理乱码坏块与重复分支;新增 min_context_switch 未授权拦截;补齐 suggested 顺序基线初始化与顺序守卫联动。
3. 新增复合写工具 min_context_switch(减少上下文切换)并接入注册、参数解析、写工具白名单、提示词与文档;仅在用户明确允许打乱顺序时可用。
4. 工具口径升级:find_first_free 支持 day/day_start/day_end 范围参数并统一文案;移除 find_free 兼容别名;读写工具输出统一到“第N天(星期X)”格式。
5. prompt 同步升级:chat/execute/execute_context 增加粗排后是否继续微调、顺序授权、min_context_switch 使用边界与返回示例约束。
6. handoff 文档重命名并重写下班交接重点:下一步聚焦“工具收敛能力研究 + 运行态必要参数重置(不丢运行态)”。
7. 同步更新调试日志文件。
前端:无
仓库:无
2026-04-08 23:55:09 +08:00

24 KiB
Raw Blame History

Handoff工具研究与运行态重置

以下内容可直接交给下一位助理继续做。

本文档更新时间2026-04-08

0. 当前结论先说清

当前可以明确分成三段看:

  1. 第 1-2 阶段已完成
    粗排链路和 abort -> deliver 正式终止协议已打通,真实链路已验证可跑。

  2. 第 3 阶段第一版已落地
    execute 上下文已改成固定 4 消息结构,并接入当轮 ReAct 窗口压缩(按工具去重保留最新 observation
    工具结果在执行链路中已改为不截断prompt 也已加硬约束JSON、参数名、读写动作、重复读约束等

  3. 当前主矛盾已转移到“工具收敛能力”
    最新日志显示:不是上下文失控,而是工具输出对“何时停止微调”支持不足,导致模型持续 list_tasks/find_first_free/move 小步循环。

一句话总结:

  • 粗排和执行框架已经能跑;
  • 上下文瘦身第一版已经到位;
  • 下一棒应优先改工具层的“冲突表达 + 候选位质量 + 结束判据”,而不是再回头补粗排。

1. 用户已经明确确认的业务语义

这些结论已经和用户对齐,后续不要再摇摆:

  1. 第一轮实现优先参考旧 agent 链路,不能闭门造车。

  2. 对排程场景来说LLM 的角色是“粗排后的优化器”,不是“粗排漏排后的人工补排器”。

  3. 如果粗排完成后仍有真实 pending 任务,这不是正常状态,而是异常状态。
    正确处理是:

    • 直接终止本轮
    • 明确报错
    • 不再引导 LLM 去一个个 place
  4. always_execute、是否自动放行、是否写库,这些都是后端执行层语义,不应该写进 prompt 让 LLM 判断。

  5. prompt 必须可插拔,不能写死成“排程专用 prompt”。

  6. prompt 必须保留明确编号结构,例如 1. / 1.1 / 2.1,不能写成一坨说明文。

  7. prompt 里要保留最小可用 JSON 示例,否则 LLM 很容易输出跑偏。


2. 第 1 阶段:粗排链路修复,已完成

2.1 已完成的核心修复

A. 粗排结果来源修正

位置:

  • backend/service/agentsvc/agent_newagent.go

已做:

  • makeRoughBuildFunc() 不再只看 []TaskClassItem
  • 改为使用 HybridScheduleWithPlanMulti() 返回的 []HybridScheduleEntry
  • 只提取 status="suggested"task_item_id>0 的条目

意义:

  • 旧问题是:只会拿到有 EmbeddedTime 的一部分结果,普通 suggested 条目会丢
  • 现在粗排 placement 来源和旧 agent 主链路一致

B. 作用域修正:只按本轮 task_class_ids 看 pending

位置:

  • backend/newAgent/tools/status.go
  • backend/newAgent/model/graph_run_state.go
  • backend/newAgent/node/rough_build.go

已做:

  • 新增按 task_class_ids 判断 task 是否属于本轮范围
  • EnsureScheduleState() 会对 ScheduleState / OriginalScheduleState 做域内裁剪
  • countPendingTasks() 只统计本轮任务类范围内的真实 pending

意义:

  • 修掉“用户所有任务类的 pending 被误算进本轮粗排结果”的问题

C. 窗口修正ScheduleState 的 DayMapping 改为优先按本轮任务类加载

位置:

  • backend/newAgent/model/state_store.go
  • backend/newAgent/model/graph_run_state.go
  • backend/conv/schedule_provider.go

已做:

  • 新增可选接口 ScopedScheduleStateProvider
  • AgentGraphState.EnsureScheduleState() 首次加载时,若 provider 支持 scoped 加载,则优先走 LoadScheduleStateForTaskClasses()
  • ScheduleProvider 实现了按本轮 task_class_ids 精确加载 ScheduleState
  • buildWindowFromTaskClasses() 改成逐个任务类做日期转换,坏日期/超学期日期会被忽略,不再把整轮窗口拖坏

这次修的是一个真实 bug

  • 用户真实日志里曾出现:
    • placements=44
    • pending_in_scope=44
  • 这说明 placement 已经出来了,但一个都没写回 state
  • 根因不是粗排没算出来,而是 DayMapping 窗口被全量任务类脏日期污染,导致 WeekDayToDay() 映射失败

现在这个问题已经修掉,用户已确认“粗排跑通了”。

D. 粗排落位语义改成 suggested

位置:

  • backend/newAgent/node/rough_build.go
  • backend/newAgent/tools/read_tools.go
  • backend/newAgent/tools/read_helpers.go
  • backend/newAgent/tools/write_tools.go
  • backend/newAgent/tools/SCHEDULE_TOOLS.md

已做:

  • 粗排成功写回后,任务状态会从真实 pending 变成 suggested
  • 不再使用“pending + slots”的旧兼容语义作为主路径
  • 工具读写层已经统一支持 existing / suggested / pending

意义:

  • 粗排结果是“建议落位”,后续应使用 move / swap / unplace
  • 不应该再让 LLM 把这些任务当作待补排任务来 place

E. 粗排节点增加了可观测 debug

位置:

  • backend/newAgent/node/rough_build.go

现在会打这些日志:

  • placements
  • applied
  • day_mapping_miss
  • task_item_match_miss
  • pending_in_scope
  • window_days
  • 少量 miss 样本

意义:

  • 下次如果粗排再挂,不需要再靠猜
  • 能直接区分是:
    • DayMapping 没命中
    • 还是 task_item_id 没命中

2.2 粗排阶段当前的真实状态

当前真实结论:

  • 粗排已经能跑通
  • 用户已在真实链路确认这一点

所以粗排这条线当前不是主矛盾了。


3. 第 2 阶段:正式 abort/terminal 协议,已完成

3.1 已完成的核心改动

A. CommonState 引入统一 terminal outcome

位置:

  • backend/newAgent/model/common_state.go

已做:

  • 新增:
    • FlowTerminalStatus
    • FlowTerminalOutcome
  • 新增方法:
    • Abort(...)
    • Exhaust(...)
    • HasTerminalOutcome()
    • TerminalStatus()
    • IsCompleted()
    • IsAborted()
    • IsExhaustedTerminal()
    • ClearTerminalOutcome()

意义:

  • 后续 graph / execute / deliver 不再各自猜“当前算不算结束”
  • 统一围绕一份终止结果收口

B. execute contract 正式支持 abort

位置:

  • backend/newAgent/model/execute_contract.go
  • backend/newAgent/prompt/execute.go

已做:

  • 新增 ExecuteActionAbort = "abort"
  • ExecuteDecision 新增 Abort *AbortIntent
  • Validate() 已补齐互斥/必填规则
  • execute prompt / react prompt 都已加入 abort 契约和 JSON 示例

C. rough_build 异常会正式 abort而不是让 LLM 补排

位置:

  • backend/newAgent/node/rough_build.go

已做:

  • 若粗排后仍有真实 pending
    • 发失败状态
    • flowState.Abort(...)
    • 直接交给 deliver 收口

这部分已经和用户确认过业务语义,是对的。

D. execute 层接入 abort / exhausted 正式语义

位置:

  • backend/newAgent/node/execute.go

已做:

  • execute 轮次耗尽时,不再伪装成 done
  • 改为 flowState.Exhaust(...)
  • 新增 handleExecuteActionAbort(...)
  • abort 不在 execute 内直接最终答复,而是交给 deliver

E. graph 路由改成看正式 terminal outcome

位置:

  • backend/newAgent/graph/common_graph.go

已做:

  • RoughBuild -> Execute 改为 branch
  • 粗排异常终止时可以直接 RoughBuild -> Deliver
  • branchAfterExecute() 不再因为“刚好最后一轮”就提前 deliver
  • 必须等 execute 正式写入终止结果

F. deliver 收口统一按 terminal outcome 输出

位置:

  • backend/newAgent/node/deliver.go
  • backend/newAgent/node/agent_nodes.go

已做:

  • deliver 不再无脑 Done()
  • deliver summary 会优先看 terminal outcome
  • 新增:
    • buildAbortSummary
    • buildExhaustedSummary
  • 只有 completed 路径才写 schedule preview
  • aborted / exhausted 跳过 preview

3.2 第 2 阶段的验证情况

本地已跑通过:

go test ./conv ./newAgent/node ./newAgent/model ./newAgent/graph ./newAgent/tools ./service/agentsvc

注意:

  • 每次 go test 后都已清理根目录 .gocache
  • 过程中使用过临时 *_test.go 验证窗口问题和粗排写回问题,跑完后已全部删除

4. 非常重要:当前“上下文”到底改没改

这个点后续助理很容易误判,这里单独写清楚。

4.1 没做的事

这轮没有做第 3 阶段那种“系统性的上下文瘦身”。

也就是说,以下这些东西没有被系统重构:

  • ConversationContext 的整体装配框架
  • 历史恢复/回填主流程
  • 历史裁剪策略
  • token budget 接入
  • “把 history 从流水账改成摘要流”的体系化工程

4.2 但确实改了会进入模型上下文的内容

为了适配新的粗排/abort 语义,这轮确实改了“上下文内容本身”,主要包括:

  1. 粗排完成后的 pinned block 文案变了
    位置:

    • backend/newAgent/node/rough_build.go
  2. execute 的提示词/输出契约变了
    位置:

    • backend/newAgent/prompt/execute.go
  3. 工具层的状态语义从 pending/existing 扩成了 pending/suggested/existing
    位置:

    • backend/newAgent/tools/read_tools.go
    • backend/newAgent/tools/write_tools.go
  4. state summary 会展示 terminal outcome
    位置:

    • backend/newAgent/prompt/base.go

4.3 所以当前准确结论是

可以这样理解:

  • 没有做上下文瘦身
  • 但确实改了进入模型的上下文内容

所以如果下游 execute 现在表现依旧很差,不能简单说:

  • “是第 1-2 阶段没做好”

更准确的说法是:

  • 第 1-2 阶段把粗排和终止语义打通了
  • 但下游本来就被上下文噪音淹着
  • 现在必须进入第 3 阶段,先瘦身,再评价整体效果

5. 当前主矛盾:不是粗排,而是 execute 上下文过胖

用户已经明确表达:

  • “下游本来就基本跑不通”
  • “必须要瘦身上下文才能看出整体的效果”

这意味着明天接手时不要再把精力放在:

  • 继续 patch 粗排小问题
  • 继续围绕 abort 收口补语义

下一步的主任务必须切换为:

  • 第 3 阶段:上下文瘦身
  • 第 4 阶段prompt 结构重构

6. 第 3 阶段:上下文瘦身,明天应该怎么做

6.1 目标

目标不是“再写一版更长的 prompt”而是

  • 让 execute 每轮看到的输入,变成“足够决策、但不淹没”的信息量

换句话说,要把现在的:

  • system + tool summary + 全量 history + pinned + runtime prompt

改造成更可控的:

  • 少量稳定规则
  • 少量当前必要状态
  • 少量最近真实有效观察

6.2 第 3 阶段必须完成的事

A. 历史去流水账

重点文件:

  • backend/service/agentsvc/agent_newagent.go
  • backend/newAgent/prompt/base.go
  • backend/newAgent/node/execute.go

要做:

  • 同工具同参数的重复查询,不保留多份原文
  • 旧结果改成摘要
  • 只保留最近一条原始结果

典型对象:

  • get_overview
  • list_tasks
  • find_free

B. assistant 过程废话不再进入后续模型历史

要处理的典型文本:

  • “我先查一下”
  • “我接下来会……”
  • “我准备先获取……”

这些文本对下一轮决策价值极低,但会稳定吃 token。

C. 失败模式保留“摘要”,不要保留整段原始失败链路

例如:

  • placetask_id
  • find_freeduration

正确保留方式应该更像:

  • 最近失败模式:place 缺少 task_id

而不是整段原始 tool call / tool result 全保留。

D. 缩短 state summary / pinned / runtime prompt 的重叠信息

目前这三层有明显重复:

  • renderStateSummary
  • pinned blocks
  • execute runtime user prompt

第 3 阶段要先做减法,减少重复指令。

E. 参考旧链路的 token budget

重点参考:

  • backend/service/agentsvc/agent.go
  • backend/pkg/token_budget.go

要求:

  • 不一定照搬
  • 但至少要借鉴旧链路“按预算裁历史”的思路

6.3 第 3 阶段推荐顺序

建议按这个顺序做:

  1. 先打印/抓取 BuildExecuteMessages() 的真实输入样本
  2. 再压 history
  3. 再压 pinned/state summary/runtime prompt 的重叠
  4. 最后再接 token budget

原因:

  • 先把“到底胖在哪”看清楚
  • 避免直接上 budget 把有用信息也一起砍掉

6.4 第 3 阶段完成标准

至少要满足:

  1. execute 首轮 messages 显著变短
  2. 同类查询不会反复堆原始结果
  3. assistant 流水话大幅减少
  4. 最近失败模式还能被模型感知
  5. 不破坏第 1-2 阶段已经打通的粗排/abort 语义

7. 第 4 阶段prompt 结构重构,明天应该怎么做

7.1 目标

把当前 execute prompt 从“堆规则 + 堆领域细节 + 堆运行时说明”的混合物,重构成:

  1. 通用执行内核
  2. 领域模块
  3. 运行时任务简报

这是用户已经认可的方向。

7.2 建议的三层结构

第一层:通用执行内核

负责:

  • agent 身份
  • 通用动作协议
  • 通用输出字段
  • 最小 JSON 示例

这里不要写死排程语义。

第二层:领域模块

对排程领域来说,建议抽成单独模块,至少包含:

  • domain_name
  • domain_primary_responsibility
  • domain_out_of_scope
  • domain_goals
  • domain_non_goals
  • tool_catalog_brief
  • hard_constraints
  • soft_objectives
  • abort_conditions
  • done_conditions

对“粗排后排程优化”这个领域,必须明确写清:

  • 这是优化器,不是补排器
  • pending > 0 是异常,不是待办

第三层:运行时任务简报

负责:

  • 用户原始目标
  • 最新补充指令
  • 当前阶段
  • 当前轮次
  • 当前实例级约束
  • 最近状态变化
  • 最近失败摘要
  • 上一次工具结果摘要
  • 本轮目标
  • 推荐下一步动作

7.3 第 4 阶段不要做成什么样

不要做成:

  • 换一版更长的 execute prompt
  • 继续把排程规则硬编码进通用层
  • 继续把运行时状态散落在多个 message 里重复讲

7.4 第 4 阶段推荐落地文件

可以考虑在以下位置拆分:

  • backend/newAgent/prompt/base.go
  • backend/newAgent/prompt/execute.go

如有必要,可以新增文件,例如:

  • backend/newAgent/prompt/execute_core.go
  • backend/newAgent/prompt/execute_domain_schedule.go
  • backend/newAgent/prompt/execute_runtime_brief.go

7.5 第 4 阶段完成标准

至少要满足:

  1. 通用执行协议不再写死排程业务
  2. 排程语义以领域模块方式注入
  3. 运行时信息有单独的结构化简报
  4. prompt 保留编号结构
  5. prompt 保留最小 JSON 示例

8. 明天接手时,最重要的判断标准

明天的助理接手后,不要先问:

  • “为什么微调效果还是差?”

而要先问:

  • “第 3 阶段有没有把上下文瘦下来?”

只有在第 3 阶段做完之后,才适合重新评估:

  • execute 是否真正理解了粗排后的 suggested 语义
  • prompt 重构是否真的提升了整体表现
  • 端到端排程链路是否比之前更稳定

9. 关键文件清单

第 1-2 阶段已改文件

  • backend/conv/schedule_provider.go
  • backend/newAgent/model/state_store.go
  • backend/newAgent/model/graph_run_state.go
  • backend/newAgent/model/common_state.go
  • backend/newAgent/model/execute_contract.go
  • backend/newAgent/graph/common_graph.go
  • backend/newAgent/node/rough_build.go
  • backend/newAgent/node/execute.go
  • backend/newAgent/node/deliver.go
  • backend/newAgent/node/agent_nodes.go
  • backend/newAgent/prompt/base.go
  • backend/newAgent/prompt/execute.go
  • backend/newAgent/tools/read_helpers.go
  • backend/newAgent/tools/read_tools.go
  • backend/newAgent/tools/write_tools.go
  • backend/newAgent/tools/SCHEDULE_TOOLS.md
  • backend/service/agentsvc/agent_newagent.go

第 3-4 阶段重点关注文件

  • backend/service/agentsvc/agent_newagent.go
  • backend/newAgent/prompt/base.go
  • backend/newAgent/prompt/execute.go
  • backend/newAgent/node/execute.go
  • backend/pkg/token_budget.go
  • backend/service/agentsvc/agent.go

10. 测试与验证注意事项

  1. go test 后必须清理项目根目录 .gocache

  2. 如果为了验证临时补 *_test.go,跑完必须删除,不要长期保留

  3. 当前用户明确不希望这轮把 agent 写库逻辑接回去,仍然以“内存态运行”为主

  4. 所有说明、注释、文档都继续用中文


11. 一句话交给下一位助理

第 1-2 阶段已经把“粗排接入”和“正式 abort 收口”打通了,粗排真实链路也已经跑通;现在不要再围绕粗排打补丁,直接进入第 3 阶段做 execute 上下文瘦身,再做第 4 阶段 prompt 三层重构,完成后再评估整体链路效果。


12. 2026-04-08 最新增量交接(以本节为准)

本节优先级高于前文历史描述。接手时请先读本节,再看上文细节。

12.1 本轮已完成的落地项

  1. execute 上下文结构已固定为 4 条消息:

    • message[0]:固定 prompt规则 + JSON 约束 + 工具简表)
    • message[1]:历史上下文短摘要(聊天摘要 + 早期 ReAct 摘要)
    • message[2]:当轮 ReAct Loop 窗口thought/reason + tool_call + observation 绑定)
    • message[3]:当前执行状态(初始目标、结束判断、非目标)
  2. 当轮 ReAct 压缩已接入:

    • 窗口内同工具只保留最新 observation 原文;
    • 被压缩旧结果替换为“当前工具调用结果过于久远,已经被删除。”
  3. execute 输出稳态增强:

    • continue / ask_user / confirmspeak 时会兜底回退 reason
    • 工具结果写入 history 前的截断已删除(不再自动裁到 3000 字符)。
  4. 工具能力已升级:

    • get_overview 改为任务视角全量输出(课程仅占位统计,不展开课程明细);
    • 新增 find_first_freefind_free 保留兼容别名;
    • move / batch_move 限定仅允许 suggested
    • list_tasks 增加输入约束(status 单值、category 不接受 task_class_ids 列表)。
  5. prompt 与文档同步:

    • execute prompt 已切换到 find_first_free 表达;
    • SCHEDULE_TOOLS.md 已同步 get_overview / find_first_free / move/batch_move 新语义;
    • plan prompt 中读工具示例也已从 find_free 更新为 find_first_free

12.2 最新日志结论(关键)

本轮问题已不是“上下文塞不下”,而是“工具不利于收敛”:

  1. find_first_free 当前策略过于贪心
    只返回最早可用位,模型会持续把任务向前挪,容易出现“局部改善但全局不收口”的微调循环。

  2. query_range 把“可嵌入共存”和“硬冲突”混合输出
    模型会把可嵌入并存也当成冲突,导致不必要移动。

  3. 缺少“完成判据工具”
    当前只有读写事实工具,没有明确“是否可结束”的评估口径,模型自然倾向继续优化。

  4. 写工具冲突口径存在潜在不一致
    findConflictCanEmbed 的处理与 findEmbedHost 的可嵌入约束并非同一套判据,后续应统一。

12.3 下一棒建议优先级(按顺序做)

P0必须先做

  1. 新增评估类只读工具(建议名:evaluate_balance
    返回最少三项:

    • hard_conflict_count
    • load_variance(或等价离散指标)
    • done_suggestion(可结束/建议继续 + 原因)
  2. find_first_free 为“候选集”而非单点
    建议支持 top_k(默认 3并返回每个候选的

    • 位置
    • 目标日负载变化
    • 是否涉及可嵌入
  3. query_range 输出结构
    必须区分:

    • hard_conflict
    • embeddable_overlap 避免模型把可嵌入并存误判为硬冲突。

P1P0 后做)

  1. prompt 增加收敛指引
    明确要求模型在每次写操作后优先调用 evaluate_balance,满足条件就 done,避免“无限微调”。

12.4 接手后的最小验证清单

  1. 跑一轮真实 execute确认不会长时间卡在 list_tasks/find_first_free/move 循环。
  2. 确认 query_range 可区分硬冲突与可嵌入并存。
  3. 确认 evaluate_balance 能触发 done 收口。
  4. 每次 go test 后清理项目根目录 .gocache

12.5 关键文件(本轮增量相关)

  • backend/newAgent/prompt/execute_context.go
  • backend/newAgent/prompt/execute.go
  • backend/newAgent/prompt/plan.go
  • backend/newAgent/node/execute.go
  • backend/newAgent/tools/read_tools.go
  • backend/newAgent/tools/write_tools.go
  • backend/newAgent/tools/registry.go
  • backend/newAgent/tools/SCHEDULE_TOOLS.md

13. 2026-04-08 下班前交接(本节优先级最高)

下一棒主线已经明确:先研究工具收敛能力,再修“新一轮执行前必要参数重置”。

13.1 本轮新增落地(已完成)

  1. 顺序约束链路已落地:

    • 新增 order_guard 节点,并接入 graph 分支;
    • 默认 AllowReorder=false 时,PhaseDone(completed) 会先走 order_guarddeliver
    • 用户明确允许打乱顺序时才放行。
  2. min_context_switch 工具已接入:

    • 新增工具实现与注册;
    • execute 层已加护栏:未授权打乱顺序时拒绝执行并返回明确 observation
    • prompt / 工具文档已同步“仅用户明确授权才可用”。
  3. execute.go 乱码坏块已修复:

    • 清理了污染字符串、重复 if、结构异常
    • 该段目前为单一、可读、可编译分支。
  4. 当前分支编译验证通过:

    • go test ./newAgent/... ./logic/... 已通过;
    • 测试后已清理项目根目录 .gocache

13.2 已确认的两个“未完成关键点”

A. msg2/msg3 语义尚未改到目标形态

现状:

  • execute 仍是固定 4 消息骨架(msg2=当轮 ReAct 窗口msg3=执行状态锚点
  • “当轮 ReAct 结束后降级为普通历史并走统一 token 裁剪”还没真正落地;
  • ConversationContext.AppendHistory 本身不做裁剪,统一裁剪链路也尚未接入。

相关文件:

  • backend/newAgent/prompt/execute_context.go
  • backend/newAgent/prompt/base.go
  • backend/newAgent/model/conversation_context.go

B. round 未在“新一轮开始”自动重置

现状:

  • RoundUsed 只在 NextRound() 累加;
  • StartDirectExecute() 不会重置 RoundUsed
  • 快照恢复会带回旧 RoundUsed,所以“对话已结束但 round 没清零”可复现。

相关文件:

  • backend/newAgent/model/common_state.go
  • backend/service/agentsvc/agent_newagent.go

13.3 下一步实施建议(按此顺序)

P0运行态重置必须先做

目标:不丢运行态,不破坏连续对话;只重置执行期临时字段。

  1. CommonState 新增 ResetForNextRun()(统一重置入口):

    • 需要重置:RoundUsedConsecutiveCorrectionsPlanSteps/CurrentStepNeedsRoughBuildNeedsRefineAfterRoughBuildAllowReorderSuggestedOrderBaselineTerminalOutcome
    • 不重置:ConversationIDUserID、历史对话、ScheduleState。
  2. Chat 节点入口做主路径重置:

    • 条件:!HasPendingInteraction() 且上一轮 PhaseDone
    • 目的:用户发起新轮请求时自动清执行期脏状态。
  3. 在冷加载恢复处做同样重置兜底:

    • 位置:loadOrCreateRuntimeState()
    • 条件同上;
    • 目的:覆盖断联恢复场景,避免旧 round 污染新轮。

P1工具收敛能力研究与改造

延续 12.x 的结论,优先做:

  1. evaluate_balance(完成判据工具)
  2. find_first_free 从单点升级为候选集(top_k
  3. query_range 明确区分 hard_conflictembeddable_overlap

13.4 本节涉及的关键文件

  • backend/newAgent/model/common_state.go
  • backend/newAgent/node/chat.go
  • backend/service/agentsvc/agent_newagent.go
  • backend/newAgent/prompt/execute_context.go
  • backend/newAgent/tools/read_tools.go
  • backend/newAgent/tools/registry.go
  • backend/newAgent/tools/SCHEDULE_TOOLS.md