Study Notes / 2026 ・ No.06

Vibe Coding 札记

做大系统时,AGENTS.md 之外还要放什么

发布

本期要回答的问题

Q1除了 AGENTS.md,还需要什么 Q2规格(SPEC)和规则集放在哪里、怎么运转 Q3做一个中等规模的网页系统,现在的最佳实践是什么

先说结论:“把规格、规则、验证分开,分别放进文件和机制里”

上一期讲了交给智能体的“规矩”——AGENTS.md。
但如果要和 AI 一起做一个有几十个页面的业务系统,光有它还不够。
本期以订单管理系统为例,讲清什么放在哪里、怎么推进。

一

Vibe Coding 的现状

CORE

“Vibe Coding”是 Andrej Karpathy 在 2025 年 2 月起的名字。最初的定义是“完全顺着感觉走,甚至忘记代码的存在”,他本人也说这适合一次性的原型和玩票项目。

一年后的 2026 年 2 月,Karpathy 又为工作中的用法起了另一个名字:“智能体工程(agentic engineering)”——99% 的代码不再自己写,而是指挥智能体去写,自己负责监督。之所以叫“工程”,是因为这里面有技术和专业性。实务中说“Vibe Coding”时,越来越多是指这种用法,本文也按这个意思来写。

为什么需要监督,数据也说明了问题。

调查发现
METR
(2025 年 7 月)
对 16 名资深开源开发者的随机对照试验中,使用 AI 工具后完成时间反而延长 19%,而他们自己感觉变快了
Veracode
(2026 年 3 月)
150 多个模型写的代码,通过安全检测的只有 55%。语法正确率已超过 95%,安全性却与 2025 年几乎持平。XSS 防护只有 15% 通过

AI 已经非常擅长写“能跑的代码”。但“是否符合正确的规格”“是否安全”“是否与之前的决定矛盾”,放任不管就没有保证。系统越大,这个差距越明显。

二

AGENTS.md 之外还要什么 ── Q1 的答案

WHAT

AGENTS.md 是“每次都读的规矩”。既然只能写得很短,其他内容就要放到别处。缺的大致有三样:做什么(规格)、在哪里怎么写(分领域规则和操作手册),以及确认是否完成的机制。

放什么内容例子
规格(spec)按功能写目的、范围外、验收条件specs/012-order-approval/spec.md
计划・任务怎么做、按什么顺序做plan.md、tasks.md
ADR做了什么决定、为什么(设计决策记录)docs/adr/0007-approval-state.md
产品说明系统为什么存在、术语表、整体结构docs/product.md、architecture.md
分领域规则只在 API・页面・DB 等处生效的规则.claude/rules/api.md
技能(操作手册)重复性工作的步骤新功能的起步方法、发布步骤
验证机制测试、类型、lint、E2E、CI、钩子每次保存跑 lint,每个 PR 跑 CI
对外连接让 AI 操作 DB、工单、浏览器等MCP 服务器

关键在于读取的时机不同。如果全塞进 AGENTS.md,每次都得全部读一遍,正如上期介绍的研究,效果反而会变差。

放置的内容,何时被读取

每次都读 AGENTS.md 碰到相应文件时 规则:API 规则:DB 需要时才读 规格・设计・ADR 技能 一定执行 钩子 CI・测试 给 AI 的上下文 (请求) 机制 (强制)

上面三层是“请求”,可能不被遵守。只有最下面一层一定生效

三

规格驱动的做法

SDD

现在的主流是规格驱动开发(Spec-Driven Development)。在让 AI 写代码之前,先把做什么(规格)→ 怎么做(计划)→ 工作拆分(任务)写成文档,由人确认后再进入实现。

工具也逐渐齐备,下面列出有代表性的两个。

GitHub Spec KitKiro(AWS)
形态开源 CLI + 面向各智能体的命令,支持 30 多种智能体(2026 年发布 v1.0)内置规格功能的 IDE
产出的文档constitution.md(原则)、spec.md、plan.md、tasks.md,按需有 research.md・data-model.md・contracts/requirements.md(或 bugfix.md)、design.md、tasks.md
存放位置specs/NNN-功能名/.kiro/specs/功能名/
流程constitution → specify → clarify → plan → tasks → analyze → implement可以选择从需求开始,或从设计开始

