Compare commits

...

3 Commits

Author SHA1 Message Date
lanrtop
d15d3895d7 docs(conventions): v1.12.0——动工前辩证收缩进约定 + 使者回传处置台账
All checks were successful
Push & PR Check / check (push) Successful in 1m24s
- CONVENTIONS 飞轮工作流阶段 2 末新增「动工前辩证收缩」(M/L 卡必做),
  附 07-15 实证:3 张初稿卡直做会错 2/3,辩证后 U3/B4 零返工
- governance-feedback-loop 落 23 条使者回传处置台账:本轮 3 项落地
  (/ship 铁律与规模闸修正、MCP 重试说明、envoy 硬门槛)、
  11 条核实此前已落地、5 项 log_for_review 待观察、2 个遗留尾巴
2026-07-18 09:43:57 +09:00
lanrtop
f0e5b70025 fix(onboarding/envoy): 使者分类加「非显而易见」前置硬门槛
常识性设计知识与触发条件过窄的 corner case 一律留本项目,
堵住 enterprise-system 2 例误回传的根因(07-18 使者回传 confirmed)。
顺带补 skill 描述行便于命令发现。
2026-07-18 09:43:41 +09:00
lanrtop
b01f1d1d81 fix(agent-infra): 修复框架扫描漏报 Tauri+React 项目的两个 bug
Bug 1:Tauri 检测条件过严
- 原条件要求 src-tauri/src/commands/ 目录存在才能识别 Tauri
- 新项目初始化时只有 lib.rs + main.rs,commands/ 未创建,导致整个 Tauri 检测跳过
- 修复:只检查 Cargo.toml 含 tauri 依赖,commands/ 用 confidence 反映是否已建

Bug 2:detect_contracts() 无前端框架检测
- Node.js 框架段只覆盖后端(Drizzle/Prisma/Hono/Express/Fastify/tRPC)
- 新增 React / Vite / Zustand 三个检测分支
2026-07-17 16:50:51 +09:00
4 changed files with 85 additions and 18 deletions

View File

@ -1,6 +1,6 @@
---
version: 1.11.0
updated: 2026-07-15
version: 1.12.0
updated: 2026-07-18
source: dev-manager-tauri
---
@ -311,6 +311,17 @@ Claude 在每次对话中应遵循以下流程:
> 开始写代码前,先判断改动类型:**Bug Fix**(意外偏差,直接执行)还是 **Feature**(新增能力/主动改变行为,必须先输出确认卡等触发词)。完整触发规则见 AGENTS.md「需求对齐协议」章节。
#### 动工前辩证收缩M/L 卡必做S 卡可跳过)
任务卡拆好后、加锁动工前,对每张 M/L 卡做一轮**多角度辩证**,典型追问:
- **该不该做**:这张卡解决的问题是真实的吗?做了会不会伤及已有体验(如自动触发打断用户节奏)?→ 可能直接否决
- **载体对不对**实现层选对了吗hook vs 数据层、前端 vs 后端、轮询 vs 事件)?→ 可能翻转载体
- **设计有没有洞**:边界条件、并发、旧数据兼容有没有漏?→ 补进任务卡
辩证结论写回任务卡(否决的标 abandoned 并记原因)。
实证2026-07-15 炼境自身3 张初稿卡辩证后 1 张否决、1 张载体翻转、1 张补两处设计缺陷——直做会错 2/3实施后 U3/B4 零返工。
### 阶段 3实现功能 — 两阶段执行锁
任务卡执行遵循**两阶段提交**开始写第一行代码前加锁信息1全部完成后解锁信息2。只有信息1没有信息2说明任务被中断。

View File

