新增: 看板归档器 + 已完成内容再分离
- 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 及其验收块
This commit is contained in:
@@ -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 目标钉扎<br/>✅代码 8ce18cb"]:::done
|
||||
P1["父① 小bug攒批<br/>✅①.2/①.3(①.1过时·①.4归⑤)"]:::done
|
||||
P2["父② 知识图谱Phase1<br/>✅Phase1(数据层+业务层)"]:::done
|
||||
P3["父③ AI对话体验<br/>📋待办"]:::todo
|
||||
P4["父④ F-09 per-conv<br/>✅前端per-conv(accessor)"]:::done
|
||||
P5["父⑤ 灵感模块<br/>✅完成(⑤.1/①.4/⑤.2)"]:::done
|
||||
P6["父⑥ Phase2-5<br/>🔨Phase2-3✅·4-5待办"]:::doing
|
||||
P7["父⑦ 技术债<br/>📋待办"]:::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**。
|
||||
|
||||
|
||||
+1
-110
@@ -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 目标钉扎<br/>✅代码 8ce18cb"]:::done
|
||||
P1["父① 小bug攒批<br/>✅①.2/①.3(①.1过时·①.4归⑤)"]:::done
|
||||
P2["父② 知识图谱Phase1<br/>✅Phase1(数据层+业务层)"]:::done
|
||||
P3["父③ AI对话体验<br/>📋待办"]:::todo
|
||||
P4["父④ F-09 per-conv<br/>✅前端per-conv(accessor)"]:::done
|
||||
P5["父⑤ 灵感模块<br/>✅完成(⑤.1/①.4/⑤.2)"]:::done
|
||||
P6["父⑥ Phase2-5<br/>🔨Phase2-3✅·4-5待办"]:::doing
|
||||
P7["父⑦ 技术债<br/>📋待办"]:::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**。
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
// 看板归档器:把 docs/todo.md 中「已完成」内容分离到 docs/07-项目管理/todo归档/<date>.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 <file>: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}`);
|
||||
Reference in New Issue
Block a user