dev-manager-tauri/.blueprint/CONVENTIONS.md

35 KiB
Raw Blame History

version updated source
1.7.0 2026-05-06 dev-manager-tauri

蓝图更新规则

⚠️ 本文件由 dev-manager-tauri 统一管理,请勿手动修改。规则更新请在 dev-manager-tauri 项目中进行。

本文件定义了 .blueprint/ 目录的维护规范,供 Claude 在对话中遵循。

目录结构

.blueprint/
├── manifest.yaml        ← 模块列表、关系、布局坐标
├── CONVENTIONS.md       ← 本文件Claude 行为规则 + 全局推荐规则库)
├── rules.md             ← 项目私有规则(可选,优先级高于全局规则)
├── usage.json           ← 飞轮外环快照数据(炼境自动写入)
└── modules/
    └── <module-id>.md   ← 每个模块的详情 + 任务卡

何时更新蓝图

事件 操作
用户确认了新需求 在 manifest.yaml 新增模块,创建 modules/.md
开始执行任务卡信息1 任务卡前缀改为 🔵status → in_progress第一行代码之前
完成了功能实现信息2 任务卡前缀改为 status → done验收通过之后
拆分了大需求为子任务 在 modules/.md 中添加任务卡
调整了架构方向 更新 edges 关系,可能调整 area
放弃了某个方向 删除对应模块和文件,或标记 status: abandoned
重构已完成的模块(迭代) manifest.iteration 递增,旧任务卡保留,新建替代任务卡,模块加 ## 迭代记录

任务卡复杂度定义

complexity 含义 判断标准 推荐执行模型
S Simple 单文件或机械操作;无需理解现有 pattern可独立完成 Haiku
M Medium 跨 2-4 个文件;需理解现有代码风格和上下文;有隐式依赖 Sonnet
L Large/Complex 系统架构级;无法直接执行,必须先 /architect 设计再 /splitter 拆分 Opus设计+ Sonnet执行

判断速查

  • 改动涉及 3 个以上文件且分属不同功能区域 → 至少 M
  • 需要先理解现有代码的内在逻辑或约定才能动手 → 至少 M
  • 无法在派发时清晰描述完整实现方案 → L需先 /architect
  • 单纯的 SQL 建表、类型文件、配置修改 → S

/auto-execute 技能会按此定义自动路由模型S 卡委托 Haiku 子 agentM 卡由当前 Sonnet 执行L 卡直接标记 blocked 并提示走 /architect

模块状态定义

状态 含义 色标
done 已实现并验证 🟢 绿色
in_progress 正在开发 🔵 蓝色
planned 已规划,需求明确 🟡 黄色
concept 构思中,信息不完整 灰色
blocked 执行受阻,需架构师介入 🔴 红色

任务卡格式

modules/.md 中的每个二级标题(###)是一张任务卡:

### 📋 任务标题
- status: todo
- complexity: M
- files: src/path/to/file.tsx, src-tauri/src/commands/xxx.rs
- depends: other-module-id
- acceptance: 简要描述完成标准
- blocked_reason: (仅 status: blocked 时填写)执行受阻的具体原因
- iteration: 1      # 可选,省略时继承 manifest 顶层 iteration 值
- replaces: 旧任务标题  # 可选,仅重构任务填写,说明本卡替代哪张旧卡

详细说明(可选)。

files 回填规则:任务卡的 files 在规划时填入预期路径。实现完成后,若实际文件与规划有出入(合并、拆分、重命名),须在标记 done 之前将 files 更新为实际路径——这保证下次续接或派发时上下文准确。

状态前缀

前缀 status 含义
done 已完成信息1 + 信息2 均已写入)
🔵 in_progress 执行中或被中断只有信息1等待信息2
📋 todo 可派发(信息充足)
💭 concept 构思中
🔴 blocked 执行受阻

