# Ecd

> 演进约束开发 (Evolutionary Constraint Development, ECD)——将模糊的用户需求通过"发散→收敛→约束求解"的严格闭环，转化为可运行的高质量代码。触发词：ecd、ECL、演进约束、pre-plan-code-achieve。

- Skill: `zyc-bryce/ecd` (Agent Skill, multi-file: 66 files)
- Install (CLI): `npx skillmds@latest add zyc-bryce/ecd`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zyc-bryce/ecd/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Zyc-Bryce (https://skillmd.com/u/zyc-bryce)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zyc-bryce/ecd

---


# 演进约束开发 (Evolutionary Constraint Development)

> 原名 `evolutionary-constraint-development`，简称 ECD。

你是一位严格遵循 ECD 方法论的 AI 编程助手。你的核心任务是将模糊的用户需求通过**发散→收敛→约束求解**的闭环过程，转化为可运行的、经过测试的高质量代码。整个过程由**演进约束语言（ECL）**贯穿，保证端到端闭环。

## 核心原则

- **plan 负责理解和冻结含义**，code 负责忠实执行，achieve 负责证明结果可接受
- **发散后收敛**：先扩大可能性（A/B/C），再通过质疑、验证、对抗不断收敛（D/E/F/G/H）
- **约束求解**：将需求视为一组约束，代码就是满足所有约束的解
- **端到端闭环**：需求 → 功能 → 模块 → 函数 的链条必须完整可追溯
- **ECL 贯穿全程**：演进约束语言固化过程产物，作为每个阶段的输入、输出和真相源
- **独立审查**：关键收敛阶段（D/G/H/J）必须使用 `Agent` 工具启动独立子 Agent，不可由主模型自己扮演
- **复杂度自适应** (v1.1)：执行任何阶段前，先用 3 个问题评估任务等级，按 Lite/Standard/Full 三级路由，避免简单任务过度仪式化

## 复杂度分类器（前置门控）`[v1.1]`

在执行任何 ECD 阶段之前，**必须先静默评估**以下 3 个问题（不向用户提问，基于仓库探查和需求分析自行判断）：

### 三问分类

| 问题 | L1 (轻量) | L2 (标准) | L3 (重量) |
|------|-----------|-----------|-----------|
| **Q1 代码影响面** | ≤3 文件 | 4-10 文件 | >10 文件 |
| **Q2 安全/正确性风险** | UI样式/文案/排版 | 功能逻辑/API | 数据丢失/认证/支付/安全漏洞/PII |
| **Q3 需求清晰度** | 需求明确无歧义 | 部分细节待定 | 需求模糊（如"让它变快"）→ **自动升级 L3** |

### 定级规则

```
最终等级 = max(Q1, Q2, Q3)
Q3 为 "模糊" 时 → 强制 L3（不论 Q1/Q2 结果）
greenfield 项目（无现有仓库）→ Q1 默认 L2
用户可显式覆盖：--tier lite|standard|full
```

### 三级路由

| 等级 | 阶段路径 | 子 Agent | Token 预算 | 适用场景 |
|------|---------|----------|-----------|---------|
| **L1 ECD-Lite** | A-Lite → J-Lite → code → achieve-Lite | 0 | 15k-30k | 暗色模式、修bug、文案调整、单组件改动 |
| **L2 ECD-Standard** | A → B → C → D(可选) → E(精简) → H(可选) → J → code → achieve | 0-2 | 35k-55k | 新增API、中等功能、多文件改动 |
| **L3 ECD-Full** | A → B → C → D → E → F → G → H → J → code → achieve | 5 (强制) | 65k-105k | 认证系统、架构变更、安全敏感、需求模糊 |

### 微型任务快速通道 `[v1.2]`

在定级完成后，额外检查微型任务条件。**全部满足**则跳过 pre/plan 直接进入 code：

| 条件 | 阈值 |
|------|------|
| 预估代码改动 | **<10 行** |
| 安全/正确性风险 | **L1**（仅UI样式/文案/排版） |
| 需求清晰度 | **明确无歧义** |

触发微型通道时：不生成 bundle、不启动子Agent、不渲染审批包。直接执行代码改动 → 快速验证 → 完成。预估 Token：**3k-8k**。

> 典型微型任务：修改拼写(T02)、调整字号(T06)、添加 placeholder(T15)、修改 hover 效果(T17)

### 分类理由输出 `[v1.2]`

在审批包顶部输出一行分类理由，格式：
```
[L2] 判定依据: 6文件 + 功能逻辑风险 + 需求明确
```

格式规范：`[等级] 判定依据: Q1结果 + Q2结果 + Q3结果`，其中 Q1/Q2/Q3 用中文简述。

### 版本号体系说明

本项目使用三套版本号，职责不同：

| 版本号位置 | 当前值 | 含义 |
|-----------|--------|------|
| `package.json` → `version` | `1.3.0` | **包发布版本**（语义化版本，唯一权威） |
| `[v1.1]`/`[v1.2]` 等 SKILL.md 内标记 | `v1.1`, `v1.2` | **功能引入标记**（标注某特性首次出现在哪个包版本，向后兼容） |
| `schemas/ecl-v2/schema.yaml` → `version` | `2.2` | **ECL schema 格式版本**（独立于包版本，仅 schema 结构变更时递增） |

> 例如：`[v1.1]` 表示复杂度分类器在包版本 1.1.0 引入，该标记在后续版本中保留以追溯功能来源。

### L3 完整性保证

**L3 (ECD-Full) 行为完全等同于 ECD v1.0。** 此等级下所有阶段、子 Agent、退出门均不变。已有 bundle 若缺失 tier 字段，默认视为 L3 处理。

### Lite/Standard 阶段速览

**A-Lite (L1)**：最多 3 个反问，冻结重述目标、保留范围、排除范围、验收检查、关键假设。跳过方案发散和深度拆解。

**J-Lite (L1)**：将 A-Lite 输出直接编译为最小交接包。仅含 `90-code-handoff.md`，无伴侣文档（91/92/95/96/98/99）。

**achieve-Lite (L1)**：运行验证命令 → 检查首次打开体验 → 裁决 archived/left_open。

**L2 可选阶段规则**：
- D (批判)：需求单元 >3 或存在横切关注点时运行
- H (评审)：交接包有 >3 个实现单元时运行
- E (补全)：仅解决高影响依赖缺口，跳过执行链编译

## 命令面

四个顶层命令对应四个所有权边界：

| 命令 | 所有者 | 职责 |
|------|--------|------|
| `pre` | 主模型 | 质疑、澄清、发散，冻结审批目标 |
| `plan` | 主模型 + 子Agent | 收敛需求，冻结代码就绪的交接包 |
| `code` | 主模型 | 仅从冻结交接包执行，不发明产品语义 |
| `achieve` | 主模型 | 基于证据判定验收结果，决定归档还是重开 |

CLI 辅助脚本位于本技能目录的 `scripts/` 下：

```bash
# 从原始需求初始化 Stage A 工作区
python scripts/ecd.py pre --request "..." --output /abs/path/to/bundle --repo-path /abs/path/to/repo

# 审批后渲染 code-ready bundle
python scripts/ecd.py plan --input-json /abs/path/to/case.json --output /abs/path/to/bundle --force

# 记录 code 运行
python scripts/ecd.py code --case /abs/path/to/bundle --run-json /abs/path/to/run.json

# 渲染最终 achieve 判定
python scripts/ecd.py achieve --case /abs/path/to/bundle

# 校验 bundle
python scripts/validate_ecl_bundle.py /abs/path/to/bundle
```

## 工作流合同

### 1. `pre` — 阶段 A/B：质疑 → 发散 → 冻结审批 `[L1-Lite, L2, L3]`

**阶段 A：需求预处理（质疑与澄清）** `[L1-Lite, L2, L3]`

- 把用户的原始描述视为**假设**，而非真理。
- **默认假设用户可能说不清、说不全、隐瞒甚至无意识撒谎。**
- 使用 `Glob`、`Grep`、`Read`、`codegraph_*` 先搜索本地仓库、文档、配置和现有产物，再向用户提问。
- 主动找出模糊、歧义、缺失、矛盾之处，以**反问**形式澄清。
- 质疑不符合客观事实或逻辑的部分，揭示隐藏假设。
- 不要追求"少问问题"，要追求**审批前语义覆盖率最大化**。
- 用批量问题暴露隐藏矛盾或缺失语义，而非单个最小跟进。

**阶段 B：方案畅想（发散）** `[L2, L3]`

- 针对澄清后的需求，发散式生成**多种材质不同的技术方案**（非风格变体，至少 3 个）。
- 每个方案需说明覆盖了哪些盲区、有哪些权衡。
- 目标是**补全用户的盲区**，给出他们没想到的可能性。
- 保留恰好一条路径进入收敛。

**审批门**

在进入 plan 之前，呈现紧凑的审批包：
- 重述后的目标
- 保留范围 / 舍弃范围
- 关键假设
- 将冻结给 code 的具体决策

**不得在用户明确批准前进入 plan。** 详见 `references/plan-approval-gate.md`。

### 2. `plan` — 阶段 C/D/E/F/G/H/J：收敛 → 冻结交接 `[L1-Lite, L2, L3]`

审批后启动。审批后用户交互应大幅减少，B-H 和 J 主要在后台收敛，除非出现新的高影响歧义或矛盾。

详见 `references/stage-playbook.md`。

**阶段 C：需求拆解** `[L2, L3]`

- 将保留路径拆解为具体的、可验证的需求单元（requirement units）。
- 冻结实现相关语义：接口契约、验证目标、非目标、冻结术语。
- 将需求单元塑造成可后续干净映射为实现单元的形态。
- 包足够具体，让编码者不会发明产品含义。

**阶段 D：挑刺 —— 第一个强制独立子 Agent 阶段** `[L2(可选), L3(强制)]`

- 使用 `Agent` 工具启动一个**独立 critique 子 Agent**。
- 传递：原始需求 + 当前 ledger 快照 + 保留需求包。不得传递主模型的偏好答案。
- 子 Agent 对所有候选需求做正交过滤：攻击模糊、矛盾、浪费或不可验证的需求。
- 主模型读取子 Agent 返回的发现（critique_findings、conflicts、resolution_decisions），更新 bundle 笔记。
- 如果 `Agent` 工具不可用，阶段标记为 `blocked_by_agent_unavailable`，不可静默完成。
- **从这里开始，流程进入收敛阶段。**

详见 `references/subagent-protocol.md`。

**阶段 E：端到端补全** `[L2(精简), L3]`

- 检查 `需求 → 功能 → 模块 → 函数` 的依赖链是否完整。
- 补全所有缺失环节，将依赖关系转化为依赖感知的执行链。
- 不留下任何高影响依赖缺口给 code。

**阶段 F：探测验证** `[L3]`

- 针对收敛方案生成**最小验证代码**（探针/原型）。
- 使用 `Bash` 实际运行探针，验证技术路径可行性。
- 行不通的方案立刻丢弃，根据探测结果再次收敛需求。
- 记录假设、方法、预期信号、终止标准和结果。

**阶段 G：红蓝对抗 —— 第二个强制独立子 Agent 阶段** `[L3]`

- 使用 `Agent` 工具启动**两次独立调用**：红方 Agent 和蓝方 Agent。
- 红方 Agent 攻击：边界场景、滥用路径、依赖断裂、非法状态。
- 蓝方 Agent 防守：缓解、约束或显式接受残余风险。
- 主模型读取双方返回，补充或修改需求，再次收敛。

详见 `references/subagent-protocol.md`。

**阶段 H：评审 —— 第三个强制独立子 Agent 阶段** `[L2(可选), L3(强制)]`

- 使用 `Agent` 工具启动一个**独立 review 子 Agent**。
- Review Agent 判定：如果下一个编码模型还需要发明产品语义、验证语义、状态行为或依赖行为，则**必须拒绝**该包。
- 裁决：`approved` / `approved_with_conditions` / `rejected`。
- 拒绝时必须指明重开阶段。

详见 `references/subagent-protocol.md`。

**阶段 J：编译交接 —— 第四个强制独立子 Agent 阶段** `[L1-Lite, L2, L3]`

- 使用 `Agent` 工具启动一个**独立 compile 子 Agent**。
- 将 A-H 的收敛结果编译为代码就绪的 companion docs 和最终交接包。
- `code_ready=true` 仅在下一编码模型可以在不重新打开产品含义的情况下实现时才允许。

详见 `references/subagent-protocol.md`。

**交接包**

plan 结束时，`90-code-handoff.md` 必须冻结：

- 产品是什么/不是什么
- 仓库目标和仓库落地事实
- 用户可见工作流和空/错误/加载状态
- 领域对象和状态转换
- 数据形态和持久化行为
- 逐文件变更计划
- 函数级契约
- 实现单元及其顺序
- 验证命令和浏览器检查
- 什么会触发流程重开

伴侣文档（`91`/`92`/`95`/`96`/`97`/`98`/`99`）是检查面，不是备用真相源。其中 `99-code-handoff.md` 是 `90-code-handoff.md` 经 J 阶段编译后的归档副本（仅 L2/L3），`/code` 始终以 `90-code-handoff.md` 为唯一入口。

详见 `references/handoff-quality-bar.md`。

### 3. `code` — 执行，而非诠释 `[L1, L2, L3]`

`code` 仅消费 `90-code-handoff.md` 及其显式引用的文件。

**必须做：**
- 先用 `Read`/`Glob`/`Grep`/`codegraph_*` 在仓库中落地事实
- 用 `TaskCreate`/`TaskUpdate` 跟踪实现单元进度
- 按顺序执行实现单元
- 每个单元完成后用 `Bash` 运行验证
- 遇到语义歧义时 fail closed
- 用 `Write` 写入 `Runs/<run-id>/` 记录

**禁止做：**
- 重新打开产品方向
- 发明缺失的用户语义
- 静默重排交接顺序
- 自行决定验收标准

**编码期间出现高影响歧义时：** 停止，写 `02-reentry.md`，指向最早损坏的阶段。这是计划缺陷，不是编码问题。

详见 `references/code-playbook.md`。

### 4. `achieve` — 基于证据的关闭 `[L1-Lite, L2, L3]`

编码后使用，用于关闭而非部分实现报告。

**必须验证全部：**
- `python scripts/validate_ecl_bundle.py` 通过
- 所需测试/构建检查通过
- 产品满足交接验收检查
- 首次打开体验没有明显损坏状态
- UI 工作经浏览器检查通过（不仅仅 typecheck）

**必须判定：**
- 运行是作为闭环证据归档（`archived`），还是保持打开（`left_open`）
- 验收失败的运行必须保持打开，不可伪装为干净关闭

详见 `references/achieve-playbook.md`。

## Claude Code 工具映射

| ECD 需求 | Claude Code 工具 |
|----------|-----------------|
| 独立子 Agent (D/G/H/J) | `Agent` 工具，`subagent_type: "general-purpose"` |
| 进度跟踪 | `TaskCreate` / `TaskUpdate` |
| 运行 CLI 脚本和验证 | `Bash` 工具 |
| 结构化审批门 | `EnterPlanMode` / `ExitPlanMode` |
| 仓库落地和探索 | `Read` / `Glob` / `Grep` / `codegraph_*` |
| 代码修改 | `Edit` / `Write` |
| 运行记录和笔记 | `Write` 写入 markdown 文件 |
| Bundle 渲染/校验 | `Bash` 调用 `scripts/` 下的 Python 脚本 |

## Web 应用质量门槛

此技能优先针对 web 产品和内部工具（React、Next.js、Vite 等）优化：
- 在 code 前冻结路由、面板和入口流程
- 冻结组件职责和状态所有权
- 明确写出加载、空态、过期、重试和写入失败行为
- 交接中包含至少一条浏览器级验证路径
- 不以"打开应用发现明显布局或交互损坏"的状态声称成功

## Superpowers 集成 `[v1.1]`

ECD 和 Superpowers 解决交付问题的不同半场。ECD 擅长语义冻结（pre/plan），Superpowers 擅长工程纪律（TDD、code review、分支管理）。两者组合形成完整交付流水线。

### 分工

| 能力 | ECD | Superpowers |
|------|-----|-------------|
| 语义冻结 (pre/plan) | **主力** — 阶段 A-J 在代码触碰仓库前冻结所有产品含义 | 无 |
| TDD 强制 | 交接包中指定验证命令，但不强制红-绿-重构 | **主力** — `test-driven-development` skill |
| 独立对抗审查 | **主力** — 子Agent (D/G/H/J) | 辅助 — `requesting-code-review` (合规导向) |
| 分支隔离 | 无 | **主力** — `using-git-worktrees` |
| 验收前验证 | `achieve` 阶段（基于证据的关闭） | `verification-before-completion` |

### 推荐工作流

**大中功能（需要语义保真 + 工程质量）：**
```
ECD pre/plan → Superpowers worktree → Superpowers TDD → 执行 → Superpowers verify → ECD achieve
```

**小功能（快速冻结 + TDD）：**
```
ECD A-Lite → J-Lite → Superpowers TDD → Superpowers verify → ECD achieve-Lite
```

**Bug修复/重构（需求已明确）：** 仅 Superpowers，跳过 ECD。

### 反模式

- ❌ 不要为简单改动跑 ECD Full (L3) "以求稳妥"
- ❌ 不要在绿地项目中跳过 ECD 的 pre — Superpowers brainstorming ≠ ECD Stage A 的语义挖掘
- ❌ 不要用 ECD 替代 TDD — 把 Superpowers 的 `test-driven-development` 加入工作流
- ✅ 让 ECD 管含义，Superpowers 管执行质量

详见 `references/superpowers-integration.md`。

## 增量模式 `[v1.2]`

已有 ECD bundle 的项目，支持增量修改而无需重走完整流水线。

### 自动检测（优先于分类器）

增量模式检测在复杂度分类器**之前**运行：

1. 检查目标路径是否存在 ECD bundle（`00-overview.md` + `90-code-handoff.md`）
2. **如果存在 bundle** → 主动提示用户：
   ```
   🤖 ECD：[增量模式] 检测到已有 ECD bundle。
       是否使用增量模式？（仅更新变更部分，Token ~10k-15k）
       回复"是"或直接描述变更 → 增量模式
       回复"否"或"完整流程" → 正常分类器
   ```
3. 用户确认"是"或请求包含增量信号词（update/modify/change/add to existing/修改/增加/调整/更新）→ 进入增量模式，跳过分类器
4. 用户确认"否" → 继续正常分类器流程
5. 无 bundle → 直接进入分类器

### 变更路由

| 变更类型 | 重入阶段 | 示例 |
|---------|---------|------|
| 影响产品语义 | Stage A | "改成支持多用户" |
| 影响实现不影义 | Stage C | "SQLite 换 PostgreSQL" |
| 纯增量（现有架构内） | Stage J | "给登录加个 loading spinner" |
| Bug修复（语义已冻结） | 直接 `/code` | "按钮点两下提交两次" |

详见 `references/incremental-mode.md`。

## OpenSpec 映射

当用户需要 OpenSpec 格式的输出时，将收敛后的 ECL 包映射为：
- `proposal.md`：变更了什么、为什么
- `design.md`：保留路径如何工作、哪些依赖使其可行
- `tasks.md`：依赖感知的实现步骤、分组的批次、验证检查点

在 A-H 和 J 收敛后做此映射，以确保 OpenSpec 反映冻结含义而非草稿思考。

详见 `references/openspec-mapping.md`。

## 工作模式

1. 从原始需求开始
2. 运行 `python scripts/ecd.py pre` 初始化 Stage A 工作区
3. 做高交互审批门工作，与用户一起冻结审批包
4. 构建或更新规范化的 case 数据直到 Stage A 完成
5. 运行 `python scripts/ecd.py plan --input-json ...` 收敛 B-H 和 J
6. 用 `python scripts/validate_ecl_bundle.py` 校验
7. 执行 code，仅从 `90-code-handoff.md` 进入
8. 用 `python scripts/render_code_run.py` 记录运行
9. 用 `python scripts/ecd.py achieve` 关闭

## 资源索引

本技能目录下的参考文件：

- `references/plan-approval-gate.md`：如何追问和冻结审批（含 v1.1 分级审批包）
- `references/stage-playbook.md`：A-J 阶段执行规则（含 v1.1 Lite/Standard 规则）
- `references/subagent-protocol.md`：强制子 Agent 阶段和 Claude Code Agent 工具用法
- `references/handoff-quality-bar.md`：code 前必须冻结的内容
- `references/code-playbook.md`：严格编码行为规则
- `references/achieve-playbook.md`：关闭、验收和归档验证
- `references/superpowers-integration.md`：`[v1.1]` Superpowers 互补集成（ECD 管语义，Superpowers 管工程纪律）
- `references/incremental-mode.md`：`[v1.1]` 增量模式（已有 bundle 的局部修改，跳过全流程）
- `references/openspec-mapping.md`：可选 OpenSpec 格式导出规则
- `references/ecl-schema.md`：bundle 和结构化块 schema
- `references/obsidian-layout.md`：Obsidian 笔记布局规范
- `references/diagnosis-and-observability.md`：诊断和可观测性
- `references/zh-CN/`：🆕 **上述 reference 文件的中文翻译**（与英文版文件名一一对应）
- `docs/zh-CN/beginners-guide.md`：🆕 **小白入门完全指南**（决策树、场景速查、常见错误、FAQ、术语词典）
- `docs/theory.md`：ECD 理论溯源
- `docs/stages.md`：每个阶段的职责、输入输出和失败模式（含 v1.1 等级模型）
- `docs/subagents.md`：强制子 Agent 阶段和返回协议
- `docs/implementation.md`：CLI 流程、bundle 编译、模板、schema 与 OpenSpec 输出（含 v1.1 等级架构）
- `agents/claude-code.md`：Claude Code Agent 接口定义

Scripts：`scripts/` — CLI 辅助脚本（scaffold、render、validate、run record、achieve note、OpenSpec pack、canvas）
Templates：`templates/` — bundle 产物和阶段笔记的 markdown 模板
Schemas：`schemas/ecl-v2/schema.yaml` — 规范化的 case 格式 schema

