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行已建,旧副本待清理但非阻塞)
This commit is contained in:
2026-06-15 17:23:57 +08:00
parent 672d677046
commit f30df333b3
17 changed files with 2184 additions and 15 deletions

View File

@@ -0,0 +1,85 @@
# 定时代码走查 — P0 状态复核2026-06-15
> 触发:定时走查 cron每 30 分钟)。本轮重点 = 自上次走查HEAD `4b5f096`)起新增内容走查 + 既有 P0 修复状态地面复核。
> 方法2 路后台代理TaskDetail.vue 新文件 / 后端提交 `2de0c6e` 16 文件大改)+ 主代理地面核对(`project.ts:273` / `workflow.rs:211` / `useAiStream.ts` / `stream_recv.rs` / `todo.md`)。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 待修项见 `docs/todo.md`。
> 关联:[工作区多角度走查-2026-06-15.md](./工作区多角度走查-2026-06-15.md)上一轮3 P0 + DRY 发现源头)。
---
## 核心结论:纠正过时认知(定时走查首要价值)
| P0 | 上轮判断 | 本轮地面复核 | 处置 |
|---|---|---|---|
| **B-260615-34** selectType | 「未修,仍 camelCase」 | **已修 ✅**`project.ts:273` 现为 `select_type: ... ?? 'single'` + 正确注释「Tauri 2 IPC 不转 camelCase须 snake_case 对齐后端 workflow.rs:211」后端 `workflow.rs:211``select_type: Option<String>`。前后端契约对齐。 | todo 标 `[x] ✅`,删过时描述 |
| **B-260615-32** 队列收尾 | 未修 | **仍未修 ❌**`onStreamTimeout`useAiStream.ts:24-53复位 streaming/generatingConvId/currentText + clearStreamWatchdog + 反向扫 completed toolCall 区分文案 + push 错误消息,**仍不清 `state.queue`**useAiSend:116 有 clearQueue 但收尾路径未调)→ 生成中输入消息丢失 | todo 加复核标注,仍 `[ ]` |
| **B-260615-33** 骨架屏 | 未修 | **仍未修 ❌**`onStreamTimeout` 仍**不回滚 running toolCall**(只读 `status===completed` 做文案判断,不改 running→rejected→ 审批卡片后端 hang 时永久骨架屏,无重审入口 | todo 加复核标注,仍 `[ ]` |
> 「B-34 未修」是上一轮压缩前快照,之后提交(`80b9243`「P0 bug 修复」批)已修。后端代理通过后端 IPC 签名推断「前端已对齐」**结论正确**。定时走查纠正过时认知,避免「以为没修催着修」。
---
## 新发现 P0后端代理 ②)
### B-260615-35 — broadcast `Lagged` 兜底仅 warn关键终态事件丢失时前端永久卡死
**位置**`src-tauri/src/commands/workflow.rs:90-110`forward 任务循环)
**问题**`run_workflow` 的 forward 任务靠 `finished = matches!(event, WorkflowCompleted | WorkflowFailed)` 判定退出。broadcast 滑动窗口 `Lagged(n)` 时丢 n 条最旧事件,代码注释**已识别风险**(「关键终态事件可能永久丢失」),但兜底措施只有 `tracing::warn!`**没有主动从 DB 查终态或加 watchdog 超时**。若 Lagged 恰好丢了 WorkflowCompleted/Failedforward 任务永远 `rx.recv().await` 等不到 finished前端依赖事件关闭审批/完成弹窗的场景**永久卡死**,只能靠 DB 轮询兜底(实时性差)。
**修法(代理建议)**`Err(RecvError::Lagged(n))` 分支后加被动超时/主动查 DB — 累计 lag 次数到阈值或单次 n 过大时,查 `WorkflowRepo::get_by_id(&forward_exec_id)` 看是否终态,若是则补 emit `workflow-event` 给前端并 break。需把 `state.db.clone()` 也 move 进 forward 任务(当前仅 executor spawn 持有 db
**优先级**P0低频但后果为「永久卡死」无自愈开发者已知未做兜底。
---
## 新内容走查结果
### 1. TaskDetail.vue362 行新文件)— DRY 复发,单文件质量良好
| # | 等级 | 发现 |
|---|---|---|
| ① | 🔴 | `.ai-md` 样式块**第 5 份重复**CR-260615-09 复发):`:263-333` ~70 行与 ProjectDetail/Ideas/Knowledge 逐字符同,累计 ~350 行重复 CSS。TaskDetail 是抽公共样式(`src/styles/ai-md.css``composables/useMarkdownCss.ts`)最佳时机 |
| ② | 🔴 | `renderedDescription` computed **第 4 份重复**CR-260615-10 复发):`:116-119` `void mdReady.value` 技巧四处重复。建议 `useMarkdown``renderedRef()` 帮手收敛 |
| ③-⑦ | 🟡 | 路由 id 空守 / 快切竞态(无序号/AbortController/ 错误信息缺 `.message` 优先 / `projectApi.list()` 全量拉取仅解名 / 静态文案半 i18n 半硬编码 |
| ✅ 亮点 | — | XSSDOMPurify + escapeFallback 双层)/ `void mdReady` 响应式依赖捕获(注释明确 B-24 修复点)/ Promise.all 并发 / onMounted 不阻塞 load |
### 2. 后端提交 `2de0c6e`16 文件 1418+/152-)— 工程化重构扎实1 真实 P0 + 文档完善项
| # | 等级 | 位置 | 发现 |
|---|---|---|---|
| ① | 🔴 | stream_recv.rs:97-1082de0c6e 版) | 注释虚假承诺「stop_notify 即时打断」,实际该提交无 stop_notify 分支。**working tree 已修** — `80b9243` 补了本地 Notify + 第 3 select 分支(:102-154 现状),无需记 todo |
| ② | 🔴 | workflow.rs:90-110 | **见 B-260615-35**broadcast Lagged 终态丢失) |
| ③ | 🟡 | stream_recv.rs:60-69 | `"timed out"` 分支**非死代码**(代理自查纠正初判:`"operation timed out"` 不含子串 `"timeout"`),可合并到首分支提升可读性 |
| ④ | 🟡 | commands.rs:265-287 | `ai_chat_stop` 3s 兜底任务用闭包前快照 conv_id会话切换后 emit 错对话spawn 内重新读 active_conversation_id 配合 generating 判定) |
| ⑤ | 🟡 | commands.rs:367/313/452 | tauri async cmd 内同步调 keyring IO 占 runtime worker建议 `spawn_blocking`Linux secret-service D-Bus 慢时影响明显) |
| ⑥ | 🟡 | commands.rs:313-322 | `ai_list_providers` mask 后 api_key 字段语义模糊(`""`/`"sk-xxx"`/`"sk-1••••xyz9"` 三语义混一字段),建议拆 `has_api_key: bool` + `api_key_mask` |
| ⑦ | 🟡 | secret.rs:51-64 | failcount sidecar 锚 `current_dir()` 不稳定(跨启动 cwd 变化致计数失效),建议改 `app_data_dir`(同 db_path |
| ⑧ | ⚪ | Cargo.toml + secret.rs | keyring noop backend 自检缺失Linux 漏 feature 时 set 静默成功 get 永空 → 兜底误判「已迁移」清 DB api_key 致密钥永久丢失 |
| ⑨ | ⚪ | agentic.rs:317-361 | 达 MAX_AGENT_ITERATIONS 后先 emit AiError 再 emit AiCompleted前端 UX 处理依赖实现 |
| ⑩ | ⚪ | workflow.rs:213 | `let _ = &app;` 显式占位,直接删 app 参数更清晰Tauri 自动重生成路由) |
| ✅ 亮点 | — | B-09 GeneratingGuard RAII 收敛复位Drop 兜底 panic/异常路径)/ B-11 stale loop 一致性校验(会话切换旧 loop 自动退出)/ stream_recv 错误诊断体系char 迭代修 UTF-8 边界 panic + 11 单测)/ secret.rs keyring 优先+DB 兜底双源 / tool_registry 双层校验防 symlink 逃逸 + 单次 open 消 TOCTOU |
---
## 其他确认
- **aiShared.ts 破环 ✅ 亮点**ARC-260615-06 落地):`nextMsgId` 下沉 aiShareduseAiStream 注释明确「本模块不再 import useAiEvents环消除」。4 composable 共享同一计数器,边界严格(仅下沉「无依赖、被多 composable 共用」成员)。
- **stream_recv.rs working tree 已补 stop_notify ✅**:102-154 三分支 select! 含 stop_notify 即时打断。2de0c6e 提交自带的注释虚假承诺问题,已被后续 `80b9243` 修代码侧,**当前 working tree OK无需记 todo**。
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| P0 状态复核 | 3 | B-34 已修 ✅(纠正过时)/ B-32 未修 / B-33 未修 |
| 新发现 P0 | 1 | B-260615-35 broadcast Lagged 终态丢失 |
| 🔴 DRY 复发 | 2 | CR-09四→五份/ CR-10第四份|
| 🟡 建议 | 12 | TaskDetail 5 + 后端 5 + stream_recv 1 + workflow 1 |
| ⚪ 可选 | 4 | 后端 3 + TaskDetail 1 |
| ✅ 亮点 | 4 | aiShared 破环 / GeneratingGuard RAII / stale loop 校验 / stream_recv 错误诊断 |
**本轮价值**:纠正 1 个过时 P0 判断B-34 已修)、坐实 2 个 P0 仍未修B-32/33、新增 1 个真实 P0B-35、确认 1 个架构亮点落地aiShared 破环)。无运行时 panic/数据损坏/并发竞争类硬伤,后端重构质量评级**良**。
todo 映射B-260615-35新增CR-260615-09 描述更新四→五份B-260615-34 标 ✅B-260615-32/33 加复核标注。