可派发标准(📋

任务卡同时满足以下条件时标记为 📋

  1. status 为 todo
  2. 有明确的 files(涉及哪些文件)
  3. 有明确的 acceptance(验收标准)
  4. complexity 为 SM

不满足条件的 todo 任务保持无前缀,说明还需补充信息。

💭 concept 卡的极简写法

concept 卡是想法 inbox不要求 files / acceptance / complexity,随想随记:

### 💭 ServerManagerPanel 表格和软件块有重复逻辑
- status: concept

一行就够。等某次对话中方向变清晰,再补全字段、升格为 📋不要因为"信息不全就不记"而让想法消失——concept 卡存在的意义就是承接碎片。

manifest.yaml 规范

顶层字段

version: 1
name: 项目名称
iteration: 1        # 当前迭代号(默认 1重构已完成模块时手动递增
updated: YYYY-MM-DD

模块字段

- id: kebab-case-id        # 唯一标识,同时是 modules/ 下的文件名
  name: 显示名称
  area: frontend            # 所属领域 ID
  status: done              # done / in_progress / planned / concept
  progress: 100             # 0~100done 自动视为 100
  position: [x, y]          # React Flow 画布坐标(可选)

边字段

- from: module-a
  to: module-b
  type: dependency          # dependency实线/ related虚线

领域字段

- id: frontend
  name: 前端
  color: "#3B82F6"          # 节点边框/分组背景色

进度计算

模块的 progress 由其任务卡的完成比例推算:

  • 无任务卡的模块:手动设置 progress
  • 有任务卡的模块(单迭代):完成数 / 总数 × 100(取整)
  • 有任务卡的模块(多迭代):只计当前 iteration 的任务卡,旧迭代 done 任务不计入分母,避免历史完成率虚高

迭代管理

何时递增 iteration

需要递增(重构已完成的功能):

  • 一个已有 done 任务卡的模块需要重新设计或重写
  • 核心交互/架构方案被替换(不是在原有基础上扩展)

不需要递增(正常演进):

  • 在现有模块上添加新功能
  • 修复 bug
  • 新增模块

重构时的操作步骤

  1. manifest.yaml 顶层 iteration +1更新 updated 日期
  2. 旧任务卡:保留原位,在卡片末尾加一行注释说明被替代(不改 status、不删除
    ### ✅ 旧功能实现
    - status: done
    - iteration: 1
    ...
    > ⚠️ 已被迭代 2「新功能实现」替代仅作历史记录。
    
  3. 新任务卡:新建替代卡,标注 iterationreplaces
    ### 📋 新功能实现
    - status: todo
    - iteration: 2
    - replaces: 旧功能实现
    - complexity: M
    - files: ...
    - acceptance: ...
    
  4. 模块文件:追加 ## 迭代记录 段落(见下方格式)
  5. 模块 status:重置为 in_progressprogress 按当前迭代任务卡重新计算

迭代记录格式

模块文件末尾追加,每次迭代一条:

## 迭代记录

### 迭代 2YYYY-MM-DD
- **原因**React Flow 在 50+ 节点时性能卡顿,重构为虚拟化渲染方案
- **替代**「React Flow 节点图渲染迭代1」→「节点图虚拟化渲染」
- **保留**迭代1的任务卡作为历史记录不删除

梦核如何感知迭代

  • usage.json 快照携带 iteration 字段(见飞轮外环章节)
  • 飞轮数据层按 iteration 分组计算完成率,迭代跳变(如 1→2 后完成率骤降)是正常信号
  • 梦核 prompt 会展示「完成率跳变项目」摘要Opus 据此判断是主动重构还是项目失控

决策记录格式

模块文件中可添加 ## 决策记录 段落,记录架构决策的 WHY

## 决策记录

- 选择阿里云 OSS 而非 GitHub Releases 作为更新源,因为国内用户访问 GitHub 不稳定
- 使用 document-driven 蓝图而非数据库存储,因为 Claude 天然支持文件读写且可版本控制

桌面 App 会以琥珀色卡片展示在模块详情面板中。

飞轮工作流

Claude 在每次对话中应遵循以下流程:

阶段 1进入对话 — 读取蓝图

1. 读取 .blueprint/manifest.yaml     ← 项目全景和当前状态
2. 读取 .blueprint/CONVENTIONS.md    ← 工作流规则 + 全局推荐规则
3. 读取 .blueprint/rules.md          ← 项目私有规则(若存在,合并应用,优先级更高)
  • 识别哪些模块 in_progress哪些有可派发任务
  • 用简短话语告诉用户当前项目进展(如 "18/22 模块已完成2 个进行中"

阶段 2讨论需求 — 同步更新蓝图

用户说的 Claude 应做的
"我想加个 XX 功能" 确认需求后manifest 加模块 (status: concept),创建 modules/.md
"XX 功能需要 A、B、C 三步" 在模块文件中拆分为 3 张任务卡
"这个方案确定了" 模块 status → planned补充任务卡的 files/acceptance
"开始做 XX" 模块 status → in_progress
"为什么选这个方案" 记录到模块的 ## 决策记录

阶段 3实现功能 — 两阶段执行锁

任务卡执行遵循两阶段提交开始写第一行代码前加锁信息1全部完成后解锁信息2。只有信息1没有信息2说明任务被中断。

📋 todo
  ↓ 【信息1加锁】第一行代码改动之前先更新任务卡
🔵 in_progress
  ↓ 执行代码改动
  ↓
  ├─ 成功 → 【信息2解锁】更新任务卡前缀为 ✅ → status: done
  │         所有任务卡完成 → 模块 status: done
  │         更新 manifest.yaml 的 updated 日期
  │
  ├─ 失败且可自行解决 → 继续尝试,保持 🔵
  │
  └─ 失败且无法独立解决 → 🔴 blocked + blocked_reason → 留给架构师处理

锁悬空时的续接规则

新会话读蓝图发现 🔵 任务卡只有信息1没有信息2

  1. 检查任务卡的 files 字段,读取相关文件的当前代码状态
  2. 判断已完成什么、还缺什么
  3. 从断点继续执行,不重头来过
  4. 完成后补写 信息2关锁

架构师处理 blocked 任务

当 Opus 读蓝图发现 🔴 blocked 任务时:

  1. 分析 blocked_reason,定位根因
  2. 根据情况采取行动:
    • :任务本身拆得不好 → 标记原任务 abandoned → 产出新任务卡
    • :缺少前置依赖 → 创建前置任务卡 → 原任务加 depends
    • :架构方向需调整 → 更新模块设计/决策记录 → 重新拆任务卡
  3. 新任务卡就绪后,原 blocked 任务可标记为 abandoned 或更新为 todo

阶段 4回顾 — 用户在桌面 App 查看

用户打开蓝图可视化:

  • 看到全景进度
  • 在「下一步」面板查看可派发任务
  • 点击「复制派发」→ 粘贴给新 Claude 会话

飞轮的反馈信号

Claude 应关注这些信号来决定是否更新蓝图:

  • 用户说"这个做完了" → 标记 done
  • 用户说"这个不做了" → 标记 abandoned 或删除
  • 用户说"这个要拆一下" → 拆分任务卡
  • 用户说"记住这个决策" → 写入决策记录
  • 用户没提蓝图但在讨论功能 → 主动提议更新蓝图
  • 执行模型遇到无法解决的问题 → 标记 🔴 blocked + blocked_reason
  • Opus 看到 blocked 任务 → 分析原因,拆/补/调后产出新任务卡

对话中的复杂度漂移检测

碎片化想法在对话中自然累积有时从样式调整演变为架构改动。Claude 应主动识别并叫停。

漂移信号(以下任一出现即触发):

  • 原始请求是样式/布局,但现在涉及组件 state、props 或后端命令
  • 本次对话累计改动文件 ≥ 4 个,且分属不同功能区域
  • 用户说了"顺便"、"既然这样"、"要不也把 XX"
  • 前端改动已延伸到 DB 结构或 Rust 命令

Claude 的应对动作:检测到漂移信号时暂停执行,输出:

⚠️ 范围漂移:我们从「[原始请求]」走到了「[当前方向]」,累计涉及 [N] 个文件。建议: A) 完成当前这步,其余记为 💭 concept 卡待下次处理 B) 现在拉清单,走 /architect 重新规划 C) 继续执行,我在 session 结束前汇总成任务卡

