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:
85
docs/05-代码审查/定时走查-2026-06-15-P0复核.md
Normal file
85
docs/05-代码审查/定时走查-2026-06-15-P0复核.md
Normal 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/Failed,forward 任务永远 `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.vue(362 行新文件)— 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 半硬编码 |
|
||||
| ✅ 亮点 | — | XSS(DOMPurify + escapeFallback 双层)/ `void mdReady` 响应式依赖捕获(注释明确 B-24 修复点)/ Promise.all 并发 / onMounted 不阻塞 load |
|
||||
|
||||
### 2. 后端提交 `2de0c6e`(16 文件 1418+/152-)— 工程化重构扎实,1 真实 P0 + 文档完善项
|
||||
|
||||
| # | 等级 | 位置 | 发现 |
|
||||
|---|---|---|---|
|
||||
| ① | 🔴 | stream_recv.rs:97-108(2de0c6e 版) | 注释虚假承诺「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` 下沉 aiShared,useAiStream 注释明确「本模块不再 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 个真实 P0(B-35)、确认 1 个架构亮点落地(aiShared 破环)。无运行时 panic/数据损坏/并发竞争类硬伤,后端重构质量评级**良**。
|
||||
|
||||
todo 映射:B-260615-35(新增);CR-260615-09 描述更新(四→五份);B-260615-34 标 ✅;B-260615-32/33 加复核标注。
|
||||
123
docs/05-代码审查/定时走查-2026-06-15-第2轮.md
Normal file
123
docs/05-代码审查/定时走查-2026-06-15-第2轮.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# 定时代码走查 — 第 2 轮(2026-06-15)
|
||||
|
||||
> 触发:定时走查 cron(每 30 分钟)。本轮范围 = 自上次走查起新增 6 提交(`fddca9d`/`892a642`/`19d64fc`/`d809cf4`/`8710d6c`/`06a2dea`)前端改动 + 工作区未提交(`types.ts`/`project.ts` M)。
|
||||
> 方法:3 路后台代理并行(A:ARC-05 store 拆分 / B:B-22 状态同步含 B-32/33 核对 / C:CR-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 至此全部闭环。
|
||||
|
||||
---
|
||||
|
||||
## 新发现 P0:AR-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 子 store(state/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` IPC(commands.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-19(action 字段 emit 但前端不消费,契约冗余)/ CR-20(stopDataChangedListener try/catch 过度防御,与 workflow.ts:108 不一致)。
|
||||
|
||||
---
|
||||
|
||||
## P0 汇总(仍未修)
|
||||
|
||||
| ID | 问题 | 状态 |
|
||||
|---|---|---|
|
||||
| B-260615-35 | broadcast Lagged 兜底仅 warn → 终态事件丢失前端永久卡死(后端 workflow.rs:90-110) | **未修**(第1轮发现,本轮确认仍在)|
|
||||
| AR-11 前端 | listener 永不 attach(App.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-11(todo:77)状态更新 / CR-11(todo:212)标 ✅ / 新增 CR-260615-18/19/20。
|
||||
70
docs/05-代码审查/定时走查-2026-06-15-第3轮.md
Normal file
70
docs/05-代码审查/定时走查-2026-06-15-第3轮.md
Normal 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 attach(dc27e79)✅
|
||||
- `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→create,update_*→update,delete_*/purge→delete,restore/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/20(f574562)✅
|
||||
- **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/catch(P3 轻量)|
|
||||
|
||||
**本轮价值**:确认前两轮走查发现被接收方完整修复(含 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 新增。
|
||||
89
docs/05-代码审查/定时走查-2026-06-15-第4轮.md
Normal file
89
docs/05-代码审查/定时走查-2026-06-15-第4轮.md
Normal 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-CN,loadAll 后回填,已知短暂态有注释。
|
||||
- **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 整页未接 i18n(13 处)是新页面 i18n 债。
|
||||
|
||||
**方法论**:换垂直切片角度(i18n 维度)有效突破前几轮按提交/改动的横切盲区,发现 40+ 处硬编码 — 印证 task2/3「功能/模块垂直走查」的价值(换角度有新发现)。
|
||||
|
||||
todo 映射:CR-260615-08 扩展(3→40+ 子项,标 P1-1 最高优先)+ CR-21 标 ✅。
|
||||
94
docs/05-代码审查/定时走查-2026-06-15-第5轮.md
Normal file
94
docs/05-代码审查/定时走查-2026-06-15-第5轮.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# 定时代码走查 — 第 5 轮(2026-06-15)
|
||||
|
||||
> 触发:定时走查 cron(每 30 分钟)。范围 = **api 层垂直切片**(9 文件,此前从未深查,IPC 契约边界)。无新提交(自第4轮起 src/ 干净)。
|
||||
> 方法:2 路后台代理(A:api invoke 契约层 / B:types 类型对齐层)+ 主代理地面核对 + **WebSearch 权威裁决**。
|
||||
> 性质:核对记录,不改产品代码(本会话 session-role-diagnose-only)。todo 待修项见 `docs/todo.md`。
|
||||
> 关联:[第1-4轮](./)。
|
||||
|
||||
---
|
||||
|
||||
## 🚨 核心发现:Tauri v2 camelCase 行为权威裁决(代理矛盾 → 纠正假阳性)
|
||||
|
||||
### 矛盾
|
||||
- **代理 A**:Tauri v2 **不转** camelCase,6 处 IPC 参数遗漏(ai_approve/ai_save_provider/knowledge_events/ai_set_concurrency_config/ai_set_provider/ai_pending_tool_calls)真 P0(B-34 同类)
|
||||
- **代理 B**:Tauri v2 **默认转** camelCase(宏生成别名),6 处全误判
|
||||
|
||||
### 权威裁决(WebSearch Tauri v2 官方文档 + StackOverflow)
|
||||
|
||||
> **Tauri v2 默认自动转换 snake_case(Rust)↔ camelCase(JavaScript)**。
|
||||
> 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 用 camelCase,workflow.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 struct(Idea/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` **错**,后端 TaskStatus(types.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 不直碰 invoke(workflow.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-22(types 注释/冗余 P3)+ CR-260615-23(B-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)
|
||||
73
docs/05-代码审查/定时走查-2026-06-15-第6轮.md
Normal file
73
docs/05-代码审查/定时走查-2026-06-15-第6轮.md
Normal 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**:refresh(Dashboard.vue:202-204)Promise.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 进度条 + 数字 stat,GPU 友好动画,**无性能问题**
|
||||
- aiShared 破环正确(ARC-06),nextMsgId 两窗口各自独立不冲突
|
||||
|
||||
---
|
||||
|
||||
## 📊 本轮摘要
|
||||
|
||||
| 类别 | 数 | 代表 |
|
||||
|---|---|---|
|
||||
| 价值闭环 | 1 | CR-22 ✅ + CR-23 撤销 |
|
||||
| P1 新发现 | 1 | 分离窗口 R1+R2 listener 双注册+泄漏(CR-24)|
|
||||
| P2 新发现 | 3 | 分离窗口状态机(CR-25)/ 列表页契约+空态(CR-26)/ Dashboard(CR-27)|
|
||||
| 亮点 | 4 | 列表页 i18n 100% / Dashboard 纯 CSS 无性能问题 / aiShared 破环 / useConfirm DRY |
|
||||
|
||||
**本轮价值**:**分离窗口是新功能,前几轮横切(按提交/改动)完全没覆盖**,垂直切片(Dashboard+AI窗口维度)首次深查即暴露 P1(listener 泄漏)+ 状态机缺口。**再次印证 task2/3 垂直走查价值** — 横切收敛后,垂直切片是新发现来源(i18n/api/列表页/AI窗口 4 个垂直切片均挖出真问题)。
|
||||
|
||||
**方法论**:分离窗口 P1(R1+R2)经地面核 stopListener 零调用坐实(避免第5轮代理 A 假阳性教训),走查发现须地面验证。
|
||||
|
||||
todo 映射:CR-260615-24(P1 分离窗口 listener)/ CR-25(P2 状态机)/ CR-26(P2 列表页)/ CR-27(P2 Dashboard)。
|
||||
81
docs/05-代码审查/定时走查-2026-06-15-第7轮.md
Normal file
81
docs/05-代码审查/定时走查-2026-06-15-第7轮.md
Normal 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 通道断(P1,CR-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 缺口:
|
||||
- AiCompleted(useAiEvents: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 落库,静默不持久化。当前无 bug(useSetting 多绑值类型,df-ai-ui 走 set 整对象替换),隐式契约。
|
||||
|
||||
---
|
||||
|
||||
## 📊 本轮摘要
|
||||
|
||||
| 类别 | 数 | 代表 |
|
||||
|---|---|---|
|
||||
| 价值闭环 | 3 | CR-24/26/27 全修(修复质量好)|
|
||||
| P1 新发现 | 1 | knowledge error 通道断(CR-28,CR-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 个垂直切片(stores),knowledge error 通道断是新发现维度(超越 i18n 的功能缺陷)。ai.ts 状态机完整是「走查验证修复」价值(非只找 bug)。
|
||||
|
||||
todo 映射:CR-260615-28(P1 knowledge error)/ CR-29(P2 messages+竞态)/ CR-30(P3 useSetting 边界)。
|
||||
64
docs/05-代码审查/定时走查-2026-06-15-第8轮.md
Normal file
64
docs/05-代码审查/定时走查-2026-06-15-第8轮.md
Normal 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 恢复 panelOpen(R3)+ resumeInDetached 核 ai_is_generating(R4)+ 删 switchConversation 自动 switch(R5)|
|
||||
| 40461b2 | CR-28 ✅ | knowledge create 内 loadCandidates 改非阻塞(不污染成功语义)+ Knowledge.vue error banner 消费 store.error(**通道接通**)|
|
||||
| b300bb7 | CR-30 ✅ | useSetting 值类型契约文档 + changed helper JSON 深比较 |
|
||||
|
||||
**CR-29(ai.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-29(ai.ts messages 无上限 + knowledge 竞态)/ CR-31(useConfirm/ToolCardList 健壮性)/ CR-08(i18n 硬编码 40+)/ CR-09/10(DRY .ai-md/renderedRef)/ CR-12(可选一组)。
|
||||
|
||||
---
|
||||
|
||||
## 💡 建议
|
||||
|
||||
前端走查已**充分覆盖**(8 轮 + 5 垂直切片,收尾无必修,接收方修复速度跟上发现速度)。建议:
|
||||
|
||||
1. **停止 cron**(前端边际收益递减)— 用户可 `/loop` 停止或让我 CronDelete
|
||||
2. **转 task2/3 后端 workflow 功能/模块垂直走查**(新维度:后端 src-tauri + 8 crate 全链路,此前前端走查未覆盖后端)
|
||||
|
||||
todo 映射:CR-260615-31(P2 收尾健壮性)。
|
||||
@@ -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 |
|
||||
|
||||
141
docs/05-代码审查/文档全量核对报告-2026-06-15.md
Normal file
141
docs/05-代码审查/文档全量核对报告-2026-06-15.md
Normal 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 模块文档列不存在的文件 + 已删 trait(A-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 项零入 todo(C-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 头号 P0(human_node.rs:41 缺 await)B-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→实际 false(B-260614-02);:138 try_recv_human_approval(已删);:155-156 set_waiting/set_skipped(已删,仅留 set_cancelled)。**建议**:4 处对齐。
|
||||
|
||||
### 10. df-storage V8→V13(B-A-4/C-4.1)
|
||||
:3,9,26-36,114,132 反复 V1-V8/MIGRATION_VERSION=8,实际 V1-V13(V9 ai_providers/V10 knowledges.reasoning+knowledge_events/V11 projects.deleted_at/V12 path+stack/V13 app_settings)。表数 11→18,Repo 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 仅 Shell(D-3.3)
|
||||
ARCHITECTURE:84/PROGRESS:29/df-nodes 文档描述 df-execute Shell/Docker/SSH/Git,实际仅 shell.rs+lib.rs(docker/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。**建议**:统一「原 13,2026-06-14 删 5 零引用,现 8」(ADR 加「已修正」标注保留决策史)。
|
||||
|
||||
### 14. INDEX 漏 9 文档 + 09-问题排查目录(A/D-2.3)— **本会话已补正**
|
||||
F-07 trait下沉/密钥迁移/工作流边界/条件引擎/generating状态机(02 区 5)/DAG引擎详解/AI对话引擎(03 区 2)/全局代码review(05 区 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 个 P0(AC3/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-V13(C-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「文档核对待修项」)。
|
||||
Reference in New Issue
Block a user