名字不同,内容几乎一样:把规格、计划、任务三份文档放进按功能划分的文件夹,每个阶段由人确认。尤其重要的是下面两点。

  • 加入让 AI 提问的环节 ── 像 Spec Kit 的 clarify 那样,让 AI 读写到一半的规格,找出“还没定下来的事”。规格的漏洞,越晚发现代价越高
  • 规格按功能拆开 ── Kiro 官方也建议不要写一个巨大的规格,而是按“认证”“商品列表”“购物车”等功能分开。每一份越小,AI 和人都越能读完

即使不装工具,手工建好同样结构的文件夹和 Markdown,任何智能体都能按同样方式推进。下一章的布局就是不依赖工具的形式。

四

文件怎么放 ── Q2 的答案

举个例子:一个公司内部用的订单管理系统,约 30 个页面,有前端、API 和数据库,采购、销售、财务都会用。仓库这样划分:

order-system/ ├─ AGENTS.md ← 全局规矩(100 行以内) ├─ CLAUDE.md ← 只有一行“@AGENTS.md” ├─ docs/ │ ├─ product.md ← 系统的目的・术语表 │ ├─ architecture.md ← 整体结构与分层边界 │ └─ adr/ │ ├─ 0001-use-postgresql.md │ └─ 0007-approval-state.md ├─ specs/ │ ├─ 012-order-approval/ │ │ ├─ spec.md ← 做什么・为什么(验收条件) │ │ ├─ plan.md ← 怎么做 │ │ └─ tasks.md ← 工作拆分与进度 │ └─ 013-invoice-export/ ├─ .claude/ │ ├─ rules/ │ │ ├─ api.md ← 只在碰 apps/api/ 时读 │ │ ├─ web.md ← 只在碰 apps/web/ 时读 │ │ └─ db.md ← 只在碰 db/ 时读 │ ├─ skills/new-feature/ ← 从规格开始做新功能的步骤 │ └─ settings.json ← 钩子(lint・禁止危险操作) ├─ apps/web/ apps/api/ ├─ db/migrations/ └─ tests/e2e/

放置的原则有五条:

  • 每次都读的要薄,需要时才读的可以厚 ── AGENTS.md 只写入口和规矩。细节放进 docs/ 和 specs/,由 AGENTS.md 指明位置
  • 规格按功能放进带编号的文件夹 ── 编上 012、013,顺序和历史一目了然,也容易和分支名、PR 对应
  • 决定写进 ADR,连同理由 ── “为什么用 PostgreSQL”“为什么用状态迁移来管理审批”。当 AI 想擅自改设计时,它就是依据
  • 分领域规则用路径限定 ── API 的规则只在碰 API 时读,不要每次都读
  • 同一件事不写两处 ── 规则里引用 docs。复制过去,总有一份会过时

作为入口的 AGENTS.md 大致如下。和上期的例子不同,这里把“没有规格就不做”这种推进方式本身写成了规矩。

# AGENTS.md — order-system 公司内部的订单管理系统。术语以 docs/product.md 的术语表为准。 ## 推进方式 - 新功能只做 specs/ 里有规格文件夹的。没有就先不做,来商量 - 按 specs/<编号>/tasks.md 的顺序,一个任务一次提交 - 要改设计决定时,先在 docs/adr/ 里新增 ADR ## 命令 - 测试: pnpm test / E2E: pnpm e2e / 类型: pnpm typecheck - 完成的条件: 这三项全部通过 ## 必须遵守 - 不碰生产数据库和生产环境变量 - 不改已执行的迁移文件,而是新增文件

各工具的存放位置差异如下:

作用Claude CodeCursorKiro
每次都读的规矩AGENTS.md(或 CLAUDE.md)AGENTS.md、Always 规则.kiro/steering/
分领域规则.claude/rules/(用 paths 限定).cursor/rules/(用 globs 限定)steering 的读取条件
规格specs/(格式自由)specs/(格式自由).kiro/specs/功能名/
五

