diff --git a/docs/todo.md b/docs/todo.md index 8ac807a..49ab318 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -63,7 +63,7 @@ > 用户实测:AI 对话中让 AI 创建任务并推进状态 → AI 调 `run_workflow(task_id, target_status)` → 审批卡片渲染 → 用户点批准 → handler 返回 Err → LLM 重试循环。 -- [ ] B-260617-01 [P1] — **run_workflow 作为 AI 工具无法执行 + 无意义重试 + 审批混淆**。三个关联问题: +- [x] ✅(波9·e23b316+主代核查,cargo0err+devflow79pass,方案a2后端分支) B-260617-01 [P1] — **run_workflow 作为 AI 工具无法执行 + 无意义重试 + 审批混淆**。三个关联问题: - **问题 1**:`run_workflow` handler(tool_registry.rs:530-546)仅持有 `db: Arc`,无法访问 `AppHandle/State`(registry/event_bus/workflows Repo),返回 `Err("run_workflow 工具需经 Tauri IPC 执行...")`。审批通过后 `ai_approve`(commands.rs:329)调 `ai_tools.execute()` → handler 必然 Err → `audit_status="failed"` → 错误信息作为 tool_result 回传 LLM。工作流实际未执行,任务状态未推进。 - **问题 2**:handler Err → tool_result=错误提示 → LLM 认为失败 → 重试(1/4) → 同结果循环。工具定义未标 `no_retry`,浪费 token + 用户反复审批。 - **问题 3**:前端渲染的是 AI 工具审批(tool_call pending_approval),非工作流 HumanNode 审批。用户批准后工作流引擎从未启动,HumanNode 审批节点从未到达。 diff --git a/docs/待决策.md b/docs/待决策.md index c52631c..ee52e3f 100644 --- a/docs/待决策.md +++ b/docs/待决策.md @@ -39,7 +39,7 @@ - c: **从 AI 工具移除 run_workflow**(仅保留 advance_task 推进状态,工作流由用户手动在前端触发) - **推荐**:**a 前端拦截**(改动最小,`ai_approve` 一处分支即可;方案 b 需改 tool_registry 签名链路较长;方案 c 退回手动不符合 AI 驱动目标)。问题 2/3 随 a 自动消解。 - **关联**:todo B-260617-01 / tool_registry.rs:530-546 / commands.rs:329-334 / audit.rs:590-630 -- **状态**:🟡 待决 +- **状态**:✅ 已决(2026-06-17·波9 e23b316)— **决策:a 细化为 a2(后端分支)**。ai_approve 已持 app+state,后端直接调 run_workflow_inner 最干净(无需新 IPC/前端分支/工作流知识泄漏),符合 a 大方向(绕开 ai_tools.execute 必 Err)。问题 2 随 a2 消解(成功 tool_result + High 去重缓存双层断循环);问题 3 渲染区分记观察项(tool_display_hint 已含「触发工作流」语义)。详单见待审查 CR-52。 ### ⏸️ 暂缓(待条件触发) diff --git a/docs/待审查.md b/docs/待审查.md index cf40b77..c7250ca 100644 --- a/docs/待审查.md +++ b/docs/待审查.md @@ -357,6 +357,22 @@ - ⑫**AE-04 FR-S1**:TrustKey 只含 tool+dir,不含 api_key/文件内容/命令串(mod.rs:189 注释)。 - **待修项回流 todo**: **无**(核心 grep+test+构建全 PASS;阶段3 延迟 mutate 口径 + AE-04 目录级粒度为设计取舍非 bug)。 +### CR-260616-52 波9 B-260617-01 run_workflow审批执行(方案a2后端分支)(e23b316) — 🟡 待审 + +- **范围**: 单 agent workflow wf8r5vlno,走查+实施。改 workflow.rs(run_workflow_inner 抽取)/ mod.rs(execute_run_workflow_for_tool)/ commands.rs(ai_approve run_workflow 分支)/ tool_registry.rs(handler 注释+防御文案)。 +- **commit**: e23b316。 +- **主代核查(2026-06-17)**: cargo check --workspace EXIT 0(6 warning 全 pre-existing)/ cargo test -p devflow --lib **79 passed**(无回归)/ grep 核验形态(workflow.rs:87 run_workflow_inner + mod.rs:446 execute_run_workflow_for_tool + commands.rs:317 ai_approve 分支 + trust_key_for:294 在分支前 AE-04 不破坏)。 +- **方案选型**:agent 选 a2(后端分支)而非 a1(前端拦截)。理由:ai_approve 已持 app+state,后端直接调 run_workflow_inner 最干净,无需新 IPC/前端分支/工作流知识泄漏。符合用户推荐 a 大方向(绕开 ai_tools.execute 必 Err)。 +- **审查 agent 待复审重点**: + - ①**run_workflow_inner 抽取语义零变化**:workflow.rs:87 抽取 run_workflow 命令体为共用核心,命令层瘦转发(:79)。核心逻辑(模板选 DAG/落记录/spawn 转发+执行+联动)全部移入,语义不变。 + - ②**execute_run_workflow_for_tool**:mod.rs:446 从 args 取 task_id/target_status + 构造空 DagDef+config + name 拼"AI 推进任务" + 调 run_workflow_inner + 回填 {task_id,target_status,execution_id,status:"running"} 让 LLM 收成功。 + - ③**ai_approve run_workflow 分支**:commands.rs:317 `if approval.tool_name == "run_workflow"` → execute_run_workflow_for_tool,否则原 ai_tools.execute。后续 audit_finalize/emit_data_changed/replace_tool_result/emit/save/try_continue 共用零变化。 + - ④**AE-04 trust 不破坏**:trust_key_for 写 trust(:294)**在 run_workflow 分支(:317)前**;audit trust_hit 查询(audit.rs:568)未动;create/switch clear(:1177/1257)未动。 + - ⑤**重试循环根治**:a2 真实执行→成功 tool_result(非 Err)+ 既有 High 去重缓存(find_cached_high_risk_result audit.rs:406 失败 tool_result 复用)双层保障。不新增 no_retry 标志(无字段+无消费方+crate 改动大,去重缓存已等效)。 + - ⑥**handler 防御文案**:tool_registry.rs:556 run_workflow handler Err 改防御兜底(正常流程不可达,a2 分支接管)+"勿盲目重试"明示(对齐 run_command 超时标注模式)。 + - ⑦**FR-S1**:run_workflow 无 api_key,tool_result 仅 execution_id+task_id+target_status。 + - **待修项回流 todo**: **无**(a2 实施正确,grep+test+构建全 PASS;no_retry 不增为设计取舍,去重缓存等效)。 + --- ## 已审归档