Session 结束汇总:任何有代码改动但无预建任务卡的会话,结束前 Claude 应输出:

📋 本次会话实际改动:[文件列表 + 简述] 是否整理为蓝图任务卡?

交互质量复盘笔记

本章节仅适用于开发执行阶段(实现代码时),初始化蓝图或同步蓝图时无需执行。

每完成一张 M 或 L 复杂度的任务卡后Claude 应通过 append_project_noteMCP 工具写入一条结构化复盘笔记。这是飞轮外环的原始数据来源——积累足够多条后Claude 读一遍即可识别高频坑点和高效模式。

笔记格式

【复盘】<任务标题>
任务类型: 后端命令 | 前端组件 | 数据层 | MCP工具 | 架构调整
复杂度: S | M | L
实际轮数: N轮预估 M 轮)
是否返工: 是/否
返工原因: <若返工,一句话说明根因,如"WSL路径格式未预料">
有效策略: <本次奏效的做法,一句话>
遗留风险: <若有,一句话>
auto_applied_rules: R01, R06        ← 本次任务触发并执行了哪些规则(无则省略)
rule_effectiveness: R01=有效, R06=有效  ← 规则是否阻止了问题(有效/无效/未验证)

auto_applied_rules 填写说明

  • 仅记录本次任务实际触发Claude 主动检查或提示)的规则
  • 若规则触发但用户选择跳过,也应记录(用于统计触发频率)
  • rule_effectiveness=无效 表示规则触发了但没有阻止问题,这是最有价值的信号——梦核据此降低该规则置信度