View File

@@ -0,0 +1,123 @@
# 定时代码走查 — 第 2 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。本轮范围 = 自上次走查起新增 6 提交(`fddca9d`/`892a642`/`19d64fc`/`d809cf4`/`8710d6c`/`06a2dea`)前端改动 + 工作区未提交(`types.ts`/`project.ts` M
> 方法3 路后台代理并行AARC-05 store 拆分 / BB-22 状态同步含 B-32/33 核对 / CCR-11 健壮性+工作区未提交)+ 主代理地面核对(`useAiStream.ts`/`useAiSend.ts`/`workflow.rs`/`f93b758` 提交)。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 待修项见 `docs/todo.md`。
> 关联:[定时走查-2026-06-15-P0复核.md](./定时走查-2026-06-15-P0复核.md)(第 1 轮B-32/33 结论被本轮纠正)。
---
## 核心结论3 前端 P0 全修(第 3 次纠正过时认知)
| P0 | 第1轮判断 | 第2轮地面复核 | 提交 | 处置 |
|---|---|---|---|---|
| **B-34** selectType | 已修 ✅ | 已修 ✅(确认) | — | 保持 ✅ |
| **B-32** 队列收尾 | 「未修」 | **已修 ✅** | `f93b758` | todo 标 ✅纠正第1轮 |
| **B-33** 骨架屏 | 「未修」 | **已修 ✅** | `f93b758` | todo 标 ✅纠正第1轮 |
**B-32/B-33 地面证据**`useAiStream.ts` 当前 81 行第1轮 Read 时为 73 行旧版):
- `:28` `state.queue = [] // B-32:超时收尾同步清队列` + useAiEvents.ts:225(AiError) + useAiSend.ts:152(stopChat)/124(approveToolCall catch) **四路径全清队列**
- `:43-45` onStreamTimeout 单遍反向扫描 running toolCall → rejected合并探测 completed 为单次 O(n),实现干净)
**B-32/B-33 修复提交**`f93b758`「修复: B-32+33 流式收尾清队列+回滚 running toolCall」3 文件 +18/-7。
> 第1轮「B-32/33 未修」为过时快照working tree 当时旧版,与 B-34 同根因)。**定时走查连续 3 轮纠正过时 P0 判断**B-34 → B-32 → B-33说明走查必须以地面 Read 为准,不可信赖记忆/旧快照。前端 3 P0 至此全部闭环。
---
## 新发现 P0AR-11 前端 listener 永不 attach功能半接通死代码
**位置**`src/stores/project.ts:31-55`(定义)+ `:109-110`export+ `src/App.vue:203-213`onMounted 未挂载)
**根因**:工作区未提交改动新增 `startDataChangedListener`/`stopDataChangedListener` 两函数 + export但**全项目零调用方**grep 确认)。后端 `emit_data_changed`audit.rs:259-270+ 自动执行路径audit.rs:351+ 审批路径commands.rs:175三处 emit 已就位且逻辑正确,事件 `df-data-changed` 正常发出,但前端 `listen('df-data-changed', …)` 永不执行 — 监听器从未 attach。
**影响**AR-11「数据变更联动刷新」功能**完全失效**。用户通过 AI 工具create/update/delete project/task/idea改数据后列表不自动刷新仍需手动刷新正是 AR-11 要消除的痛点)。后端 emit 成死事件。
**修复方向**`App.vue` onMounted 调 `await projectStore.startDataChangedListener()`onUnmounted 调 `stopDataChangedListener()`(对齐 `ProjectDetail.vue:463/470` 的 workflow listener 生命周期模式,数据变更可能来自任意页面)。
**性质**:工作区未提交半成品(非历史遗留,非 ARC-05 拆分收尾)。代理 C 确认 diff 是纯 AR-11 新增。
> todo:77 AR-11 条目原标「暂缓」第2轮复核更正为「后端已实施 ✅,前端半接通 🔴」。
---
## ARC-05 上帝 store 拆分 — 质量评级:优
**提交** `8710d6c``project.ts` 362→barrel + 5 子 storestate/projects/tasks/ideas/workflow
**3 项硬指标全部兑现**
| 指标 | 证据 |
|---|---|
| barrel 零改动兼容 | 逐字段比对 8710d6c~1 与 8710d6c 的 `return reactive({...})`37 key 完全一致8 getter state + clearError + 9 project + 4 task + 6 idea + 7 workflow actions + pendingApproval/stats computed。state getter 用 `get projects() { return state.projects }` 保留「避免 loadXxx 重赋值后视图为空」关键设计 |
| state 真单例 | state.ts 模块级 `export const state = reactive({...})`ESM 保证全 app 单实例4 子 store import 同一引用 |
| 依赖图无环 | 4 子 store 互不 import只依赖叶子 `./state`barrel 单向依赖子 store无循环/无初始化顺序陷阱 |
**🟡 建议 3**
1. `state.ts:32-37` 可变 `let _eventUnlisten` 跨模块共享 + setter依赖 ESM live-binding运行时正确但反直觉建议注释点明或并入 reactive
2. **AR-11 监听器已侵入 barrel**working tree project.ts:31-55违反「纯 barrel」定位 — 建议抽第 6 子 store `project/dataChange.ts`(与上面 AR-11 P0 同源)
3. `projects.ts:105` clearError 夹在 projects return 语义错位(属 state 层建议移除barrel 已独立从 state 导入)
**⚪ 可选 2**:注释「四子 store」实为 5 文件(四领域+共享 state/ createXxx 入参类型内联可抽 types。
**✅ 亮点**:越层 invoke 下沉彻底(`approve_human_approval`/`cancel_workflow_node` 下沉 `api/workflow.ts:39-54`B-34 snake_case 对齐在 api 层统一)/ ProjectStore 类型 + 单例 `_storeInstance` 保留 / view 端 7 处 `useProjectStore` 零改动。
---
## B-22 前后端状态同步 — 实现质量良好
**提交** `d809cf4``ai_is_generating` IPCcommands.rs:12+ sendMessage 预检useAiSend.ts:27
**设计对症**:双源(前端 streaming / 后端 generating各自维护确有不同步风险发送前查后端真值对症。
**竞态窗口可接受**`useAiSend.ts:42` 查后端与 `:97` 实际 sendMessage 之间有窗口,但后端 `ai_chat_send:57` 原子检查+占用(`if session.generating { Err }` + `generating=true` 同锁内)是真兜底。前端预检仅优化 UX提前入队而非发出去被拒降级路径完备IPC 失败 catch 退化为原 streaming 预检)。
**回归安全**正常事件流delta/tool/AiAgentRound/AiCompleted/AiError未改仅 sendMessage 入口前置预检,不影响 handleEvent。
**🟡 Issue 1**`useAiSend.ts:53-57` 入队分支复位 `streaming=true` 但**未启动看门狗**resetStreamWatchdog 只在 :89 正常发送路径调)。极端卡死场景(后端既不 emit、Drop spawn 又未执行streaming 可能永真。建议入队分支也调一次 resetStreamWatchdog代价一行。非 d809cf4 新引入回归onStreamTimeout 本就依赖正常路径启动的看门狗)。
**信息 Issue 2**`useAiSend.ts:60-61` 注释「streaming=true 但后端 false」描述与实际复位方向onStreamTimeout/AiError 复位 streaming=false有歧义建议改注释。
---
## CR-11 健壮性批fddca9d— ✅5 亮点 + 1 死逻辑副产品
**子项 ⑦⑧⑨⑩⑪⑫ 全部实施**
**✅ 5 亮点**
1. `useAiConversations.ts:77-93` JSON.parse 逐条 try/catch原单条坏 args 清空整对话 → 单条降级空对象)
2. `useAiEvents.ts:130-133` AiHeartbeat 显式 case 防 TS 穷举穿透
3. `useAiSend.ts:84-85` 复用 findToolCall消除内联 flatMap+find 重复 + 反向扫描 O(1) 均)
4. `ToolCard.vue:236-242` argString 去 3 处 `as any``Record<string,unknown>` 类型收窄
5. `workflow.ts:44-92` approveHumanApproval 签名收敛 `(decisions: string[], comment?)`(消除单/多选调用方歧义)
**⚠️ ⑪ 实施引入死逻辑CR-260615-18**`workflow.ts:67-68` `decision = selectType === 'multiple' ? decisions[0] ?? '' : decisions[0] ?? ''` 两分支返回值完全相同,三元无意义。后端 workflow.rs:291-296 有兜底。修:直接 `const decision = decisions[0] ?? ''`
**🟡 其他**CR-19action 字段 emit 但前端不消费,契约冗余)/ CR-20stopDataChangedListener try/catch 过度防御,与 workflow.ts:108 不一致)。
---
## P0 汇总(仍未修)
| ID | 问题 | 状态 |
|---|---|---|
| B-260615-35 | broadcast Lagged 兜底仅 warn → 终态事件丢失前端永久卡死(后端 workflow.rs:90-110 | **未修**第1轮发现本轮确认仍在|
| AR-11 前端 | listener 永不 attachApp.vue 未挂载) | **未修**(本轮新发现,工作区半接通)|
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| P0 全修确认 | 3 | B-34保持✅/ B-32 / B-33第1轮过时本轮纠正|
| 新发现 P0 | 1 | AR-11 前端 listener 永不 attach功能半接通|
| 仍存 P0 | 2 | B-35 broadcast Lagged后端/ AR-11 前端 attach |
| ✅ 质量肯定 | 2 | ARC-05 store 拆分(优)/ CR-11 健壮性批5 亮点)|
| 🟡 建议 | 6 | ARC-05 三项 / B-22 看门狗 / CR-18 死逻辑 / CR-19·20 |
| ⚪ 可选 | 4 | ARC-05 两项 / ToolCard 兜底 |
**本轮价值**:第 3 次纠正过时 P0 判断B-32/33 实已修f93b758前端 3 P0 全闭环;新发现 AR-11 前端 listener 永不 attach工作区半接通死代码功能未闭环肯定 ARC-05 拆分3 硬指标全兑现)与 CR-11 健壮性批质量。
**方法论警示**:连续 3 轮纠正过时判断B-34→B-32→B-33根因是第1轮 Read 到 working tree 旧版73 行)而 HEAD 已是新版81 行)。**走查必须每次地面 Read不可信赖上轮快照**。后续走查代理 prompt 应强调「以当前 working tree + HEAD 为准git log 看提交,勿用记忆」。
todo 映射B-32/33 标 ✅ + 复核更正 / AR-11todo:77状态更新 / CR-11todo:212标 ✅ / 新增 CR-260615-18/19/20。