@ -48,6 +48,27 @@
**落地物**最小版执行成本趋零AGENTS.md / 接入包模板 / agents-meta-rules 增设「自验报告纪律」三条;用户侧两个习惯(先看「没验什么」;意外感或外部契约变更时深查)。刻意不做:新工具、强制 hook、报告模板系统——坑驱动增量人肉版跑出疼点后再在本模块机制化。
## 使者回传处置台账2026-07-18 消化,共 23 条)
### 已落地(本轮 3 项)
- **/ship 三处模板修正**`~/.claude/commands/ship.md`,全局命令即分发源):① blueprint 尾 commit 铁律改为「每轮 /ship 的最后一个 PR 末位 commit」多 PR 场景 manifest 单文件不可能每 PR 都带);② 规模闸补两个不可拆例外(单一功能域强耦合 / 全新业务线初版)→ 警告放行不阻塞;③ MCP 连接错误注明可原地重试 2~3 次(偶发抖动非业务失败)
- **envoy.md 分类硬门槛**接入包全托管文件Step 3 前置追问「任何有经验的工程师是否会提前想到?」——常识性知识与过窄 corner case 一律留本项目,堵住 2 例误回传的根因
- **CONVENTIONS v1.12.0**:飞轮工作流阶段 2 末新增「动工前辩证收缩」M/L 卡必做),实证返工率对照写入
### 此前会话已落地11 条,本轮核实关闭)
MANAGED 块警示5b0b068、Bug Fix/Feature 分类 + S 级轻量卡 + 汇总补录限定语67bdacb AGENTS v1.5.0、蓝图机器门控f04eb6e blueprint-gate 双层,回应 07-09「文档约束无机器门控」假设、lefthook API typecheck 必填项 + CONVENTIONS scope 前置提示be2f695 v1.11.0、Playwright 版本锁死AGENTS tmpl、agent_verify/human_verify 分层AGENTS + CONVENTIONS、/ship 阶段八 rebase 前 stash 保护(已在 ship.md、空路径分发防护473cf7e
### 待观察log_for_review暂不动模板
- **verify_onboarding lefthook 键名匹配是名义非语义**等价功能不同键名会误报缺失enterprise-system 6/7 fail 待核实是缺失还是改名
- **/ship 运行期间并行开发混入变更**under_validation建议最终报告对比第零步 status 快照、新增变更单独列出不纳入本轮——再积累 1~2 次实例后进模板
- **/antirot 命令模板化**enterprise-system 实现的文档防腐命令(机器验+文档一致性+蓝图健康三步),候选纳入接入包标配
- **Loop 模型路由**Haiku=Observer / Sonnet=Actor与**种子层/土壤层分工**enterprise-system 特有 Loop 体系,尚不构成跨项目通用约定,观察其长期效果
- **OpenAI SDK tool_calls 联合类型守卫**:可作 AI 代码审查检查项候选project_type:web
### 遗留尾巴
- src-tauri/ 下 6 处空路径污染残留(.blueprint/.claude/docs/AGENTS.md/CLAUDE.md/lefthook.yml均 untrackedliangjing.json 指向「agent编排界面(opencode)」——2026-07-18 会话中删除操作被用户拦下,保留待人工决定
- envoy.md 硬门槛已进模板,**需重建安装炼境后 apply 才会分发到子项目**(模板打包在二进制资源)
## 任务卡
concept 阶段L 级——待 /architect 设计确认后由 /splitter 拆卡)

View File

@ -1,3 +1,5 @@
在子项目会话结束时扫描体系级洞察、回传给炼境。Use at the end of a session in a managed project.
<!-- 由炼境托管:重跑接入包会用最新模板覆盖本文件,请勿在此做项目定制 -->
你是**炼境使者**——在子项目会话里代表炼境执行现场感知与回传。
@ -16,7 +18,12 @@
## Step 3分类每条洞察
**📦 带回炼境**(满足任一条):
**前置硬门槛(先于一切分类判断)**:问自己——**任何有经验的工程师是否会提前想到这一点?**
- 会(常识性设计知识,如"外键优于业务字段关联")→ 一律归「留本项目」,不得回传
- 触发条件过窄的 corner case复现依赖本项目特定组合→ 同样归「留本项目」
- 只有**非显而易见、且跨项目可复用**的教训才有资格进入下方分类
**📦 带回炼境**(通过硬门槛后,满足任一条):
- 炼境分发的模板 / 约定 / 接入包有 bug 或可改进
- 某工作流或实践有明确代价或验证结果(有具体证据)
- 会影响多个项目的体系级改进(哪怕还是假设)

View File

@ -128,12 +128,7 @@ fn detect_contracts(root: &Path) -> Vec<DetectedContract> {
let cargo_content = std::fs::read_to_string(root.join("Cargo.toml"))
.or_else(|_| std::fs::read_to_string(root.join("src-tauri/Cargo.toml")))
.unwrap_or_default();
// Tauri 项目commands 目录在 src-tauri/src/commands/
let tauri_commands_path = if path_exists(root, "src-tauri/src/commands") {
"src-tauri/src/commands"
} else {
"src/commands"
};
// ── Node.js 框架层 ────────────────────────────────────────────────────────
@ -226,6 +221,37 @@ fn detect_contracts(root: &Path) -> Vec<DetectedContract> {
});
}
// React前端组件层
if pkg_deps.iter().any(|k| k == "react") {
contracts.push(DetectedContract {
label: "前端组件类型React/TypeScript".into(),
paths: vec!["src/**/*.tsx".into()],
doc: "组件 Props 类型变更需检查所有消费方".into(),
confidence: "medium".into(),
});
}
// Vite 构建配置
if pkg_deps.iter().any(|k| k == "vite") {
let p = "vite.config.ts";
contracts.push(DetectedContract {
label: "构建配置Vite".into(),
paths: vec![p.into()],
doc: "Vite 配置变更影响构建输出和 dev 行为Tauri 项目尤其注意)".into(),
confidence: confidence(root, p),
});
}
// Zustand 状态层
if pkg_deps.iter().any(|k| k == "zustand") {
contracts.push(DetectedContract {
label: "前端状态类型Zustand store".into(),
paths: vec!["src/store/**".into()],
doc: "Store 类型变更影响所有消费组件,需同步更新".into(),
confidence: "medium".into(),
});
}
// pnpm monorepo 共享类型
if path_exists(root, "pnpm-workspace.yaml") {
// 优先已知命名约定;否则列出 packages/ 下实际存在的子包目录
@ -300,21 +326,23 @@ fn detect_contracts(root: &Path) -> Vec<DetectedContract> {
});
}
// Tauri自身的 command 层)
let tauri_frontend_ts = if path_exists(root, "src/lib/commands.ts") {
"src/lib/commands.ts"
} else {
"src/commands.ts"
};
if cargo_has(&cargo_content, "tauri") && path_exists(root, tauri_commands_path) {
// Tauricommand 层)
// 注意:不要求 commands/ 目录已存在——新项目初始化时只有 lib.rs但契约路径应预先声明
if cargo_has(&cargo_content, "tauri") {
let tauri_cmd_dir = "src-tauri/src/commands";
let tauri_frontend_ts = if path_exists(root, "src/lib/commands.ts") {
"src/lib/commands.ts"
} else {
"src/commands.ts"
};
contracts.push(DetectedContract {
label: "Tauri command 接口(前后端契约)".into(),
paths: vec![
format!("{tauri_commands_path}/**/*.rs"),
format!("{tauri_cmd_dir}/**/*.rs"),
tauri_frontend_ts.into(),
],
doc: "新增 command 时前后端必须同步".into(),
confidence: "high".into(),
confidence: if path_exists(root, tauri_cmd_dir) { "high".into() } else { "medium".into() },
});
}
}