From 2d02cff7a66bb5d5a5da1d26b7a6a52f7829bfbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Wed, 17 Jun 2026 02:08:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20CR-53/54=E7=99=BB?= =?UTF-8?q?=E8=AE=B0(=E6=B3=A211yellow=E4=BF=AE+UX=C2=B7=E6=B3=A212F-04?= =?UTF-8?q?=E8=B4=9F=E8=BD=BD=E5=9D=87=E8=A1=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/待审查.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/待审查.md b/docs/待审查.md index 2d16dd4..88a569d 100644 --- a/docs/待审查.md +++ b/docs/待审查.md @@ -377,6 +377,24 @@ - ⑦**FR-S1**:run_workflow 无 api_key,tool_result 仅 execution_id+task_id+target_status。 - **待修项回流 todo**: **无**(a2 实施正确,grep+test+构建全 PASS;no_retry 不增为设计取舍,去重缓存等效)。 +### CR-260616-53 波11 CR-51 yellow修(audit trust-hit持锁重构) + UX-01工具失败视觉 + UX-03自动收起增强(332a6bb+31ea151) — 🟡 待审 + +- **范围**: 2 agent workflow w79v52ofy,文件域零重叠。①**audit.rs**(332a6bb):CR-51 yellow 修复——trust-hit 分支原 inline `.await tools_arc.execute` 持 `&mut session`(注释 L593 声称锁外但代码持锁,run_command 慢命令阻塞同会话所有触 state.ai_session 的 IPC)。重构:trust_hits Vec 收集(L558,元组携带 risk_level 供回填审计)→ 命中分支缩减为 toast emit+push trust_hits+continue(L588-601,删 inline execute)→ join_all 闭包锁外 execute+emit AiToolCallCompleted+emit_data_changed(L657-695)→ 串行回填持锁 push tool_result+audit_tool_call Some("auto_trust")(L696-705)。对齐 Low risk L708+ spawn+clone 模式,join_all 保序。②**UX-01 ToolCard**(31ea151):isToolFailure(tc)(run_command 看 exit_code≠0 结构化 / 通用工具 parseResult=null+文本匹配 /执行失败|failed|error/i 对齐 AR-6 err_msg)+ --failed 红框/banner/红底结果框 + aiStreamRetry 文案改"AI 响应失败,正在重试"(明确 LLM/网络重试非工具失败)+ transition border/shadow/opacity。③**UX-03**(31ea151):AiChat wasNearBottom 边沿检测(远离→近底转换瞬间收起一次)+ streaming watch s=true 分支(generatingConvId===activeConversationId 守卫防后台/恢复误触)+ ToolCardList userExpandedCards 记忆态(collapseInactive 不清,isCardExpanded 优先读)。 +- **维度**: ①CR-51 yellow execute 真移锁外(非表面重构——核验 spawn 闭包确不持 sessionArc.lock,join_all 在 process_tool_calls 锁释放后跑)+ 语义不变(trust 命中仍真执行+emit AiToolCallCompleted+emit_data_changed+audit auto_trust 留痕 9 条逐条核验) ②UX-01 失败检测正确性(run_command exit_code 判定可靠 / 通用工具文本匹配启发式是否会误判成功结果如 "no errors found")+ Fatal canRetry 隐藏(auth/provider_config)与流式重试 retryable 区分清晰 ③UX-03 收起触发不误伤(streaming watch 守卫防后台生成误触 / wasNearBottom 边沿防重复触发 / userExpandedCards 记忆态防"刚在看被收起")+ transition 不影响流式渲染性能(body 高度不动,仅 card 层 3 属性)。 +- **commit**: 332a6bb(audit yellow)+ 31ea151(前端 UX)。 +- **主代核查(2026-06-17)**: cargo check --workspace EXIT 0(7 warning 全 pre-existing dead_code)/ vue-tsc --noEmit EXIT 0 / cargo test -p devflow --lib **88 passed**(无回归)/ grep 核验形态(audit.rs trust_hits Vec L558 + join_all 闭包 L657 execute 锁外 + 串行回填 L696 持锁 / ToolCard isToolFailure + --failed CSS / ToolCardList userExpandedCards / AiChat streaming watch + wasNearBottom)。 +- **审查 agent 待复审重点**: ①CR-51 yellow——核验 join_all 闭包确在 session 锁外执行(grep sessionArc.lock 作用域,确认 execute 不在锁内)+ 串行回填持锁(push tool_result/audit)+ join_all 保序(tool_result 按 tool_call_id 索引,LLM 按 id 匹配不依赖到达顺序) ②语义不变——trust 命中 9 条逐条核验(真执行/emit toast/emit completed/emit_data_changed/audit auto_trust/仅 execute 移锁外/Med-High 非 trust 路径零改动/Low risk 零改动/pending_count 不变/错误信息格式不变) ③UX-01 isToolFailure——run_command exit_code 路径(parseResult 命中合法 JSON 看 exit_code)+ 通用工具文本匹配(正则是否误判含 failed/error 字样的成功结果) ④UX-03 守卫——streaming watch generatingConvId===activeConversationId 防后台生成/恢复会话误触收起 + wasNearBottom 边沿触发防每 tick 收起 + userExpandedCards 记忆态不被 collapseInactive 清除。 +- **待修项回流 todo**: **无**(主代核查全过,待审查 agent 独立复审)。 + +### CR-260616-54 波12 F-04多Provider负载均衡池(数据层+选择器+并发原语) + CR-52白项清理(79b6a43) — 🟡 待审 + +- **范围**: 2 agent workflow w7krn220n,文件域零重叠且不碰波11(audit/前端)。①**F-04 基础设施**(79b6a43):storage 层——V19 迁移幂等补 ai_providers.enabled(DEFAULT 1)+weight(DEFAULT 50)列(PRAGMA column_exists 探测,对齐 v17/v18)+ models.rs AiProviderRecord 加 enabled:bool+weight:u32(serde default 兼容老 JSON)+ crud.rs ai_provider_from_row(i32→bool/u32 解析,unwrapor 默认)+insert/update SQL 加新列 + 4 处 AiProviderRecord 构造点补字段(ai_node test/secret test/crud test/commands.rs ai_save_provider 新建默认 enabled=true weight=50)。provider_pool.rs(新,270 行)——ProviderPool::select(providers, model_id) 过滤 enabled&&weight>0,3 键稳定排序(主键模型亲和含 model_id 的 provider 排前保 F-01 路由结果 / 次键 weight 降序 / 末键 is_default 兜底)+ 9 单测。state.rs LlmConcurrency 加 per_provider HashMap>+acquire_for_provider(返 Option,None 时无限流分支)+set_provider_caps。agentic.rs 循环入口 ProviderPool::select 选主候选(单 provider 零变化,首位=唯一)+流式块 acquire_for_provider permit。②**CR-52 white**:tool_registry.rs 删 `let _db = db.clone();` 死代码(防御 handler 闭包未引用,run_workflow 真执行经 ai_approve→execute_run_workflow_for_tool→run_workflow_inner)+ workflow.rs run_workflow_inner 加 triggered_by:&str 参数(命令层 run_workflow 传"manual"前端人工 / execute_run_workflow_for_tool 传"ai")+ mod.rs execute_run_workflow_for_tool L481 传"ai"+pub mod provider_pool。③**诚实拆波**:fallback 实际切换(InitFailed retryable 耗尽切备用 provider)未实施——agentic.rs L436-530 流式重试块嵌套 for iteration 内有自己的 per-provider 重试,fallback 需外层包 for candidate 循环+resolved_model 重算路由,回归面大,拆 F-04b 独立批。CR-52 项3 mod.rs canonicalize lexical normalize(安全边界 trust_key 归一化)+ 项4 agentic.rs 诊断日志语义(超文件域)均不做(留独立项)。 +- **维度**: ①select 排序正确性(模型亲和优先保 F-01 路由结果不换走含模型 provider / weight 降序同亲和内 / is_default 兜底启动行为不变)+ 边界(0 enabled→空 Vec 调用方兜底 / 1 enabled→单元素无 fallback / model_id None→全亲和纯 weight) ②单 provider 零变化(池仅 1 enabled→select 单元素首位=唯一→build_provider 不变,老库迁移 enabled=1 行为同 F-01 前) ③per_provider permit Option 安全(未配 set_provider_caps 时 acquire_for_provider 返 None,drop(None) 无副作用,无限流分支) ④triggered_by 透传链完整(workflow.rs run_workflow_inner 加参 + 命令层"manual"+mod "ai",grep 仅 2 调用点) ⑤fallback 拆波诚实(F-04b 独立批,本轮端到端可用基础设施+9 单测) ⑥FR-S1 不破坏(resolve_provider_secret/ensure_resolved_key 闭环未动,api_key 不入 enabled/weight 字段/日志) ⑦V19 迁移幂等(PRAGMA column_exists 探测+DEFAULT 老库零变化+新库 V9 SQL 同步加列)。 +- **commit**: 79b6a43。 +- **主代核查(2026-06-17)**: cargo check --workspace EXIT 0(7 warning 全 pre-existing dead_code)/ cargo test -p devflow --lib **88 passed**(79 基线+9 provider_pool 新增全过)/ grep 核验形态(provider_pool.rs select 过滤 enabled&&weight>0+3键稳定排序 / agentic.rs L146 ProviderPool::select 取首位+L435 acquire_for_provider permit / state.rs LlmConcurrency per_provider HashMap / V19 迁移 PRAGMA 探测幂等)。 +- **审查 agent 待复审重点**: ①provider_pool select 3 键排序——核验模型亲和(含 model_id 的 provider 排前保 F-01 路由)+ weight 降序 + is_default 兜底,排序稳定不依赖输入顺序 ②单 provider 零变化——核验 select 单元素首位=唯一 provider 路径 + 老库迁移 enabled=1 行为等价 F-01 前 + 空池兜底 get_active_provider ③per_provider permit——核验 acquire_for_provider 返 Option(None 无限流)+set_provider_caps 未被调用(本轮无消费方,待 F-04c 前端)+drop(None) 无副作用 ④agentic 接入——核验 ProviderPool::select 取首位主候选 + acquire_for_provider permit 在流式块 + 不破坏单 provider 路径 ⑤triggered_by 透传——核验 run_workflow_inner 签名加参 + 2 调用点(manual/ai)更新无遗漏 + grep 仅 2 调用点 ⑥V19 迁移——核验 PRAGMA column_exists 幂等 + DEFAULT 1/50 老库零变化 + V9 建表 SQL 同步加列 ⑦fallback 拆波诚实——确认本轮未实施 fallback 实际切换(留 F-04b),基础设施可用。 +- **待修项回流 todo**: **无**(主代核查全过,待审查 agent 独立复审;F-04b fallback + F-04c 前端已记拆波)。 + --- ## 已审归档