用一个功能走一遍 ── Q3 的例子

以给订单系统新增“采购审批流程”为例,从规格走到验证。一共 6 个阶段,其中 3 处由人批准。

一个功能的推进方式

STEP 1 写规格 spec.md 人来写,AI 提问 ✓ STEP 2 定计划 plan.md・ADR AI 出方案,人来决定 ✓ STEP 3 拆任务 tasks.md AI 拆分 STEP 4 实现 一个任务=一次提交 AI,连同测试 STEP 5 验证 CI・E2E・评审 机制+人的眼睛 ✓ STEP 6 关闭规格 更新 spec.md 把偏差写回规格 下一个功能 ✓ 需要人批准的阶段(不可跳过)

想跳过某个阶段,往往是在赶时间的时候。越是这时,返工越大

STEP 1 写规格(spec.md)

目的和验收条件由人来写,因为了解业务情况的只有人。写好后让 AI 读,并请它“把没定下来的事问出来”。

# 012 采购审批流程 ## 目的 采购员创建的订单,按金额由上级审批后才能确认。 现在用 Excel 和邮件流转,每月都有几笔漏审的订单。 ## 范围外 - 向供应商发送(沿用现有 EDI 对接) - 预算管理 ## 验收条件 1. 合计 50 万日元以上的订单,点击“申请审批”后状态变为“待审批”, 并通知部门上级 2. 50 万日元以下的订单,无需申请审批即可“确认下单” 3. 上级退回时必须填写理由,状态回到“草稿” 4. 待审批的订单,连创建者也不能修改明细 5. 所有状态变更都记录谁・何时・从什么到什么 ## 待定事项 - [ ] 上级不在时是否需要代理审批(正在向业务部确认)

验收条件要写成可以直接变成测试的样子。不写“要好用”,而写“50 万日元以上就进入待审批”。条件和结果一句对一句,到 STEP 5 时 AI 和人都能判断。

STEP 2 定计划(plan.md 与 ADR)

计划让 AI 写,由人判断。要看的是“有没有破坏现有结构”“是否与已定的事矛盾”。像状态怎么管理这类日后难改的决定,要写进 ADR。

# 012 计划 - 状态: 草稿 → 待审批 → 已审批 → 已下单,退回则回到草稿 状态迁移集中在 orders 领域的 OrderStatus(ADR-0007) - DB: orders 增加 status・approved_by・approved_at, 新建 order_status_logs(一个迁移文件) - API: POST /orders/{id}/request-approval, /approve, /reject - 页面: 订单详情加按钮,新建“待审批列表” - 通知: 沿用现有 NotificationService(邮件) - 测试: 先写状态迁移的单元测试。E2E 覆盖验收条件 1–4

STEP 3 拆任务(tasks.md)

一个任务的大小,要一次对话就能做完,而且做完能确认。诀窍是把写测试的任务放在实现之前。

# 012 任务 - [x] T1 写 OrderStatus 迁移表的单元测试(验收条件 1–4) - [x] T2 实现 OrderStatus,让 T1 通过 - [ ] T3 迁移(status 列・历史表) - [ ] T4 3 个 API 与权限检查(只有上级角色能审批) - [ ] T5 页面:详情按钮、待审批列表 - [ ] T6 E2E:审批・退回・50 万以下直接下单 - [ ] T7 把待定事项写回 spec.md,更新 docs/architecture.md

STEP 4–6 实现・验证・关闭规格

  • 实现 ── 按 tasks.md 从上往下一个一个做。一个任务一次提交,出问题时回退点很清楚。大范围的调查(比如梳理影响范围)交给子智能体,不让主对话变乱
  • 验证 ── 以“测试・类型・E2E 通过”为完成条件,并在 CI 里必跑。人的评审先对照验收条件,再看差异。权限检查遗漏、XSS 这类安全问题要专门看(如第一章的数据,放任不管就有近一半漏过去)
  • 关闭规格 ── 把实现过程中定下来的事(比如不需要代理审批)写回 spec.md,让规格与代码一致后再结束。偏离的规格,会在下一个功能里把 AI 带偏
