修复: DOC-09+10 df-workflow/df-storage 模块文档过期修正

- DOC-09 df-workflow 4 处:NodeRegistry 删 Default impl(无 panic 铁律)+conditions 默认 true→false(B-260614-02)+try_recv_human_approval 已删+set_waiting/set_skipped 已删(仅 set_cancelled 唯一旁路)+set_* 签名 &mut→&self。
- DOC-10 df-storage:V8→V13 + 表数 13 业务表(+schema_version)+Repo 13(12 impl_repo!+1 手写 SettingsRepo)+MIGRATION_VERSION 常量已删(版本靠 schema_version 表)+迁移表补 V9-V13+knowledges DDL 补 reasoning 列。
主代理抽查:过期项仅历史说明残留。批4
This commit is contained in:
2026-06-15 05:40:37 +08:00
parent 9bf9e12058
commit 0e196ee86f
2 changed files with 61 additions and 44 deletions

View File

@@ -1,6 +1,6 @@
# df-workflow 工作流引擎
> 创建: 2026-06-10 | 状态: 初稿 | 最后更新: 2026-06-14
> 创建: 2026-06-10 | 状态: 初稿 | 最后更新: 2026-06-15
---
@@ -19,7 +19,7 @@ df-workflow 是 DevFlow 的核心引擎,负责 DAG 定义、拓扑排序、节
| Node trait 定义 | ✅ 已实现 |
| 状态机 (WorkflowRunStatus) | ✅ 已实现 |
| EventBus (broadcast) | ✅ 已实现 |
| 条件表达式引擎 | ⚡ 仅支持 true/false |
| 条件表达式引擎 | ⚡ 仅支持 true/false(未识别默认 **false** 保守拒绝) |
| 断点续跑 | ⬜ 待实施(引擎整体无暂停/恢复/快照机制,缺乏底层基础设施支撑) |
## 核心设计
@@ -78,7 +78,7 @@ pub trait Node: Send + Sync {
| `is_registered` | `(&self, type_name: &str) -> bool` | 检查类型是否已注册 |
| `registered_types` | `(&self) -> Vec<&str>` | 列出所有已注册类型名 |
> `Default` 实现仅注册占位 `script` 工厂(`unimplemented!`实际 `ScriptNode` 由 `df-nodes` crate 注册。
> **不实现 `Default`**:原 `Default` 注册了一个会 panic 的 `script` 工厂(`unimplemented!`违反项目铁律「无 panic——所有占位代码返回空/默认值」,已删除。所有调用方应显式 `new()` + 手动 `register` 真实节点(如 `state.rs::build_registry` 的做法),实际 `ScriptNode`/`AiNode`/`HumanNode` 由 `df-nodes` crate 注册。
### DAG 执行流程
@@ -135,10 +135,9 @@ pub trait Node: Send + Sync {
| `send` | `(&self, WorkflowEvent) -> ()` | 广播事件(忽略接收者已关闭错误,异步) |
| `subscribe` | `(&self) -> broadcast::Receiver<WorkflowEvent>` | 订阅事件流 |
| `emit_human_approval_request` | `(&self, WorkflowEvent) -> Result<usize, SendError>` | 发送人工审批请求(返回接收者计数) |
| `try_recv_human_approval` | `(&self, execution_id, node_id) -> Option<HumanApprovalResponse>` | **TODO 占位**:当前恒返回 `None`,审批响应存储/检索未实现,需配合前端 |
| `Default` / `Clone` | — | `Default``new`;`Clone` 复刻 `sender`(broadcast sender 可 clone,共享通道) |
> `emit_human_approval_request` 与 `try_recv_human_approval` 为人工审批占位接口,后者**未实现**,执行器当前不消费审批响应(对应 `is_blocking` 等待逻辑亦未落地)
> 人工审批当前**只发不收**:`emit_human_approval_request` 发出 `WorkflowEvent`,对应的审批响应(`HumanApprovalResponse`)由 `df-nodes::human_node` 通过 `EventBus::subscribe()` 订阅后自行消费,`EventBus` 本身不再持审批响应存储/检索接口
### 状态机state.rs
@@ -149,15 +148,16 @@ pub trait Node: Send + Sync {
| 方法 | 签名 | 职责 |
|------|------|------|
| `new` / `get` | `... -> Self` / `(&NodeId) -> NodeStatus` | 创建;取状态(缺失默认 `Pending` |
| `set_running` | `(&mut self, NodeId) -> Result<()>` | `Pending → Running` |
| `set_completed` | `(&mut self, NodeId) -> Result<()>` | `Running → Completed` |
| `set_failed` | `(&mut self, NodeId) -> Result<()>` | `Running → Failed` |
| `set_waiting` | `(&mut self, NodeId)` | 设为 `Waiting`**绕过转换校验**(直接 set |
| `set_skipped` | `(&mut self, NodeId)` | `Skipped`**绕过转换校验** |
| `is_cancelled` | `(&NodeId) -> bool` | 是否为 `Cancelled`(同样无对应 setter外部直接 set |
| `snapshot` | `() -> &HashMap<NodeId, NodeStatus>` | 全量状态快照引用 |
| `set_running` | `(&self, NodeId) -> Result<()>` | `Pending → Running` |
| `set_completed` | `(&self, NodeId) -> Result<()>` | `Running → Completed` |
| `set_failed` | `(&self, NodeId) -> Result<()>` | `Running → Failed` |
| `set_cancelled` | `(&self, NodeId)` | `Cancelled`**唯一受控旁路**:不经 `transition` 合法性校验直接 `insert`(人工审批取消由 `cancel_workflow_node` IPC 异步触发,节点可能处于 Running 之外的任意态,走 `is_legal` 会被拒绝 |
| `is_cancelled` | `(&NodeId) -> bool` | 是否`Cancelled` |
| `snapshot` | `() -> HashMap<NodeId, NodeStatus>` | 全量状态快照clone 返回,调用方持独立副本 |
> `Waiting` / `Skipped` / `Cancelled` 三态暂未纳入 `is_legal` 校验链,对应的 `set_*` 直接 `insert`,可从任意态跳转。
> **`set_waiting` / `set_skipped` 已删除**:两者同为旁路置位但全仓零调用,已删。`Waiting` / `Skipped` 两态当前无对应 setter。`Cancelled` 由 `set_cancelled` 作为唯一受控旁路置位,可从任意态跳转。
>
> 共享语义:内部 `Arc<Mutex<HashMap>>``clone()` 为浅拷贝Arc 引用计数 +1所有 clone 共享同一底层 HashMap。`DagExecutor` 的 `state_machine` 与下沉到 `NodeContext.node_status` 的 clone 共享底层;`run_workflow` 把执行器状态机注册到 `AppState` 全局表后,`cancel_workflow_node` IPC 的 `set_cancelled` 可直达运行中阻塞节点(如 `HumanNode`)的 `is_cancelled` 轮询。
### Dag 对外 APIdag.rs
@@ -177,7 +177,7 @@ pub trait Node: Send + Sync {
`ConditionEngine::evaluate(expr: &str, context: &Value) -> Result<bool>` — 仅支持 `"true"` / `"false"` 字面量(区分大小写,先 `trim()` 去空白)。
**默认放行(安全风险)**:空串、`"True"`/`"FALSE"` 等大小写不匹配字面量、以及任意非 `true`/`false` 字面量(如 `"yes"``"1"``"$.status == 'completed'"`)均回退为 `Ok(true)``tracing::warn!`。即**条件不匹配时放行而非阻断**,DAG 边全通 —— 无法据上游输出做条件分支
**默认保守拒绝**:空串、`"True"`/`"FALSE"` 等大小写不匹配字面量、以及任意非 `true`/`false` 字面量(如 `"yes"``"1"``"$.status == 'completed'"`)均回退为 `Ok(false)``tracing::warn!`。即**条件未识别时阻断而非放行**(B-260614-02 反转)——条件分支写错或引擎未实现时不静默放行
> 现状:JSON Path、比较运算、`contains`、逻辑组合均未实现(`context` 参数当前未被使用,仅占位对齐签名)。详见 [B 路线决策接入需求](#🔮-决策能力接入需求b-路线)。
@@ -211,7 +211,7 @@ crates/df-workflow/src/
AI ChatB 路线)从单链 ReAct 升级为规划式协作时,本引擎需补两处:
1. **`condition.rs::ConditionEngine::evaluate()`** —— 当前只认 `"true"` / `"false"` 字面量,默认 `Ok(true)`DAG 边全通,无法据 AI 输出做条件分支。需补:
1. **`condition.rs::ConditionEngine::evaluate()`** —— 当前只认 `"true"` / `"false"` 字面量,未识别表达式默认 `Ok(false)`(保守拒绝),无法据 AI 输出做条件分支。需补:
- JSON Path 取值(从上游节点输出读字段)
- 比较运算(`==` `!=` `>` `<` `>=` `<=`
- `contains` / 字符串匹配