🔍 需求求解全过程

把「一句话需求」在工作空间里被求解的完整链路摊开:术语命中 → 多步拆句 → 每步能力 DAG 派生 → 工具/HTTP → 跨步继承 → 失败回退。推导只读、零副作用(不执行工具、不改 scope、不落会话),与真实执行链路共用同一套原语(term_resolver / split_multi_intent_steps / plan_capability_dag / derive_dag),因此不是"另写一份解释",而是同一套代码的旁路推演。

① 输入需求

默认走规则层术语匹配(零 LLM、毫秒级);勾「深度解析」则走 term_resolver.resolve_terms 全链路(Layer C > B > A,与线上路由期同一入口,通常 30~150s)。

② 求解流水线(权威阶段表)

下表由后端 /api/solve-trace 的 pipeline 字段权威输出,与源码逐行对齐;前端与文档均消费同一份,避免双源漂移。
求解后展示…

⑧ Sandbox 执行参数轨迹(.sandbox_trace.jsonl)

来自后端 /api/sandbox/trace?workspace=,是真实多步执行时由 SandboxStore 记录的持久化证据链(落盘于 workspaces/<ws>/.sandbox_trace.jsonl):每一步实际提交的参数格式(如 data.touserid 被包成 {"newvalue":"5"} 而非裸值)、以及 Sandbox 结构(产物节点 / 父子 / 引用标记)。与「⑤ 真实执行回填」的区别:这里是历史落盘,无需再跑一遍即可查;切换上方工作空间后点「刷新」。
点「加载最近 sandbox 轨迹」查看…

⑦ 权威说明 · 链路细节与实测

以下内容为 2026-09-07 对 sdwesp_design「列出 → 新增 → 查找 → 移交」四步复合需求的完整复盘,含源码位置与真实执行日志。

6.1 结论

✓
这条需求走的是 「术语解析 → 确定性多步拆句 → 每步能力 DAG 零 LLM 执行」通道,不是设计总监的 Supervisor 编排——Supervisor 只在某步 DAG 失败时兜底。它命中 4 个工作空间术语,被确定性拆成 4 步,每步各自派生一条 SDWESP 工具链。

6.2 源码位置速查

环节源码落点要点
HTTP 入口server_handler_post.py:57 → server_handler_post_ops.py:831只有流式端点 /api/workspace/<ws>/chat/stream,无 /chat
8 阶段编排workspace_chat_flow.py:2371 / :829:840 写 session_context["workspace_name"],后续一切作用域依据
协调者workspace_chat_flow.py:77无顶层 coordinator → 取 roles 池首项 = sdwesp_design_orchestrator
成员宇宙workspace_scope.py:10315 个成员 → 不触发路由层单成员退化
术语解析term_resolver.py:1504 / :302 / :334triggers 是字面子串包含(k in message,按长度降序最长匹配),非打分非语义
拆句workspace_chat_flow.py:1751连接词(然后/接着/随后…)+ 写动词(新增/删除/修改…)开新步,零 LLM
DAG 派生capability_dag.py:95解开 {mode: sequence, steps:[…]};顺序与接线由契约 edges/bindings 派生,scope 只声明节点集
DAG 执行capability_dag.py:1148槽位回查 → 候选×原文回填 → 逐层执行 → recheck 读后校验
回退group_manager.py:1959 / :2019群主是 supervisor → selected 强制置空 → _run_single_agent → 8085
工具出口adapters/base.rs:1215 / :222config.id=="sdwesp" → send_via_curl(reqwest 对 SDWESP gunicorn 恒 401)

6.3 四步工具链(本次需求)

步术语工具链关键参数
1data.listpublish_get_list → reply_get_listGET /publish?ptype → GET /reply?publishid&pageid=0
2data.createpublish_get_list → pflowlist_get_list → flow_put_startflowname=新建;data={"说明":{"newvalue":"多层次"}}
3data.getpublish_get_list → pflowlist_get_list → flow_put_startflowname=查找;data={"filtercond":{"说明":"多步验证3"}}
4data.transferpublish_get_list → reply_get_list → reply_get_action → flow_put_startaction=myflow 取 flowid(移交≈1866);replyid + receivers=[圣达维 userid]

6.4 实测执行结果(2026-09-07 01:57–01:59)

[WS_MULTI] 多意图拆分为 4 步:['列出【我要说】」模版下的数据','新增一条记录,内容是 (说明=多层次)','查找 说明=多步验证3 的记录','移交给圣达维']
[WS_DAG] data.list     确定性执行完成(369ms,零 LLM)publish_get_list → reply_get_list        ✅
[WS_DAG] data.create   确定性执行完成(367ms,零 LLM)→ pflowlist_get_list → flow_put_start     ✅
[WS_DAG] data.get      确定性执行完成(391ms,零 LLM)→ pflowlist_get_list → flow_put_start     ✅
[WS_DAG] data.transfer 在 tool 阶段失败(D_INTERNAL: HTTP 404 (/flow))→ 回退 Agent 路径        ❌
[group_manager] owner sdwesp_design_orchestrator 是 supervisor 架构 → 单成员退化
[INFO] 子Agent 'form_designer' 10 / 'flow_designer' 37 / 'org_designer' 20 / 'sdwesp_developer' 143 个工具
[DEBUG architecture] type=supervisor, sub_count=4
[LoopController] 连续失败 3 次,冷静 300s

6.4.1 接收人解析:必须走 publish/users 别名表

调用实测结果
sdwesp_publish_get_list模板「我要说」→ publishid=334
sdwesp_publish_users(publishid=334)18 条候选,「圣达维」别名 → userid=5
sdwesp_user_get_list(通用表)只有「真实姓名」,查无圣达维
根因:publishid 原来只有一个来源(模板名),失败时异常被静默吞掉直接 422。 已修复为:publishid 多路获取(继承 → 槽位 → 原文「模板名=」→ 原文【】)+ 全量模板兜底 (存活优先,因已删除模板 title 带「(已删除)」且排在列表最前)+ [USER_REF] 失败留痕 + 解析结果回写 session_context._resolved_user_ids 供执行期复用。

6.5 关键机制(为什么这样设计)