文档: todo销账(batch29 ARC-05/06+FR-D3+R-PD-10)+待审查登记+DOC整理
- todo: ARC-05越层核验0命中+四领域拆分/ARC-06破环aiShared/FR-D3三子项闭环销账+新增ARC-06b遗留
- 待审查: 登记CR-260616-02(batch29+R-PD-10代码 fc767e1)待审
- DOC-14: df-storage/SQLite-CRUD文档表数V13/V9→V15对齐migrations.rs schema_version=15
This commit is contained in:
@@ -11,14 +11,14 @@ DevFlow 使用 SQLite (rusqlite) 作为本地存储引擎。df-storage 负责 SQ
|
|||||||
## 当前状态
|
## 当前状态
|
||||||
|
|
||||||
- SQLite 连接管理: 已实现(`Arc<Mutex<Connection>>` 单连接,非连接池)
|
- SQLite 连接管理: 已实现(`Arc<Mutex<Connection>>` 单连接,非连接池)
|
||||||
- Schema 迁移 (V1-V9 累计 11 张表 + 9 索引): 已实现
|
- Schema 迁移 (V1-V15 累计 14 张表 + 12 索引): 已实现
|
||||||
- CRUD 层: 已实现(`impl_repo!` 宏 + 11 个 Repo + 向量检索)
|
- CRUD 层: 已实现(`impl_repo!` 宏 + 17 个 Repo + 向量检索)
|
||||||
|
|
||||||
## 设计要点
|
## 设计要点
|
||||||
|
|
||||||
### 已实施内容
|
### 已实施内容
|
||||||
|
|
||||||
1. **`impl_repo!` 宏 CRUD** — 一次性为各表生成 insert / get_by_id / list_all / query / update_field / update_full / delete(当前 11 个 Repo,非 trait 抽象)
|
1. **`impl_repo!` 宏 CRUD** — 一次性为各表生成 insert / get_by_id / list_all / query / update_field / update_full / delete(当前 17 个 Repo,非 trait 抽象)
|
||||||
2. **参数化查询** — `?1`/`?2` 占位符 + `params![]` 绑定,防止 SQL 注入
|
2. **参数化查询** — `?1`/`?2` 占位符 + `params![]` 绑定,防止 SQL 注入
|
||||||
3. **列名白名单校验** — `ALLOWED_COLUMNS` 校验 query / update_field 的动态列名
|
3. **列名白名单校验** — `ALLOWED_COLUMNS` 校验 query / update_field 的动态列名
|
||||||
4. **`update_full(record)`** — 整体更新全可变字段(保留 id 与 created_at)的原子写
|
4. **`update_full(record)`** — 整体更新全可变字段(保留 id 与 created_at)的原子写
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
## 概述
|
## 概述
|
||||||
|
|
||||||
df-storage 是 DevFlow 的数据持久化层,基于 SQLite (rusqlite),负责连接管理、Schema 迁移(V1-V13)和 CRUD 操作。绝大多数 Repo 由 `impl_repo!` 宏自动生成,KV 类表(`app_settings`)手写 Repo。
|
df-storage 是 DevFlow 的数据持久化层,基于 SQLite (rusqlite),负责连接管理、Schema 迁移(V1-V15)和 CRUD 操作。绝大多数 Repo 由 `impl_repo!` 宏自动生成,KV 类表(`app_settings`)手写 Repo。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -15,8 +15,8 @@ df-storage 是 DevFlow 的数据持久化层,基于 SQLite (rusqlite),负责
|
|||||||
| 功能 | 状态 |
|
| 功能 | 状态 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| SQLite 连接管理 | ✅ |
|
| SQLite 连接管理 | ✅ |
|
||||||
| Schema 迁移 V1-V13 | ✅ |
|
| Schema 迁移 V1-V15 | ✅ |
|
||||||
| impl_repo! 宏 CRUD(12 Repo) | ✅ |
|
| impl_repo! 宏 CRUD(17 Repo) | ✅ |
|
||||||
| KV 类手写 Repo(SettingsRepo) | ✅ |
|
| KV 类手写 Repo(SettingsRepo) | ✅ |
|
||||||
| KnowledgeRepo(含向量)| ✅ Sprint 15 |
|
| KnowledgeRepo(含向量)| ✅ Sprint 15 |
|
||||||
| KnowledgeEventsRepo(生命线审计)| ✅ |
|
| KnowledgeEventsRepo(生命线审计)| ✅ |
|
||||||
@@ -24,7 +24,7 @@ df-storage 是 DevFlow 的数据持久化层,基于 SQLite (rusqlite),负责
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 数据表(V1-V13 迁移历史)
|
## 数据表(V1-V15 迁移历史)
|
||||||
|
|
||||||
| 版本 | 新增/变更 |
|
| 版本 | 新增/变更 |
|
||||||
|------|-----------|
|
|------|-----------|
|
||||||
@@ -41,6 +41,8 @@ df-storage 是 DevFlow 的数据持久化层,基于 SQLite (rusqlite),负责
|
|||||||
| V11 | 幂等补列:projects.deleted_at(软删回收站)|
|
| V11 | 幂等补列:projects.deleted_at(软删回收站)|
|
||||||
| V12 | 幂等补列:projects.path / projects.stack(项目绑定真实代码目录 + 技术栈)|
|
| V12 | 幂等补列:projects.path / projects.stack(项目绑定真实代码目录 + 技术栈)|
|
||||||
| V13 | 新建 **app_settings** 表(通用应用设置 KV,前端 localStorage 迁移目标)|
|
| V13 | 新建 **app_settings** 表(通用应用设置 KV,前端 localStorage 迁移目标)|
|
||||||
|
| V14 | 幂等补列:tasks.deleted_at(软删回收站,对标 projects.deleted_at V11,D-260616-02 决策)|
|
||||||
|
| V15 | 幂等补列:tasks.review_rounds INTEGER NOT NULL DEFAULT 0(review 退回累计轮数,F-260616-04 任务推进链)|
|
||||||
|
|
||||||
> **当前共 13 张业务表**:ideas / projects / tasks / releases / workflow_executions / node_executions / branches / ai_conversations / ai_providers / ai_tool_executions / knowledges / knowledge_events / app_settings。另有一张内部表 `schema_version`(仅记录版本号,无业务语义)。
|
> **当前共 13 张业务表**:ideas / projects / tasks / releases / workflow_executions / node_executions / branches / ai_conversations / ai_providers / ai_tool_executions / knowledges / knowledge_events / app_settings。另有一张内部表 `schema_version`(仅记录版本号,无业务语义)。
|
||||||
|
|
||||||
@@ -125,7 +127,7 @@ fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 // 点积 / (‖a‖‖b‖
|
|||||||
|
|
||||||
## 迁移幂等设计
|
## 迁移幂等设计
|
||||||
|
|
||||||
迁移机制:`schema_version` 表记录已应用版本,`run()` 读出 `MAX(version)` 作 `current_version`,按 `current_version < N` 顺序应用 V1…V13(每版应用后 `INSERT` 对应版本号)。当前最新目标版本为 **13**。
|
迁移机制:`schema_version` 表记录已应用版本,`run()` 读出 `MAX(version)` 作 `current_version`,按 `current_version < N` 顺序应用 V1…V15(每版应用后 `INSERT` 对应版本号)。当前最新目标版本为 **15**。
|
||||||
|
|
||||||
> 注:早期版本曾用 `MIGRATION_VERSION` 常量,现已无此常量——版本号直接散落在各 `if current_version < N` 分支,由 `schema_version` 表动态跟踪。
|
> 注:早期版本曾用 `MIGRATION_VERSION` 常量,现已无此常量——版本号直接散落在各 `if current_version < N` 分支,由 `schema_version` 表动态跟踪。
|
||||||
|
|
||||||
@@ -134,7 +136,7 @@ fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 // 点积 / (‖a‖‖b‖
|
|||||||
关键列补建不依赖版本号,用 `PRAGMA table_info(<table>)` 探测实际 schema,缺列才 `ALTER TABLE ADD COLUMN`。
|
关键列补建不依赖版本号,用 `PRAGMA table_info(<table>)` 探测实际 schema,缺列才 `ALTER TABLE ADD COLUMN`。
|
||||||
|
|
||||||
- 对新库(列已由建表带入)、老库(DDL 正常生效)、坏库(版本号已写入但 DDL 漏生效)三种情况都安全幂等。
|
- 对新库(列已由建表带入)、老库(DDL 正常生效)、坏库(版本号已写入但 DDL 漏生效)三种情况都安全幂等。
|
||||||
- V4/V5/V6/V8/V10/V11/V12 均复用此模式(补列迁移)。
|
- V4/V5/V6/V8/V10/V11/V12/V14/V15 均复用此模式(补列迁移)。
|
||||||
- V9/V10/V13 用 `CREATE TABLE IF NOT EXISTS` 幂等建表(老库已有表则跳过)。
|
- V9/V10/V13 用 `CREATE TABLE IF NOT EXISTS` 幂等建表(老库已有表则跳过)。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -145,7 +147,7 @@ fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 // 点积 / (‖a‖‖b‖
|
|||||||
crates/df-storage/src/
|
crates/df-storage/src/
|
||||||
├── lib.rs — 模块入口,导出公共 API
|
├── lib.rs — 模块入口,导出公共 API
|
||||||
├── db.rs — SQLite 连接管理(Database struct)
|
├── db.rs — SQLite 连接管理(Database struct)
|
||||||
├── migrations.rs — V1-V13 迁移逻辑(schema_version 表跟踪版本)
|
├── migrations.rs — V1-V15 迁移逻辑(schema_version 表跟踪版本)
|
||||||
├── models.rs — 全部 *Record struct(含 KnowledgeRecord / KnowledgeEventRecord)
|
├── models.rs — 全部 *Record struct(含 KnowledgeRecord / KnowledgeEventRecord)
|
||||||
└── crud.rs — impl_repo! 宏 + 全部 Repo(含 KnowledgeRepo / KnowledgeEventsRepo / SettingsRepo)
|
└── crud.rs — impl_repo! 宏 + 全部 Repo(含 KnowledgeRepo / KnowledgeEventsRepo / SettingsRepo)
|
||||||
```
|
```
|
||||||
|
|||||||
27
docs/todo.md
27
docs/todo.md
@@ -194,7 +194,7 @@
|
|||||||
- [x] FR-C4 ~~MIGRATION_VERSION 死常量~~ ✅ 删(零代码引用,run() if 链自管版本)(commit cf18678)
|
- [x] FR-C4 ~~MIGRATION_VERSION 死常量~~ ✅ 删(零代码引用,run() if 链自管版本)(commit cf18678)
|
||||||
- [x] FR-C5 ~~AiConversationDetail 缺 readonly~~ ✅ 加 readonly?: boolean(commit cf18678)
|
- [x] FR-C5 ~~AiConversationDetail 缺 readonly~~ ✅ 加 readonly?: boolean(commit cf18678)
|
||||||
- [x] FR-D1/D2/D4/D5/R5 ✅ wave5/6 部分完成(4a95f6a/4b5f096):dag O(V+E) 建 adjacency 索引 / search_vector 显式 14 列 / replace_tool_result_content 反向 rposition / useConfirm 抽 4 视图 / 前端 findToolCall 反向遍历
|
- [x] FR-D1/D2/D4/D5/R5 ✅ wave5/6 部分完成(4a95f6a/4b5f096):dag O(V+E) 建 adjacency 索引 / search_vector 显式 14 列 / replace_tool_result_content 反向 rposition / useConfirm 抽 4 视图 / 前端 findToolCall 反向遍历
|
||||||
- [ ] FR-D3 / FR-P1~P6 剩余性能项(单连接 Mutex、migrations if 链、~~tool_registry truncate(50)+注释散落提常量~~ ✅第⑯批销账 06-15 抽 MAX_LIST_RESULTS 常量 4 处)— 见报告 §5-6
|
- [~] FR-P1~P6 剩余性能项 — ~~单连接 Mutex~~ ✅(batch29·2026-06-16 评估非瓶颈:Tauri 本地单用户+WAL 写本串行化,r2d2 池收益近零属过度优化,保持现状) + ~~migrations if 链~~ ✅(batch29·2026-06-16 if 链→step 数组循环,零行为变更,cargo test -p df-storage 11 集成+迁移路径全过) + ~~tool_registry truncate(50)+注释散落提常量~~ ✅第⑯批销账 06-15 抽 MAX_LIST_RESULTS 常量 4 处 — FR-D3 三子项全闭环,见报告 §5-6
|
||||||
- [x] FR-D6 ✅ ~~任务工具集不完整(缺 delete_task/update_task)~~(commit 36d68dd 补全):tool_registry.rs 现有 create_task(:241) + update_task(:265) + delete_task(:287,硬删对齐 commands::task::delete_task,注释「清理孤儿任务时务必用本工具,不要误用 delete_project」) + list_tasks(:140) 四工具齐全。
|
- [x] FR-D6 ✅ ~~任务工具集不完整(缺 delete_task/update_task)~~(commit 36d68dd 补全):tool_registry.rs 现有 create_task(:241) + update_task(:265) + delete_task(:287,硬删对齐 commands::task::delete_task,注释「清理孤儿任务时务必用本工具,不要误用 delete_project」) + list_tasks(:140) 四工具齐全。
|
||||||
- [x] FR-D7 ✅ wave4(36d68dd) 抽 `bind_dir_to_project(repo, id, path, stack_opt)`,create_project/bind_directory 共用,删原 :171 TODO;主代理核查补回 create_project 响应 stack 字段
|
- [x] FR-D7 ✅ wave4(36d68dd) 抽 `bind_dir_to_project(repo, id, path, stack_opt)`,create_project/bind_directory 共用,删原 :171 TODO;主代理核查补回 create_project 响应 stack 字段
|
||||||
- [x] FR-D8 ✅ wave4(36d68dd) create_idea schema 补 priority(可选 integer) + 魔法数字默认值注释(idea=1/task=2 与 IPC default_priority 对齐)
|
- [x] FR-D8 ✅ wave4(36d68dd) create_idea schema 补 priority(可选 integer) + 魔法数字默认值注释(idea=1/task=2 与 IPC default_priority 对齐)
|
||||||
@@ -230,8 +230,9 @@
|
|||||||
- [x] ARC-260615-04 ✅ wave(2026-06-16,待commit) — ~~`stores/index.ts` 补 `export useAiStore`~~ barrel 补导出(3 处 view 直连可选迁移,非强制)
|
- [x] ARC-260615-04 ✅ wave(2026-06-16,待commit) — ~~`stores/index.ts` 补 `export useAiStore`~~ barrel 补导出(3 处 view 直连可选迁移,非强制)
|
||||||
|
|
||||||
**中期(技术债)**
|
**中期(技术债)**
|
||||||
- [ ] ARC-260615-05 — `stores/project.ts` 上帝 store 拆分(四领域+越层 invoke:`approve_human_approval`/`cancel_workflow_node` 应沉 `api/workflow.ts`,全项目仅此 store 越层)
|
- [x] ✅(batch29·2026-06-16) ARC-260615-05 — ~~stores/project.ts 上帝 store 拆分(四领域+越层 invoke)~~ 核验越层 invoke 0 命中(已下沉 api/workflow.ts:approveHumanApproval:39/cancelHumanApproval:52 封装,stores/project/workflow.ts:78/101 调)+四领域拆分(god-store 拆分批已处理 stores/project/ 子 store barrel project.ts:122-123 委托)。vue-tsc exit 0
|
||||||
- [ ] ARC-260615-06 — `composables/ai/` 6 文件为拆而拆(events↔stream 循环依赖 useAiEvents.ts:18↔useAiStream.ts:12)— 合回 `stores/ai.ts` 或提 `aiShared.ts` 破环
|
- [x] ✅(batch29·2026-06-16) ARC-260615-06 — ~~events↔stream 循环依赖~~ 提 aiShared.ts 下沉 nextMsgId/_msgCounter 纯函数,useAiStream 不再 import useAiEvents(仅 5 处注释),useAiEvents→useAiStream→aiShared 单向 DAG。vue-tsc exit 0
|
||||||
|
- [ ] ARC-260615-06b [P3] — useAiEvents↔useAiSend 另一环(useAiEvents:19 import useAiSend/useAiSend:23 import useAiEvents),靠事件总线 ai-approval-clear-timers 部分缓解,非本批范围。遗留自 ARC-06 核验
|
||||||
- [ ] ARC-260615-07 — 其余见文档:df-core 改名 df-types(类型库非核心)/ src-tauri IPC 编排层抽取(df-app,5711 行成事实业务层) / AI agent loop 从 IPC 下沉 df-ai / 3 view 绕 store 调 api / 类型契约 ts-rs 代码生成 / AiSession 多会话(B 路线前置) / AppState 分组 / IPC 命名统一
|
- [ ] ARC-260615-07 — 其余见文档:df-core 改名 df-types(类型库非核心)/ src-tauri IPC 编排层抽取(df-app,5711 行成事实业务层) / AI agent loop 从 IPC 下沉 df-ai / 3 view 绕 store 调 api / 类型契约 ts-rs 代码生成 / AiSession 多会话(B 路线前置) / AppState 分组 / IPC 命名统一
|
||||||
|
|
||||||
**渲染优化(自研块级 memo 已实施,2026-06-16)**
|
**渲染优化(自研块级 memo 已实施,2026-06-16)**
|
||||||
@@ -240,7 +241,7 @@
|
|||||||
### 🔵 全局代码 review 待修项(2026-06-16)
|
### 🔵 全局代码 review 待修项(2026-06-16)
|
||||||
|
|
||||||
> 7 维度并行深入扫(DRY/架构/潜在bug/简洁性/安全/AI可靠/工作流引擎),详见 [全局代码review-2026-06-15.md](./05-代码审查/全局代码review-2026-06-15.md)。
|
> 7 维度并行深入扫(DRY/架构/潜在bug/简洁性/安全/AI可靠/工作流引擎),详见 [全局代码review-2026-06-15.md](./05-代码审查/全局代码review-2026-06-15.md)。
|
||||||
> **P1 可执行 6 + P2 可执行 13 已全闭环**(批1/2/3 主代理独立核查 cargo workspace exit 0 + 5 crate test 共 126 passed)。下为**需设计**待立项项(R-PD-3 条件引擎去重 T-260614-11)。
|
> **P1 可执行 6 项 (R-P1-1~6) + P2 可执行 13 项 (R-P2-1~13) 已全闭环**(批1/2/3 主代理独立核查 cargo workspace exit 0 + 5 crate test 共 126 passed)。闭环明细见全局review-2026-06-15.md §推进状态(批1=4 项 R-P1-2/3/5/6 + 批2=2 项 R-P1-1/4 + 批3=13 项 R-P2-1~13 四域 A/B/C/D)。下为**需设计**待立项项(R-PD-3 条件引擎去重 T-260614-11)。
|
||||||
|
|
||||||
**P1 需设计(进设计文档)**
|
**P1 需设计(进设计文档)**
|
||||||
- [x] R-PD-1 ✅(批2,2026-06-16) — **[P1 security]** 编辑 provider 空 api_key 默默清 DB 明文致密钥永久丢失(未迁移态 keyring 空 + DB 非空时改 name/base_url 触发)— `commands.rs` ai_save_provider:329-355 + crud.rs INSERT OR REPLACE 全字段覆盖 — 修法:空 api_key 时确认 keyring 有/DB 有再清,keyring 无且 DB 非空先即时迁移补密钥 — source:全局review §P1需设计
|
- [x] R-PD-1 ✅(批2,2026-06-16) — **[P1 security]** 编辑 provider 空 api_key 默默清 DB 明文致密钥永久丢失(未迁移态 keyring 空 + DB 非空时改 name/base_url 触发)— `commands.rs` ai_save_provider:329-355 + crud.rs INSERT OR REPLACE 全字段覆盖 — 修法:空 api_key 时确认 keyring 有/DB 有再清,keyring 无且 DB 非空先即时迁移补密钥 — source:全局review §P1需设计
|
||||||
@@ -253,7 +254,7 @@
|
|||||||
- [x] R-PD-7 ~~LlmProvider trait 抽象缺口:name() 语义错位 + supported_features/ProviderFeatures 死代码~~ ✅ 已修(删 ProviderFeatures + supported_features trait 方法 + 两 provider impl;补 endpoint() 默认方法供 401/网络错误诊断,两 provider override 返真实端点;name() 语义错位单独立项不改)
|
- [x] R-PD-7 ~~LlmProvider trait 抽象缺口:name() 语义错位 + supported_features/ProviderFeatures 死代码~~ ✅ 已修(删 ProviderFeatures + supported_features trait 方法 + 两 provider impl;补 endpoint() 默认方法供 401/网络错误诊断,两 provider override 返真实端点;name() 语义错位单独立项不改)
|
||||||
- [x] R-PD-8 — AiProviderRecord 整条穿透 IPC 边界(DB schema 演进直接破坏前端契约,models 字段 provider 返串/conversation 返数组不一致)— `commands.rs`:282-295 定义 ProviderDto/ConversationSummary 映射层(对抗分析否决 2026-06-16, 见 :537, 5个IPC手动对齐可接受)
|
- [x] R-PD-8 — AiProviderRecord 整条穿透 IPC 边界(DB schema 演进直接破坏前端契约,models 字段 provider 返串/conversation 返数组不一致)— `commands.rs`:282-295 定义 ProviderDto/ConversationSummary 映射层(对抗分析否决 2026-06-16, 见 :537, 5个IPC手动对齐可接受)
|
||||||
- [x] R-PD-9 ✅ display_hint (第⑩批 2026-06-16) — ~~命令层臃肿~~ audit 工具名→文案映射作 display_hint 注册进 AiToolRegistry(消除双份);agentic loop 下沉 df-ai 较大进 todo — agentic loop/tool_registry 717 行/audit reason 映射堆 commands/ai,无法被 df-nodes/AiNode 复用
|
- [x] R-PD-9 ✅ display_hint (第⑩批 2026-06-16) — ~~命令层臃肿~~ audit 工具名→文案映射作 display_hint 注册进 AiToolRegistry(消除双份);agentic loop 下沉 df-ai 较大进 todo — agentic loop/tool_registry 717 行/audit reason 映射堆 commands/ai,无法被 df-nodes/AiNode 复用
|
||||||
- [ ] R-PD-10 — .map_err(\|e\| e.to_string()) 10 文件 85 处复制(强类型 Error 拍平成自由文本,分类信息丢弃)— 全 commands/ 加 err_str helper 统一日志点
|
- [x] ✅(主代理·2026-06-16) R-PD-10 — crud.rs 110 处 `.map_err(|e| Error::Storage(e.to_string()))` 统一 df-storage 局部 `storage_err` helper(原 todo「85处 e.to_string」过时,实际 crud.rs 110 处 Error::Storage 包装;commands 层 err_str 早已有 mod.rs:23)。cargo check -p df-storage exit 0
|
||||||
- [x] R-PD-11 ✅ wave(2026-06-16,待commit) — ~~目录防重复绑定逻辑两处重复~~ 抽 `ProjectRepo::find_path_conflict`(`df-storage/crud.rs:575`,接收已规范化 target+exclude_id,内含 list_active+排除+规范化比较);两处 use 替换:`project.rs::find_binding_conflict` 委托(去 inline find)+`tool_registry.rs::bind_dir_to_project` 委托(去 for 循环);路径规范化复用 `df_project::scan::normalize_path`(df-storage 不依赖 df-project,故本 crate 镜像同算法 `normalize_stored_path` 比较存库路径,已注明须同步)
|
- [x] R-PD-11 ✅ wave(2026-06-16,待commit) — ~~目录防重复绑定逻辑两处重复~~ 抽 `ProjectRepo::find_path_conflict`(`df-storage/crud.rs:575`,接收已规范化 target+exclude_id,内含 list_active+排除+规范化比较);两处 use 替换:`project.rs::find_binding_conflict` 委托(去 inline find)+`tool_registry.rs::bind_dir_to_project` 委托(去 for 循环);路径规范化复用 `df_project::scan::normalize_path`(df-storage 不依赖 df-project,故本 crate 镜像同算法 `normalize_stored_path` 比较存库路径,已注明须同步)
|
||||||
- [x] R-PD-12 ✅ 假能力删 (第⑩批 2026-06-16) — ~~run_workflow AI 工具 no-op 桩~~ 删假能力(prompt/audit/ToolCard 当真实能力宣传,LLM 调用走审批拿空结果,体验断裂) — `tool_registry.rs`:383-390 + `prompt.rs`:57 + `audit.rs`:120-123 + ToolCard.vue:367 (与 R-PD-2 协同)
|
- [x] R-PD-12 ✅ 假能力删 (第⑩批 2026-06-16) — ~~run_workflow AI 工具 no-op 桩~~ 删假能力(prompt/audit/ToolCard 当真实能力宣传,LLM 调用走审批拿空结果,体验断裂) — `tool_registry.rs`:383-390 + `prompt.rs`:57 + `audit.rs`:120-123 + ToolCard.vue:367 (与 R-PD-2 协同)
|
||||||
- [x] R-PD-13 ✅(P0批,2026-06-16,待commit) — ~~Lagged 静默丢事件~~ 最小兜底:单行 warn 升级带 execution_id+lagged 字段结构化 warn+注释(broadcast 不暴露被丢事件类型/关键终态事件丢失致 finished 不触发循环不 break 前端永久收不到结束/依赖 DB 轮询兜底)+三后续方向(提升广播容量/持久化队列重发/forward watchdog 超时);重发复杂度超本 todo 范围 — workflow.rs
|
- [x] R-PD-13 ✅(P0批,2026-06-16,待commit) — ~~Lagged 静默丢事件~~ 最小兜底:单行 warn 升级带 execution_id+lagged 字段结构化 warn+注释(broadcast 不暴露被丢事件类型/关键终态事件丢失致 finished 不触发循环不 break 前端永久收不到结束/依赖 DB 轮询兜底)+三后续方向(提升广播容量/持久化队列重发/forward watchdog 超时);重发复杂度超本 todo 范围 — workflow.rs
|
||||||
@@ -303,10 +304,16 @@
|
|||||||
- [x] DOC-260615-04 ✅ 文档P0重写 (第⑩批 2026-06-16) — ~~使用手册全面重写 7 处~~ (运行命令 bun→npm / 任务状态 4→7 态 / 优先级方向 / 节点类型 Script/Ai/Human / EventBus 非 WebSocket / 多 Provider / 知识库 Tier1)— 08-用户指南/使用手册 — 详见 §4
|
- [x] DOC-260615-04 ✅ 文档P0重写 (第⑩批 2026-06-16) — ~~使用手册全面重写 7 处~~ (运行命令 bun→npm / 任务状态 4→7 态 / 优先级方向 / 节点类型 Script/Ai/Human / EventBus 非 WebSocket / 多 Provider / 知识库 Tier1)— 08-用户指南/使用手册 — 详见 §4
|
||||||
|
|
||||||
**P1 — 审查状态断层**
|
**P1 — 审查状态断层**
|
||||||
- [ ] DOC-260615-05 — todo 补全局 review R-P1-1~6/R-P2-1~13 已完成回写(报告说全闭环 126 test pass,todo 零条目)— 已完成区补汇总 — 详见 §5
|
- [x] DOC-260615-05 ✅(2026-06-16) — ~~todo 补全局 review R-P1-1~6/R-P2-1~13 已完成回写~~ 在全局代码 review 待修项区头部补「R-P1 6 项 + R-P2 13 项全闭环(126 test pass)」汇总指针(指向全局review-2026-06-15.md 推进状态三批),原 todo 只有 R-PD-1~14 需设计项无 R-P1/R-P2 执行项追踪,现补齐。报告说全闭环但 todo 零条目,已完成区补汇总指针 — 详见 §5 + 全局review-2026-06-15.md §推进状态
|
||||||
- [ ] DOC-260615-06 — 架构复核报告 §5 新发现 11 项补 todo(复核-新①③④⑪ 待补:pendingToolCalls 二次 token / NodeCancelled 事件语义 / cancel 终态守卫 / 主窗口幽灵 watchdog;余已被全局 review 取代)— 详见 §6
|
- [x] DOC-260615-06 ✅(2026-06-16) — ~~架构复核报告 §5 新发现 11 项补 todo~~ 拆 4 子项独立 todo(见下方),核对发现 **复核-新① 已解决**(`useAiConversations.ts:122` 已有 pendingToolCalls await 后二次 token 比对),只补 ③④⑪ 三项;其余 7 项已被全局 review 取代(R-PD 系列) — 详见 §6
|
||||||
|
- [ ] 复核-新③ [P2] — **NodeCancelled 事件语义双标**。`executor.rs:149` 取消节点(set_cancelled 后 Err 路径)状态保 Cancelled(:145 跳 set_failed),但事件总线仍 emit `NodeFailed { error: "人工审批被取消" }`。前端若按 NodeFailed 分支判断会误归类「失败」非「取消」。修法:加 `NodeCancelled` variant 或 NodeFailed 加 `cancelled: bool` 字段。— 来源:架构复核报告 §5 新③,crates/df-workflow/src/executor.rs:145-153 + df-core/events.rs
|
||||||
|
- [ ] 复核-新④ [P2] — **cancel_workflow_node 无节点终态前置校验**。`workflow.rs:352` 仅校验 execution_id 在注册表,不校验 node_id 状态。对已 Completed/Failed/Cancelled 节点调 set_cancelled 会静默覆盖终态(set_cancelled 绕 is_legal)。修法:加 `match sm.get(&node_id) { Running|Waiting => {}, _ => Err }` 守卫。— 来源:架构复核报告 §5 新④,src-tauri/src/commands/workflow.rs:341-358
|
||||||
|
- [ ] 复核-新⑪ [P2] — **主窗口看门狗幽灵**:detach 时主窗口 `state.streaming`/`state.generatingConvId` 未清(`useAiWindow.ts:20-59` detachPanel 仅快照写 localStorage 不清主窗口 state),看门狗续计 130s 后往主窗口 state 补幽灵错误消息。用户已切走无实际危害,仅主窗口面板重开时看到一条幽灵错误。修法:detach 时显式清主窗口 streaming/generatingConvId 或暂停主窗口看门狗(detach 前提下主窗口不应跑生成态看门狗)。— 来源:架构复核报告 §5 新⑪,src/composables/ai/useAiWindow.ts:20-59 + useAiEvents.ts:115 watchdog
|
||||||
- [x] DOC-260615-07 ✅(第⑲批 2026-06-16) — ~~aichat §8 表补勾~~ aichat审查报告第八章 AR-1~11 优先级表逐行补状态勾注(AR-1退役✅/AR-2~7,9~11已修✅+commit/AR-8重评🔄)+文档头二次增补行;零新增条目对齐 DOC-13 瘦身方向;状态不一致 2 项(AR-1退役/AR-8重评)按 todo 标注非矛盾 — 详见 §7
|
- [x] DOC-260615-07 ✅(第⑲批 2026-06-16) — ~~aichat §8 表补勾~~ aichat审查报告第八章 AR-1~11 优先级表逐行补状态勾注(AR-1退役✅/AR-2~7,9~11已修✅+commit/AR-8重评🔄)+文档头二次增补行;零新增条目对齐 DOC-13 瘦身方向;状态不一致 2 项(AR-1退役/AR-8重评)按 todo 标注非矛盾 — 详见 §7
|
||||||
- [ ] DOC-260615-08 — 近期改动 CR-03 未做子项拆独立 todo(audit.rs 三臂 / openai Error::from / ToolCard projectNameById find)— 详见 §8
|
- [x] DOC-260615-08 ✅(2026-06-16) — ~~近期改动 CR-03 未做子项拆独立 todo~~ 拆 3 子项独立 todo(见下方)。原 CR-03(line 212)内联备注「未做留 todo」未独立追踪,现拆。— 详见 §8
|
||||||
|
- [ ] CR-260615-03-a [P2] — **audit.rs Err 误报「项目已不存在」**。`audit.rs:52` `resolve_project_label` 用 `_` 合并 `Err`(DB 故障/锁/连接断)与 `Ok(None)`(真不存在),DB 出错时用户看到误导性「项目已不存在」而非错误。修法:分三臂 `Ok(Some)`/`Ok(None)`/`Err`(Err 打 warn 日志回退裸 id)。零行为破坏(仅 Err 分支加日志+改文案)。— 来源:近期改动审查 §2②,src-tauri/src/commands/ai/audit.rs:50-52
|
||||||
|
- [ ] CR-260615-03-b [P2] — **openai_compat `anyhow::anyhow!(e)` 丢 source 链**。`openai_compat.rs:414` 非超时分支用 `anyhow!(e)` 把 reqwest::Error 整体塞进 message,丢失 `#[source]` 因果链(`?` 本会保留)。修法:改 `anyhow::Error::from(e)` 保留 source。零行为破坏(仅错误追溯链增强)。— 来源:近期改动审查 §2③,crates/df-ai/src/openai_compat.rs:414
|
||||||
|
- [ ] CR-260615-03-c [P2] — **ToolCard projectNameById computed 过度结构化**。`ToolCard.vue:390` computed 每次重建全量项目(含回收站)的 Map,审批卡通常仅 1-2 行用项目 id。修法:改 `projectStore.projects.find(p=>p.id===id)?.name ?? projectStore.deletedProjects.find(...)?.name`(审批场景项目数有限,find 提前退出,响应式仍由 store 数组保证)。零行为破坏。— 来源:近期改动审查 §2⑧,src/components/ToolCard.vue:390,417,441
|
||||||
|
|
||||||
**P1 — 架构/模块文档过期**
|
**P1 — 架构/模块文档过期**
|
||||||
- [x] DOC-260615-09 ✅(第⑮批核对 06-15) — df-workflow 模块文档 4 处过期 **0 处需改(历史已修)**(NodeRegistry 删 Default / conditions 默认 true→false / try_recv_human_approval 已删 / set_waiting·set_skipped 已删)— 详见 §9
|
- [x] DOC-260615-09 ✅(第⑮批核对 06-15) — df-workflow 模块文档 4 处过期 **0 处需改(历史已修)**(NodeRegistry 删 Default / conditions 默认 true→false / try_recv_human_approval 已删 / set_waiting·set_skipped 已删)— 详见 §9
|
||||||
@@ -317,10 +324,10 @@
|
|||||||
|
|
||||||
**P2 — 迭代/Phase/规范**
|
**P2 — 迭代/Phase/规范**
|
||||||
- [x] DOC-260615-12 ✅(第⑱批销账 06-15) — DEVFLOW-1~4 + Phase1/Phase2 标完成归档(DEVFLOW-2/3/4 正文 checkbox 补勾对齐头部✅;Phase1清单#1-#11全✅+计数67修正;Phase2各小节补「实际状态」2.1/2.2✅ 2.3启发式✅LLM❌ 2.4仅并行✅,task行保留原文+核对风格不强勾)(Phase1 已收尾文档仍全待实施)— 详见 §17-19
|
- [x] DOC-260615-12 ✅(第⑱批销账 06-15) — DEVFLOW-1~4 + Phase1/Phase2 标完成归档(DEVFLOW-2/3/4 正文 checkbox 补勾对齐头部✅;Phase1清单#1-#11全✅+计数67修正;Phase2各小节补「实际状态」2.1/2.2✅ 2.3启发式✅LLM❌ 2.4仅并行✅,task行保留原文+核对风格不强勾)(Phase1 已收尾文档仍全待实施)— 详见 §17-19
|
||||||
- [ ] DOC-260615-13 — todo 肥大瘦身(大段详情移 docs 子目录)+ 重复收口(HumanNode 审批/密钥迁移/FR-S1)+ 文档记录规范在 INDEX 突出 — 详见 §20-22
|
- [~] DOC-260615-13 ◐(2026-06-16 评估·部分做) — ~~todo 肥大瘦身(大段详情移 docs 子目录)~~ **评估结论**:todo 主要「肥大」是单行长条目(超 1000 字符/条,F-260616-01=1506/AE-2025-04=1667/B-260615-08=1526/AR-11=1428 等),非多行详情块;单行长条目多已通过「详案见 docs/子目录/xx.md」+ plan 文件指针(quizzical-prancing-hennessy.md 等)外部化,详情已在子文档,inline 摘要保留助读。**本次未强行瘦身**(强行拆单行条目易碎+破坏 grep/锚点),仅评估标注。**已做收口**:①重复项 HumanNode 审批(B-03b/CR-03/复核-新③)各保留各自语义无纯重复 ②密钥迁移(FR-S1/CR-01/R-PD-1)三处分工:FR-S1=明文根治/CR-01=删除闭环/R-PD-1=编辑路径迁移,非重复。**遗留**:若未来单行长条目继续膨胀,可立专项把已完成项(AR-11/FR-R1 等)的详细勘察段移 docs/05-代码审查/ 历史归档,inline 只留一句结论 + commit。文档记录规范在 INDEX 突出 → 归 DOC-14 改造指南重写时一并 — 详见 §20-22
|
||||||
|
|
||||||
**P3 — 技术/工具文档**
|
**P3 — 技术/工具文档**
|
||||||
- [ ] DOC-260615-14 — Tauri-IPC/View 改造指南全篇过时重写或归档 + SQLite 表数 V1-V9→V1-V13 + 锚点顿号 — 详见 §23-26
|
- [~] DOC-260615-14 ◐(2026-06-16 评估·部分做) — ~~Tauri-IPC/View 改造指南全篇过时重写或归档 + SQLite 表数 V1-V9→V1-V13 + 锚点顿号~~ **核对结论**:①Tauri-IPC 模式(`01-技术文档/Tauri-IPC模式-2026-06-12.md`)顶部已加归档 banner(2026-06-15,指向 ARCHITECTURE.md §三),✅ 已归档不需重写;②View 改造指南(`06-前端开发/View改造指南-2026-06-12.md`)顶部已加归档 banner(2026-06-15,指向 DEVFLOW-3.Store对接实施),✅ 已归档;③SQLite 表数 **已改**:df-storage 模块文档 V1-V13→V1-V15(补 V14/V15 迁移行 + 头部/状态表/迁移机制行/文件树注释 6 处)+SQLite-CRUD 模式文档 V1-V9→V1-V15(11→14 表/9→12 索引/11→17 Repo 3 处),核对真实 migrations.rs schema_version 最大值=15;④锚点顿号(INDEX:107-109 `#四crate-结构` 渲染器差异)低危遗留不强行做。**遗留**:锚点顿号 + 路径风格统一(功能创意池:150 链接省 `./`),低危,未来 INDEX/创意池重整时一并 — 详见 §23-26
|
||||||
|
|
||||||
### 🟡 B-03b 复核后续(独立深度复核,2026-06-14)
|
### 🟡 B-03b 复核后续(独立深度复核,2026-06-14)
|
||||||
|
|
||||||
|
|||||||
36
docs/待审查.md
36
docs/待审查.md
@@ -23,23 +23,39 @@
|
|||||||
|
|
||||||
## 当前队列
|
## 当前队列
|
||||||
|
|
||||||
### CR-260616-01-fixes 审查待修项修复批次 — 🟡 待审(低优先,主代理已核查)
|
### CR-260616-02 batch29+R-PD-10 代码改动批次 — 🟡 待审
|
||||||
|
|
||||||
- **状态**: 🟡 待审(低优先 — 小修+主代理已独立核查双绿,独立审查 agent 可选核)
|
- **commit**: `fc767e1` 优化: R-PD-10 storage_err DRY统一 + FR-D3 migrations if链转数组循环
|
||||||
- **来源**: CR-260616-01 审查待修项①类7项(cr01-fixes workflow `wu4r8ejcp`)
|
- **状态**: 🟡 待审(中优 — DRY 重构 + 迁移逻辑改,主代理已独立核查)
|
||||||
- **改动文件**:
|
- **改动文件**:
|
||||||
- `src/views/TaskDetail.vue`(.status-testing/.status-blocked CSS + advancing 接文案)
|
- `crates/df-storage/src/crud.rs`(R-PD-10: 110 处 `.map_err(|e| Error::Storage(e.to_string()))` 统一 `storage_err` helper)
|
||||||
- `crates/df-storage/src/crud.rs`(CAS SQL 加 `AND deleted_at IS NULL` 两分支 + 白名单注释)
|
- `crates/df-storage/src/migrations.rs`(FR-D3: run() 15 个 `if current_version<N` 块改 `[(i32, fn); 15]` step 数组循环,零行为变更)
|
||||||
- `crates/df-nodes/src/task_advance_node.rs`(ALL_STATES.join DRY + 测试改名)
|
- **主代理核查**: cargo check -p df-storage exit 0 + cargo test -p df-storage 11 集成全过(含 open_in_memory→run 全量迁移路径)+ git diff 边界合规(2 文件符合 df-storage 域)
|
||||||
- `src-tauri/src/state.rs`(build_registry 补 TaskAdvanceNode 未注册注释)
|
- **审查关注点**: ①R-PD-10 helper 泛型 `E: ToString` 全 110 处类型兼容 ②FR-D3 step 数组循环行为等价(同 current_version 同序执行同 migrate_vN)③迁移数据安全(PRAGMA 幂等探测 + schema_version INSERT 保留)
|
||||||
- **主代理核查**: cargo check --workspace exit 0(仅 pre-existing warning)+ vue-tsc exit 0 + git diff 边界合规(4 文件符合 agent 领地)
|
- **范围外**: ARC-05/06 验证性无代码改动(此前批次已闭环,本次仅核验)+ DOC 文档(V13→V15 表数对齐,低审)
|
||||||
- **审查关注点**:①CR-01-B CAS 补 deleted_at 语义正确性(回收站任务必败)②CR-01-A CSS 配色跨视图一致 ③CR-01-C DRY 无运行时文案变更
|
|
||||||
- **未做**: CR-01-D(错误枚举区分)/CR-01-G(i18n 分级)②类留 todo
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 已审归档
|
## 已审归档
|
||||||
|
|
||||||
|
### CR-260616-01-fixes 审查待修项修复批次 — ✅ 已审(PASS)
|
||||||
|
|
||||||
|
- **commit**: `4dc5219` 修复: CR-01审查待修项①类7项(CSS补 testing/blocked 徽章 + CAS防回收站推进 + DRY + 注释 + 测试改名 + advancing 接文案)
|
||||||
|
- **审查时间**: 2026-06-16(独立审查 agent · 防"主代理已核查双绿"代入,亲核源码)
|
||||||
|
- **总体结论**: ✅ **PASS** — 🔴0 🟡0 ⚪2(范围外观察项)
|
||||||
|
- **独立核验**(不信主代理核查声明,grep/read 亲验 7 项①类修复):
|
||||||
|
- ① **CR-01-B CAS deleted_at 语义** ✅ — `soft_delete`(crud.rs:800)设 `deleted_at` 非空;`advance_status_atomic` 两分支(bump_rounds + 普通,crud.rs:855/859)均加 `AND deleted_at IS NULL`,回收站任务 `affected=0 → None` 必败。D-02 软删收口正确,一处关闭。
|
||||||
|
- ② **CR-01-A CSS 配色跨视图一致** ✅ — TaskDetail.vue:344-345 与 Tasks.vue:413-414 **逐字镜像**(testing 橙 `#ff9800` / blocked 红danger 0.5px 边框),跨视图统一。
|
||||||
|
- ③ **CR-01-C DRY 文案零变更** ✅ — `ALL_STATES`(task_state_machine.rs:48-56)= `["todo","in_progress","in_review","testing","done","blocked","cancelled"]`,`join("/")` = 原硬编码串,顺序与值全等,无运行时文案变化。
|
||||||
|
- **CR-01-H 测试改名** ✅ — `cas_returns_none_when_status_mismatch`(task_advance_node.rs:313)真存在,改名后注释指向正确的 CAS 失败测试。
|
||||||
|
- **CR-01-I advancing i18n** ✅ — zh/en 均有(taskDetail.ts:38 `推进中.../Advancing...`),TaskDetail.vue:63 接 advancing 态。
|
||||||
|
- **CR-01-F 白名单注释** ✅ — `allowed_columns_for("tasks")`(crud.rs:331)数组无 `review_rounds` + 注释说明专用路径(仅 advance_status_atomic),收口防误补。
|
||||||
|
- **CR-01-E state.rs 注释** ✅ — build_registry(state.rs:240)注释准确,说明 TaskAdvanceNode 未注册原因(阶段2 DAG 联动时加)。
|
||||||
|
- **范围外(记录不审,非本批缺陷)**:
|
||||||
|
- ⚪ **工作区 crud.rs 226行未提交** = `R-PD-10` `storage_err` DRY 重构(提取包装函数替换散落 `.map_err(|e| Error::Storage(e.to_string()))`),非 4dc5219 范围,独立审查留待其 commit。
|
||||||
|
- ⚪ **`status-abandoned` CSS class ↔ `cancelled` 后端态** = 历史命名别名(`constants/project.ts:83` `cancelled: 'status-abandoned'` 映射闭环,功能正确),非本批引入。命名语义瑕疵(abandoned 弃用 ≠ cancelled 取消),low,可选优化。
|
||||||
|
- **待修项回流 todo**: **无**(7 项全过,无新缺陷)。
|
||||||
|
|
||||||
### CR-260616-01 任务推进链(batch28) — ✅ 已审
|
### CR-260616-01 任务推进链(batch28) — ✅ 已审
|
||||||
|
|
||||||
- **commit**: `d2cb38c` 新增: 任务推进链(7态状态机+advance_task CAS原子写)+软删除+前后端7态对齐
|
- **commit**: `d2cb38c` 新增: 任务推进链(7态状态机+advance_task CAS原子写)+软删除+前后端7态对齐
|
||||||
|
|||||||
Reference in New Issue
Block a user