View File

@@ -0,0 +1,70 @@
# 定时代码走查 — 第 3 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。范围 = 自第2轮起新增 3 提交(`dc27e79` AR-11 / `b08adcb` B-35 / `f574562` CR-18·19工作区 src/ 干净。
> 方法:主代理地面 git show 3 提交 + Read 关键文件核对修复质量/回归(修复集中、范围明确,无需派代理)。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 待修项见 `docs/todo.md`。
> 关联:[第1轮P0复核](./定时走查-2026-06-15-P0复核.md)、[第2轮](./定时走查-2026-06-15-第2轮.md)。
---
## 核心结论:走查价值闭环
接收方另一会话据第2轮走查修复了全部发现项 + 核对撤销 1 误判:
| 项 | 发现轮 | 第3轮核对 | 提交 |
|---|---|---|---|
| AR-11 listener 永不 attach | 第2轮 🔴 P0 | ✅ **已修**App.vue:218 attach | dc27e79 |
| B-35 broadcast Lagged 兜底 | 第1轮 🔴 P0 | ✅ **已修**(分支完整健壮) | b08adcb |
| CR-18 decision 死逻辑 | 第2轮 🟡 P2 | ✅ **已修**(删三元) | f574562 |
| CR-19 action 注释 | 第2轮 🟡 P3 | ✅ **已修**(注释明确,保留预留) | f574562 |
| CR-20 stop try/catch 过度防御 | 第2轮 🟡 P3 | ✅ **撤销(走查误判)**:接收方核 workflow.ts:108 一致 | f574562 commit 说明 |
> **前端 P0 全闭环**B-32 / B-33 / B-34 / B-35 / AR-11 全部已修。
> **走查↔接收方双向校验有效**:接收方不仅修复,还核对出 CR-20 为走查误判workflow.ts:108 stopEventListener 确有 try/catch写法一致主动撤销 — 说明走查质量经得起反向核对。
---
## 各修复核对
### AR-11 listener attachdc27e79
- `App.vue:218` onMounted `await projectStore.startDataChangedListener()` + `:258` onUnmounted `projectStore.stopDataChangedListener?.()`
- barrel `listen<DfDataChangedPayload>('df-data-changed')` 按 entity 调 loadProjects/loadTasks/loadIdeas
- 后端 audit.rs `data_change_for_tool` 映射create_project/idea/task→createupdate_*→updatedelete_*/purge→deleterestore/bind_directory→update+ emit_data_changed + commands.rs ai_approve 成功路径 emit
- listener 单例(`if (_dataChangedUnlisten) return`)防重复 attach ✅
- **功能闭环**AI 工具 create/update/delete 后前端列表自动刷新
### B-35 broadcast Lagged 兜底b08adcb
- `workflow.rs` `forward_db = state.db.clone()` move 进 forward 任务第1轮建议
- `lagged_total` 累计达 `LAGGED_PROBE_THRESHOLD=8``WorkflowRepo::get_by_id` 终态
- completed/failed/cancelled 补 emit workflow-event + break合成事件 total_duration_ms/failed_node 占位(注释说明 broadcast 不暴露原字段DB 为准)
- **分支完整健壮**Ok(Some) 终态→break / running→重置 lagged_total 继续等 / Ok(None)→warn 重置等 / Err(DB)→warn 重置等 / Closed→break
- 第1轮建议方案原样落地
### CR-18/19/20f574562
- **CR-18**`workflow.ts:67` decision 三元删除 → `const decision = decisions[0] ?? ''`
- **CR-19**action 注释明确「为未来 delete 本地移除等差异化刷新预留,当前未消费统一 load 全量」
- **CR-20 撤销**:提交说明「经核查与 workflow.ts:108 stopEventListener 写法一致(走查误判,不修)」
---
## 新发现1 轻量)
### CR-260615-21 🟡 P3 — App.vue:218 await 无 try/catch
`App.vue:218` `await projectStore.startDataChangedListener()` 无 try/catch。Tauri `listen` 失败(极罕见)会 reject onMounted。虽已是 onMounted 末尾(前面 appSettings/migrate/theme/i18n/keydown/loadCandidates 已跑app 不崩),但 AR-11 静默失效 + Vue 控制台 warn。修`try { await ... } catch(e){ console.error(...) }`。非阻塞,极低概率。
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| 价值闭环(修复确认) | 4 | AR-11 / B-35 / CR-18 / CR-19 全到位 |
| 撤销误判 | 1 | CR-20接收方核对 workflow.ts:108 一致)|
| 前端 P0 全闭环 | 5 | B-32/33/34/35/AR-11 全修 |
| 新发现 | 1 | CR-21 App.vue try/catchP3 轻量)|
**本轮价值**:确认前两轮走查发现被接收方完整修复(含 1 项撤销误判),前端 P0 全闭环。走查↔接收方双向校验机制有效(接收方主动核对出 CR-20 误判并撤销)。本轮仅 1 项 P3 轻量新发现,代码质量趋稳。
**方法论肯定**第3轮严格执行「地面 git show + Read 核对」,未重复走查已审内容(前两轮已覆盖的 ARC-05/B-22/CR-11 主体不再重审,只核对修复),符合「跳过已审避免重复」。
todo 映射B-35/CR-18/19/20/AR-11 标 ✅CR-20 标撤销误判)+ CR-21 新增。