六

规则与钩子

RULES

分领域规则的基本做法是只在碰到那个地方时才读。在 Claude Code 里,只要在 .claude/rules/ 文件开头写上 paths,就只会在读到匹配文件时加载。Cursor 的 .cursor/rules/ 也能用 globs 做到同样的事。

# .claude/rules/api.md --- paths: - "apps/api/**" --- # API 规则 - 输入必须用 schema 校验(apps/api/src/schemas/) - 错误按统一格式返回: { code, message }(见 docs/architecture.md) - 权限检查放在 usecase 层,而不是控制器 - 金额用整数(日元)处理,不用浮点数 - 不拼接 HTML 返回。不破坏“由页面端转义”的前提

规则只是“请求”。必须遵守的事,要交给钩子或 CI。Claude Code 官方文档也写道:“写上‘不要编辑 .env’只是请求,不是保证。每次都必须遵守的,就做成钩子。”比如,每次改写文件都跑一次 lint 的钩子如下:

// .claude/settings.json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "pnpm lint --silent" } ] } ] } }
出现这种情况时该加什么
同样的错犯了两次在 AGENTS.md 加一行,或写成分领域规则
同样的步骤讲了三次技能(操作手册)
希望每次都必然发生钩子
绝对不能发生权限设置、分支保护、CI
调查的内容塞满了对话子智能体

此表参考了 Claude Code 官方“逐步完善配置”的建议。不必一开始就全部备齐。

七

现在的最佳实践 ── Q3 的答案

BEST

把和 AI 一起做中等规模网页系统的做法(截至 2026 年 9 月)归纳为 10 条。共同点是这样的分工:人把握“做什么”和“是否完成”,“怎么写”交给 AI。

要做的事
01每个功能都从规格开始。验收条件写成能变成测试的样子
02设 3 道人的关卡:规格・计划・验证,不可跳过
03先让 AI 提问,再做计划。在变成代码之前补上规格的漏洞
04任务要小,并附验证方法。一个任务一次提交
05测试先写,至少同时写。把“测试通过”定义为完成
06每次都读的要薄。AGENTS.md 只写入口和规矩,分领域规则用路径限定
07重复的步骤做成技能,必须遵守的交给钩子・CI・权限
08决定写进 ADR,连同理由
09安全要专门看。把安全规则写进规则文件,CI 里加静态分析,评审时检查权限和输入输出
10不留下规格与代码的偏差。关闭功能时更新规格

反过来,也列出三件应当避免的事:

  • 让 AI 一口气写出巨大的规格书 ── 读不完的规格,就是没人确认过的规格
  • 不读就提交 AI 写的文档 ── 正如上期的研究,原样放入的自动生成指示反而会拉低效果
  • 页面上能跑就当完成 ── “能跑”和“正确”“安全”是两回事

工具和名称今后还会变化。这里列出的,是 Spec Kit、Kiro、Claude Code、Cursor 官方文档中共通的思路,整理成了不依赖工具的形式。

结 — 一页总结

  1. 在工作中,“Vibe Coding”已变成让 AI 写、由人监督的形式(Karpathy 所说的“智能体工程”)。AI 的代码能跑,但正确性和安全性放任不管就没有保证。
  2. 放在 AGENTS.md 之外的有:规格(spec・plan・tasks)、ADR、产品说明、分领域规则、技能、验证机制。按读取时机分开放置。
  3. 规格按功能放在 specs/编号-功能名/,决定放在 docs/adr/,分领域规则用路径限定。
  4. 一个功能按规格 → 计划 → 任务 → 实现 → 验证 → 关闭规格推进,在规格・计划・验证处由人批准。
  5. 必须遵守的事,不只写下来,还要用钩子・CI・权限拦住。安全要专门确认。

参考

Vibe Coding 札记 — 全七章 / 2026.09

← 返回文章列表