S.U.P.E.R 架构五原则深度解析:Spec-Driven Develop 如何为 AI 生成代码装上架构护栏
S.U.P.E.R 架构五原则深度解析:Spec-Driven Develop 如何为 AI 生成代码装上架构护栏
Spec-Driven Develop 是一款面向 AI 编程代理(Claude Code、Codex、Cursor 等)的规范驱动开发工作流插件,其核心架构护栏正是 S.U.P.E.R 五原则——Single Purpose、Unidirectional Flow、Ports over Implementation、Environment-Agnostic、Replaceable Parts。它把"像搭积木一样写代码"的理念织入项目分析、任务分解、执行审查的每一个阶段,确保 AI 生成的每一行代码都经过架构健康度把关,而不是盲目堆砌功能。
为什么 AI 生成代码需要架构护栏?
🤖 当你让 AI Agent "用 Rust 重写这个项目"或"迁移到微服务架构"时,一个常见的现实是:
- AI 会兴奋地一口气写出几百行"能跑"的代码,但模块边界模糊、依赖方向混乱、配置硬编码散落各处
- 几周后想替换一个数据源,结果牵一发动全身,改了 A 文件 B 文件也炸了
- 代码能运行,但替换成本高得离谱——这才是架构质量的真正指标
Spec-Driven Develop 的解法不是写一条提示词,而是在工作流的每个阶段嵌入一套可量化的架构约束体系——S.U.P.E.R 五原则。它源自 Unix 哲学、Clean Architecture、Hexagonal Architecture 和 12-Factor App 等经典思想,但被重新组织成一套 AI Agent 能"执行"的检查清单。
完整原则定义见 super-philosophy.md
S.U.P.E.R 五原则速览
| 字母 | 原则 | 一句话解释 | 思想来源 |
|---|---|---|---|
| S | Single Purpose | 一个模块、一个文件、一个函数只解决一个问题 | Unix 哲学 |
| U | Unidirectional Flow | 数据单向流动,依赖只指向内层,禁止循环调用 | Clean Architecture |
| P | Ports over Implementation | 先定义接口契约(Schema/数据结构),再写实现 | Hexagonal Architecture |
| E | Environment-Agnostic | 配置走环境变量,代码在本地、Docker、VPS 上都能跑 | 12-Factor App |
| R | Replaceable Parts | 任何一层都能被替换而不影响其他层——替换成本是架构质量的核心指标 | S+U+P+E 的自然结果 |
🔑 核心类比:搭乐高。每块砖只有一个功能(S)、卡扣方向一致(U)、接口标准化(P)、任何玩具套装都能用(E)、想换一块随时换(R)。
逐一拆解:每个原则怎么"卡住"AI
S — Single Purpose:单一职责
试金石:如果你不能用一句话描述一个模块的职责,它就该被拆分。
AI 常见反模式:一个脚本同时做数据抓取、指标计算、图表渲染和消息通知。
S.U.P.E.R 的正确姿势:
fetch_data.py → 只负责取数据,输出 JSON
compute.py → 只负责计算,读 JSON 写 JSON
render.py → 只负责渲染,读 JSON 生成 HTML
notify.py → 只负责通知,读 JSON 调 webhook
在 Spec-Driven Develop 中,Phase 1(项目深度分析) 阶段会为每个模块逐一评估 S 原则合规度,不合规的模块会被标记为"需要拆分",并直接写入任务分解计划。
U — Unidirectional Flow:单向数据流
分层模型(从外到内):
+-----------------------------------+
| Infrastructure (API, DB, UI) | ← 最外层,可随时替换
+-----------------------------------+
| Adapters (transform, format) |
+-----------------------------------+
| Core business (pure logic) | ← 最内层,零外部依赖
+-----------------------------------+
试金石:核心逻辑能否在零外部服务的情况下跑通单元测试?如果不能,依赖方向就错了。
AI Agent 在分析阶段会检测循环依赖,并在规划阶段将"解耦"任务排到早期 Phase 优先执行——而不是等功能全写完再回头收拾。
P — Ports over Implementation:接口契约先行
三条实践规则:
- 每个模块的输入和输出必须是可序列化的数据结构
- 跨模块通信通过 JSON 文件或标准数据结构,跨模块接口必须有显式 Schema
- 定义明确的接口契约——不是"看代码自己琢磨格式"
为什么这对 AI 特别重要:AI 在并行执行多个任务时,如果模块之间没有显式契约,不同任务产出的代码格式会悄悄漂移。P 原则用 Schema 把"上游"和"下游"隔离开,替换数据源、渲染层或通知渠道时,核心逻辑零改动。
E — Environment-Agnostic:环境无关
配置优先级(从高到低):
环境变量 > .env 文件 > config.json > 代码内默认值
检查清单:
- ✅ 所有 API key、webhook URL 从环境变量读取?
- ✅ 所有依赖显式声明在
requirements.txt/package.json? - ✅ 没有硬编码的文件路径假设?
- ✅ 换一台机器能零修改跑起来?
Phase 1 的风险评估会专门捕获硬编码配置和平台特定假设,这些发现会作为"S.U.P.E.R 违规热点"进入后续规划。
R — Replaceable Parts:可替换部件
这是前四个原则的自然结果和终极目标。核心度量指标是替换成本——替换一个组件是否引发无关模块的连锁修改?
替换矩阵(来自 super-philosophy.md):
| 要替换的东西 | 影响范围 | 正确做法 |
|---|---|---|
| 数据源 API | 仅适配器层 | 写新 fetcher,输出相同 JSON |
| 前端渲染器 | 仅渲染层 | 读相同 JSON,换渲染实现 |
| 通知渠道 | 仅通知层 | 换 webhook 适配器 |
| 部署平台 | 仅部署配置 | 改 Dockerfile 或配置文件 |
| 编程语言 | 仅实现层 | JSON 契约不变,用任何语言重写 |
🚨 判断标准:如果替换一个组件导致无关模块连锁变更,架构就是"坏的"。
S.U.P.E.R 在工作流各阶段的落地
S.U.P.E.R 不是一份"AI 可能会读"的参考文档——它被织入工作流的每一层。以下是 SKILL.md 中定义的各阶段集成点:
| 工作流阶段 | S.U.P.E.R 如何生效 |
|---|---|
| Phase 1 深度分析 | 每个模块获得逐原则合规评分(格式:S🟢 U🟡 P🔴 E🟢 R🟡),风险评估中包含"S.U.P.E.R 架构健康度汇总"和违规热点排名 |
| Phase 2 意图精炼 | 分析发现呈现给用户,让用户在任务分解前做出关于范围和 S.U.P.E.R 优先级的知情决策 |
| Phase 3 任务分解 | 每个任务标注其"S.U.P.E.R 设计驱动原则"(该任务最需要关注哪些原则),早期 Phase 优先修复违规热点 |
| Phase 5 执行与审查 | 每个任务完成后运行 10 项 S.U.P.E.R 代码审查清单;自适应控制循环将 S.U.P.E.R 合规评分作为执行遥测的一部分采集 |
分析阶段的模块清单模板要求对每个模块逐项评估五个原则,具体格式见 analysis.md;规划阶段的每个任务行都包含 S.U.P.E.R 列,见 plan.md。
10 项代码审查清单:任务完成的"门禁"
每个任务完成时,AI Agent 必须运行以下 10 项检查(来源:SKILL.md Phase 5):
| # | 检查项 | 对应原则 |
|---|---|---|
| 1 | 每个新模块/文件恰好一个职责 | S |
| 2 | 没有函数做了多于一件事 | S |
| 3 | 数据流为 输入→处理→输出,无反向依赖 | U |
| 4 | 没有引入循环导入 | U |
| 5 | 跨模块接口有 Schema 定义 | P |
| 6 | 模块 I/O 可序列化 | P |
| 7 | 没有硬编码的路径、URL、密钥或配置值 | E |
| 8 | 所有新依赖已显式声明 | E |
| 9 | 新模块可被替换而不修改其他模块 | R |
| 10 | 变更后所有测试通过 | — |
判定规则(简单粗暴):
- ✅ 全部通过 → 继续下一个任务
- ⚠️ 1-2 项失败 → 修复后重新审查,然后才能标记任务完成
- 🛑 3 项及以上失败 → 停止执行,先重构再推进
自适应控制:S.U.P.E.R 分数成为"执行遥测"
这是 S.U.P.E.R 最精妙的设计之一。工作流不仅事前约束,还事后度量。
每个任务完成后,Agent 会采集三项遥测信号(定义见 adaptive-control.md):
| 信号 | 采集内容 |
|---|---|
| 实际工作量 | 估算 effort(S/M/L/XL)vs 实际,取差值 |
| S.U.P.E.R 分数变化 | 运行 10 项清单,记录 super_score(0-10)和 super_delta(相对任务前状态的变化) |
| 计划外依赖 | 执行中发现的、任务描述里没列的依赖数量(上限计 2 个) |
三者合成 task_drift,累加到全局 drift_score。当偏差超过阈值时,系统自动响应:
| 漂移等级 | 阈值(按阶段任务数百分比) | 自动响应 |
|---|---|---|
| 轻度 | ≥ 20% | 给下一个任务加警告标注 |
| 显著 | ≥ 40% | 暂停执行,重新分解剩余任务 |
| 严重 | ≥ 60% | 暂停执行,回到 Phase 2 重新评估范围 |
这意味着:如果 AI 持续产出 S.U.P.E.R 合规度下降的代码(super_delta 为负),漂移分会累积,系统会强制它停下来反思,而不是"硬着头皮继续写"。
真实案例:项目自己的归档
这个仓库就有一段完整的 S.U.P.E.R 工作流归档,可以直观看到五原则如何在实际任务中运作——"Adaptive Control Layer" 项目,6 个任务分 3 个 Phase,完整文档在 docs/archives/adaptive-control-layer/。
几个任务的实际标注(摘自 task-breakdown.md):
| 任务 | 描述 | S.U.P.E.R 驱动原则 | 为什么是这个原则 |
|---|---|---|---|
| T1 | 创建 adaptive-control.md 协议文档 | S, P | 单一职责文档 + 定义遥测接口契约 |
| T2 | 将自适应控制集成到 SKILL.md | U | 确保数据流单向:SKILL 控制 → 执行器反馈 |
| T3 | 子技能模板增加遥测章节 | S, P | 新增单一职责模块 + Schema 化遥测格式 |
| T5 | 行为规则新增 3 条 | S | 每条规则只管一件事 |
任务间的依赖关系用 Mermaid 图表达,见 dependency-graph.md,整体结构为 Phase 1 打基础 → Phase 2 并行 3 条 Lane 集成 → Phase 3 收尾。每条 Lane 负责不同文件,合并风险被显式评估为 Low/None。
快速上手:让 S.U.P.E.R 护栏开始工作
📦 安装(以 Claude Code 为例):
/plugin marketplace add zhu1090093659/spec_driven_develop
/plugin install spec-driven-develop@spec-driven-develop
其他平台(Codex、OpenCode、Cursor)的安装脚本见 scripts/ 目录,或直接复制 SKILL.md 到你 Agent 的指令目录——纯 Markdown,零依赖。
🚀 触发方式:直接用自然语言描述大型改造任务即可自动触发,例如:
"把这个 Python 项目迁移到 Rust" "重构整个项目为微服务架构"
也可以手动触发:
/spec-dev rewrite this Python project in Rust
触发后,Agent 会进入 6 阶段流水线(Phase 0 意图捕获 → Phase 1 深度分析 → Phase 2 意图精炼 → Phase 3 任务分解 → Phase 4 进度追踪 → Phase 5 确认与执行),每个阶段都会自动应用 S.U.P.E.R 检查。
📁 产出物:所有分析、规划、进度文档统一存放在 docs/ 目录下,完成后归档到 docs/archives/,完整保留可追溯性。
小结
S.U.P.E.R 五原则把"好架构"从模糊的口号变成了可执行、可度量、可自动响应的工程约束:
- 事前:分析阶段给每个模块打分,规划阶段给每个任务标注设计驱动原则
- 事中:10 项代码审查清单作为任务完成的硬门禁
- 事后:S.U.P.E.R 分数变化进入自适应控制遥测,偏差超标自动暂停、重新规划
对于使用 AI 编程代理做大规模改造的开发者来说,这套护栏的意义是:让 AI 像资深架构师那样思考边界,而不是像打字机一样堆代码。