View File

@@ -0,0 +1,89 @@
# 定时代码走查 — 第 4 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。范围 = 自第3轮起 1 新提交(`94cdcdc` CR-21 修复)+ **i18n 垂直切片走查**src/i18n 26 文件此前从未深查,最大未审区域)。
> 方法:主代理地面 git show 核 CR-21 + 1 路后台代理走查 i18n 完整性/硬编码遗漏45 tool_uses 全量扫)。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 待修项见 `docs/todo.md`。
> 关联:[第1轮](./定时走查-2026-06-15-P0复核.md)/[第2轮](./定时走查-2026-06-15-第2轮.md)/[第3轮](./定时走查-2026-06-15-第3轮.md)。
---
## 一、CR-21 修复确认(价值第 4 次闭环)
`94cdcdc` App.vue:218-222 `try { await startDataChangedListener() } catch(e){ console.error(...) }`。提交说明「cron 巡检捕获另一会话走查第3轮 CR-21」。✅ 已修。
---
## 二、i18n key 树质量 — 优秀 ✅
**466 key 全对齐**12 命名空间 × 2 语言):
| 维度 | 结果 |
|---|---|
| zh vs en key 树 | **0 缺 key / 0 多余 / 0 结构不一致** |
| 翻译质量 | 0 TODO/占位符0 复制中文漏译(仅 `aiLanguageZh=🇨🇳 简体中文` 1 处合理) |
| 插值参数 | `{var}` 占位符 zh/en 逐一匹配0 mismatch |
| 命名/嵌套 | 顶层=文件名camelCase嵌套≤2 层,一致 |
> i18n 文件本身无需改动。问题全在 **src/ 硬编码遗漏**。
---
## 三、硬编码遗漏 — 40+ 处CR-08 扩展,真实问题)
CR-260615-08 原记 3 处i18n 代理全量扫发现 **40+ 处**,按严重度分三档:
### 🔴 P1 — 直接破坏 i18n已有 key 却硬编码)
**P1-1 `useAiEvents.ts:182`(最高优先,改一行)**`tc.result = '用户拒绝了此操作'` 硬编码,绕过已有 `aiTool.rejectedHint`en=`User rejected this action`。ToolCard.vue:54 渲染 `tc.result || $t('aiTool.rejectedHint')``||` 短路致 **en locale 拒绝提示恒中文**,已有 en 翻译被一行废掉。修:删该赋值(让 ToolCard 走 t())或改 `t('aiTool.rejectedHint')`
**P1-2 `TaskDetail.vue` 整页 13 处未接 i18n**L6/12/17/24 + 11 个 label span + L144 errorMsg。i18n 无 taskDetail namespace只有 tasks需新建。en locale 全中文。
**P1-3 `ProjectDetail.vue` 审批/导入 5 处**L12 导入目录 / L201 确认(N) / L220 取消 / L392 confirmDialog / L399 Message.success / L404 Message.error / L381 未知错误 fallback。
**P1-4 `Dashboard.vue:76`** `暂无项目,去创建一个`
**P1-5 `AiChat.vue` 3 处**L107 title=清空 / L471 confirmDialog / L687 showToast 发送失败。
### 🟡 P2 — JS 字符串赋 UI/Toast
**P2-1 `ToolCard.vue:152-164` ARG_LABEL_MAP**11 个审批参数标签硬编码ID/项目 ID/名称/标题/描述/字段/新值/路径/优先级/标签/来源aiTool.ts 无对应 key需新增 `aiTool.argLabels.*`
**P2-2 store error fallback 11 处全中文**knowledge.ts:53/64/74/105 + ideas.ts:10/20/38 + projects.ts:13/25/37/63/71/81/90 + tasks.ts:10/20/38 + workflow.ts:19。en locale 下所有加载/CRUD 失败 toast 中文。
**P2-3 `useAiStream.ts:52-53`**CR-08 行号偏差,原记 39-41看门狗超时两文案 `⚠ 工具已执行完成...` / `⚠ 响应中断...` 直接 push messages。
**P2-4 `useAiSend.ts:49/65/130`**:队列满 throw + 审批未送达 tc.result。
### ⚪ P3 — 边界/低优先
**P3-1 `utils/time.ts:46-51`(隐蔽)**`formatRelative` 相对时间硬编码(刚刚/X 分钟前...。i18n 已有 `common.justNow/minutesAgo/hoursAgo/dayAgo` key 却没用 → en locale 所有时间戳中文。
**P3-2 `router/index.ts:18-60`**8 个 `meta.title` 中文,但 **0 消费方**grep meta.title/document.title 无匹配),死代码/潜伏隐患。
**P3-4 `i18n/index.ts:20` `fallbackLocale: 'en'`**zh-CN 用户缺 key 回退英文,反直觉(当前 key 全对齐不触发,设计气味)。
---
## 四、亮点
- **i18n key 树工程化扎实**466 key 双语全对齐、插值参数一致、命名规范、无占位符 — 国际化基础设施质量高。
- **i18n index 初帧渲染处理合理**appSettings 异步,`getInitialLocale()` 默认 zh-CNloadAll 后回填,已知短暂态有注释。
- **TaskDetail.vue 单文件 XSS/响应式到位**第1轮已肯定i18n 是唯一短板。
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| 价值闭环 | 1 | CR-21 → 94cdcdc ✅ |
| i18n key 树肯定 | 466 | 全对齐 0 缺 key优秀|
| 硬编码新发现 | 40+ | P1-1 useAiEvents:182改一行最高 ROI/ TaskDetail 整页 / ToolCard ARG_LABEL_MAP / store fallback 11 处 / time.ts 隐蔽 |
| P1 i18n 破坏 | 5 | useAiEvents:182 / TaskDetail / ProjectDetail / Dashboard / AiChat |
| P2/P3 | 6 | ARG_LABEL_MAP / store fallback / useAiSend / time.ts / router meta / fallbackLocale |
**本轮价值**i18n 垂直切片暴露真实问题 — key 树优秀但 src/ 硬编码 40+ 处CR-08 严重低估)。**P1-1 useAiEvents:182 是明确 i18n 破坏 bug**(一行废掉 en 翻译),改一行最高 ROI应优先。TaskDetail 整页未接 i18n13 处)是新页面 i18n 债。
**方法论**换垂直切片角度i18n 维度)有效突破前几轮按提交/改动的横切盲区,发现 40+ 处硬编码 — 印证 task2/3「功能/模块垂直走查」的价值(换角度有新发现)。
todo 映射CR-260615-08 扩展3→40+ 子项,标 P1-1 最高优先)+ CR-21 标 ✅。

