<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SDD on 春水煎茶</title><link>https://www.chunshuijiancha.top/tags/sdd/</link><description>Recent content in SDD on 春水煎茶</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 19 Apr 2026 20:00:00 +0800</lastBuildDate><atom:link href="https://www.chunshuijiancha.top/tags/sdd/index.xml" rel="self" type="application/rss+xml"/><item><title>从 Vibe Coding 到 SDD：企业级 AI 编程范式的演进与实践</title><link>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-1-onboarding/</link><pubDate>Thu, 16 Apr 2026 10:00:00 +0800</pubDate><guid>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-1-onboarding/</guid><description>通过 SDD + OpenSpec，我们在一个真实的存量项目中，用 AI 生成了 9600+ 行可编译、可测试的代码，手动修改不到 50 行。本文记录了完整的实践过程、评测结果和踩坑经验。</description></item><item><title>OpenSpec 架构：把 AI 协作从“对话驱动”变成“状态驱动”</title><link>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/</link><pubDate>Sun, 19 Apr 2026 20:00:00 +0800</pubDate><guid>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/</guid><description>&lt;h2 id="openspec-架构"&gt;OpenSpec 架构&lt;/h2&gt;
&lt;h3 id="整体架构"&gt;整体架构&lt;/h3&gt;
&lt;p&gt;可以把它理解成三层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;状态层&lt;/strong&gt;：仓库目录本身就是状态存储&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算层&lt;/strong&gt;：schema + dependency graph + validator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交互层&lt;/strong&gt;：CLI 和 skills，把结构化状态喂给 AI 或人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套分层很重要，因为它避免了一个常见问题：把“流程”硬编码进 prompt。在 OpenSpec 里，prompt 只是表现层；真正的工作流定义在 schema 中，真正的状态在文件系统里。&lt;/p&gt;
&lt;p&gt;&lt;img alt="OpenSpec 整体架构图（Excalidraw 重绘）" loading="lazy" src="https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/arch_overall_excalidraw.svg"&gt;&lt;/p&gt;
&lt;h3 id="核心对象"&gt;核心对象&lt;/h3&gt;
&lt;p&gt;OpenSpec 其实有4个核心对象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;specs&lt;/code&gt;&lt;/strong&gt;：当前系统行为的 source of truth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;changes&lt;/code&gt;&lt;/strong&gt;：待合入的变更包&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;schema&lt;/code&gt;&lt;/strong&gt;：工作流定义，决定有哪些 artifact、它们如何依赖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;archive&lt;/code&gt;&lt;/strong&gt;：变更完成后的历史沉淀&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果第一次使用，你可能会好奇schema是什么?&lt;/p&gt;
&lt;p&gt;&lt;img alt="img.png" loading="lazy" src="https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/arch_01.webp"&gt;&lt;/p&gt;
&lt;p&gt;在每次变更文件夹中，&lt;code&gt;.openspec.yaml&lt;/code&gt;文件中就有 &lt;code&gt;schema&lt;/code&gt;字段，默认值为&lt;code&gt;spec-driven&lt;/code&gt;。可以在源码中，看到&lt;code&gt;spec-driven&lt;/code&gt;定义了产出物（artifacts）的目录、文件名、文件格式、生成Prompt等，以及实施阶段（apply）读取的任务文件和Prompt。
这是OpenSpec预定义的schema，我们也可以自定义schema，对他进行扩展。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img.png" loading="lazy" src="https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/arch_schema_01.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img.png" loading="lazy" src="https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-2-architecture/arch_schema_02.webp"&gt;&lt;/p&gt;
&lt;h3 id="工作流"&gt;工作流&lt;/h3&gt;
&lt;p&gt;如下是OpenSpec默认的工作流，通过schema定义中的&lt;code&gt;requires&lt;/code&gt;字段定义依赖关系。&lt;/p&gt;
&lt;div class="mermaid-container"&gt;
&lt;div class="mermaid"&gt;
flowchart LR
proposal --&amp;gt; specs
proposal --&amp;gt; design
specs --&amp;gt; tasks
design --&amp;gt; tasks
tasks --&amp;gt; apply
apply --&amp;gt; archive
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;artifacts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;proposal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;generates&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;proposal.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requires&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;specs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;generates&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;specs/**/*.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requires&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;proposal]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;design&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;generates&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;design.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requires&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;proposal]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tasks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;generates&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tasks.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requires&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;specs, design]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apply&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requires&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;tasks]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;这里的设计哲学：&lt;strong&gt;dependency is an enabler, not a gate&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是说，依赖表示“现在什么是可做的”，而不是“你必须严格按唯一顺序前进”。这和很多传统 spec 流程差异很大：后者把流程建模成 phase，前者把流程建模成 action + dependency。&lt;/p&gt;</description></item><item><title>openspec增强</title><link>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-3-enhancements/</link><pubDate>Thu, 16 Apr 2026 10:00:00 +0800</pubDate><guid>https://www.chunshuijiancha.top/posts/llm/xdd/openspec/part-3-enhancements/</guid><description>&lt;p&gt;ing&amp;hellip;&lt;/p&gt;</description></item></channel></rss>