Files
DevFlow/docs/02-架构设计/专项设计/DRY技术债走查报告-2026-10-01.md
lxy 26cc3c3df9 文档: 能力批设计收口与走查状态同步
- DRY技术债走查报告:状态表同步 12/12 全收口,头部注记状态表为走查快照
- 并行化与异步唤醒设计:补 §13.4 有界失败记忆(窗口折叠/失败分册按类去重/监控轮转,三界类目口径同源)
- todo:登记 GitHub 直连受限替代方案(失败学习环首条)+F-m 实施细节补充
2026-10-05 00:35:04 +08:00

6.3 KiB
Raw Permalink Blame History

DRY 技术债走查报告(2026-10-01)

范围:全库(src-tauri + src),origin/main..HEAD 30 笔提交走查的横向延伸。 方法:只读审计,按(漂移后果 × 重复量)降序。纯相似但不漂移的不算债。 本轮已收口:#1/#2/#3/#4/#5/#6/#7/#8/#9/#10/#11/#12 全部 12 项(B/C 批收口记录见任务 de6095bd 注释与 DRY-A 任务)。 状态表仅反映走查当时快照,实测以任务销账记录为准。

汇总

# 债务 重复量 漂移后果 状态
1 emit+publish 双写样板 ~50 处 ~120 行 已发生(BUG-260805-02 只 emit 未 publish 丢事件) ✅ 收口
2 KV 引号归一 7 处 3 种策略并存 ~25 行 已发生(auto-execute medium/all 档静默失效注释自证) ✅ 收口
3 高风险工具名单 TS↔Rust 双写 名单×2 已漂移:前端缺 10 个 High 工具,审批后二次确认漏弹 ✅ 本轮收口
4 噪音目录名单 4 处 4 套 ~25 行 已漂移(AI 搜索与文件树过滤集合不一致) ✅ 收口
5 工具元数据 match 表散布 5 处 ~90 行 已漂移(幽灵 edit_file/list_dir 分支永不命中) ✅ 收口
6 相对时间阶梯 3 套实现 ~45 行 用户可见不一致(同为更新时间三种分档) ✅ 收口
7 insert system 警示骨架 4 处同构 ~100 行 conv 生命周期语义变更需 4 处同改 ✅ 收口
8 压缩关键词兜底块逐字双胞胎 ~35 行 两条失败路径易只改其一产生行为分叉 ✅ 收口
9 formatWaitTime+等待阈值双写三处 ~36 行 审批浮窗与主窗「变红」时刻分叉风险 ✅ 收口
10 灵感 statusOptions 双写 ~20 行 透传链断一处详情页回退英文原值 ✅ 收口
11 truncate 家族(同名不同义陷阱) ~30 行 fetch_url 与 audit 同名函数语义分叉误导复用 ✅ 收口
12 LOCK-SLOW 持锁计时样板 ~29 处 ~145 行 低(阈值/行号写死变量名,维护噪音) ✅ 收口

明细与收敛方向

1. emit+publish 双写样板

  • 正典:stream_recv.rs:152 emit_ai_chat_event(私有,仅内部可用)
  • 手抄:chat.rs ×21、audit/mod.rs ×12、audit/approval.rs ×4、agentic/mod.rs ×7、settings.rs 等,全库 emit 59 处
  • 收敛:helper 提为 pub(crate) 挪 event_bus.rs,手抄点全量替换;emit_fatal_error 内部 error_type 两端不一致(emit=Network/publish=None)顺带修

2. KV 引号归一三种策略

  • trim 版(audit/mod.rs:318)/from_str 版(lib.rs:215,唯一能处理转义的写法)/bool 版(audit/mod.rs:345,默认值两处相反)
  • 收敛:df-storage 或 state.rs 加 get_string_norm/get_bool_norm,lib.rs from_str 版为正典