View File

@@ -0,0 +1,94 @@
# 定时代码走查 — 第 5 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。范围 = **api 层垂直切片**9 文件此前从未深查IPC 契约边界。无新提交自第4轮起 src/ 干净)。
> 方法2 路后台代理Aapi invoke 契约层 / Btypes 类型对齐层)+ 主代理地面核对 + **WebSearch 权威裁决**。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 待修项见 `docs/todo.md`。
> 关联:[第1-4轮](./)。
---
## 🚨 核心发现Tauri v2 camelCase 行为权威裁决(代理矛盾 → 纠正假阳性)
### 矛盾
- **代理 A**Tauri v2 **不转** camelCase6 处 IPC 参数遗漏ai_approve/ai_save_provider/knowledge_events/ai_set_concurrency_config/ai_set_provider/ai_pending_tool_calls真 P0B-34 同类)
- **代理 B**Tauri v2 **默认转** camelCase宏生成别名6 处全误判
### 权威裁决WebSearch Tauri v2 官方文档 + StackOverflow
> **Tauri v2 默认自动转换 snake_caseRust↔ camelCaseJavaScript**。
> Rust `#[tauri::command] fn greet(tool_call_id: String)` ↔ JS `invoke('greet', { toolCallId })` 自动匹配。
> **除非** `#[tauri::command(rename_all = "snake_case")]` 才需 JS 传 snake_case。
项目地面核对:`grep rename_all src-tauri/``state.rs:30``KnowledgeConfig` 的 serde**非 command 参数****无任何 `#[tauri::command]` 用 rename_all** → 全部走默认camelCase 转换)。
### 结论
**代理 B 对,代理 A 6 处全误判(假阳性)**
- `api/ai.ts:15` `{ toolCallId }` → 后端 `tool_call_id` ✅ 自动转换,工作
- `api/ai.ts:20` `{ convId }` / `:47-54` `{ providerType/baseUrl/apiKey/defaultModel }` / `:59/64` `{ providerId }` / `:69` `{ globalLimit/perConvLimit }` → 全 ✅
- `api/knowledge.ts:80` `{ knowledgeId/eventType }` → ✅
camelCase 和 snake_case **都工作**项目混用ai.ts 用 camelCaseworkflow.ts 用 snake_case均正常
---
## 🔑 根因B-34 错误注释传播误导
**`src/stores/project.ts:273`** B-34 注释「Tauri 2 IPC 不转 camelCase,须 snake_case 对齐后端 workflow.rs:211」**与权威矛盾**(实际转)。
- 代理 A 据此错误注释判 6 处假阳性 P0认为 camelCase 失效)
- B-34 实际「修复」selectType→select_type**no-op**camelCase 本工作snake_case 也工作,两种都接受。改了无害,但**注释错误传播误导**
- 若「多选审批静默失效」曾为真症状,根因**非 selectType 命名**需复核camelCase 转换正常)
> **本轮最高价值**:揭露 B-34 技术债(错误注释),避免后续维护者/走查代理据此做无用「修复」(代理 A 已踩坑)。
---
## 代理 B 发现types 对齐)— 良好4 项低风险
**字段名/可选/枚举/响应包装全对齐**(无 P0 undefined 风险7 Record structIdea/Project/Task/Workflow/AiProvider/Knowledge/KnowledgeEvent字段名全 snake_case 对齐Option↔可选对齐AiChatEvent/WorkflowEvent union 变体对齐。
**4 项低风险**CR-260615-22
1. `TaskRecord.status`types.ts:88注释 `review_ready/merged/abandoned` **错**,后端 TaskStatustypes.rs:165= `todo/in_progress/in_review/testing/done/blocked/cancelled`
2. `IdeaRecord.status`:11注释漏 `archived`IdeaStatus 6 变体)
3. `ProjectRecord.status`:39注释漏 `testing/releasing`ProjectStatus 7 变体)
4. `AiConversationSummary.models`:233冗余后端返但前端无消费点
> status 字段类型是 `string`(非 literal union注释不阻断运行时仅误导维护者。
---
## ✅ 亮点
- **api/types.ts 类型对齐质量高**7 Record struct + union 类型全对齐,无字段漂移
- **IPC 命令名零漂移**(代理 A 核 60+ 命令注册):无拼写错/未注册/已删残留
- **越层下沉治理**store 不直碰 invokeworkflow.ts:7-8 注释api 是唯一 IPC 边界
- **workflow.ts 契约自觉**:虽「不转 camelCase」判断有误但 snake_case 风格统一 + options 透传注释R-PD-5是好的防回归实践
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| 权威裁决 | 1 | Tauri v2 默认转 camelCase代理 B 对)|
| 假阳性纠正 | 6 | 代理 A IPC camelCase 遗漏全误判 |
| 根因澄清 | 1 | B-34 错误注释传播误导CR-23|
| 低风险新发现 | 4 | types 枚举注释错/漏 + 冗余字段CR-22|
**本轮价值**:多代理交叉验证暴露矛盾 → WebSearch 权威裁决 → 纠正 6 处假阳性(避免后续基于错误注释的无用修复)+ 揭露 B-34 注释技术债。
**方法论**
1. **走查须以权威行为为准(官方文档/实际运行),非代码注释** — 注释可能错误(如 B-34代理 A 据错误注释判 6 处假阳性
2. **多代理交叉验证有效** — 代理 A/B 结论矛盾触发权威裁决,单代理走查无此纠错机制
3. **api 层垂直切片证实类型对齐质量高**(与前几轮横切互补)
todo 映射:**不记代理 A 6 处**(假阳性)+ CR-260615-22types 注释/冗余 P3+ CR-260615-23B-34 注释修正 P2
---
## Sources
- [Calling Rust from the Frontend | Tauri v2](https://v2.tauri.app/develop/calling-rust/)
- [Why does Tauri modify the parameter names of invoked functions? — Stack Overflow](https://stackoverflow.com/questions/78432685/why-does-tauri-modify-the-parameter-names-of-invoked-functions)
- [Tauri Command Fundamentals — Tauri Tutorials](https://tauritutorials.com/blog/tauri-command-fundamentals)

View File

@@ -0,0 +1,73 @@
# 定时代码走查 — 第 6 轮2026-06-15
> 触发:定时走查 cron每 30 分钟)。范围 = **列表页 + Dashboard + AI 面板/窗口垂直切片**此前从未深查。1 新提交CR-22 修复)。
> 方法2 路代理A 列表页 / B Dashboard+AI窗口+ 主代理地面核 stopListener。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 见 `docs/todo.md`。
> 关联:[第1-5轮](./)。
---
## CR-22 ✅ + CR-23 撤销(价值第 5 次闭环)
- `16aeacc` CR-22 ✅types.ts 3 枚举注释对齐后端Task/Idea/Project status+ 删 AiConversationSummary.models 冗余
- CR-23 撤销(不适用):接收方核对 B-34「Tauri 不转」注释在 ARC-05 拆分时已简化workflow.ts:81/project.ts:58 仅风格对齐无错误说明)
---
## 🔴 分离窗口生命周期新功能首次深查P1 核心)
**代理 B R1-R5**。地面核 `stopListener`(useAiEvents.ts:258) **全仓零调用**grep App/AiChat/AiDetached onUnmounted/onBeforeUnmount 都不调)确认 R2。
### CR-260615-24 [P1] listener 双注册 + 永不清理R1+R2
- **R1 双窗口重复消费 ai-chat-event**:后端 `app.emit`stream_recv/agentic/commands/audit 多处)是**全局广播**发给所有 webview。主窗口AiChat.vue:790+ 分离窗口AiDetached 渲染 AiChat各注册 `listen('ai-chat-event')`,两窗口 handleEvent 都触发 → delta 各 `+=` 一次 / AiAgentRound 各 push 空气泡。当前靠 App.vue:94 `v-if="panelOpen && !detached"` detach 时卸载主窗口 AiChat 间接停,但 state 是模块级单例handleEvent 仍写主窗口 state**脆弱隐式契约**。
- **R2 stopListener 零调用**useAiEvents.ts:258 定义但全仓无调用点 → listener + watchdog 永久泄漏startListener 幂等防重复注册,但卸载不释放)。
- **边界影响**reattach 重叠窗口期多一条空 assistant 消息(非崩溃/非数据损坏)。
- **修**AiChat.vue onBeforeUnmount 补 `store.stopListener()` + detach 时主窗口显式 stopListener / reattach startListener或后端 `emit_to(label)` 定向。
### CR-260615-25 [P2] 分离窗口状态机缺口R3/R4/R5
- **R3**`win.once('tauri://destroyed')` 置 detached=false 但**不恢复 panelOpen=true**(只 reattachPanel 显式设)→ 用户直接 X 关分离窗口后面板消失,需手动 Ctrl+I
- **R4**`resumeInDetached`(useAiWindow.ts:79-95) 强行重建生成态(读 df-ai-gen 置 streaming=true + push 空气泡),与后端 `ai_is_generating` 真值可能失配 → 假气泡 / 130s 后 watchdog 假超时
- **R5**:分离窗口 onMounted `switchConversation`(useAiWindow.ts:81) + loadConversations 内自动 switch后端 **AiSession 单例** activeConversationId 被分离窗口覆盖 → 主窗口期间发消息可能落错会话B-22 同类延伸)
---
## 🟡 列表页(代理 A
### CR-260615-26 [P2] AR-11 + B-29 契约交互 + Tasks 空态R-1/Y-2
- **R-1**AR-11 监听器project.ts:38对 task 调 `loadTasks()` **无参 → 全量加载**,破坏 B-260615-29 建立的「store.tasks 反映当前筛选」契约。filteredGroups 二次过滤**兜住结果正确**,但 store.tasks 变全量createTask push 到全量数组)+ 性能
- **Y-2**Tasks.vue:39-71 **无 loading/error/empty 兜底**加载失败或无结果时空白页store.error/loading 零引用)。对比 Projects.vue:107 至少有空态
### ✅ 列表页亮点
- **Projects/Tasks i18n 100%**grep 确认中文仅注释/console— CR-08 范围内这两页**无硬编码遗漏**
- Projects.vue useConfirm composable 抽离DRY消除 4 视图重复)
- B-260615-29 筛选重载注释保留(可追溯)
---
## 🟡 Dashboard代理 B
### CR-260615-27 [P2] refresh 兜底 + stage 颜色 + 死代码M1/M3/L4
- **M1**refreshDashboard.vue:202-204Promise.all **无 try/catch**,任一接口失败 unhandledrejection + 用户无反馈onMounted 有 try/catch 但 refresh 无)
- **M3**getProjectStage(:150) status→stage 映射 **planning 归 coding stage颜色紫但 label planning**颜色语义撒谎cancelled 归 testing 同)
- **L4**:决策/批注两 panel(:103-120) 永远空态CSS(.decision-row/.anno-row :504-572) 完整但模板未用 = **死代码**
### ✅ Dashboard 亮点
- **无图表库**,纯 CSS 进度条 + 数字 statGPU 友好动画,**无性能问题**
- aiShared 破环正确ARC-06nextMsgId 两窗口各自独立不冲突
---
## 📊 本轮摘要
| 类别 | 数 | 代表 |
|---|---|---|
| 价值闭环 | 1 | CR-22 ✅ + CR-23 撤销 |
| P1 新发现 | 1 | 分离窗口 R1+R2 listener 双注册+泄漏CR-24|
| P2 新发现 | 3 | 分离窗口状态机CR-25/ 列表页契约+空态CR-26/ DashboardCR-27|
| 亮点 | 4 | 列表页 i18n 100% / Dashboard 纯 CSS 无性能问题 / aiShared 破环 / useConfirm DRY |
**本轮价值****分离窗口是新功能,前几轮横切(按提交/改动)完全没覆盖**垂直切片Dashboard+AI窗口维度首次深查即暴露 P1listener 泄漏)+ 状态机缺口。**再次印证 task2/3 垂直走查价值** — 横切收敛后垂直切片是新发现来源i18n/api/列表页/AI窗口 4 个垂直切片均挖出真问题)。
**方法论**:分离窗口 P1R1+R2经地面核 stopListener 零调用坐实避免第5轮代理 A 假阳性教训),走查发现须地面验证。
todo 映射CR-260615-24P1 分离窗口 listener/ CR-25P2 状态机)/ CR-26P2 列表页)/ CR-27P2 Dashboard

