Files
DevFlow/docs/05-代码审查/定时走查-2026-06-15-第7轮.md
绝尘 f30df333b3 docs: 巡检简报+todo 回写(2026-06-15 第2轮)
巡检发现:
- 2196c77 workflow 整文件替换回退破坏(AiChat+Ideas 12项功能)
- B-260615-03 truncated 标志已落地
- AR-8-scroll scrollToBottom smooth 已补
- CR-260615-09 .ai-md 残余:4详情页各21处 scoped .ai-md
  (全局 ai-md.css 75行已建,旧副本待清理但非阻塞)
2026-06-15 17:23:57 +08:00

82 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 定时代码走查 — 第 7 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。范围 = **stores 独立 store 垂直切片**ai/knowledge/appSettings/index未审+ 核 CR-24/26/27 修复。
> 方法:主代理 git show 3 提交 + 1 路代理走查 stores。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 见 `docs/todo.md`。
> 关联:[第1-6轮](./)。
---
## CR-24/26/27 ✅(价值第 6 次闭环)
| 提交 | CR | 修复 |
|---|---|---|
| ef2d033 | CR-24 ✅ | AiChat onBeforeUnmount 补 `store.stopListener()` + useAiEvents stopListener 补 `clearStreamWatchdog()`(卸载清 130s watchdog 避免写已卸载 state|
| 7637f29 | CR-26 ✅ | project.ts `_activeTaskProject` 三态undefined 不触发/all 全量/具体 id+ Tasks.vue 空态兜底89 行)|
| 5e6aa79 | CR-27 ✅ | Dashboard 删决策/批注死代码(-96 行)+ stage 颜色 + refresh try/catch |
**CR-25分离窗口状态机 R3/R4/R5仍存**(无提交提及,接收方未修或在做)。
---
## 🔴 knowledge error 通道断P1CR-08 深化)
### CR-260615-28 [P1] state.error 死字段 + create 语义矛盾
- **state.error 死字段**knowledge.ts:19,49,53,64,74,105 写入 `state.error`,但 **grep 全应用零消费**Knowledge.vue store.error 零命中)→ 用户遭遇加载/检索/配置失败只看空白列表,无错误提示
- **CR-08 深化**CR-08「store error fallback 11 处中文」只记了硬编码,**整个 error 通道前端是断的**(写了从不读)— 比中文硬编码更严重
- **create 语义矛盾**create(:80-85) 成功后调 loadCandidates若 loadCandidates 失败把错误塞 state.error但 create 已返回 record 给调用方(认为成功)
**修**Knowledge.vue 接 error banner/toast或删 state.error 改 throw 由调用方 catch + create 内 loadCandidates 失败不污染 error。
---
## ✅ ai.ts 状态机完整(亮点,验证修复质量)
四核心态 `streaming/generatingConvId/currentText/queue`**6 复位点闭环**,无卡死 streaming=true 缺口:
- AiCompleteduseAiEvents:189-217/ AiError(:220-235) + queue=[]B-32
- onStreamTimeout(useAiStream:25-28) + queue=[] + running→rejected(B-33)
- sendMessage catch(useAiSend:99-105)/ approveToolCall catch(:121-133) + queue=[]
- stopChat(:149-154) 本地先复位再发停止信号(不依赖后端 AiCompleted防审批态看门狗已 clear 致 AiCompleted 竞态丢失)
- 分离窗口 resumeInDetached(useAiWindow:111) 先 invoke('ai_is_generating') 核对R4 防 df-ai-gen 残留假气泡)
> 验证B-32/33/ef2d033 修复质量扎实,状态机无非法组合残留。
## ✅ appSettings 双源同步(亮点)
三态 `cache(reactive)↔SQLite↔ref`
- set 乐观写 cache + debounce 300ms 合并 + pendingValues 取最新值非定时器快照落库失败仅日志UI 一致性优先,不回滚致不一致)
- useSetting 双 watch `Object.is` 守卫防循环
- switchConversation 双 token 竞态防护useAiConversations:44,48,52,122 `_latestSwitchId`
---
## 🟡 P2/P3 新发现
### CR-260615-29 [P2] ai.ts messages 无上限 + knowledge 竞态/错误不一致
- **ai.ts messages 单对话无上限**useAiSend push user+ai / useAiEvents push err/审批 / useAiStream push delta单对话线性增长切换对话整体替换是减负点但同对话不轮换长会话+大工具结果内存可观
- **knowledge 异步无竞态**loadList/search/loadConfig 无请求序号messages 有 switch token快速连点后返回覆盖先
- **knowledge 错误处理不一致**load*/search 有 catch 兜底create/updateStatus/archive/saveConfig/extractNow 直抛(调用方无 catch 致 unhandled
### CR-260615-30 [P3] appSettings useSetting 对象值不落库(边界)
useSetting 双 watch `Object.is` 守卫对值类型完美防循环,但**对象/数组值深 mutate**`r.value.x=1`)时 `Object.is(v,cache[key])` 同引用恒 true → 不触发 set 落库,静默不持久化。当前无 buguseSetting 多绑值类型df-ai-ui 走 set 整对象替换),隐式契约。
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| 价值闭环 | 3 | CR-24/26/27 全修(修复质量好)|
| P1 新发现 | 1 | knowledge error 通道断CR-28CR-08 深化)|
| P2/P3 新发现 | 2 | ai.ts messages 无上限 + knowledge 竞态CR-29/ useSetting 对象值边界CR-30|
| 亮点 | 2 | ai.ts 状态机完整6 复位点,验证修复质量)/ appSettings 双源同步设计扎实 |
**本轮价值**
1. **knowledge error 通道断**是新维度发现 — CR-08 只记中文硬编码,实际整个 error 通道前端断的(写了从不读),用户看不到知识库错误
2. **ai.ts 状态机完整肯定前几轮修复质量**B-32/33/ef2d033 闭环无卡死缺口)— 走查不仅找问题也验证修复
3. CR-24/26/27 三项 P1/P2 全修,走查↔接收方闭环高效(第 6 次闭环)
**方法论**:第 5 个垂直切片storesknowledge error 通道断是新发现维度(超越 i18n 的功能缺陷。ai.ts 状态机完整是「走查验证修复」价值(非只找 bug
todo 映射CR-260615-28P1 knowledge error/ CR-29P2 messages+竞态)/ CR-30P3 useSetting 边界)。