proposal/spec/design/tasks 四件套解剖:OpenSpec 是怎么给 AI 编程“立规矩“的
proposal/spec/design/tasks 四件套解剖OpenSpec 是怎么给 AI 编程立规矩的【免费下载链接】OpenSpecSpec-driven development (SDD) for AI coding assistants.项目地址: https://gitcode.com/GitHub_Trending/op/OpenSpec2025 到 2026 年AI 编程工具迎来爆发式增长但一个尴尬的现实摆在开发者面前Claude Code、Cursor 这类助手写代码越来越熟练想清楚再写却越来越难。需求口头说一遍AI 凭上下文自由发挥几轮对话之后模型甚至忘了最初要什么多个变更并行推进时谁先落地、谁依赖谁全靠人脑记忆。社区里涌现出一批规范驱动开发SDD框架试图解决这个问题而 OpenSpec 是其中增长最猛的一个——GitHub 上已有数万星标社区文章称其每两秒就有一条新规范被创建得物、洞窝等企业也公开分享了用它治理 AI 编码的实践。OpenSpec 给出的答案朴素得有点反直觉既然 AI 最擅长照着做那就先给它一份结构化的规矩——每个变更必须沉淀成 proposal、spec、design、tasks 四份产物让 AI 从猜需求变成按契约执行。本文就从源码层面拆解这四件套每一份文件承担什么职责、它们之间如何流转、最终又是靠什么机制保证变更不失控。一、为什么立规矩能解决 AI 编程失控先看一个典型痛点人类说给用户加个导出功能AI 助手可能直接写一个exportToCSV()函数却没人定义导出成功长什么样数据量太大怎么办要不要走异步任务。问题不在模型能力而在需求没有形成可验证的契约。OpenSpec 的核心设计是把软件开发拆成两个物理世界openspec/specs/当前系统的事实真相和openspec/changes/待实施的变更提案docs/concepts.md 用一张图说得很清楚——specs 描述系统现在怎么工作changes 描述我们打算怎么改两者通过归档archive时的合并动作完成同步。而每一次变更都强制落成一组文档openspec/changes/add-dark-mode/ ├── proposal.md # Why and what ├── design.md # How (technical approach) ├── tasks.md # Implementation checklist ├── .openspec.yaml # Change metadata └── specs/ # Delta specs └── ui/ └── spec.md # Whats changing这套结构不是文档模板的简单堆叠而是被 schemas/spec-driven/schema.yaml 用机器可读的依赖关系焊死的。下面逐一解剖。二、四件套的职责边界why / what / how / steps 的四层分层proposal.md回答Why——变更的理由与边界proposal.md 模板 定义了四个固定章节Why一两句话讲清问题与时机、What Changes新增/修改/移除的具体清单破坏性变更要标注BREAKING、Capabilities本次变更触及哪些能力、Impact影响的代码、API、依赖与系统。模板里最关键的指令藏在 schema 的 instruction 字段里Capabilities 章节是 proposal 与 spec 两阶段的契约。schema 要求作者先运行openspec list --specs摸清项目能力清单再决定是新增能力还是修改既有能力——新增能力要按kebab-case命名如user-auth而不是add-login-endpoint因为能力名要对应可持续演化的系统行为而不是这一次要做的事。看仓库里一个真实的例子add-version-command 的 proposal## Capabilities ### New Capabilities - cli-version: Report the installed OpenSpec version and install context, with an optional privacy-aware update check and stable JSON output. ### Modified Capabilities None.它只声明了一个新能力cli-version后续的 spec、tasks 全部围绕这个能力展开。注意 schema 里有一条硬约束每个变更要么至少声明一个能力新增或修改要么在.openspec.yaml里显式设置skip_specs: true否则openspec validate直接拒绝零 delta 的变更。这把需求必须落成规范变成了不可绕过的关卡。specDelta Specs回答What——系统行为的可测试契约spec 不是设计文档而是行为契约。schema.yaml 的 specs instruction 给出了一条极其实用的判别标准Quick test: if the implementation can change without changing externally visible behavior, it likely does not belong in the spec.也就是说spec 只收用户或下游系统可观测的行为内部类名、框架选型、实现步骤一概排除——那些属于 design 和 tasks。spec 文件用结构化的 Delta 格式书写支持四种操作ADDED Requirements新增能力的行为MODIFIED Requirements改动的行为必须包含完整更新内容避免归档时信息丢失REMOVED Requirements废弃的特性必须给出 Reason 和 MigrationRENAMED Requirements仅改名FROM:/TO: 格式每条需求用 RFC 2119 的 SHALL/MUST 措辞且必须配至少一个#### Scenario:场景注意是四个井号三个会静默失效场景用 WHEN/THEN 描述可验证的输入输出。add-version-command 的 spec 是教科书级示范——报告已安装版本这条需求下挂了四个场景人类可读输出、机器可读 JSON、源码检出场景、旧版旗标兼容。每个场景都是一个可以直接变成测试用例的验收点。design.md回答How——技术方案与取舍记录design 是按需创建的schema 明确列出四种才需要写跨模块/新架构模式、新外部依赖或数据模型变更、安全/性能/迁移复杂度、值得先做技术决策的歧义。模板定义了Context、Goals / Non-Goals、Decisions、Risks / Trade-offs、Migration Plan、Open Questions等章节。看 add-version-command 的 design它把为什么新增独立命令而不是扩展--version本地检查与网络检查分离JSON 信封用 schemaVersion 版本化等七个决策逐条给出 rationale 和备选方案还在风险表里坦承了install.location可能泄露用户名的权衡。仓库里大量轻量变更如add-amp-support根本没有 design.md——这正是 OpenSpec 强调的渐进式严谨风险等级决定文档深度。tasks.md回答Steps——可勾选、可追踪的实施清单tasks 模板 要求分组编号## 1. Setup/- [ ] 1.1 ...。它的特殊性在于apply 阶段会解析复选框格式来追踪进度——只有纯x大小写、间距不限算完成[~]、[-]、空[]一律视为未完成没有复选框的行根本不计入追踪。每个任务还必须写明如何验证完成测试、命令或可观测结果。更严格的是两条组织纪律测试与文档必须跟随各自任务组落地不许攒到最后统一补否则晚组改动会连带早组返工需要归档后执行的工作要作为纯文本放入可选的## Workflow follow-up章节不参与进度追踪。add-version-command 的 tasks 把工作切成模型层、结构化结果层、命令层、兼容性验证层、文档发布层五个组每组都标注了验证方式。三、从提案到归档信息如何逐层升级四件套不是平级文件而是被 schema 的requires字段钉死的有向依赖图proposal (root node) │ ┌───────────┴───────────┐ │ │ ▼ ▼ specs design (requires: (requires: proposal) proposal) │ │ └───────────┬───────────┘ │ ▼ tasks (requires: specs, design)这里有个容易误读的细节依赖是创建顺序的使能条件不是阶段闸门。specs 和 design 都只依赖 proposal可以并行产出tasks 依赖 specs design。Schema 的注释特别强调Dependencies are enablers, not gates——你完全可以在不需要 design 时跳过它add-amp-support就是证明也可以先写 specs 再写 design。所谓规范驱动不是瀑布流而是保证任何一份产物都有上游依据。依赖被真正执行的地方在 src/commands/workflow 的工作流实现里。而 schema 里每个 artifact 的instruction字段是 AI 生成该产物时的行为准则——比如 specs 阶段要求写一个文件就落盘一个让用户看到进度tasks 阶段要求写任务前先检查 design 的 Open Questions。信息的流转终点是归档archive。docs/concepts.md 描绘了完整循环specs 描述当前行为changes 以 delta 形式提出修改实施让修改变成现实tasks 逐项勾选归档把 delta 合并进 specsspecs 描述新行为成为下一轮变更的基线。归档时变更目录会带上日期前缀移入changes/archive/四份产物原样保留——你随时能回溯当时为什么这么改、怎么设计、做了哪些任务这正是社区文章反复强调的可追溯性。四、产物一致性delta 机制如何让变更不失控四件套最容易翻车的地方是文档与代码脱节。OpenSpec 用三道防线把失控概率压到最低。第一道proposal 与 spec 的能力契约前面说过proposal 的 Capabilities 章节是硬约束——它直接决定 spec 文件要落在specs/capability-path/spec.md。schema 甚至要求生成 spec 前先比对 proposal 列出的能力与已存在的 spec 文件从第一个缺失文件开始写不要重写已有文件。这保证提案里承诺的每一个能力都有一份对应的行为规范。第二道delta 合并时的语义校验归档不是简单地把文件拼起来。src/core/specs-apply.ts 的buildUpdatedSpec是合并引擎它先把 delta 解析成操作计划然后做一系列近乎偏执的预校验同一需求出现在多个 delta 区段如 MODIFIED 又 REMOVED直接报错RENAMED 必须 FROM:/TO: 成对出现不成对就拒绝目标 spec 不存在时只允许 ADDEDMODIFIED/RENAMED 一律中止大小写或空白折叠后撞名的需求会被识别为近似错拼并硬性拦截——因为归档是作者最后能发现问题的时机。合并按 RENAMED → REMOVED → MODIFIED → ADDED 的顺序执行每种操作都有近匹配守卫比如 REMOVED 的目标需求已在基线中消失会被当作早已同步的幂等操作no-op而非失败——但若存在仅大小写/空白不同的近似需求则判定为拼写错误并中止。这套逻辑在 src/core/archive.ts 里还有更狠的兜底若合并后的 spec 一个需求都不剩isRetirableSpec会调用校验器确认这条 spec 根本不可能被合法写出从而触发能力退役retire而不是留下一个残破文件。第三道validate 与 skip_specs 的豁免机制src/core/validation/constants.ts 里的错误消息暴露了校验的边界设计找不到 delta 时提示要么补上specs/capability/spec.md并确保每个需求至少带一个#### Scenario:要么在变更的.openspec.yaml设置skip_specs: true显式声明本次无规范级行为变化纯重构、工具链、文档。注意豁免必须显式声明——skip_specs的语义是我确认过没有行为变化而不是我懒得写。这正是给 AI 立规矩的微妙之处规则给了明确的例外出口但出口本身也是一条规则。规矩的注入config.yaml 的上下文约束除了文件结构OpenSpec 还把项目级约束写进 openspec/config.yamlcontext字段注入技术栈、跨平台要求等环境事实rules字段按产物类型给出纪律——specs 必须写跨平台路径场景、tasks 涉及文件路径时要有 Windows CI 验证、design 优先用 Node.js path 模块而非字符串拼接。这些约束会随openspec instructions注入 AI 的工作上下文让规矩不只是事后校验而是事前约束。五、结语四件套的本质是契约的可执行化回到标题的问题OpenSpec 是怎么给 AI 编程立规矩的答案藏在四件套的分工里——proposal 立下为什么做的动机契约spec 立下系统该有什么行为的可测试契约design 记录怎么做的技术取舍tasks 把契约翻译成可勾选、可追踪、可验证的执行步骤。schema 用requires依赖图保证产物之间有据可依delta 机制与归档引擎用语义校验保证合并不丢信息validate 与skip_specs保证例外也有规则可循。这种设计的价值在于它不试图替代人的判断而是把人机对齐这件事从对话时的运气问题变成了文件系统里的结构问题。当每个变更都自带一份可审查、可回滚、可追溯的契约时AI 写代码从自由发挥回归按图施工——这或许就是规范驱动开发在 AI 时代重新流行的根本原因。【免费下载链接】OpenSpecSpec-driven development (SDD) for AI coding assistants.项目地址: https://gitcode.com/GitHub_Trending/op/OpenSpec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