View File

@@ -0,0 +1,81 @@
# 定时代码走查 — 第 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 边界)。

View File

@@ -0,0 +1,64 @@
# 定时代码走查 — 第 8 轮(前端收尾)
> 触发:定时走查 cron每 30 分钟)。范围 = **剩余小区域收尾**useConfirm/useMarkdown/ConfirmDialog/ToolCardList/constants/utils+ 核 CR-25/28/30 修复。
> 方法:主代理 git show 3 提交 + 1 路代理收尾走查。
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only。todo 见 `docs/todo.md`。
> 关联:[第1-7轮](./)。
---
## CR-25/28/30 ✅(价值第 7 次闭环)
| 提交 | CR | 修复 |
|---|---|---|
| ac8dab3 | CR-25 ✅ | 分离窗口状态机destroyed 恢复 panelOpenR3+ resumeInDetached 核 ai_is_generatingR4+ 删 switchConversation 自动 switchR5|
| 40461b2 | CR-28 ✅ | knowledge create 内 loadCandidates 改非阻塞(不污染成功语义)+ Knowledge.vue error banner 消费 store.error**通道接通**|
| b300bb7 | CR-30 ✅ | useSetting 值类型契约文档 + changed helper JSON 深比较 |
**CR-29ai.ts messages 无上限 + knowledge 竞态)仍存**
## 数据完整性修复
todo:227 CR-30 行末**被污染**(上轮 Edit 锚错位接 CR-23 的 B-34 注释残留内容),本轮修复(删除 CR-23 残留段)。走查记录数据完整性已恢复。
---
## 收尾小区域(代理)— 无必修,质量过关
### CR-260615-31 [P2] 小区域健壮性Y-1/Y-2
- **Y-1 useConfirm 并发 confirmDialog 覆盖 resolve**useConfirm.ts:35-47连点两删除/confirm 交错时,第二个覆盖 `resolve`,前一个 Promise **永挂**(静默中断 + 轻微内存泄漏)。修:进入时 `resolve?.(false)` 打断前一个视为取消
- **Y-2 ToolCardList collapseInactive 漏清 expandedTools**:47-51只清 expandedCards 未动 expandedTools已完成卡片折叠后内容展开态残留 Set。修对称过滤或注释明确有意保留
### ✅ 5 亮点(收尾区域是项目较干净部分)
- **G-1 useConfirm 抽取消除 5 处重复**Projects/ProjectDetail/Ideas/Settings/AiChat— DRY 到位
- **G-2 useMarkdown 单例 + AiChat 流式 getter 复用** + **escapeHtml 全局单份** + **useRendered 已抽**CR-10 无残留重复)
- **G-3 XSS 防护链完整**renderMd `_purify.sanitize(_marked.parse(...))` + escapeFallback 纯文本转义双保险B-24 覆盖)
- **G-4 project 常量统一映射**label/badge/stage 三套 + accessor 兜底 + parseStack 防崩)— 根治三套矛盾
- **G-5 ConfirmDialog 自包含**(样式内联不依赖外部 .btn-*CSS 变量主题化)
> 硬编码中文文案AiChat:471/ProjectDetail:392均带「i18n 不在白名单」注释属已知取舍CR-08 范围内不重复记。
---
## 📊 8 轮 cron 走查总结(前端全覆盖)
| 维度 | 成果 |
|---|---|
| 轮次 | 8 轮 cron + 5 垂直切片i18n/api/列表页/AI窗口/stores+ 收尾 |
| 价值闭环 | **7 次**B-32/33/34/35 + AR-11 + CR-18/19/21/22/24/25/26/27/28/30 全被接收方修复)|
| 假阳性纠正 | 1 次Tauri camelCase代理 A 6 处误判经权威裁决纠正)|
| 数据完整性 | 1 次污染修复CR-30 行末 CR-23 残留)|
| 方法论 | 走查须地面 Read/权威为准(非注释);多代理交叉验证有效;垂直切片是横切收敛后的新发现来源 |
**前端剩余未修**CR-29ai.ts messages 无上限 + knowledge 竞态)/ CR-31useConfirm/ToolCardList 健壮性)/ CR-08i18n 硬编码 40+/ CR-09/10DRY .ai-md/renderedRef/ CR-12可选一组
---
## 💡 建议
前端走查已**充分覆盖**8 轮 + 5 垂直切片,收尾无必修,接收方修复速度跟上发现速度)。建议:
1. **停止 cron**(前端边际收益递减)— 用户可 `/loop` 停止或让我 CronDelete
2. **转 task2/3 后端 workflow 功能/模块垂直走查**(新维度:后端 src-tauri + 8 crate 全链路,此前前端走查未覆盖后端)
todo 映射CR-260615-31P2 收尾健壮性)。

