diff --git a/Cargo.lock b/Cargo.lock
index 9670bb2..04e9e6f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1039,7 +1039,7 @@ dependencies = [
[[package]]
name = "devflow"
-version = "0.1.3"
+version = "0.1.5"
dependencies = [
"anyhow",
"async-trait",
diff --git a/crates/df-ai/src/ai_tools.rs b/crates/df-ai/src/ai_tools.rs
index f5e57d8..003bcab 100644
--- a/crates/df-ai/src/ai_tools.rs
+++ b/crates/df-ai/src/ai_tools.rs
@@ -488,10 +488,7 @@ pub fn object_schema(properties: Vec<(&str, &str, bool)>) -> Value {
let mut required = Vec::new();
for (name, type_str, is_required) in properties {
- props.insert(
- name.to_string(),
- serde_json::json!({ "type": type_str, "description": "" }),
- );
+ props.insert(name.to_string(), serde_json::json!({ "type": type_str }));
if is_required {
required.push(name.to_string());
}
@@ -579,6 +576,9 @@ mod tests {
let schema = object_schema(vec![("name", "string", true), ("age", "integer", false)]);
assert_eq!(schema["type"], "object");
assert_eq!(schema["properties"]["name"]["type"], "string");
+ // 空属性描述不落盘:序列化输出不含 "description" 键(省 LLM 请求白携带)
+ let serialized = serde_json::to_string(&schema).unwrap();
+ assert!(!serialized.contains("description"));
let required = schema["required"].as_array().unwrap();
assert_eq!(required.len(), 1);
assert_eq!(required[0], "name");
diff --git a/docs/02-架构设计/devflow-core抽取-设计-2026-10-22.md b/docs/02-架构设计/devflow-core抽取-设计-2026-10-22.md
new file mode 100644
index 0000000..1029af4
--- /dev/null
+++ b/docs/02-架构设计/devflow-core抽取-设计-2026-10-22.md
@@ -0,0 +1,64 @@
+# devflow-core 抽取设计(云化阶段2)
+
+> 任务 711e1390 · 2026-10-22 · 勘察依据:workspace 9 个 crate Cargo.toml 实测
+
+## 一、现状 crate 依赖图(实测)
+
+```
+ df-types (零依赖: serde/thiserror/chrono/uuid)
+ ┌────┴──────────────────────┐
+ df-ai-core df-workflow
+ (零tauri, trait层) (DAG/条件引擎, 仅依赖df-types)
+ │ │
+ df-storage ←──df-ai─────┐ df-nodes ──┐
+ (rusqlite+keyring, (reqwest流式) (聚合5crate) │
+ 依赖df-types/df-ai-core) │ │
+ └──────┬───────────┴──────────────┘
+ ▼
+ src-tauri (Tauri 壳, 68 IPC commands)
+
+ 隧道链: df-tunnel(出站WS) → df-relay(云端中继镜像) → df-im-gateway(IM适配)
+ 工具链: df-execute(零依赖) / df-mcp / df-ideas / df-project(依赖df-types)
+```
+
+## 二、核心发现:devflow-core 已基本存在,无需「抽取」只需「收口」
+
+关键事实:**UI 无关的 crate 已经全部独立**——df-types/df-ai-core/df-workflow/df-storage/df-ai/df-nodes/df-project/df-execute/df-tunnel 均零 tauri 依赖,tauri 只在 src-tauri 壳层。昨天的「抽取」假设(需要从 8-crate 里剥离 UI 耦合)不成立,工作量大幅下降。
+
+## 三、设计(三步收口,非重构)
+
+### S1. 虚拟 target:workspace 内定义 `devflow-core` 集合(0.5 天)
+不建新 crate,先以约定划界:`crates/df-{types,ai-core,workflow,storage,ai,nodes,project,execute}` = core 集合。云端服务直接 path 依赖这组 crate。**零代码改动**。
+
+### S2. 存储层 trait 化(2-3 天,唯一实质改造)
+- 现状:df-storage 直用 rusqlite(bundled),SQL 内嵌
+- 改造:定义 `StorageProvider` trait(项目/任务/工作流/知识 CRUD 切面),SQLite 为默认实现;PostgreSQL 实现放独立 `df-storage-pg`(feature-gated,云端服务才编译)
+- 保留双库分歧模式(devflow.db / devflow-dev.db 的 cfg! 分支语义)
+- 风险:rusqlite 与 sqlx-tokio-postgres 的异步模型差异 → trait 方法全部 async(workspace 已有 async-trait)
+
+### S3. AI Provider 双模式(1 天)
+- df-ai/df-ai-core 已是 trait 层(reqwest 直连,key 本机)——天然支持云端托管:新增 `RemoteProvider` 实现(key 由 df-cloud-server 下发),编译期 feature 切换,个人版行为零变更
+
+### 云端落地形态(阶段2 末期)
+- `df-cloud-server`:新 crate(或独立仓),path 依赖 core 集合 + df-storage-pg,Axum/actix 暴露 HTTP+WS,部署同主机 Nginx 后
+- 复用 df-tunnel 协议与 u-relay 管道层,拓扑不变
+
+## 四、迁移步骤
+
+1. S1 约定划界 + `cargo check` 全绿验证(不动代码)
+2. S2 StorageProvider trait 引入,SQLite 实现先行,桌面端切到 trait 调用(行为零变更,IPC 68 commands 不动)
+3. df-storage-pg 新 crate + 集成测试(本地 docker postgres)
+4. S3 RemoteProvider feature
+5. df-cloud-server 骨架(healthz + 只读任务查询先行)
+
+## 五、风险 Top3
+
+| 风险 | 缓解 |
+|---|---|
+| rusqlite 同步 API vs PG 异步驱动的 trait 撕裂 | trait 全 async + SQLite 实现内 spawn_blocking |
+| df-storage 依赖 df-ai-core(ModelConfig 反序列化)造成边界混杂 | 接受(同属 core 集合,不跨集合) |
+| 与阶段1 联调互踩 src-tauri | S2 改动收敛在 df-storage 内部 + 调用方,分批提交攒批 |
+
+## 六、工作量总估
+
+S1 0.5d + S2 2-3d + S3 1d + cloud-server 骨架 1-2d ≈ **5-7 天**(远低于原「抽取重构」预期)。
diff --git a/docs/02-架构设计/devflow云化架构-2026-10-21.html b/docs/02-架构设计/devflow云化架构-2026-10-21.html
new file mode 100644
index 0000000..4b7cd68
--- /dev/null
+++ b/docs/02-架构设计/devflow云化架构-2026-10-21.html
@@ -0,0 +1,143 @@
+
+
+
+
+
+DevFlow 云化架构 — 2026-10-21
+
+
+
+
+
+
DevFlow 云化架构方案
+
拍板日期 2026-10-21 · 阶段1 已在飞书实机闭环验证 · 状态源:任务 711e1390 / 6e13f49b
+
+
一、核心决策(已拍板)
+
+
+ - 决策1中继不新建:复用生产
u-relay(:9180,纯中继零改动),df-im-gateway 以 WS Commander 身份接入
+ - 决策2df-im-gateway 走方案 A:先落在 devflow workspace 当第 9 个 crate,四端全通后再拆独立仓(避免模块 vs 实际代码脱节坑)
+ - 决策3云端零业务逻辑零落盘:任务/AI对话/审批状态全留桌面端 SQLite;AI Provider key 不上云,本机直连
+ - 决策4语言对齐 Rust:复用 df-tunnel 类型与 systemd 原子切换发布模式(publish-u-relay 同款)
+
+
+
+
二、部署拓扑总览
+
用户四端 ┌─────────────────── 云端(已有云主机复用,不新购)──────────────────┐
+ ┌────────┐ │ │
+ │ 飞书 │──WS 长连接──┼──▶ ┌─────────────────────────────┐ │
+ │ 钉钉 │─Stream Mode─┼──▶ │ df-im-gateway (Rust, 新增) │ │
+ │ 企微 │──WS 长连接──┼──▶ │ · 四端协议适配(验签/AES/卡片) │ │
+ │ Web │─HTTPS/WSS───┼──▶ │ · WS Commander 身份 │ │
+ └────────┘ │ │ · 审批转发 │ │
+ │ └────────────┬────────────────┘ │
+ │ │ df-tunnel 协议 │
+ u-relay :9180 ◀──────┼─────────────────┘ (纯中继:WS 长连接管理/路由/Commander 注册表) │
+ │ │
+ │ Nginx :443 (TLS 终结 + 反代, 后续挂 df-cloud-server 用) │
+ │ │
+ └────────┬──────────────────────────────┬──────────────────────────┘
+ │ 出站 WS(穿透 NAT) │ 出站 WS
+ ▼ ▼
+ ┌── 用户本机 ─────────────────────────────────────────────────┐
+ │ DevFlow 桌面端 (Tauri 2, 唯一执行引擎 + 状态源) │
+ │ · AI Provider 直连 (GLM/DeepSeek, key 本机) │
+ │ · SQLite (任务/对话/审批 全量状态) │
+ │ · 8-crate workspace (+未来第9 crate df-im-gateway) │
+ └─────────────────────────────────────────────────────────────┘
+
+
三、数据流
+
+| 方向 | 路径 | 用途 |
+| 下行指令 | IM/Web → df-im-gateway → u-relay → 桌面端 | 发消息 / 审批 / 停止 |
+| 上行事件 | 桌面端 → u-relay → df-im-gateway → 各端 | 流式回复 / 状态广播 |
+
+
⚠ 桌面端全程主动出站,不开任何入站端口——NAT 友好,家里/公司网络都能用;云端被攻破也拿不到业务数据(无状态管道)。
+
+
四、阶段路线
+
+
+
阶段1 · IM 远程接入 进行中·飞书实机
+
+ - 飞书单端 E2E 闭环(握手→事件→卡片流式→审批回调→流式回复)——代码已全落地,实机验证中
+ - df-im-gateway 作为 workspace 第 9 crate 承载
+ - 钉钉/企微/Web = 后续扩展,不阻塞
+ - 唯一动 u-relay 的点:Commander 身份注册(配置级)
+
+
+
+
阶段2 · devflow-core 抽取 设计启动
+
+ - UI 无关 crate 界定为 devflow-core(工作流引擎/任务管理/存储层)
+ - 存储 trait 双实现:SQLite(本地)/ PostgreSQL(云端)
+ - AI Provider 双模式:key 本机直连(个人版)/ 云端集中托管(团队版)
+ - 同主机 Nginx 后追加 df-cloud-server,管道层不动
+
+
+
+
阶段3 · 完整云端化 预留
+
+ - 云端接管全部业务逻辑,桌面端降级薄客户端
+ - 多用户 / 多设备 / 团队协作(任务池/审批/知识库共享)
+ - 可选本地引擎保离线能力
+
+
+
+
+
五、组件清单与状态
+
+| 组件 | 形态 | 部署位置 | 状态 |
+| u-relay :9180 | Rust 二进制(已有) | 云端主机,systemd 原子切换 | ✅ 复用零改动 |
+| df-im-gateway | Rust crate(新增,方案A先驻 workspace) | 联调期本机 → 常驻期云端主机 | ✅ 飞书端已通,实机验证 |
+| Nginx :443 | TLS 终结 + 反代(已有) | 云端主机 | ✅ 复用 |
+| DevFlow 桌面端 | Tauri 2 应用 | 用户本机 | ✅ 唯一状态源 |
+| df-cloud-server | Rust 服务(规划) | 云端主机,Nginx 后 | 阶段2 拍板后立项 |
+
+
+
六、风险与关键点
+
+
+ - 风险1飞书卡片版本:审批按钮回调仅新版卡片
card.action.trigger 生效,旧版 card 帧被 SDK 直接丢弃——联调最大坑(已知已沉淀)
+ - 风险2假活自愈:断流约 13 分钟由看门狗 notify_waiters 唤醒(45f0560f),云端常驻部署后需关注长连接巡检参数
+ - 注意1双库分歧:devflow.db vs devflow-dev.db 是刻意设计(cfg! 分支),云化时存储层抽象需保留该模式
+ - 注意2钉钉/企微降级:P3/P4 保持 todo,不阻塞阶段1 验收与阶段2 并行
+
+
+
+
DevFlow 云化架构 · 生成于 2026-10-21 · 依据知识库拍板记录 978a3cf0 · 相关任务 6e13f49b / 711e1390
+
+
+
diff --git a/docs/todo.md b/docs/todo.md
index 8b5c3c1..c4bf8ac 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -418,6 +418,10 @@
- [ ] 913 ✅转待办 验收:auto 模式审批架空语义收敛——auto_takeover_all 触发高危工具(run_command 等)须按 S2/信任分级处置(拦截或旁路留痕);审计表可查 auto 会话审批触发/旁路记录,产品语义写入设计档。
- [ ] 观察进化系统只写不读:knowledges 1033 条/embedding 全 NULL/83.6% 零复用/knowledge_search 仅 5 次
- [ ] 915 ✅转待办 验收:知识库由「只写不读」转读写闭环——embedding_status 回填(或明确弃用向量路径),≥半数知识进检索候选,knowledge_search 调用与复用率实测上升(复用率 >50%、检索调用非个位数);口径=同库 DB 查询核验。
+ - [~] **P0 治理批已落地(2026-10-23,用户拍板「推进落地」)**:①写入防重融合——提炼前按窗口关键词查已有知识 top5 随 prompt 附给 LLM,schema 增 action=new|update+target_id 协议,重复经验覆盖融合(target_id 校验候选集防幻觉 id),knowledge_insert 工具同口径(update_target_id);②淘汰机制——repo.archive_stale(零复用+low+超龄→archived,UPDATE RETURNING 批量)+knowledge_archive_stale command(逐条留痕 status_changed),检索面 status 白名单天然排除 archived,检索排序加 confidence 决胜键(两处 SQL);③向量路径「明确弃用检索用途」已声明(注释+实测 0/1688,阶段3 改职建边引擎)。验收:cargo test -p df-storage 242 passed(含 3 新测:update_content_merged 融合轨迹/archive_stale 三条件筛选/search_keywords 置信决胜)+cargo check -p devflow EXIT 0+knowledge 58 passed+tool_registry 50 passed(工具数未破)。✅ **存量清理批已执行(2026-10-23 用户授权「1」)**:先备份(backup API 快照 1688 条核对一致)后变更,判据校准 low→非high(生产实证 LLM 置信系统性偏高 low 仅 1/1688,原判据命中 0 形同虚设),归档 62 条(published 1550→1488)+knowledge_events 逐条留痕可回滚;**未执行档**:零复用+超龄不看置信 632 条(84% high 已无区分度,规模大待单独拍板)。台账:temp/数据变更台账.md。诊断与终局设计见 temp/知识库治理审查-20261023.md 与 temp/知识中枢终局设计-20261023.md(五阶段路线:0治节点→1连边→2图召回→3自动建边→4中枢共享,百万级换挡表已实测留档)。
+ - [~] **阶段1 连边已落地(2026-10-23 续批,用户「继续」)**:①V54 迁移 knowledge_edges 边表(kind/weight/origin/last_verified_at,双列索引,LATEST_SCHEMA_VERSION 53→54);②repo 边 CRUD——insert_edge(双向去重幂等+触验)、list_related(双向 JOIN+对端展开,archived 不展示);③提炼链 related_ids 协议——prompt 规则 7(new 时列最多 3 个强相关已有条目),解析循环建 similar 边(origin=llm-tag,target 校验候选集防幻觉);④knowledge_insert 工具 related_ids 同口径+knowledge_search 返回补 id 字段(agent 引用已有条目的前提);⑤详情页「关联知识」区块——knowledge_get_detail payload 直带 related,折叠 section+点击跳对端(open-related→selectKnowledge),双语 i18n。验收:cargo test -p df-storage 243 passed(V54 迁移幂等门+边 CRUD 新测)+cargo check -p devflow EXIT 0+vue-tsc --noEmit EXIT 0。阶段2(图召回激活扩散)待下批。
+ - [~] **治理续批(2026-10-24 用户「自主推」+「蒸馏压缩合并/打包换装」)**:①激进档已执行——自主授权(可逆+留痕+备份),归档 570 条零复用超龄(置信不限),累计 archived 632/published 1550→918,备份 devflow.db.bak-知识库淘汰批二-1024,台账已登记;②存量蒸馏合并功能落地——knowledge_distill.rs(archived 按 kind 分组 limit 20→LLM 合订本 candidate→merges 边 origin=distill 连组内全部条目,strip_code_fence/candidate_record_from_item pub(crate) 复用)+repo.list_by_status_kind(created_at 升序最老优先)+knowledge_distill_group command;③版本 0.1.3→0.1.4,打包换装 package-devflow.ps1 -Mode full 执行中。验收:cargo test -p df-storage 244 passed(含 list_by_status_kind 新测)+cargo check EXIT 0。蒸馏批生产执行(app 内按 kind 逐组人工触发)与阶段2图召回待下批。
+ - [~] **渐进披露批(2026-10-24 /swarm 四执行者+主控核查,用户「披露式按需召回加载」+「不牺牲缓存命中」)**:D1 文档探索策略段 11.9K 全文常驻→路标 260 字符常驻+全文按需(URL/文档词触发,fingerprint 含门位,全文进 volatile 侧——缓存安全主控核查通过);D2 技能清单 120条×80字→60条×40字;D3 devflow.md 投影目录化(纪律分区全文保留,其余目录+read_file 按需,总闸 6000→3000);D4 工具 schema 属性级空串 description 清理(81 工具×~4 属性,~10KB/轮);驳回工具两跳披露(冻结集跨轮字节前缀稳定约束>收益)。**附带修复目标切换失忆(用户实证「切换目标两三轮后拉回老目标」)**:G1 钉扎段加仲裁行「用户最近指令>登记目标」——根因=system 级老目标压过对话流新意志。验收:cargo test -p devflow --lib 932 passed+df-storage 244+df-ai 605+cargo check EXIT 0。**换装 0.1.4 完成**(装机 exe 版本实测 0.1.4/PID 存活);⚠️ 登记换装脚本验证缺陷:swap 启动验证只查进程存活+读 mtime,build 期间旧进程复活锁文件致 NSIS 静默安装失败仍报「换装成功」——验证应加装机 exe 版本核对(待修)。新会话提示词静态底座 16.2K→~4.5K 字符+工具载荷省 ~10KB/轮。
- [ ] 观察多模态未走通:贴图落"[图片已忽略]"占位,实际靠 run_command 外部 vision CLI 绕路
- [ ] 917 ✅转待办 验收:贴图走原生视觉路径不落占位——非视觉模型收图时明确拒绝或切视觉模型,视觉模型直接出识别结果,不再靠 run_command 调外部 vision CLI 绕路;实测贴图会话零"[图片已忽略]"占位。
- [ ] 观察编排面零使用:workflow/node_executions/ai_plans 等 9 张表全 0 行;四会话分工 origin 89/89 全 NULL
@@ -776,11 +780,13 @@
- [ ] M4-b UX 小批(i18n 补键/token 化/aria/loaded/Esc/队列带图标记)——未动,留板
- [x] **收尾令(用户 2026-10-18 21:41 飞书下达到 AI-Ops,转登记)**:M1 销账后——①按 G3 提交本批改动并 push origin main(推送令已拍板,限本批范围);②启动 dev 模式运行验证(重点验 M4 反口水话与 M1 恢复链);③完成信息经飞书推送用户。若 AI-Ops 监测到 M1 已销账而本条未执行,AI-Ops 代执行。——✅ 23:0x AI-Ops 执行完毕:四笔分组提交(05d0f89 上下文P1批/302c4bc 飞书闭环/25ec9cf 前端令牌批/fb83339 文档)已 push(3bb662f..fb83339);验收 cargo test 2281 passed 0 failed+vue-tsc EXIT 0;dev 已跑(vite:1420 HTTP 200);完成信息已飞书推送。
-### 💡 2026-10-19 上下文管理对标 u-claw·大批量并行差距(AI-Ops 分析,待领单)
-> 用户战略令(10-18 飞书):DevFlow 上 Linux 替代 u-claw+CC,第一门槛=上下文管理三命题(丢记忆/历史召回/token 高效),大批量多会话并行是常态场景。详情:[02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md](../02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md)
-- [ ] P0-A usage 真值采集:stream_options.include_usage 三口径(input/cache_read/cache_creation),6 月 P1 设计复活(当时暂缓,结构层已回退干净)
-- [ ] P0-B 压缩触发改 token 水位主判据(≈窗口 70% 可配,体积兜底;u-claw 86e9216 同款,治压缩/请求比 4.8 偏频),依赖 P0-A
-- [ ] P1-A 跨会话归档检索(/history 等价):消息全文搜索(FTS5 或 LIKE 起步)+检索指令+AI 检索指引进 sop
-- [ ] P1-B boundary/loop_state 写入闭环(代语义显式化+换代通知推送)
-- [ ] P2-A 大内容外置纪律(大结论写盘 out/+回复给路径,system prompt 处理规则)
-- [ ] P2-B 并行资源治理(全局 token 预算视图/多会话压缩协防)——与 Linux 化/远程容器方向合流设计
+### 💡 2026-10-19 上下文管理对标 u-claw·大批量并行差距(10-21 已批次化,待领单)
+> 用户战略令(10-18 飞书):DevFlow 上 Linux 替代 u-claw+CC,第一门槛=上下文管理三命题(丢记忆/历史召回/token 高效),大批量多会话并行是常态场景。详情:[02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md](../02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md)。**10-21 勘察批**:分析落 temp/分析-P0A/P0B/P1A/P1B-P2A-2026-10-21.md+temp/待完成六条-汇总方案-2026-10-21.md。
+- [x] **T1 批 P0-A usage 口径统一**(S-M,无依赖,推荐首批):考古实锤=三口径列已齐(V38 864c696 prompt/completion+V39 a031521 cache_hit/cache_miss/reasoning,ai_messages;V5 ai_conversations 累加),include_usage 已注入——**真缺口=两栈口径漂移**:openai_compat.rs:542-549 缺失全零静默入库(三路走查:85)vs Anthropic 缺失硬失败、anthropic cache 段少记 prompt;修=缺失回退估算+is_estimated 标记+cache 段口径对齐 u-claw 三口径(input/cache_read/cache_creation)。拍板:缺失回退策略确认——✅ **2026-10-22 落地**:anthropic_helpers usage 整段+字段双层 serde default(端点不回 usage 不再炸帧,全零下行走既有估算轨 round_usage_effective 打 is_estimated;openai 臂既有 serde default 同口径零改动)+cache 三口径归一(prompt=input+cache_read+cache_creation 对齐 openai 全量输入语义,apply_anthropic_event 归一点)+round_is_estimated 全链透传(stream_relay→loop→completed_event)。df-ai 603 绿
+- [x] **T2 批 P0-B 压缩水位判据**(S 级两阶段,Phase1 无硬依赖可首批并行):方案实锤=temp/分析-P0B-压缩水位判据-2026-10-21.md——现行判据 context_lifecycle.rs:117-138(history>0.6×(budget−sys)+保护区 6 条);窗口分母已解决(model_context.rs:31 三级来源,budget 模型感知零新增管道);Phase 1=判据行加分支(KV `df-ai-compress-watermark` 默认关+`-ratio` 默认 0.70,分子维持估算,开关关逐字节等价)/Phase 2=分子换 usage 真值(usage_anchor 锚点,缺失自动回退);与 W1-W4 交互=触发后移缓存净增(W3 可验),红线 trigger+max_round_growthratio×budget 严格大于,替换语义不并联)+parse_watermark_ratio 钳位 [0.3,0.95](prompt.rs:775,保 headroom≥5% budget,debug_assert 契约)+KV 开关默认关+S1 同轴挂点注释钉死实施序;Phase2 usage 真值分子待 T1 数据观察后另批
+- [x] **T3 批 P1-A 跨会话检索**(核心 2.5d/含前端 3.5d,无依赖可并行):方案已实锤=temp/分析-P1A-跨会话检索-2026-10-21.md(终版含生产库实测)——**实测:ai_messages 32,349 行/117 会话,content 39.5MB,compressed 消息原文完整保留=全量账本,archive jsonl 仅派生副本,检索面盖 ai_messages 即全覆盖,零迁移零回填**;LIKE 实测 113ms/单关键词——LIKE+复用知识库分词(extract_query_keywords,knowledge_inject.rs:115)起步,FTS5 开箱可用(bundled SQLite 3.45)但中文按字切分召回差+仓内两先例拍过不上,升级条件(>50 万行/P95>500ms)留档;**双入口分期**:AI 工具 history_search 先行(两跳式瘦身:首跳每会话 120 字片段/深查二跳 conversation_id,对齐 2K 预算纪律 namespace_store.rs:32;无参降级列最近 10 会话;基线 tool_registry.rs:1520 断言 80 工具+1),前端侧栏升级同批可选;sop 指引 prompt.rs:161-163 guidance 行+:251 父子同源(先例 :385)。拍板 6:①入口分期(AI 先行+前端可选)②两跳式瘦身 ③无参列会话内置降级 ④tool 角色默认排除检索 ⑤无摘要会话摘要降级链 ⑥FTS5 阈值留档——✅ **2026-10-22 AI 工具入口落地**:message_repo 跨会话关键词检索(MessageSearchHit+snippet 命中点前后 200 字截 500,FTS5 升级触发条件注释留档)+idea_repo escape_like 升 pub(crate) 单一实现复用+tools/history.rs 声明式注册 history_search(两跳式/无参降级列最近会话/tool 角色排除)+tool_registry 接线+prompt guidance 双语(严禁 run_command 查 sqlite 代查+压缩史 read_file archive 路径引导)。df-storage 227 绿;前端侧栏入口未做(分期可选,待令)
+- [x] **T4 批 P1-B 代语义闭环**(M,无依赖):boundary/loop_state 填充率 0 的挂点补齐——四事件挂点=压缩完成/停靠(emit_task_parked agentic/mod.rs:~1464)/恢复链快照/会话清空;换代通知接飞书既有推送通道(审批/停靠通知同范式);DDL 待勘察(T4 分析回收后定 V54+)——✅ **2026-10-22 三件套落地**(零 DDL,status 列 V50 既有):件一 status 终局补写(emit_ai_completed_once 顺写 completed/emit_fatal_error 写 error/ai_chat_clear 事务内归位 loop_state=NULL+status=active+boundary_json=NULL 防复活)+件二 run_generation_notifier 飞书推卡(订阅 AiTaskParked/AiAutoCompressed,停靠去重+换代 30s 聚合)+件三 DELIVERY_GUIDANCE_PROMPT 渠道段注入(cache_on 分流)+watcher 交付缺口补(快任务兜底路径早退漏调 reply_deliveries)。进度=temp/三件套-代语义闭环与飞书推送-进度-2026-10-21.md;devflow 930 绿
+- [ ] **T5 项 P2-A 大内容外置纪律**(S,轻,可搭车 T3/T4):system prompt 处理规则段(u-claw #3:大结论写盘 out/,回复给路径+3 行结论);write_file 权限语义+out/ 目录约定随批定
+- [x] ~~P2-B 并行资源治理~~ → **不立项,占位留 Linux 化**(temp/分析-P2B-并行资源治理占位-2026-10-21.md:前置=P0-A 预留 per-conversation 聚合口径+P1-B 挂点不堵死;触发=Linux 化立项启动)
+
+**批次推进序**:T1+T3 并行首批 → T2(依赖 T1)+T4 → T5 搭车;P2-B 留合流。挂账提醒:T1-T5 开工前先清 6 文件拖拽落盘攒批(等提交令)。
diff --git a/scripts/package-devflow.ps1 b/scripts/package-devflow.ps1
index 12b5e5e..d69a698 100644
--- a/scripts/package-devflow.ps1
+++ b/scripts/package-devflow.ps1
@@ -59,8 +59,16 @@ Start-Sleep -Seconds 2
Start-Process $bundle.FullName -ArgumentList "/S" -Wait
if (-not (Test-Path $exe)) { Write-Host "[失败] 安装后未找到 $exe"; exit 1 }
+# 版本核对(2026-10-25 实证修复):NSIS 静默安装可能因文件锁静默失败,旧进程复活锁文件时
+# 曾出现「报换装成功但装机 exe 仍是旧版」。装机版本必须与本次构建一致才算换装成功。
+$wantVer = (Get-Content "$repo\src-tauri\tauri.conf.json" | ConvertFrom-Json).version
+$gotVer = (Get-Item $exe).VersionInfo.ProductVersion
+if ($gotVer -ne $wantVer) {
+ Write-Host "[失败] 静默安装未生效:装机 exe 版本 $gotVer != 构建 $wantVer(疑似安装器被文件锁/旧进程拦截),请手工运行安装包后重试"
+ exit 1
+}
$exeTime = (Get-Item $exe).LastWriteTime
-Write-Host "[4/4] 启动验证(装机 exe 时间: $exeTime)..."
+Write-Host "[4/4] 启动验证(装机 exe $gotVer,时间: $exeTime)..."
Start-Process $exe
Start-Sleep -Seconds 6
$proc = Get-Process devflow -ErrorAction SilentlyContinue
diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
index 4c4c8ef..9d3c3b4 100644
--- a/src-tauri/capabilities/default.json
+++ b/src-tauri/capabilities/default.json
@@ -1,7 +1,7 @@
{
"identifier": "default",
"description": "DevFlow default permissions",
- "windows": ["main", "ai-detached", "ai-detached-*", "fe-detached-*", "approval-popup"],
+ "windows": ["main", "ai-detached", "ai-detached-*", "fe-detached-*"],
"permissions": [
"core:default",
"core:event:default",