From e61fcdea7950dfdd662caa28dc6d45a6865b8ed7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com>
Date: Sat, 10 Oct 2026 00:47:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E7=9C=8B=E6=9D=BF?=
=?UTF-8?q?=E5=BD=92=E6=A1=A3=E5=99=A8=20+=20=E5=B7=B2=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E5=86=85=E5=AE=B9=E5=86=8D=E5=88=86=E7=A6=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- scripts/archive-todo.cjs: 把看板已完成内容分离到归档(条目块 [x] 自动移出;历史/导航段走标题白名单整段移出,不靠启发式猜--本板存在大量无勾选的行内待办,启发式会误移)
- 安全闸: 未完成项零丢失断言(失败即中止不写);默认 dry-run;--list 从 UTF-8 文件读白名单(规避 Windows CLI 中文编码);容器标题(下挂更深子节)不当作空标题删
- 本次移出 6 段(统一规划 2026-06-26 全景/交接状态 2026-06-14/编排推进总览 2026-06-18)+ 909 条目;主板 847→736 行
- 核对: 未完成项 109 项零丢失,主板 [x] 清零,归档收 909 及其验收块
---
docs/07-项目管理/todo归档/2026-10-10.md | 110 +++++++++++++++++++
docs/todo.md | 111 +------------------
scripts/archive-todo.cjs | 135 ++++++++++++++++++++++++
3 files changed, 246 insertions(+), 110 deletions(-)
create mode 100644 scripts/archive-todo.cjs
diff --git a/docs/07-项目管理/todo归档/2026-10-10.md b/docs/07-项目管理/todo归档/2026-10-10.md
index ce0cc50..dccc616 100644
--- a/docs/07-项目管理/todo归档/2026-10-10.md
+++ b/docs/07-项目管理/todo归档/2026-10-10.md
@@ -177,3 +177,113 @@
908. [x] 「settings.loading」i18n key 缺失**已带病入库**(a8c92e9,10-09 AI-Ops 走查发现): `src/components/settings/AboutPanel.vue:204` 用 `t('settings.loading')`,但 zh-CN/en `settings.ts` 均无此 key(grep 实证)→ 版本信息返回前渲染字面串 `settings.loading`。修:补 `loading` 键(两边)或改用已有键。同类走查发现:AboutPanel 曾用 `window.dispatchEvent('df-toast')`(全仓无监听)已随提交改动,复核确认现机制一致。
✅ **2026-10-10 修复**:`src/i18n/zh-CN/settings.ts` / `src/i18n/en/settings.ts` 各补 `loading` 键(紧随 `descAppVersion`,与仓内 auditLog/common/fileExplorer/taskDetail 各命名空间自持 `loading` 的惯例一致)。验收:`grep -n "loading:" src/i18n/zh-CN/settings.ts src/i18n/en/settings.ts` → 各 1 命中;`bunx vue-tsc --noEmit` → EXIT 0。
+
+---
+
+## 2026-10-10 分拆(已完成内容再分离)
+
+## 🎯 统一规划(2026-06-26 全景)
+
+> 整合知识图谱设计 + 22 条未完成项 + G1 目标钉扎(✅已落地) + 多工程方案。
+> **核心主线:AI Working** — AI 拥有项目知识图谱,自主分解/编排/执行/自检,人只决策。
+> **执行策略(两阶段)**:① 先攒批无冲突小 bug/小调整 → 提交;② workflow 编排相关任务批量推进大重构(减少文件读取/LLM 交互,提高上下文效率)。
+
+### 主线脉络
+```
+G1目标钉扎(✅已落地) → 知识图谱Phase1(任务网络,AI编排地基)
+ ↓ ↓
+实测验证
+ ↓ ↑
+F-09多会话B(立项) ────────────────┘ (Phase4前置:多会话各自注入)
+```
+
+### 任务图谱(DAG · 有方向有状态)
+
+> 节点=任务(着色=状态),边=依赖方向(前置 → 后继)。**推进时更新状态**(CLI/edit 同步此表 + Mermaid)。
+> 图例:✅完成 / 🔨进行中 / 📋待办 / 🚫阻塞
+
+```mermaid
+graph TD
+ classDef done fill:#bfb,stroke:#393,stroke-width:2px
+ classDef doing fill:#ffd,stroke:#993,stroke-width:2px
+ classDef todo fill:#eef,stroke:#99c
+ classDef blocked fill:#fcc,stroke:#c33
+
+ G1["G1 目标钉扎
✅代码 8ce18cb"]:::done
+ P1["父① 小bug攒批
✅①.2/①.3(①.1过时·①.4归⑤)"]:::done
+ P2["父② 知识图谱Phase1
✅Phase1(数据层+业务层)"]:::done
+ P3["父③ AI对话体验
📋待办"]:::todo
+ P4["父④ F-09 per-conv
✅前端per-conv(accessor)"]:::done
+ P5["父⑤ 灵感模块
✅完成(⑤.1/①.4/⑤.2)"]:::done
+ P6["父⑥ Phase2-5
🔨Phase2-3✅·4-5待办"]:::doing
+ P7["父⑦ 技术债
📋待办"]:::todo
+
+ P1 -.先行.-> P2
+ G1 ==基建==> P6
+ P2 ==> P6
+ P4 ==> P6
+ P2 -.task_links.-> P5
+```
+
+| 任务 | 状态 | 子项 | 依赖(前置) |
+|---|---|---|---|
+| **G1** 目标钉扎 | ✅ 代码已落地 | G1/G2/G4 落地 | — |
+| **父①** 小bug攒批 | ✅ 完成 | ①.2 白名单✅(settings.rs) / ①.3 priority✅(idea.rs) / ①.1 BUG层1❌过时(F-260619-03 方案①取代,层2待决策) / ①.4 雷达图→归父⑤ | — |
+| **父②** 知识图谱Phase1 | ✅ Phase1完成 | ②.1 V29迁移✅ / ②.2 TaskRecord+TaskLinkRepo✅ / ②.3 IPC(create_task扩展+task_link CRUD+move_queue+get_tree)✅ / ②.4 父聚合✅(set_status_for_aggregation绕status收口) / ②.5 AI工具6✅(基线38) | G1(弱) |
+| **父③** AI对话体验 | 🔨 ③.1✅ / ③.2待办 | ③.1 B-260619-04 ToolCard✅(跨轮收起已有+标题增强) / ③.2 REFACTOR-260619-04 审批状态机拆分 / 对话透明化 L1🟡待定 | — |
+| **父④** F-09 per-conv | ✅ **全部落地**(2026-08-07 核验) | ④.1 streaming/currentText per-conv Map(accessor委派,单会话回归零变化,BUG-260624-01根因清除,vue-tsc 0) | — |
+| **父⑤** 灵感模块 | ✅ 完成 | ⑤.1 软删除✅ / ①.4 雷达图✅ / ⑤.2 #05✅/#06拆const✅/#09/#10表单(逗号tags)✅ / #07 DEC-02保留purge(不改) / 附:priority_from_i32跨层映射修复(对齐前端0=critical) | #07→②.1 |
+| **父⑥** Phase2-5 | 🔨 Phase4 注入进行中 | ⑥.1事件流✅(V30) / ⑥.2基础设施✅(V31) / ⑥.3注入✅(resolver 增强+extra 渲染) / ⑥.4前端(C 方案展开摘要✅已决待实施) |
+| **父⑦** 技术债 | 📋 待办 | SMELL-P1-6 / conditions / CR缓存 / UX分页 / 审批超时 / miniapp / 双监听器 | — (穿插) |
+
+> **推进路径**:父①先行(攒批提交)→ 父②主线 workflow → 父③/④并行 → 父⑤/⑥/⑦穿插。每父任务一个 workflow 批,子任务相关文件批量读改减少交互。**状态更新约定**:子项完成→父状态 🔨;全子完成→父 ✅;每批提交后同步此表。
+
+### 协同点(跨主题复用)
+1. **IDEA-FIX-07 关联单向 ↔ 知识图谱 `task_links`**:并入 Phase 1 用独立表(§2.2 论证 JSON 缺陷),别补 JSON 双向同步
+2. **G1 system_prompt 注入基建 ↔ Phase 4 L0 注入**:复用 `pinned_goal` 拼接链路
+3. **F-09 per-conv ↔ Phase 4 多会话注入**:F-09 前置
+4. **REFACTOR-260619-04 审批状态机 ↔ `queue=decision` 待决策池**:审批对齐
+
+
+## 交接状态(2026-06-14)
+
+**代码健康度**:`cargo test --workspace` 全过、`npx vue-tsc --noEmit` 0 error(主代理独立验证,非 mission 自报)。
+
+**工作区状态(重要)**:`git diff` 104 文件(8066+/6941-)是**三层混合**——①会话前未提交基线(Sprint 19 等大量工作:i18n 拆目录、knowledge 全栈、Settings 拆分、appSettings 迁移…)②本次会话重构 ③代理越权修复。**接手前务必 `git diff` 通览区分**,勿整体当作单一改动提交。
+
+**本次会话完成**:
+- 重构(用户授权):删 5 僵尸 crate(df-evolve/plugin/stages/task/traceability)、清 7 死模块(df-execute docker/git_ops/ssh + df-project scheduler/timeline/context + df-ideas graph)、拆 ai.rs→`commands/ai/` 11 文件、拆 ai.ts→6 composable、models 字段 bug 修复、coordinator B 路线标注
+- 代理越权追加修复 6 处(已标✅,主代理验证编译+测试通过;逐行正确性建议接手方 `git diff` 复核):B-01 审批持久化 / B-02 ConditionEngine 默认 false / B-04 删 NodeRegistry Default impl / T-05 工具结果截断 50KB / B-08 promote 补偿删除 / T-07 诊断日志清理
+
+**待设计交其他会话(核心)**:df-workflow 审批闭环三连 B-06/B-07/B-03。**✅ B-03 设计已完成**(接手会话,2026-06-14):见 [B-03-人工审批响应机制-2026-06-14.md](./02-架构设计/已编号方案/B-03-人工审批响应机制-2026-06-14.md),通道选型定为 **工作流独立审批通道**(复用 EventBus broadcast + HumanApprovalResponse 事件 + approve_human_approval IPC,非 ai.rs AiApprovalRequired——后者是 AI Chat 工具审批路径,与工作流节点审批是两条独立链路)。拆 B-03a(响应等待 + 超时,不依赖 B-07)/ B-03b(取消机制)。**B-06 / B-07 仍待实施**(B-06 = execution_id 下沉并发隔离;B-07 = 共享 StateMachine 取消前置),是 B-03a 并发安全 / B-03b 的前置。
+
+**失控代理教训**:本次会话派的后台拆分代理在 stop hook 循环里失控,越权改代码/文档(先斩后奏)。接手方若再派 agent,注意约束其不碰决策记录(用户已要求手动触发)+ 限定单任务不自主续推。
+
+---
+
+### 📋 编排推进总览(2026-06-18 更新)
+
+未完成待办按可执行性分 8 组(详细条目见下方各分类,勿重复记录):
+
+| 组 | 说明 | 代表项 |
+|---|---|---|
+| **A todo 卫生** | 矛盾清理/被取代退役标注 | ✅ 本批已完成 |
+| **B 零风险减法** | 死链清/空壳合并 | ✅ 本批已完成 |
+| **C 需用户输入** | 阻塞,无法代办 | —(已归档)
+| **D 功能增强** | 设计清晰可推进(P1) | F-15-01 审批选项 / F-15-02 task 详情 / F-15-03 分页⚠️breaking / F-15-04 卡片折叠 |
+| **E 架构重投入** | 需设计,非小改 | F-14-01 模型能力 / F-14-07 trait 下沉 / ARC-05·06 store 拆·循环依赖 |
+| **F 全局 review P2 需设计** | 安全/竞态收口 | R-PD-4/5/6/8/9/12/13 + R-PD-10 .map_err 85 处 |
+| **H 长期功能池** | 不进主线 | F-14-02~10 / T-14-06 Settings 拆 / T-14-11 条件引擎 / B-14-05 / B-03b-R9 |
+
+**推进原则**:能并行不串行(独立子任务 8-12 并发);每批重汇总+全优先级重排+销账核对 ✅;C 组阻塞项不代办等用户。**本会话首批**:A 卫生 + B 清死链。
+
+**③④C类已迁**(2026-06-16):需人工决策项(③产品取舍 7 / ④设计方向 7 / 重投入排期 9 / C用户实测 5)见 [待决策.md](./待决策.md),从本文件抽离职责分离。**batch54 可自主批进展(2026-06-16·workflow wsfz7zl8i + 主代核查)**:复核-新⑪ 看门狗幽灵 ✅ 销账(清主窗口 state 视觉残留;**核验更正**:原 watchdog 幽灵已被 CR-260615-24 stopListener:371 clearStreamWatchdog 兜底);AE-03 diff预览 ⚠️ 降级阻塞(后端 write_file 未返 diff,待后端补,见 line 538);UX-04 断线保文 待 DEC-260616-03 授权(见待决策.md 🟡,本批不含)。
+
+
+> **📦 已完成项归档**: [07-项目管理/todo归档/2026-06.md](./07-项目管理/todo归档/2026-06.md) — 2026-06-18 拆分, 已完成 `[x]` 与历史分析段迁此。另有 [2026-06-18.md](./07-项目管理/todo归档/2026-06-18.md) / [2026-06-27.md](./07-项目管理/todo归档/2026-06-27.md) — 本次归档。
+
+909. [x] **907 源头守静 + 无损归位(夹层根治)**(2026-10-10 devflow 接手登记,源自 907 补注遗留):现 907 修复走「未邻接即剥除」——保证不 400 但有损(夹层场景丢一轮工具交互)。
+ - ✅ **① 源头守静(2026-10-10 实施完成,避让插入变体)**:df-ai 新增 `ContextManager::push_system_anchor`(context/mod.rs)——末条为悬空 `ToolCallHead` 时将 system 锚点插在**该头之前**(index=len-1),否则常规尾部追加;私有判定 `ends_with_dangling_tool_call_head`(`group==ToolCallHead`)。比原设计「推迟 push」更优:摘要/警示**不丢**,且楔入根本不产生。5 处尾部 push 全量收口(压缩成功 context_lifecycle:269 / 兜底 keyword_fallback_commit:372 / 警示 insert_system_notice helpers:44 / 主题标记 agentic/mod:1804 / 续轮 nudge :2399)。单测 `push_system_anchor_appends_on_normal_tail` + `push_system_anchor_avoids_dangling_tool_call_head` 锁定。验收:`cargo test -p df-ai --lib context` **155 passed/0 failed**;`cargo check -p devflow` EXIT 0。
+ - ✅ **①-补 双取锁合并(2026-10-10 实施完成)**:`keyword_fallback_commit`(context_lifecycle.rs)内单锁一并 `set_compressing(false)` + 兜底提交,消「锁外复位→再取锁提交」的并发二次压缩窗口;复位置于 `KEYWORD_FALLBACK_ENABLED` 门控之前(开关关闭同样复位,否则标志永真致压缩停摆);两处调用点(provider 重建失败/LLM 失败)的独立复位块删除。验收:`cargo check -p devflow` EXIT 0 + `cargo test -p devflow --lib` **749 passed/0 failed**。
+ - ✅ **② 无损归位(2026-10-10 实施完成)**:`crates/df-ai/src/context/sanitize.rs` 新增 step 0.5 `reorder_interlopers_after_tool_run`——楔入 assistant 头与其 tool 响应之间的异类消息(压缩摘要/用户插话/警示 system)**整体移到该组响应之后**(只重排不删内容),归位后 step1 邻接判定即认闭合,工具轮**不再被剥除**;仅对「单头 + 夹层 + 紧随该头的连续 tool 段」生效,遇下一个 tool_call 头即停(不跨单元),其余畸形仍走剥除兜底。幂等。单测替换旧剥除用例为 `sanitize_reorders_interloper_to_keep_tool_round` + 新增 `sanitize_reorder_is_idempotent`。验收:`cargo test -p df-ai --lib context` **156 passed/0 failed**。
+
diff --git a/docs/todo.md b/docs/todo.md
index d9983e8..f58bf95 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -65,85 +65,6 @@
> 审批留在对话内(需要即时上下文),知识/灵感/通知放 Inbox。
> 后续做详细设计方案。
-## 🎯 统一规划(2026-06-26 全景)
-
-> 整合知识图谱设计 + 22 条未完成项 + G1 目标钉扎(✅已落地) + 多工程方案。
-> **核心主线:AI Working** — AI 拥有项目知识图谱,自主分解/编排/执行/自检,人只决策。
-> **执行策略(两阶段)**:① 先攒批无冲突小 bug/小调整 → 提交;② workflow 编排相关任务批量推进大重构(减少文件读取/LLM 交互,提高上下文效率)。
-
-### 主线脉络
-```
-G1目标钉扎(✅已落地) → 知识图谱Phase1(任务网络,AI编排地基)
- ↓ ↓
-实测验证
- ↓ ↑
-F-09多会话B(立项) ────────────────┘ (Phase4前置:多会话各自注入)
-```
-
-### 任务图谱(DAG · 有方向有状态)
-
-> 节点=任务(着色=状态),边=依赖方向(前置 → 后继)。**推进时更新状态**(CLI/edit 同步此表 + Mermaid)。
-> 图例:✅完成 / 🔨进行中 / 📋待办 / 🚫阻塞
-
-```mermaid
-graph TD
- classDef done fill:#bfb,stroke:#393,stroke-width:2px
- classDef doing fill:#ffd,stroke:#993,stroke-width:2px
- classDef todo fill:#eef,stroke:#99c
- classDef blocked fill:#fcc,stroke:#c33
-
- G1["G1 目标钉扎
✅代码 8ce18cb"]:::done
- P1["父① 小bug攒批
✅①.2/①.3(①.1过时·①.4归⑤)"]:::done
- P2["父② 知识图谱Phase1
✅Phase1(数据层+业务层)"]:::done
- P3["父③ AI对话体验
📋待办"]:::todo
- P4["父④ F-09 per-conv
✅前端per-conv(accessor)"]:::done
- P5["父⑤ 灵感模块
✅完成(⑤.1/①.4/⑤.2)"]:::done
- P6["父⑥ Phase2-5
🔨Phase2-3✅·4-5待办"]:::doing
- P7["父⑦ 技术债
📋待办"]:::todo
-
- P1 -.先行.-> P2
- G1 ==基建==> P6
- P2 ==> P6
- P4 ==> P6
- P2 -.task_links.-> P5
-```
-
-| 任务 | 状态 | 子项 | 依赖(前置) |
-|---|---|---|---|
-| **G1** 目标钉扎 | ✅ 代码已落地 | G1/G2/G4 落地 | — |
-| **父①** 小bug攒批 | ✅ 完成 | ①.2 白名单✅(settings.rs) / ①.3 priority✅(idea.rs) / ①.1 BUG层1❌过时(F-260619-03 方案①取代,层2待决策) / ①.4 雷达图→归父⑤ | — |
-| **父②** 知识图谱Phase1 | ✅ Phase1完成 | ②.1 V29迁移✅ / ②.2 TaskRecord+TaskLinkRepo✅ / ②.3 IPC(create_task扩展+task_link CRUD+move_queue+get_tree)✅ / ②.4 父聚合✅(set_status_for_aggregation绕status收口) / ②.5 AI工具6✅(基线38) | G1(弱) |
-| **父③** AI对话体验 | 🔨 ③.1✅ / ③.2待办 | ③.1 B-260619-04 ToolCard✅(跨轮收起已有+标题增强) / ③.2 REFACTOR-260619-04 审批状态机拆分 / 对话透明化 L1🟡待定 | — |
-| **父④** F-09 per-conv | ✅ **全部落地**(2026-08-07 核验) | ④.1 streaming/currentText per-conv Map(accessor委派,单会话回归零变化,BUG-260624-01根因清除,vue-tsc 0) | — |
-| **父⑤** 灵感模块 | ✅ 完成 | ⑤.1 软删除✅ / ①.4 雷达图✅ / ⑤.2 #05✅/#06拆const✅/#09/#10表单(逗号tags)✅ / #07 DEC-02保留purge(不改) / 附:priority_from_i32跨层映射修复(对齐前端0=critical) | #07→②.1 |
-| **父⑥** Phase2-5 | 🔨 Phase4 注入进行中 | ⑥.1事件流✅(V30) / ⑥.2基础设施✅(V31) / ⑥.3注入✅(resolver 增强+extra 渲染) / ⑥.4前端(C 方案展开摘要✅已决待实施) |
-| **父⑦** 技术债 | 📋 待办 | SMELL-P1-6 / conditions / CR缓存 / UX分页 / 审批超时 / miniapp / 双监听器 | — (穿插) |
-
-> **推进路径**:父①先行(攒批提交)→ 父②主线 workflow → 父③/④并行 → 父⑤/⑥/⑦穿插。每父任务一个 workflow 批,子任务相关文件批量读改减少交互。**状态更新约定**:子项完成→父状态 🔨;全子完成→父 ✅;每批提交后同步此表。
-
-### 协同点(跨主题复用)
-1. **IDEA-FIX-07 关联单向 ↔ 知识图谱 `task_links`**:并入 Phase 1 用独立表(§2.2 论证 JSON 缺陷),别补 JSON 双向同步
-2. **G1 system_prompt 注入基建 ↔ Phase 4 L0 注入**:复用 `pinned_goal` 拼接链路
-3. **F-09 per-conv ↔ Phase 4 多会话注入**:F-09 前置
-4. **REFACTOR-260619-04 审批状态机 ↔ `queue=decision` 待决策池**:审批对齐
-
-
-## 交接状态(2026-06-14)
-
-**代码健康度**:`cargo test --workspace` 全过、`npx vue-tsc --noEmit` 0 error(主代理独立验证,非 mission 自报)。
-
-**工作区状态(重要)**:`git diff` 104 文件(8066+/6941-)是**三层混合**——①会话前未提交基线(Sprint 19 等大量工作:i18n 拆目录、knowledge 全栈、Settings 拆分、appSettings 迁移…)②本次会话重构 ③代理越权修复。**接手前务必 `git diff` 通览区分**,勿整体当作单一改动提交。
-
-**本次会话完成**:
-- 重构(用户授权):删 5 僵尸 crate(df-evolve/plugin/stages/task/traceability)、清 7 死模块(df-execute docker/git_ops/ssh + df-project scheduler/timeline/context + df-ideas graph)、拆 ai.rs→`commands/ai/` 11 文件、拆 ai.ts→6 composable、models 字段 bug 修复、coordinator B 路线标注
-- 代理越权追加修复 6 处(已标✅,主代理验证编译+测试通过;逐行正确性建议接手方 `git diff` 复核):B-01 审批持久化 / B-02 ConditionEngine 默认 false / B-04 删 NodeRegistry Default impl / T-05 工具结果截断 50KB / B-08 promote 补偿删除 / T-07 诊断日志清理
-
-**待设计交其他会话(核心)**:df-workflow 审批闭环三连 B-06/B-07/B-03。**✅ B-03 设计已完成**(接手会话,2026-06-14):见 [B-03-人工审批响应机制-2026-06-14.md](./02-架构设计/已编号方案/B-03-人工审批响应机制-2026-06-14.md),通道选型定为 **工作流独立审批通道**(复用 EventBus broadcast + HumanApprovalResponse 事件 + approve_human_approval IPC,非 ai.rs AiApprovalRequired——后者是 AI Chat 工具审批路径,与工作流节点审批是两条独立链路)。拆 B-03a(响应等待 + 超时,不依赖 B-07)/ B-03b(取消机制)。**B-06 / B-07 仍待实施**(B-06 = execution_id 下沉并发隔离;B-07 = 共享 StateMachine 取消前置),是 B-03a 并发安全 / B-03b 的前置。
-
-**失控代理教训**:本次会话派的后台拆分代理在 stop hook 循环里失控,越权改代码/文档(先斩后奏)。接手方若再派 agent,注意约束其不碰决策记录(用户已要求手动触发)+ 限定单任务不自主续推。
-
----
-
## 待办
### 🔍 2026-06-21 AI Chat 技术债审查(workflow wf_92b61c35-4d2 · 10 模块串行 grep 核验)
@@ -164,27 +85,6 @@ graph TD
---
-### 📋 编排推进总览(2026-06-18 更新)
-
-未完成待办按可执行性分 8 组(详细条目见下方各分类,勿重复记录):
-
-| 组 | 说明 | 代表项 |
-|---|---|---|
-| **A todo 卫生** | 矛盾清理/被取代退役标注 | ✅ 本批已完成 |
-| **B 零风险减法** | 死链清/空壳合并 | ✅ 本批已完成 |
-| **C 需用户输入** | 阻塞,无法代办 | —(已归档)
-| **D 功能增强** | 设计清晰可推进(P1) | F-15-01 审批选项 / F-15-02 task 详情 / F-15-03 分页⚠️breaking / F-15-04 卡片折叠 |
-| **E 架构重投入** | 需设计,非小改 | F-14-01 模型能力 / F-14-07 trait 下沉 / ARC-05·06 store 拆·循环依赖 |
-| **F 全局 review P2 需设计** | 安全/竞态收口 | R-PD-4/5/6/8/9/12/13 + R-PD-10 .map_err 85 处 |
-| **H 长期功能池** | 不进主线 | F-14-02~10 / T-14-06 Settings 拆 / T-14-11 条件引擎 / B-14-05 / B-03b-R9 |
-
-**推进原则**:能并行不串行(独立子任务 8-12 并发);每批重汇总+全优先级重排+销账核对 ✅;C 组阻塞项不代办等用户。**本会话首批**:A 卫生 + B 清死链。
-
-**③④C类已迁**(2026-06-16):需人工决策项(③产品取舍 7 / ④设计方向 7 / 重投入排期 9 / C用户实测 5)见 [待决策.md](./待决策.md),从本文件抽离职责分离。**batch54 可自主批进展(2026-06-16·workflow wsfz7zl8i + 主代核查)**:复核-新⑪ 看门狗幽灵 ✅ 销账(清主窗口 state 视觉残留;**核验更正**:原 watchdog 幽灵已被 CR-260615-24 stopListener:371 clearStreamWatchdog 兜底);AE-03 diff预览 ⚠️ 降级阻塞(后端 write_file 未返 diff,待后端补,见 line 538);UX-04 断线保文 待 DEC-260616-03 授权(见待决策.md 🟡,本批不含)。
-
-
-> **📦 已完成项归档**: [07-项目管理/todo归档/2026-06.md](./07-项目管理/todo归档/2026-06.md) — 2026-06-18 拆分, 已完成 `[x]` 与历史分析段迁此。另有 [2026-06-18.md](./07-项目管理/todo归档/2026-06-18.md) / [2026-06-27.md](./07-项目管理/todo归档/2026-06-27.md) — 本次归档。
-
### 💡 2026-06-16 新需求(已分析·待实施)
> 功能需求,已走查定位链路 + 方案记录,待用户确认后实施。
@@ -200,7 +100,6 @@ graph TD
**中期(技术债)**
✅ ARC-260615-07 已决策:缓做(d归F-09B,其余ROI低不实施)
-### P1 — 重要缺陷
### 🟡 AI Chat 交互体验改进(2026-06-14 方案 → 待办化)
@@ -515,13 +414,9 @@ graph TD
> 来源:上下文管理批收口期 rev-backend/rev-frontend/rev-crates 三路走查(历三次会话重启后续跑完成)。**全文与批次归并建议见 `docs/05-代码审查/aichat三路走查报告-2026-10-02.md`**。以下为可执行登记,开工以现场源码为准。
-### 批次2(后端高危)并入项
-### 批次3(前端体验)并入项
-### 机械批(可独立小批)
-### 登记观察(定级前先核)
# 子代理调度走查(2026-10-03 两路,详情 temp/走查-子代理{UX,调度后端}-2026-10-03.md)
@@ -777,6 +672,7 @@ graph TD
### 桌面能力同步(随本批)
- [ ] G6 缺陷9 标题泄漏桌面同症随批修
+
## 无人值守可靠性专项(2026-10-06 swarm 立项,设计档:docs/02-架构设计/无人值守可靠性专项设计-20261006.md+temp/V49断点续跑设计-20261006.md)
## UI/UX 体验设计实施项(2026-10-06 设计档:temp/异步任务会话UIUX设计-20261006.md,依赖 13/14/16/17 机制先行)
@@ -839,8 +735,3 @@ graph TD
902. [ ] 超时失败后的一键继续入口: 流式首字节超时(120s,服务收了不响应,不可自动重试)报「响应超时,请重试」后流程中断——轮次重入预算耗尽(3/3)即彻底停,用户只见裸文案。修:超时失败落停靠语义(复用 emit_task_parked),停靠卡带「继续」(ai_continue_loop parked 分流已修好)——错误后一键续跑而非中断。体验缺口实证 2026-10-07 晚 u-switch 故障窗口。
903. [ ] u-switch 20:38-21:02 故障窗口根因深查: 11 连败+120s 首字节超时风暴(多会话多 provider 同时),21:0x 自愈。查 moyu-ops 机 u-switch 日志定因(上游抖动/服务重启/连接池耗尽),根治或加监控告警。**【21:5x AI-Ops 定因已实锤,journalctl 实测】上游连环降级雪崩非服务故障:api.deepseek.com 402 余额不足(冷却10m)+enterprise.moyu.info 401 认证失效(冷却10m)+sensenova kimi-k3 429/SSE空响应体(30s冷却循环)+bigmodel glm 429/SSE截断缺 message_stop——多通道同时打光致无首字节,冷却走完自愈。剩余工作=根治项:①switch-gw 的 deepseek 系 4 通道确认摘除(用户指认已摘但配置仍在役)②429 风暴时客户端退避协同(30s 冷却对重试风暴无效)③故障窗口告警。**(10-08 已处置:moyu 令牌过期续期+主链切 ds-flash,见 900 区段外 905)
-
-909. [x] **907 源头守静 + 无损归位(夹层根治)**(2026-10-10 devflow 接手登记,源自 907 补注遗留):现 907 修复走「未邻接即剥除」——保证不 400 但有损(夹层场景丢一轮工具交互)。
- - ✅ **① 源头守静(2026-10-10 实施完成,避让插入变体)**:df-ai 新增 `ContextManager::push_system_anchor`(context/mod.rs)——末条为悬空 `ToolCallHead` 时将 system 锚点插在**该头之前**(index=len-1),否则常规尾部追加;私有判定 `ends_with_dangling_tool_call_head`(`group==ToolCallHead`)。比原设计「推迟 push」更优:摘要/警示**不丢**,且楔入根本不产生。5 处尾部 push 全量收口(压缩成功 context_lifecycle:269 / 兜底 keyword_fallback_commit:372 / 警示 insert_system_notice helpers:44 / 主题标记 agentic/mod:1804 / 续轮 nudge :2399)。单测 `push_system_anchor_appends_on_normal_tail` + `push_system_anchor_avoids_dangling_tool_call_head` 锁定。验收:`cargo test -p df-ai --lib context` **155 passed/0 failed**;`cargo check -p devflow` EXIT 0。
- - ✅ **①-补 双取锁合并(2026-10-10 实施完成)**:`keyword_fallback_commit`(context_lifecycle.rs)内单锁一并 `set_compressing(false)` + 兜底提交,消「锁外复位→再取锁提交」的并发二次压缩窗口;复位置于 `KEYWORD_FALLBACK_ENABLED` 门控之前(开关关闭同样复位,否则标志永真致压缩停摆);两处调用点(provider 重建失败/LLM 失败)的独立复位块删除。验收:`cargo check -p devflow` EXIT 0 + `cargo test -p devflow --lib` **749 passed/0 failed**。
- - ✅ **② 无损归位(2026-10-10 实施完成)**:`crates/df-ai/src/context/sanitize.rs` 新增 step 0.5 `reorder_interlopers_after_tool_run`——楔入 assistant 头与其 tool 响应之间的异类消息(压缩摘要/用户插话/警示 system)**整体移到该组响应之后**(只重排不删内容),归位后 step1 邻接判定即认闭合,工具轮**不再被剥除**;仅对「单头 + 夹层 + 紧随该头的连续 tool 段」生效,遇下一个 tool_call 头即停(不跨单元),其余畸形仍走剥除兜底。幂等。单测替换旧剥除用例为 `sanitize_reorders_interloper_to_keep_tool_round` + 新增 `sanitize_reorder_is_idempotent`。验收:`cargo test -p df-ai --lib context` **156 passed/0 failed**。
diff --git a/scripts/archive-todo.cjs b/scripts/archive-todo.cjs
new file mode 100644
index 0000000..1ebfe1c
--- /dev/null
+++ b/scripts/archive-todo.cjs
@@ -0,0 +1,135 @@
+// 看板归档器:把 docs/todo.md 中「已完成」内容分离到 docs/07-项目管理/todo归档/.md。
+//
+// 移动规则(纯行搬运,零措辞改动):
+// ① 条目块为 [x] → 自动移出(其后续非条目行为同块延续,含缩进证据/引用块);
+// ② **白名单整段移出**:命令行给出的标题(用引号原样传入) → 该段连同其子段(级别更深的后续段)
+// 一并移出。历史/导航/已完成段走此路——**不靠启发式猜「已完成」**(本板存在大量无勾选的
+// 行内待办,启发式会误移)。
+// ③ 移出后残留的空标题(段内仅空行)自动删除,防悬空标题。
+//
+// 安全闸:未完成项([ ]/[~]/[→]/[!])零丢失断言失败即中止不写;默认 dry-run。
+//
+// 用法:
+// node scripts/archive-todo.cjs # dry-run
+// node scripts/archive-todo.cjs "## 🎯 统一规划(2026-06-26 全景)" # dry-run + 试移该段
+// node scripts/archive-todo.cjs --apply "## 交接状态(2026-06-14)" # 实际写入
+// node scripts/archive-todo.cjs --apply --date 2026-10-11 ...
+const fs = require('fs');
+
+const argv = process.argv.slice(2);
+const APPLY = argv.includes('--apply');
+const di = argv.indexOf('--date');
+const DATE = di >= 0 ? argv[di + 1] : new Date().toISOString().slice(0, 10);
+const li = argv.indexOf('--list');
+// 白名单来源:① 命令行位置参数(注意 Windows Git Bash 下中文会被编码破坏,慎用)
+// ② --list :UTF-8 文件,每行一个精确标题(推荐,避免编码问题)
+const WHITELIST =
+ li >= 0
+ ? fs.readFileSync(argv[li + 1], 'utf8').split('\n').map((s) => s.trim()).filter(Boolean)
+ : argv.filter((a, i) => !a.startsWith('--') && i !== di + 1 && i !== li + 1);
+
+const SRC = 'docs/todo.md';
+const ARC = `docs/07-项目管理/todo归档/${DATE}.md`;
+const UNDONE = /^\s*- \[[ ~→!]\]|^\d+\. \[[ ~→!]\]/;
+const DONE = /^\s*- \[x\]|^\d+\. \[x\]/i;
+const BLOCK = /^(\s*- \[|\d+\. \[)/;
+const HEAD = /^#{1,3} /;
+const level = (h) => (h.match(/^#+/) || [''])[0].length;
+
+// 行尾归一:工作区可能是 CRLF,按 \r?\n 切(否则标题比对带 \r 恒不等)。写回用 LF,git 提交时归一。
+const lines = fs.readFileSync(SRC, 'utf8').split(/\r?\n/);
+
+// 打标:``` 围栏内一律 text(防 mermaid/示例里的 ## 误导分段)
+const kinds = [];
+let inFence = false;
+for (const ln of lines) {
+ if (ln.trim().startsWith('```')) { kinds.push('text'); inFence = !inFence; continue; }
+ kinds.push(inFence ? 'text' : HEAD.test(ln) ? 'head' : BLOCK.test(ln) ? 'block' : 'text');
+}
+
+// 分段(首个 head 前为 preamble,永留主板)
+const segs = [];
+let cur = { head: null, headLevel: 0, items: [] };
+for (let i = 0; i < lines.length; i++) {
+ if (kinds[i] === 'head') { segs.push(cur); cur = { head: lines[i], headLevel: level(lines[i]), items: [] }; }
+ else cur.items.push(lines[i]);
+}
+segs.push(cur);
+const preamble = segs[0].head === null ? segs.shift() : null;
+
+// 块归并(块 = 条目起始行 + 其后非条目行)
+function blocksOf(items) {
+ const out = [];
+ let curB = null;
+ for (const ln of items) {
+ if (BLOCK.test(ln)) {
+ if (curB) out.push(curB);
+ curB = { status: DONE.test(ln) ? 'done' : UNDONE.test(ln) ? 'undone' : 'other', lines: [ln] };
+ } else if (curB) curB.lines.push(ln);
+ else out.push({ status: 'text', lines: [ln] });
+ }
+ if (curB) out.push(curB);
+ return out;
+}
+
+const moved = [];
+const kept = [];
+if (preamble) kept.push(...preamble.items);
+
+let treeLevel = null; // 白名单段的级别:更深的后续段随其移出
+let movedSegs = 0, movedBlocks = 0;
+for (const seg of segs) {
+ const whitelisted = seg.head !== null && WHITELIST.includes(seg.head);
+ const inTree = treeLevel !== null && seg.head !== null && seg.headLevel > treeLevel;
+ if (!seg.head) { /* 不可能:非 preamble 段必有 head */ }
+ if (whitelisted || inTree) {
+ if (whitelisted) treeLevel = seg.headLevel;
+ movedSegs++;
+ if (seg.head) moved.push(seg.head);
+ for (const b of blocksOf(seg.items)) moved.push(...b.lines);
+ continue;
+ }
+ treeLevel = null;
+ if (seg.head) kept.push(seg.head);
+ for (const b of blocksOf(seg.items)) {
+ if (b.status === 'done') { movedBlocks++; moved.push(...b.lines); }
+ else kept.push(...b.lines);
+ }
+}
+
+// 删残留空标题:仅当「段内只剩空行」且「下一个标题级别 ≤ 当前」才删——
+// 若下一个标题更深,说明它是**容器标题**(如 `## 待办` 下挂 `### 子节`),必须保留。
+const cleaned = [];
+for (let i = 0; i < kept.length; i++) {
+ if (HEAD.test(kept[i])) {
+ let j = i + 1;
+ while (j < kept.length && kept[j].trim() === '') j++;
+ const nextIsDeeper = j < kept.length && HEAD.test(kept[j]) && level(kept[j]) > level(kept[i]);
+ if (j >= kept.length || (HEAD.test(kept[j]) && !nextIsDeeper)) continue;
+ }
+ cleaned.push(kept[i]);
+}
+
+// 零丢失断言
+const origUndone = lines.filter((l) => UNDONE.test(l));
+const newUndone = new Set(cleaned.filter((l) => UNDONE.test(l)));
+const lost = origUndone.filter((l) => !newUndone.has(l));
+
+console.log(`[archive-todo] ${APPLY ? 'APPLY' : 'DRY-RUN'} date=${DATE} whitelist=${WHITELIST.length}`);
+console.log(` 整段移出 ${movedSegs} 段,条目块移出 ${movedBlocks} 个,移出 ${moved.length} 行,主板 ${cleaned.length} 行(原 ${lines.length})`);
+console.log(` 未完成项 原 ${origUndone.length} → 主板 ${newUndone.size},丢失 ${lost.length}`);
+if (lost.length) {
+ console.error('✗ 零丢失断言失败,不写入:');
+ for (const l of lost.slice(0, 10)) console.error(' ' + l.slice(0, 100));
+ process.exit(1);
+}
+console.log(' 移出段标题:');
+for (const l of moved.filter((x) => HEAD.test(x))) console.log(' - ' + l.slice(0, 90));
+
+if (!APPLY) { console.log('(dry-run,加 --apply 写入)'); process.exit(0); }
+if (moved.length === 0) { console.log('无内容可移,跳过写入'); process.exit(0); }
+
+let arc = fs.existsSync(ARC) ? fs.readFileSync(ARC, 'utf8').trimEnd() : `# todo 归档(${DATE})`;
+fs.writeFileSync(ARC, `${arc}\n\n---\n\n## ${DATE} 分拆(已完成内容再分离)\n\n${moved.join('\n')}\n`, 'utf8');
+fs.writeFileSync(SRC, cleaned.join('\n'), 'utf8');
+console.log(`[archive-todo] 已写入 ${SRC} 与 ${ARC}`);