View File

@@ -177,7 +177,7 @@
| # | 等级 | 文件:行 | 修改内容 | 对应 todo |
|---|------|---------|----------|-----------|
| ① | 🔴P0 | project.ts:273 | selectType→select_type多选审批静默失效 | B-260615-31 |
| ① | 🔴P0 | project.ts:273 | selectType→select_type多选审批静默失效 | B-260615-34 |
| ② | 🔴P0 | useAiSend/Stream/Events | timeout/error/stop 收尾清队列,防消息丢失 | B-260615-32 |
| ③ | 🔴P0 | useAiStream onStreamTimeout | 回滚 running toolCall防骨架屏卡死B-07 残留) | B-260615-33 |
| ④ | 🔴P1 | ProjectDetail:201 + useAiStream:39 + AiChat:675 | i18n 一组(多选按钮🔴+错误文案🟡+toast⚪ | CR-260615-08 |

View File

@@ -0,0 +1,141 @@
# 文档全量核对报告2026-06-15
> 方法4 路并行代理核对A 根目录核心 / B 架构+模块 vs 代码 / C 审查+迭代+管理 / D 交叉引用+规范+重复)
> 范围docs/ 全量 48 .md + 根目录 ARCHITECTURE.md / PROGRESS.md / URGENT.md
> 性质:核对记录,不改代码(本会话 session-role。todo 待修项见 docs/todo.md「文档核对待修项」DOC-260615-01~14。
> **悬空链接0**(全量 markdown 链接核对,目标文件全部存在)。
---
## P0 文档硬伤(按文档找代码会落空)
### 1. ARCHITECTURE.md 数据模型整段漂移B-1 + A
:262-475 列 14 表,**6 虚构 7 遗漏**`artifacts`/`connections`/`features`/`test_cases`/`test_runs`/`annotations`/`decisions` 7 张不存在df-traceability 删后未清);`workflow_defs`/`workflow_runs` 应合并为 `workflow_executions`;实际 `node_executions`/`branches`/`ai_conversations`/`knowledges`/`ai_tool_executions`/`knowledge_events`/`app_settings` 7 张未列。projects 表字段repo_path/priority/current_stage多数从未加。**建议**:整段重写对齐 migrations.rs或加「⚠ 初稿,实际 schema 见 migrations.rs」横幅。
### 2. df-nodes 模块文档 8 节点全骨架 → 实际 3 节点 2 已实现A-1/C-1/D-3.2
:9,13,17-26 列 8 节点AI/Script/Docker/Git/Human/Notify/HTTP/Subflow全标骨架 execute() 空。实际 `crates/df-nodes/src/` 仅 ai_node/script_node/human_node 3 文件,**均完整实现**script 接 shell、ai 调 provider、human subscribe→send→select!。Docker/Git/Notify/HTTP/Subflow 5 节点不存在。**建议**:重写,节点缩 3 个状态改 ✅。
### 3. df-ai 模块文档列不存在的文件 + 已删 traitA-3
:30-40 文件结构列 `router.rs`ModelRouter+ `stream.rs`StreamCollector实际均无R-PD-7 删)。:50-72 LlmProvider trait 含 `supported_features()`(已删,新增 `endpoint()`)。:22/174 工具数 12 → 实际 13。**建议**删两虚构文件行trait 段对齐12→13。
### 4. 使用手册 7 处与实际不符C-4.4
运行命令 `bun`→实际 `npm`;任务状态 4 态→实际 7 态todo/in_progress/in_review/testing/done/blocked/cancelled优先级 P0-P3 方向歧义(前后端枚举反向);节点类型 Script/Condition/Parallel→实际 Script/Ai/Human无独立 Condition/Parallel且 Script 已下线监控「WebSocket」→实际 Tauri EventBus「单 Provider」→实际多 Provider知识库「静态收集」→实际 Tier1 AI 提炼+向量检索。**建议**:全面重写。
---
## P1 审查状态断层(报告说修了/todo 看不到)
### 5. 全局 review R-P1-1~6 / R-P2-1~13 已实施 todo 零回写C-1.2/1.3
全局代码review-2026-06-15.md 推进状态标「P1×6 + P2×13 全闭环126 test pass」代码核对坐实 R-P1-2/3/5/6、R-P2-2/3/8/9/10/13 均落地。**todo.md 完全无条目**(既不在待办也不在已完成)。**建议**:已完成区补汇总回写。
### 6. 架构复核报告 §5 新发现 11 项零入 todoC-1.1
架构与缺陷复核报告 §5 新①~⑪5 项🟠todo 零覆盖。复核-新②/⑨/⑩ 后被全局 review 取代,**复核-新①/③/④/⑪ 待补**①useAiConversations pendingToolCalls 二次 token 比对 / ③executor NodeCancelled 事件语义双标 / ④cancel_workflow_node 终态守卫 / ⑪主窗口幽灵 watchdog。**建议**4 项补 todo。
### 7. aichat §8 + 工作流审批 TL;DR 已修项未勾B-3/B-4
aichat审查报告 §8 优先级表 11 行仅 AR-3 标 ✅,实际 H1/H2/create_project/AR-5/6/7/9/10 均 ✅todo 对齐)。工作流审批审查报告 TL;DR + §0 头号 P0human_node.rs:41 缺 awaitB-03b-R6 ✅ 已修但报告仍「待修」语气。**建议**:补 ✅ + commit 标注。
### 8. 近期改动 CR-03 未做子项埋 [x] 备注C-1.4
CR-260615-03 标 [x] 但备注含「未做audit.rs Err 误报/openai source 丢失/ToolCard projectNameById find」4 子项,代码核对坐实未改。**建议**:拆独立 P2 todo或合并 CR-260615-11
---
## P1 架构/模块文档过期
### 9. df-workflow 4 处接口过期B-A-2
:81 NodeRegistry Default已删registry.rs:76 注「不实现」);:180 ConditionEngine 默认 true→实际 falseB-260614-02:138 try_recv_human_approval已删:155-156 set_waiting/set_skipped已删仅留 set_cancelled。**建议**4 处对齐。
### 10. df-storage V8→V13B-A-4/C-4.1
:3,9,26-36,114,132 反复 V1-V8/MIGRATION_VERSION=8实际 V1-V13V9 ai_providers/V10 knowledges.reasoning+knowledge_events/V11 projects.deleted_at/V12 path+stack/V13 app_settings。表数 11→18Repo 11→17。**建议**:版本/表数/Repo 数全改。
### 11. 对抗评估 idea_evaluations 设计稿未标未实施B-A-5
想法探索-对抗式评估 :220-310 设计 6 struct + idea_evaluations 表,全仓零命中。实际 adversarial.rs 纯启发式AdversarialEval/Argument/AnalystAnalysis功能决策记录已标「📐 设计未实施」但模块文档未标。**建议**:加「⚠️ 当前纯启发式,三路 LLM + 表为设计稿」横幅。
### 12. df-execute 文档 Shell/Docker/SSH/Git vs 仅 ShellD-3.3
ARCHITECTURE:84/PROGRESS:29/df-nodes 文档描述 df-execute Shell/Docker/SSH/Git实际仅 shell.rs+lib.rsdocker/git_ops/ssh Sprint 19 已删)。**建议**:删 Docker/SSH/Git 描述。
---
## P1 索引/计数矛盾
### 13. 13→8 crate 多处A/D-3.1
实际 workspace 8 crate。PROGRESS:13/INDEX:4,107,119/Phase1决策 ADR-003/对抗裁决报告/想法探索 多处写 13。**建议**:统一「原 132026-06-14 删 5 零引用,现 8」ADR 加「已修正」标注保留决策史)。
### 14. INDEX 漏 9 文档 + 09-问题排查目录A/D-2.3)— **本会话已补正**
F-07 trait下沉/密钥迁移/工作流边界/条件引擎/generating状态机02 区 5/DAG引擎详解/AI对话引擎03 区 2/全局代码review05 区 1/aichat-apikey-401排查09 目录)。**已在 INDEX 补**。
### 15. commands 数 47/57/68 三处冲突C-5.1
PROGRESS:72 写 47、:48 写 57、实际 68 个 #[tauri::command]。**建议**:统一 68。
### 16. URGENT.md 过时 + 未挂索引D-5.1/2.4
5 个 P0AC3/FR-S7/FR-S8/B-03b-R8/FR-S1在 todo 全 ✅URGENT 无停用标注 + 不在任何索引。**建议**:顶部加「⚠️ 2026-06-14 快照P0 全迁 todo 已完成,本文件停用」或删除。
---
## P2 迭代/Phase 过期
### 17. DEVFLOW-1~4 全标待实施C-2.1
4 文档全「状态:待实施/实施记录待填写」,实际 Phase1 全完成DEVFLOW-1 宏替代 trait 设计转向/DEVFLOW-2 68 commands/3-4 落地)。**建议**:标已完成+实施摘要,或归档。
### 18. Phase1 任务清单严重滞后C-3.1
标「进行中」,实际全完成。待实施表 #7~#11 全 [ ](均已做)。代码规模 71 文件 4108 行 vs 实际 53/7400。已知问题 4 项 3 项已解决。**建议**:标完成或归档。
### 19. Phase2 计划部分超前/滞后C-3.2
Phase2.2/2.3 基础已完成启发式未回写Phase2.4 并行 ✅/编辑器+条件分支未做B 路线 conditions 默认值已改未同步。**建议**:标注实际状态。
---
## P2 三层规范
### 20. todo 肥大违反分层D-2.1
todo:88-101/251-267/293-296 块是 mini 审查报告塞看板(单条 10-30 行),应压成指针进 docs。**建议**每条压到「ID — [P级] 一句话 — 详见<文档>」。
### 21. 重复收口D-4.1-4.3
HumanNode 审批三处功能决策记录未瘦身为指针B-03 文档标真相源但功能决策记录仍全文重复密钥迁移两处全局review 应仅留指针FR-S1 四处todo 与 URGENT 既重复又矛盾)。**建议**:真相源收口,余改指针。
### 22. 文档记录规范未在 INDEX 突出D-5.3
文档记录规范-2026-06-14.md 是三层规范权威定义INDEX 仅普通条目README 未提。**建议**INDEX/README 加「规范基准」标注。
---
## P3 技术/工具文档
### 23. Tauri-IPC 全篇过时C-4.2
:8 「仅 greet 示例」→实际 68 commands:16-23 待实施 5 项全落地;:35 `frontend/src/`→实际 `src/`。**建议**:重写或归档。
### 24. View 改造指南全篇过时C-4.3
:7-13 当前问题 4 项全解决;:80-86 页面 ProjectsView 等(实际无 View 后缀,无 WorkflowView。**建议**:归档(与 DEVFLOW-3 重复)。
### 25. SQLite 表数 V1-V9→V1-V13C-4.1,与 §10 同源)
### 26. 锚点顿号 + 路径风格A/D
INDEX:107-109 `#四crate-结构` 锚点顿号渲染器差异(低危);功能创意池:150 链接省 `./` 风格不一。
---
## ✅ 一致性良好
- **df-knowledge 模块文档**:与代码吻合
- **规格契约自检机制**:活契约机制描述准确
- **功能决策记录**:状态标注详尽且与 todo 对齐(决策反转有留痕)
- **经验记录**:落地项均标 ✅ + commit
- **todo.md**:项目内最准真相源,审查报告交叉对照基本可靠
- **悬空链接 0**:全量 markdown 链接目标全部存在
---
## 📊 摘要
| 类别 | 数 | 代表 |
|---|---|---|
| P0 文档硬伤 | 4 | ARCHITECTURE 数据模型 / df-nodes / df-ai / 使用手册 |
| P1 审查断层 | 4 | R-P1/P2 未回写 / 复核新①③④⑪ / §8 表 / CR-03 子项 |
| P1 模块过期 | 4 | df-workflow / df-storage / 对抗评估 / df-execute |
| P1 索引计数 | 4 | 13→8 / INDEX漏 / commands冲突 / URGENT |
| P2 迭代规范 | 6 | DEVFLOW / Phase1 / Phase2 / todo肥大 / 重复 / 规范未突出 |
| P3 技术文档 | 4 | Tauri-IPC / View指南 / SQLite / 锚点 |
**最优先**P0 四项ARCHITECTURE 数据模型重写 / df-nodes 重写 / df-ai 删虚构 / 使用手册重写)—— 按文档找代码会落空,误导接手方最强。
**已本会话补正**INDEX 漏列 9 文档 + 09 目录DOC-14 部分ID 碰撞 B-260615-31→34。
todo 映射DOC-260615-01~14见 docs/todo.md「文档核对待修项」