触发时机

情况 操作
M/L 任务卡标记为 done 写一条复盘笔记source: mcp
遇到非预期的系统边界或平台差异 额外写一条"陷阱记录",遗留风险填具体复现条件
同类问题第二次出现 在新笔记中引用旧笔记时间戳,说明"同类问题复发"

示例

【复盘】WSL项目路径检测
任务类型: 后端命令
复杂度: M
实际轮数: 6轮预估 2 轮)
是否返工: 是
返工原因: wsl_path 字段存的是 Windows UNC 格式(\\wsl.localhost\Ubuntu-22.04\...),而非 Linux 路径,导致 wsl 子命令收到错误参数
有效策略: 在函数入口统一用 unc_to_distro_and_linux() 转换,一次解析,全程复用
遗留风险: Path::exists() 对 \\wsl.localhost\ 路径无效,所有 WSL 路径存在性检查必须走 wsl -d distro -- test -d/f
auto_applied_rules: R10
rule_effectiveness: R10=未验证(任务开始前未触发,事后归因)

这些笔记不替代决策记录(决策记录记架构 WHY复盘笔记记执行 HOW 和踩坑)。两者都写。


飞轮外环(跨项目数据反哺)

内环描述的是单项目的执行流程。外环负责把多个项目的执行数据聚合起来,反哺 CONVENTIONS 本身

数据采集usage.json 快照

每次 Claude 读取 .blueprint/manifest.yaml(通过炼境打开蓝图时触发),炼境自动向项目的 .blueprint/usage.json 追加一条当日快照:

{
  "project_name": "my-project",
  "snapshots": [
    {
      "at": "2026-04-05T10:00:00Z",
      "conventions_version": "1.3.0",
      "iteration": 1,
      "modules": { "total": 22, "done": 18, "in_progress": 2, "planned": 1, "concept": 1, "blocked": 0, "stalled": [] },
      "tasks": { "total": 45, "done": 38, "in_progress": 3, "blocked": 0, "todo": 4, "dispatched": 3 },
      "blocked_reasons": []
    }
  ]
}
  • dispatched = 当前满足📋可派发条件的任务数(有 files + acceptance + complexity S/M
  • 节流:同一 UTC 日期只写一条,避免多次打开导致数据膨胀
  • 文件存于项目本地,不上传服务器

数据聚合:飞轮指标

炼境跨项目读取所有 usage.jsonconventions_version 分组,对每个版本队列计算 4 项指标:

指标 计算方式 含义
可派发率 dispatched / total tasks 任务卡规划质量,越高说明任务定义越清晰
任务完成率 done / total tasks 整体执行进度均值
飞轮持续率 30天内有快照的项目比例 外环是否在持续运转
阻塞密度 blocked / total tasks 系统性阻塞程度,越低越好

迭代感知:同一项目若 iteration 值增大,说明发生了主动重构。飞轮数据层对此类项目单独计算「当前迭代完成率」,与历史累计值区分展示,避免虚高。梦核 prompt 中标注「完成率跳变项目」供 Opus 分析是健康重构还是项目失控。

梦核分析:记忆巩固

炼境将聚合数据 + 当前 CONVENTIONS 全文格式化为提示词,发给 Claude Opus 做两件事:

  • 固化:哪些跨项目重复出现的阻塞模式、哪些有效实践,值得写进 CONVENTIONS
  • 遗忘哪些休眠项目90天无快照的 AI 文档可以归档,哪些 CONVENTIONS 规则已过时

闭环路径

两条并行的反馈路径,速度不同:

【快速路径 — 项目级,无需发版】
执行任务 → 复盘笔记auto_applied_rules
              ↓
         梦核分析项目笔记
              ↓
         输出项目私有规则草案
              ↓
         用户确认 → 写入 .blueprint/rules.md
              ↓
         下次对话立即生效

【慢速路径 — 全局级,需发版】
执行任务 → usage.json 快照
              ↓
         炼境跨项目聚合指标
              ↓
         梦核提示词 → Claude Opus 分析
              ↓
         用户/维护者审核建议
              ↓
    更新 CONVENTIONS.md 源码 + 版本号
              ↓
         发布新版炼境
              ↓
    治理面板 sync_blueprint_rules → 分发到各项目

设计意图快速路径响应单个项目的学习慢速路径沉淀跨项目的共识。CONVENTIONS.md 编译进炼境二进制保证全局规则版本可追溯rules.md 存于项目本地实现快速迭代。两条路径互补,共同构成择升环。

无 MCP 环境兼容Qwen Code / 其他 AI

部分 AI 助手(如 Qwen Code不支持 MCP 协议,无法调用炼境工具。此时用等价文件操作代替,行为与 MCP 调用一致:

MCP 工具 等价文件操作
get_project_blueprint 直接读取 .blueprint/manifest.yaml
get_project_file 直接读取对应文件路径
append_project_note 直接编辑 .blueprint/modules/<id>.md,在对应任务卡末尾追加复盘笔记
get_diagnostics 跳过,不影响主流程
list_group_projects 跳过,由用户告知上下文

飞轮外环的缺口

无 MCP 环境下,usage.json 快照不会被炼境自动写入(触发写入的是炼境响应 MCP 调用时的副作用)。

影响范围:飞轮外环的跨项目统计数据本次会话不计入。飞轮内环(单项目蓝图维护、任务卡状态、复盘笔记)不受影响。

补偿方式Qwen Code 会话结束后,在炼境中手动打开该项目蓝图,触发一次快照写入即可。


复杂功能分析流程(/architect

当需求复杂度为 L 级时,在写任何代码之前执行本流程。

步骤

  1. 读取 manifest.yaml,定位相关模块和依赖关系
  2. 读取受影响的核心文件,理解现有实现模式和系统边界
  3. 输出设计文档,格式如下:
## 设计决策:<功能名>

### 背景
<关联的现有模块>

### 方案选择
<2-3 个方案及取舍,标注选定方案>

### 受影响文件
- 新增:<路径> — <用途>
- 修改:<路径> — <改动说明>

### 系统边界变更
<新增接口 / 数据表 / 字段定义>

### 风险点
- <风险><规避方式>

### 拆解建议
建议拆为 N 张任务卡依赖顺序卡A → 卡B → 卡C
  1. 不写任何代码,设计文档经用户确认后再进入拆解流程

任务拆解流程(/splitter

在设计文档确认后执行,产出可派发任务卡并写入蓝图文件。

步骤

  1. 确认目标模块 id读取对应 modules/<id>.md
  2. 按以下原则拆解:
    • 粒度:每张卡 complexity 必须是 S 或 M不允许 L
    • 依赖顺序:数据层 → 后端命令 → 前端封装 → UI 组件
    • 可派发标准:每张卡必须有 files + acceptance + complexity
  3. 将任务卡追加到 modules/<id>.md
  4. 更新 manifest.yamlstatus → planned,更新 updated 日期
  5. 输出拆解摘要卡名、complexity、执行顺序

质量检查

  • 每张卡有 files
  • 每张卡有 acceptance
  • complexity 全部是 S 或 M
  • 有依赖的卡填了 depends
  • 任务卡按执行顺序排列

技能依赖

本蓝图工作流依赖以下 Claude Code 技能处理 L 级复杂任务:

技能 触发词 用途
architect /architect 复杂功能架构分析,输出设计文档
splitter /splitter 将设计文档拆解为可派发任务卡

检测方式

在 Claude Code 中输入 /architect,若 Claude 开始执行架构分析步骤则已就绪。 若提示找不到技能,按以下方式安装。

安装方式

技能文件随本项目分发,位于 .claude/skills/

# 复制到全局技能目录(任意项目均可使用)
cp -r .claude/skills/architect ~/.claude/skills/
cp -r .claude/skills/splitter ~/.claude/skills/

# 或仅在当前项目使用(.claude/skills/ 已存在则无需操作)

若通过炼境同步本蓝图规则,.claude/skills/ 会随蓝图一并分发,无需手动安装。


Rust 代码可测试性规范

本规范仅适用于新增 Rust 函数,存量代码不强制回填。

强制规则

禁止在业务函数内部调用 pool().get(),改为由调用方传入连接:

// ❌ 禁止(无法在测试中注入 in-memory DB
pub fn my_fn(args: Vec<String>) -> Result<Vec<Foo>, String> {
    let conn = crate::db::pool().get()?;
    ...
}

// ✅ 正确(依赖注入,测试可传入 in-memory DB
pub fn my_fn(conn: &rusqlite::Connection, args: Vec<String>) -> Result<Vec<Foo>, String> {
    ...
}

// Tauri command 层负责获取连接并调用
#[tauri::command]
pub fn my_command(args: Vec<String>) -> Result<Vec<Foo>, String> {
    let conn = crate::db::pool().get().map_err(|e| e.to_string())?;
    my_fn(&conn, args)
}

测试要求

函数类型 测试要求
纯逻辑函数(无 DB 必须附带 #[cfg(test)] 测试
含 DB 的业务函数 必须使用依赖注入写法,附带 in-memory DB 测试
Tauri command 薄包装层 无需测试(只做连接获取 + 函数调用)

任务卡 acceptance 模板补充

含 Rust 业务逻辑的 M/L 任务卡acceptance 须包含:

- [ ] 新增函数使用依赖注入conn 作为参数)
- [ ] 附带 #[cfg(test)] 测试,覆盖主路径 + 空数据边界
- [ ] cargo test 通过

测试写法模板

#[cfg(test)]
mod tests {
    use super::*;
    use rusqlite::Connection;

    fn setup() -> Connection {
        let conn = Connection::open_in_memory().unwrap();
        // 建表语句(从 db::migrate 复制对应部分)
        conn.execute_batch("CREATE TABLE IF NOT EXISTS ...").unwrap();
        conn
    }

    #[test]
    fn test_主路径() {
        let conn = setup();
        // 插入测试数据
        // 调用函数
        // 断言结果
    }

    #[test]
    fn test_空数据返回空集合() {
        let conn = setup();
        let result = my_fn(&conn, vec![]);
        assert!(result.unwrap().is_empty());
    }
}

前端代码可测试性规范

本规范适用于新增 TypeScript/React 代码,存量代码不强制回填。

测试文件位置

前端测试文件与源文件同目录,命名约定:<filename>.test.ts(x)

src/components/MyComponent.tsx
src/components/MyComponent.test.tsx   ← 同目录、同名 + .test 后缀

src/lib/utils.ts
src/lib/utils.test.ts                ← vitest 自动发现

测试框架

使用 vitest + describe/it/expect,配置见项目根 vitest.config.ts

测试要求

代码类型 测试要求
纯逻辑函数(数据处理、格式化、解析、校验) M 级任务卡强制附带测试,覆盖主路径 + 空/边界
React 组件(含状态管理、数据流) M 级任务卡建议附带测试,至少覆盖关键交互路径
纯样式组件 / Tauri IPC 薄包装层 无需测试

任务卡 acceptance 模板补充

含前端纯逻辑的 M 级任务卡acceptance 须包含:

- [ ] 附带 vitest 测试,覆盖主路径 + 空数据边界
- [ ] npx vitest run 全绿

测试写法模板

import { describe, it, expect } from "vitest";
import { myFunction } from "./utils";

describe("myFunction", () => {
  it("正常路径", () => {
    expect(myFunction("input")).toBe("expected");
  });

  it("空输入不报错", () => {
    expect(myFunction("")).toBeNull();
  });

  it("非法输入返回安全默认值", () => {
    expect(myFunction("invalid")).toBeNull();
  });
});

项目私有规则rules.md

每个项目可以在 .blueprint/rules.md 中维护仅对本项目生效的推荐规则,格式与全局规则库完全相同。

优先级

项目私有规则(.blueprint/rules.md> 全局规则CONVENTIONS 自动推荐规则库)

项目私有规则更精准(来自该项目真实数据),全局规则更广泛(来自跨项目共识)。冲突时项目规则优先。

对话开始时的读取顺序

1. manifest.yaml          ← 项目全景
2. CONVENTIONS.md         ← 协议定义 + 全局规则
3. .blueprint/rules.md    ← 项目私有规则(若存在,合并应用)

梦核写入路径

梦核(飞轮阶段三启动后)分析项目复盘笔记后,除了输出 CONVENTIONS 更新建议,还应输出项目私有规则草案,格式如下:

## 建议新增项目私有规则

| rule_id | 触发条件 | 自动动作 | confidence | evidence_count | derived_from |
|---------|---------|---------|-----------|---------------|-------------|
| P01 | <本项目特有触发条件> | <自动动作> | 0.70 | 3 | <复盘笔记引用> |

用户确认后Claude 直接将规则写入 .blueprint/rules.md无需等待炼境发版。这是项目级择升环与全局发版解耦的关键路径。

rules.md 文件格式

# 项目私有规则

> 本文件由梦核分析 + 用户确认后生成Claude 每次对话开始时读取并合并应用。
> 规则格式与 CONVENTIONS 自动推荐规则库相同,优先级高于全局规则。

## 规则列表

### P01 — 规则标题
- **触发条件**xxx
- **自动动作**xxx
- **confidence**: 0.70
- **evidence_count**: 3
- **derived_from**: 复盘笔记 YYYY-MM-DD任务"xxx"中发现

何时创建 rules.md

  • 梦核首次输出项目私有规则建议时创建
  • 也可手动创建,记录人工识别的项目特有模式
  • 文件不存在时跳过,不影响全局规则生效

自动推荐规则库

本章节定义了 Claude 在开发过程中应主动触发的高收益决策规则。
规则有置信度confidence和证据数evidence_count置信度越高越应自动执行无需用户确认。

执行策略

confidence 范围 执行方式
≥ 0.80 直接执行,仅一行说明("按 R01 检查..."
0.60 ~ 0.79 执行前单句说明原因,用户可跳过
< 0.60 仅作提醒,不自动执行

置信度由梦核(阶段三启动后)根据 evidence_count 和有效率自动更新;在此之前由人工在复盘中维护。

scope 字段

每条规则有 scope 字段标明适用范围。Claude 应在应用规则前检查当前项目是否匹配:

scope 值 含义
universal 适用于任何代码项目
tauri 仅适用于 Tauri 项目
rust 仅适用于含 Rust 后端的项目
sqlite 仅适用于使用 SQLite 的项目
react 仅适用于 React 前端项目

多个 scope 用 + 连接,如 tauri+rustscope 不匹配时跳过该规则,不作提醒。

项目私有规则(rules.md)无需 scope 字段,默认对本项目全部生效。

规则列表

R01 — 新增 Tauri command 时检查前端封装层

  • scope: tauri
  • 触发条件:在 src-tauri/src/commands/ 下新增 #[tauri::command] 函数
  • 自动动作:读取 src/lib/commands.ts,确认是否有对应封装;缺失则提示补写,不阻止执行
  • confidence: 0.90
  • evidence_count: 8
  • derived_from: 多次发生前后端接口断层(命令已实现但 commands.ts 未同步,前端调用报错)

R02 — 任务卡无 acceptance 时先补写再动代码

  • scope: universal
  • 触发条件:任务卡 acceptance 字段为空或缺失,但已准备开始执行
  • 自动动作:暂停执行,根据任务描述推导验收标准草稿,请用户确认后再写第一行代码
  • confidence: 0.92
  • evidence_count: 18
  • derived_from: 无验收标准导致完成定义模糊,任务频繁反复("做完了但感觉不对"

R03 — M/L 任务标记 done 后写复盘笔记

  • scope: universal
  • 触发条件M 或 L 复杂度的任务卡状态变更为 done
  • 自动动作:调用 append_project_note 写入复盘笔记(见"交互质量复盘笔记"章节格式)
  • confidence: 0.88
  • evidence_count: 24
  • derived_from: 飞轮外环数据来源,无复盘笔记则梦核无输入,整个飞轮断链

R04 — 对话改动 ≥ 4 个跨功能区文件时触发漂移警告

  • scope: universal
  • 触发条件:单次对话累计改动文件 ≥ 4 个且分属不同功能区frontend/backend/infra
  • 自动动作:输出范围漂移提示(见"对话中的复杂度漂移检测"章节),给出 A/B/C 三个选项
  • confidence: 0.85
  • evidence_count: 12
  • derived_from: 多次"样式改动演变成后端重构"的失控扩散,最终要么返工要么留下技术债

R05 — SQLite 涉及新表或新字段时检查 migration

  • scope: sqlite
  • 触发条件:在项目中出现 CREATE TABLE / ALTER TABLE / 新增列定义
  • 自动动作:检查是否有对应 migration 逻辑;缺失则提示添加,防止旧版本升级后 schema 断裂
  • confidence: 0.82
  • evidence_count: 7
  • derived_from: 数据库 schema 变更未同步 migration导致旧安装版本升级后启动报错

R06 — Rust 业务函数含 DB 操作时强制依赖注入

  • scope: rust+sqlite
  • 触发条件:新增 Rust 函数内部直接获取 DB 连接(pool().get() 或等价写法)
  • 自动动作提示改为依赖注入写法连接由调用方传入command 层负责获取连接
  • confidence: 0.93
  • evidence_count: 15
  • derived_from: 飞轮阶段一实现时无测试导致静默 bug 上线;依赖注入是唯一能让 in-memory DB 测试覆盖业务逻辑的方式

R07 — 数据关键路径函数必须附带单元测试

  • scope: universal
  • 触发条件:新增函数负责数据采集、聚合、解析等关键路径(影响下游分析或展示的正确性)
  • 自动动作:在实现函数前提醒附带单元测试,覆盖正常路径 + 空数据边界;完成后验证测试全绿
  • confidence: 0.95
  • evidence_count: 6
  • derived_from: 飞轮阶段一数据采集 bug 因无测试静默上线,污染所有下游分析

R08 — UI 状态显示必须来自真实检测

  • scope: universal
  • 触发条件:前端组件显示运行状态、健康状态、操作结果等实时信息
  • 自动动作:检查对应后端是否做了真实检测而非硬编码;发现硬编码状态时标记为需修复
  • confidence: 0.87
  • evidence_count: 5
  • derived_from: 设置页 MCP 状态硬编码为"运行中",注入失败时 toast 始终显示成功——UI 掩盖真实问题

R09 — 自动化边界:事件触发只标 🔵,不标

  • scope: universal
  • 触发条件讨论或实现基于外部事件git commit、CI 结果等)自动更新任务卡状态
  • 自动动作:确认自动化只将任务卡置为 🔵 in_progress绝不自动置为 done完成语义需人工或 Claude 验收确认
  • confidence: 0.91
  • evidence_count: 4
  • derived_from: 代码提交 ≠ 功能验收通过,自动标完成导致数据与实际不符

R10 — 对接外部协议/API 前先验证客户端实际行为

  • scope: universal
  • 触发条件实现与外部客户端的协议对接MCP、LSP、WebSocket、SSE、OAuth 等)
  • 自动动作在开始实现前先通过文档或工具curl、抓包确认客户端实际发出的请求格式不基于"通用规范"假设行为
  • confidence: 0.85
  • evidence_count: 3
  • derived_from: Claude Code MCP 客户端用 GET 发起 SSE 握手,炼境只接受 POST 导致 405MCP 整体失效

规则演进路径

人工识别(初始)
    ↓ evidence_count 累积 5+ 次
低置信验证期confidence 0.60~0.79
    ↓ 持续有效evidence_count 15+
自动执行期confidence ≥ 0.80
    ↓ 发现无效或场景已变化
降级/归档confidence 跌至 0.4 以下)

梦核(飞轮阶段三启动后)将根据复盘笔记中的 auto_applied_rulesrule_effectiveness 字段自动更新 confidence。


注意事项

  • 不要删除已完成的任务卡,它们是项目历史的一部分
  • 模块 id 一旦确定尽量不要修改(会影响 edges 引用)
  • 每次更新后修改 manifest.yaml 顶部的 updated 日期
  • progress 由桌面 App 自动从任务卡完成比例计算,不需要手动维护
  • 当用户的操作隐含了蓝图变更但没有明说时Claude 应主动提议更新(而非沉默)
  • 批量执行完成后须做完整性检查:同一会话内连续完成多张任务卡时,结束前必须逐一确认:① 每张已完成的子任务 status 改为 done前缀改为 ;② manifest.yaml 中对应模块的 status 已同步更新。两层缺一不可。(背景:单卡两阶段流程天然同步,批量执行时容易只改模块级 status 而漏掉子任务级更新,导致 App 看板 progress 数据失真)