当意图三分法判定为「复杂任务」(多文件/跨模块/数据持久化/安全敏感),在执行 Spec 检查前,先做出以下链式决策:
决策规则:
| 条件 | 动作 |
|---|---|
| 任务涉及 ≥ 2 个模块联动 | 生成后自动联动 test-generation(至少覆盖集成路径) |
| 任务涉数据持久化/网络通信/安全敏感 | 生成后自动联动 code-review(完整深度审查) |
| 代码预计超过 200 行 | 以上两项同时联动 |
| 单函数/单文件/纯计算 | 跳过本步骤,进入第一步 Spec 检查 |
输出格式:
✓ TDD+审查链: [联动 test-generation] / [联动 code-review] / [同时联动] / [跳过]
本决策在执行前确定,不等到第六步再判断,避免遗漏验证链。
编码前检查是否有明确的spec:
如无spec:提示用户先使用 spec-driven-development 对齐需求,或生成轻量级spec
✓ Spec检查: [检测到/未检测到] 需求规格
[如检测到,列出相关scenario]
生成代码前,先确认环境和依赖:
示例:
环境确认:Python 3.10+,无第三方依赖,单文件运行。
style-alignment.md 协议先读取目标项目已有的代表性文件,提取缩进/开标签/括号位置/数组键引号/模板变量命名等风格标记,产出「风格基线」块,生成代码逐行对齐——禁止凭 Agent 自身想象套用风格(二开/插件开发/修改现有文件场景强制;Trivial Fix 改现有文件同样适用)生成包含以下要素的代码:
Karpathy约束:
生成代码须对非功能需求(NFR)做显式决策,逐项判定以下维度(禁止留白):
| NFR 维度 | 必须回答 | 默认处理 |
|---|---|---|
| 并发/竞态 | 是否存在共享可变状态?并发写是否可能? | 无共享态则标注"无竞态";有则给锁/原子/幂等方案 |
| 幂等 | 写操作重复调用是否产生副作用? | 非幂等须定义幂等键或唯一约束 |
| 重试/超时 | 外部调用是否有超时上限?失败是否重试? | 必须设超时上限;重试须幂等且有退避 |
| 降级 | 依赖不可用时的行为是什么? | 降级路径须明确(缓存兜底/默认值/失败提示) |
| 容量/规模 | 数据量增长到 N 时是否仍正确可运行? | 列表须分页/游标,禁无界拉取 |
| 可观测性 | 关键路径是否有日志/指标/追踪? | 关键决策与错误须有日志,禁静默吞异常 |
| 安全 | 外部输入是否校验?输出是否转义? | 遵循 execution-safety.md 安全红线清单 |
判定规则:
architecture-decision 产出决策记录,再编码审查路由规则:
code-review.md 完整流程):适用于多文件/多模块联动、涉及数据持久化/网络通信/安全敏感操作,或代码超过 200 行时,触发 8 步完整审查流程(Spec 一致性→项目规范→代码理解→多维度审查→Karpathy 维度→问题分级→修复建议→记录到项目记忆)。内联审查项:
证据格式(必填,对齐主流程 Step 4):
| 审查类型 | 证据类型 | 最小字段 |
|---|---|---|
| 内联精简审查 | 命令+输出 | lint 命令 + 退出码 + 问题清单 |
| 完整深度审查 | 命令+输出 | 审查报告 + 问题分级清单(阻塞/严重/一般/建议) |
| 边界条件验证 | 测试报告 | 测试用例数、通过数、失败用例清单 |
未声明证据类型的验证视为未完成。
代码生成完成后,将关键决策和新发现的规范记录到项目记忆(参见 project-memory-management.md):
**完成状态**: [完成/部分完成]
**生成文件**: [文件列表]
**关键决策**: [实现中做出的技术选择]
**偏差说明**: [与原始需求的差异及原因]
**验证建议**: [如何验证这段代码]
# [功能名称]
## 代码实现
```[语言]
[完整可运行的代码,含必要的 import / package 声明]
```
## 使用示例
```[语言]
// 示例输入(以下以 JavaScript 为例)
const result = functionName(input);
console.log(result);
// 示例输出
// { "key": "value" }
```
## 复杂度分析
- **时间复杂度**:[O(X)],[一句话说明瓶颈操作]
- **空间复杂度**:[O(X)],[一句话说明额外空间来源]
## 设计说明
[为什么选择这种实现方式,而非备选方案。如有 trade-off 需明确说明。]
## 非功能需求设计
| 维度 | 决策 | 理由 |
| --------- | --------------------------- | ------------------------------- |
| 并发/竞态 | [无竞态 / 锁 / 原子 / 幂等] | [一句话] |
| 幂等 | [是 / 否] | [幂等键/唯一约束或说明为何不需] |
| 重试/超时 | [上限值 + 退避策略] | [外部依赖说明] |
| 降级 | [降级路径] | [触发条件] |
| 容量/规模 | [分页/游标/流式] | [预估规模] |
| 可观测性 | [日志/指标/追踪] | [关键路径] |
## 边界条件处理
| 边界条件 | 处理方式 |
| ----------------- | ----------------------------- |
| 空输入 | [返回空/抛异常/默认值] |
| 超大输入(n > ?) | [分页/流式/降级] |
| 非法参数类型 | [抛 IllegalArgumentException] |
| 并发/重入 | [锁/无状态/幂等] |
## 依赖项
- [第三方库名称] v[X.Y.Z]:[用途说明]
- **锁文件要求**:项目必须基于 `composer.lock` / `package-lock.json` / `pnpm-lock.yaml` 锁文件安装依赖,禁止使用 `latest` / `*` / `dev-main` 浮动版本;新增依赖时同步更新锁文件
## 注意事项
1. [注意事项1:如特定环境限制]
2. [注意事项2:如已知局限性]
3. [注意事项3:如后续优化方向]
下面示例用于指导用户把需求说清楚,避免只给一句“帮我写个功能”导致反复澄清。
帮我实现一个订单列表接口。
语言/框架:PHP 8.2,Laravel 10。
输入:page、page_size、status、keyword。
输出:订单列表、总数、分页信息。
约束:page_size 最大 100;keyword 搜索订单号和手机号;所有外部输入必须校验;SQL 不能拼接。
验证:给出 Feature Test,覆盖正常分页、非法 page_size、keyword 模糊搜索。
生成时应优先加载:laravel-development.md、mysql-database.md、test-generation.md。
帮我给帝国CMS后台做一个批量刷新文章缓存功能。
环境:EmpireCMS 7.5,PHP 8.2。
要求:不能单请求跑完,必须 Init-Step-Poll;每批 50 条;前端显示进度、失败数和重试按钮。
安全:后台权限校验、CSRF 校验、输出转义。
验证:给出 Init、Step、Poll 的响应示例和手动测试步骤。
生成时应优先加载:cms-development.md、api-design.md、frontend-design.md;进入验证设计时再切换到 test-generation.md,避免一次加载超过 3 个 reference。
帮我写一个 Python 脚本,扫描目录下所有 .md 文件,统计标题数量和断链数量。
约束:Python 3.10+,只读文件,不修改;跳过 node_modules、vendor、.git。
输出:表格形式打印文件、标题数、断链数;退出码 0 表示无断链,1 表示存在断链。
验证:给出最小样例目录和运行命令。
生成时应优先加载:code-generation.md,如涉及性能再协同 performance-benchmark.md。
mysql-database.md,再生成代码当目标为 PHP+MySQL CMS 二次开发时,额外遵守:
$wpdb / TP: Db / Laravel: Eloquent / ECMS: $empire->query()),禁止原生 mysqli_*CONCAT('%', ?, '%'),禁止 $_GET/$_POST 直拼htmlspecialchars(..., ENT_QUOTES, 'UTF-8') 或 CMS 等效函数,模板引擎输出默认转义string,禁止 float,防止精度丢失action_module_function.php,单一入口$arr['key'],禁止 each()/create_function()/mysql_*,=== 替代 ==详见 cms-development.md。
karpathy-coding-guidelines 检查是否符合编码哲学frontend-design 确定信息架构、视觉规范、交互状态和响应式策略code-review 检查代码质量test-generation 生成配套测试doc-generation 生成函数文档cms-development.md 的数据访问层和安全规范mysql-database.md| 步骤 | 失败条件 | 回退目标 | 最大重试 | 不可恢复时升级路径 |
|---|---|---|---|---|
| 第一步:Spec检查 | 无关联spec/文件/用户上下文 | 直接基于用户描述启动,标注"无spec对照" | 0 | 提示用户先走 Spec驱动开发 对齐需求,或手动描述需求 |
| 第二步:编码前环境确认 | 目标语言/版本无法确认 | 使用当前环境默认设置,标注假设 | 1 | 提示用户明确指定语言和版本 |
| 第三步:需求分析 | 需求存在不可调和的歧义 | 列出歧义点,要求用户澄清 | 0 | 选择最简方案并标注"假设",由用户后续修正 |
| 第四步:设计方案 | 设计约束冲突(性能vs简洁不可兼得) | 优先简洁方案,标注性能取舍 | 2 | 提供两套方案供用户选择 |
| 第五步:代码实现(Simplicity First) | 依赖库不可用或版本不兼容 | 降级到标准库实现或标注兼容性说明 | 2 | 输出伪代码框架+待替换标注,移交人工实现 |
| 第六步:代码审查 | 内联审查发现逻辑缺陷 | 退回第四步重新设计方案 | 2 | 触发 code-review.md 完整审查流程 |
| 第七步:补充说明(Goal-Driven) | 成功标准无法量化或验证方法不可行 | 提供定性验证建议,标注"待量化" | 2 | 输出验证骨架,建议用户补充具体验收条件 |
| 第八步:记录到项目记忆 | 项目记忆系统不可用 | 输出Decision Record到本地文件 | 1 | 标注"决策未沉淀",提示用户手动保存 |