3. 高风险工具名单(✅ 已收口 2026-10-01)

  • 原状:useToolApproval.ts 手写 7 项 ↔ 后端 RiskLevel::High 17 个,缺 10 个(download_file/generate_image/git_merge/delete_module/run_workflow/mysql_execute/ssh_exec/mongo_insert/mongo_update/mongo_delete)
  • 收口:新增 ai_list_tools IPC(注册表只读投影 name+risk),前端启动拉取构建名单,手写表降级为兜底(元数据未到/垫片环境生效);此后新增 High 工具只注册后端,前端自动跟上

4. 噪音目录名单

  • 4 处:tool_registry.rs:968(12 项)/module.rs:662(6 项)/module.rs:1135 内联/skills.rs:164
  • 后果实例:build/.next/.cache/.venv 被 AI search_files 扫到却在文件树隐藏;技能扫描被 target/ 深度递归拖慢
  • 收敛:tool_registry 的 is_noise_dir(已 pub(crate))上移为唯一实现,分档用参数不用第二份名单

5. 工具元数据表散布

  • path_auth.rs:48 文件工具集/agentic/helpers.rs:176+291(含不存在的 edit_file、list_dir 别名)/audit/data_change.rs:30/audit/cache.rs:449/tool_registry.rs:937
  • 收敛:declare_tool! 注册点带元数据(path_args/只读/entity-action),5 处 match 改查 AiToolRegistry 单例

6. 相对时间阶梯

  • 正典 utils/time.ts:46;GitChanges.vue:278(多 yesterday 档+30 天截断);KnowledgeDetail.vue:321(30 天回退绝对日期)
  • 收敛:formatRelative(v, opts?) 加两参,调用方收敛

7/8. agentic 警示插入骨架与压缩兜底双胞胎

  • mod.rs 2419/2448/2495 + cache.rs:497 同构 insert_at(0, system);context_lifecycle.rs:223↔332 逐字双胞胎
  • 收敛:insert_system_notice(session_arc, conv_id, text, log_tag) 单函数;keyword_fallback_commit 单函数

9. 审批等待格式化与阈值

  • useToolApproval.ts:95 ↔ ApprovalPopup.vue:200(formatWaitTime 逐字同款)+ 300/120 阈值第三处
  • 收敛:沉 src/utils/time.ts(formatWaitTime + waitLevelOf)

10. 灵感状态表

  • Ideas.vue:219 ↔ IdeaDetail.vue:518(详情页依赖父级透传)
  • 收敛:statusOptions 表移 constants/project.ts,statusLabelKey 导出纯函数

11. truncate 家族

  • 正典 audit/utils.rs:32(补 …);fetch_url.rs:655 同名不同义(返回元组);generate_image.rs:460、knowledge_inject.rs:544 手写 take(500)
  • 已收口部分:tools/knowledge.rs 本地截断已改调正典(本轮)
  • 残留收敛:正典上移共享位改名 truncate_chars_ellipsis;fetch_url 改名 truncate_markdown 消同名陷阱
  • ✅ 全部完成(2026-10-04):audit/utils.rs 正典改名 truncate_chars_ellipsis + audit/mod.rs re-export / record.rs / generate_image.rs / knowledge_inject.rs / tools/knowledge.rs 全链同步;fetch_url truncate_markdown 已先行改名;df-ai context_helpers.rs 私有版跨 crate 不引依赖保留原名+正典标注注释。验收 cargo check --workspace EXIT 0 + devflow 679 测试全过。#2/#6/#9/#10 同日源码核验均为前批已落地(文档滞后)。

12. LOCK-SLOW 样板

  • 29 处 × 5 行,变量名编码行号(__hold610),阈值 30ms 逐处复制
  • 收敛:log_slow_lock(instant, site) 单行化或 TimedLockGuard(Drop 打点)

总体评价

前端健康度好于 Rust:api/ 层已收口 invoke、useConfirm 已消灭确认弹窗重复、useTurnTrace 纯函数复用方向正确。Rust 侧债务集中在 agentic/mod.rs 接缝(#1/#7/#8)与「注册表之外的第二份工具知识」(#4/#5),后者建议优先收口到 AiToolRegistry 单点——新增工具要改 5-6 处的现状是最大的持续负债。