北京智培中采教育科技有限公司是做什么的?主要服务哪些在职采购人员?

北京智培中采教育科技有限公司是做什么的?主要服务哪些在职采购人员?

北京智培中采教育科技有限公司是一家专注采购与供应链职业教育的服务机构,品牌名称为智培中采,主要面向工作繁忙的在职采购人员提供CPPM、SCMP相关的资格预审、学习规划、课程学习、复习跟进、培训考试安排说明和取证进度说明。公司提供的是咨询与备考服…

2026/10/13 13:33:51 阅读更多 →
Shardeum错误处理机制:7个异常捕获与恢复策略(完整新手指南)

Shardeum错误处理机制:7个异常捕获与恢复策略(完整新手指南)

Shardeum错误处理机制:7个异常捕获与恢复策略(完整新手指南) 【免费下载链接】shardeum Shardeum is an EVM based autoscaling blockchain 项目地址: https://gitcode.com/GitHub_Trending/sh/shardeum Shardeum 是一个基于 EVM 的自…

2026/10/13 21:05:03 阅读更多 →
Python记账数据分析源码:pandas清洗与matplotlib可视化消费方向

Python记账数据分析源码:pandas清洗与matplotlib可视化消费方向

简介:这是一份面向Python初学者与个人理财爱好者的数据分析实战示例,围绕日常记账数据展开,帮助读者用代码梳理个人消费方向、识别支出结构,从而辅助财务决策。压缩包共3个文件,包含1个py源码脚本、1个xlsx记账数据表和…

2026/10/14 2:36:45 阅读更多 →

最新新闻

Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →
C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:04:31 阅读更多 →
SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →
容器内nvidia-smi报Unknown Error的排查与根治

容器内nvidia-smi报Unknown Error的排查与根治

凌晨两点半,工作群里弹出一条消息:某个长期跑的容器,前一秒还好好的,后一秒容器里的nvidia-smi直接报Failed to initialize NVML: Unknown Error。宿主机上执行nvidia-smi一切正常,新建一个临时容器也能正常看到卡&…

2026/10/14 3:03:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →