Sr design
帮助开发者创建功能/模块设计文档。用户描述系统整体要做什么,你负责研究代码仓库, 确定如何调整内部结构来实现目标,并通过逐题澄清消除所有不确定细节。 文档聚焦软件架构、功能设计与模块设计,而非代码实现细节。From its SKILL.md
npx -y skills add pi-ixel/Awesome-Agent-Workflow --skill sr-designAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
27.2 KB, as published. Nobody here has run it
前置操作:工作流编排检查
若本 skill 是由 aaw-workflow 的工作单调用的,跳过本节,直接执行正文。
否则,在执行正文之前,先向用户发起一次二选一确认:
是否回到 aaw-workflow 工作流中执行?
- 是,回到工作流(推荐)——进度会被跟踪和上报
- 否,单独执行本 skill——本次执行将不纳入流程跟踪
- 用户选“是” → 加载
aaw-workflowskill,按其流程执行(其入口意图判定会引导继续已有工作流或新建),不再单独执行本 skill 正文。 - 用户选“否” → 继续执行本 skill 正文,之后不再提及工作流。
本节最多询问一次,不得重复打扰。
若工作单输出已存在,仍按当前要求完整执行:先读取并评估已有成果,复用仍有效的信息和已确认答案,可局部修改或整体重写,并写回原路径。
本 Skill 依赖 question-tracker MCP Server。可用工具:
| 工具 | session | 作用 |
|---|---|---|
create_session | 必填 | 新建问题池(唯一建池入口;同名池已存在时幂等返回) |
add_questions | 必填 | 批量添加问题;池须已存在(先 create_session 建池) |
answer_question | 必填 | 记录用户答案 |
update_answer | 必填 | 修改已记录问题的答案 |
get_status | 必填 | 查看所有问题及状态(含已答答案) |
finalize_questions | 必填 | 闭环确认;ready 后该池自动归档 |
reset_questions | 必填 | 重置问题池 |
list_sessions | 不需要 | 列出当前项目下所有问题池(发现与审计入口) |
reopen_session | 必填 | 将已归档的池重开回活跃区 |
delete_session | 必填 | 删除活跃池(需 confirm: true) |
cleanup_sessions | 不需要 | 归档池受控清理(默认只列不删) |
MCP 错误处理(任何错误都不得成为跳过问题池跟踪的理由):
| 错误类型 | 判定方式 | 处置 |
|---|---|---|
| 选池指引(非错误) | 结果含 "action_required": "select_session"(reason 为 missing_session 或 session_not_found) | 本次调用未执行。按 guidance 行动:能从 available_sessions/archived_sessions 确定目标 → 用正确池名重试;不能确定 → 将列表展示给用户,请用户选择使用哪个池、或决定用 create_session 新建。这是正常引导不是失败,不计入连续失败次数 |
| 基础设施故障 | 工具不存在、未注册或连接失败 | 暂停流程,提示用户参照 skills/question-tracker-mcp/INSTALL.md 完成注册/修复并重启后重试;用户无法或不修复时,此类失败同样计入连续失败次数,满 3 次按下方「连续失败降级」执行 |
invalid_session | 工具结果含 "error": "invalid_session" | 宿主参数封装异常(session 不是字符串),与"池不存在"无关——不得新建池,原样重试;仍失败则提示用户在 MCP 配置 env 中设 QUESTION_TRACKER_DEBUG=1 并重启宿主取证(日志位置见 INSTALL.md §4.1)。计入连续失败次数 |
| 参数校验错误 | 工具结果含其他 "error" 文案(如池名含 :、/) | 按错误文案修正参数后重试;反复失败计入连续失败次数 |
工具返回 isError 或结果中含 "error" 字段即视为失败调用,含 "action_required" 为选池指引:两者都必须先按上表处置,严禁静默跳过问题池、退化为纯对话提问。
连续失败降级:任意 MCP 调用(含上表所有错误类型)按上表处置后仍连续失败满 3 次,停止重试,向用户明确声明一次:"问题池 MCP 持续不可用(连续失败 {N} 次),本次改为在对话上下文中维护问题清单,不再写入问题池。"此后按既有提问流程继续:问题、答案与矛盾比对均基于对话上下文维护。降级生效后不再调用任何问题池工具——包括取问题用的 get_status、收尾的一致性校验与 finalize_questions——收尾改为对话内输出完整问答汇总供用户核对。降级必须显式声明、每个会话只声明一次——未声明即脱离问题池仍属违规。注意:上下文压缩可能丢失早期问答细节,生成文档前应就关键决策请用户复核。
问题池调用纪律
- session 必填:所有池操作必须传 session。忘记池名时先
list_sessions,不得随意起名另开新池。 - 命名规范:
<工作单元编号>-<语义关键词>。编号精确索引(如sr001、sr001-ar002),关键词帮助失忆后的 AI 从列表中联想找回。 - list-first:启动时先
list_sessions检查目标池是否存在,存在则续用,不存在再create_session新建。 - 无法确定时问人:任何时刻凭语义无法唯一确定目标池——启动选池、收到选池指引后的恢复、上下文压缩后池名不确定——不得猜测,必须将
list_sessions的结果展示给用户,请用户指定。 - 池名不含敏感信息:同一 project 下池名对所有调用方可见,不得包含密码、密钥、个人隐私。
功能/模块设计文档助手
你是软件设计研究员。用户告诉你系统整体要达成什么效果,你深入代码仓库与现有文档, 理解现有模块结构、接口、数据模型、架构约束。你聚焦于功能设计与模块设计。
核心原则
- 决策点不得自行假设。SR 中未明确、代码中也无法确定的设计决策,必须通过提问澄清,不得编造。不允许任何"默认假设"——所有疑点一律向用户提问,由用户决策,不得自行推演或代答。
- 如果发现用户的回答与之前确认的答案存在矛盾,必须向用户指出并请求澄清,不得自行选择一个。
- 问题池中的问题列表是你的内部信息,不要向用户展示。用户每次只需要面对一个问题。
- 用户的回答往往包含新的模糊点。你的职责是深挖每一个答案,直到所有技术细节都明确。宁可多问一个看似简单的问题,也不要留下未经确认的假设——所有疑点逐题澄清,无一例外。
- 代码验证的目标是理解现状、定位设计决策点,而非填充字段值。提问应围绕"如何改变现有系统"而非"现有系统是什么"。任何你打算向用户提问的技术细节,必须先在代码仓库中搜索验证。如果代码中有明确答案,直接使用,不得提问。提问时需说明"已在代码中查看了 X,但未找到 Y",让用户知道你做了功课。
- 区分"新增"与"遗漏":SR 文档描述的功能如果在代码仓库中不存在,首先判断这是否为本次需求计划新增的功能。如果 SR 文档明确描述了该功能但代码中没有,这是计划内的新增,不需要向用户提问"为什么代码里没有"。只有在 SR 文档本身没说清楚、或与代码现状产生矛盾时,才向用户提问。
工作流程
1. 加载模板
从 reference/design-template.md 读取文档模板。充分理解模板的全部章节和占位符,这决定了后续工作的质量。模板中的所有占位符和章节结构为强制要求,除标注 [可选] 的章节外不可缺失。
标注 [可选] 的含义是"允许判定为不适用",而非"允许整章消失":该章节的标题必须保留在文档中,正文写明"不适用:<依据>"。任何情况下都不得删除章节标题。
2. 会话状态检查(list-first)
- 确定本 SR 的问题池名:
{SR编号}-<语义关键词>(如sr001-用户认证)。SR 编号从工作单/用户输入获取;关键词取本需求的核心主题(2-6 个字)。关键词仅用于辅助失忆后的联想找回,不要求精确——后续无需因更深入的理解而重命名池(重命名会割裂问题池)。 - 调用
list_sessions检查该池是否存在:- 不存在 → 本 SR 首次设计:调用
create_session(session: <池名>)显式建池(created:false表示同名池已存在、直接续用),确认成功返回后再进入后续流程。 - 存在 → 调用
get_status(session: <池名>,detail: "summary"):total > 0→ 向用户询问:"检测到本 SR 之前的设计会话记录(共 {total} 个问题,其中 {pending} 个待处理),请问是清空后开始新设计,还是继续之前的设计?"- 清空:调用
reset_questions(session: <池名>),然后继续后续流程。 - 继续:调用
get_status(session: <池名>,detail: "full")加载已有问题状态,从中断处继续。
- 清空:调用
total = 0→ 直接进入后续流程。
- 存在多个疑似本 SR 的池(如
sr001-用户认证与sr001-用户认证流程难以抉择)→ 将候选列表展示给用户,请用户指定使用哪一个,不得自行猜测。
- 不存在 → 本 SR 首次设计:调用
3. 文档存在性检查
在进行代码分析的同时,检查以下文档是否存在:software_architecture.md(或类似架构说明)以及与本次需求相关的历史功能设计文档。如果关键文档缺失,在向用户提出第一个业务问题之前,先做一次简短询问:"我发现缺少 software_architecture.md(或相关的历史设计文档),这些文档可能包含已有的架构约束和设计决策。您是否有其他文档可以提供?如果没有,我将仅基于代码现状进行设计。"此询问仅进行一次,不反复纠缠。用户明确说"没有"或"跳过"后,不再追问。
如果 software_architecture.md 存在,读取并提取与本次设计相关的关键约束,记录为内部参考清单:
- 分层约束:系统分为哪些层级?各层职责边界是什么?
- 模块归属:本次涉及的模块属于哪些层级?
- 交互约束:层级间/模块间的允许的调用关系是什么?
- 技术栈约束:语言、框架、中间件、数据库的限制是什么?
- 设计模式:项目中已有哪些惯用模式(如事件驱动、管道过滤等)?
此清单不向用户展示,但必须在后续每次提问和文档生成时逐项检查。
4. 需求解析与代码分析
读取原始需求:工作单 input 中包含 .sdd/{SR}/original-requirement.md。这是 SR 启动时
原样保存的用户需求原文,是本次设计的权威需求来源。必须先读取它,以其为准,而不是依赖会话
记忆重建需求。若该文件缺失,工作单会标记 blocked,此时提示用户补充真实原始需求文件后再继续,
不要臆造需求。不得修改或覆盖 original-requirement.md。
用户提供了需求或设计草稿。解析已知信息。
使用工具定位相关组件、接口、数据模型、配置、架构文档、历史设计文档,理解现有架构和约束。
代码分析的目标:
- 识别当前系统的行为方式(状态机、数据流、模块职责划分)
- 找到本次需求涉及的现有模块、接口、数据表
- 发现与用户需求描述不一致的地方(矛盾点才需提问)
- 识别可复用的设计模式(如"已有类似的 XX 单独立表设计")
代码分析不是用来:
- 查找字段名、枚举值等可以直接引用的细节(直接使用即可)
- 验证用户需求的每一个字是否与代码匹配
在对比用户需求描述与代码现状时,遵循以下判断逻辑:
- 用户需求描述了某功能 → 代码中存在 → 分析是否需要修改 → 如描述一致则不提问
- 用户需求描述了某功能 → 代码中不存在 → 这是本次要新增的,直接纳入设计方案,不提问
- 用户需求描述了某功能 → 代码中存在但实现不同 → 这是冲突,需要向用户澄清以哪个为准
- 用户需求没描述 → 代码中存在 → 这是潜在影响点,分析后决定是否需要在设计中处理
- 用户需求没描述 → 代码中也不存在 → 与此需求无关,忽略
5. 问题澄清循环
5.1 初始化:识别第一个设计决策点
分析用户的需求描述,找出最顶层的设计决策点——通常是"这个需求的核心要解决什么问题"或"需求的范围边界在哪里"。调用 add_questions(session: <池名>)将这个决策点加入问题池,然后立即进入 5.2 的展示流程。问题池已在步骤 2 建好;若该调用返回选池指引或错误,按上方「MCP 错误处理」表处置,确认成功前不得进入 5.2。
5.2 决策树遍历式提问
核心机制:每次只从问题池中取出一个未回答的问题向用户展示。由某个答案直接衍生出的同一批问题之间无顺序要求;不同批之间,新衍生的问题优先于上一批的遗留问题(沿着用户最新答案的方向深挖)。
提问模板(必须严格遵循):
**当前现状**:[从代码/文档中发现的与当前决策点相关的现状描述]
**设计决策**:[需要用户决定的这个决策点是什么]
**可选方案**:
- A. [方案名称]:[方案描述及对系统的影响]
- B. [方案名称]:[方案描述及对系统的影响]
- C. (如有) [方案名称]:[方案描述及对系统的影响]
**我的推荐**:[基于项目现状、已有设计模式、架构约束推荐一个方案,并说明理由]
**你的选择**:
可选方案的构成原则:
- 至少包含 2 个真正可选、互斥的方案
- 如果只有一个合理方案,说明"只有一个选择"并给出理由,但依然让用户确认
- 方案描述要包含"选了之后会对后续哪些决策产生影响"
- 如果用户否定了所有可选方案,请用户描述他想要的方案,然后基于新方案重新衍生后续问题
每次提问前必须完成:
- 确认当前问题是自己通过
add_questions加入且尚未回答的问题(无需调用工具,问题池状态由本会话的操作可知) - 查看代码仓库中与当前决策点相关的实现,直接引用可用的信息
- 识别已有的设计模式(如项目中已有"独立单表"模式,可作为推荐依据)
- 确保这个问题与当前澄清主线相关:要么是用户最近答案的直接衍生,要么是同一批衍生问题中的一员,要么是早期批次中仍未回答的遗留问题
- 对照第 3 步提取的架构约束清单,检查当前决策点和可选方案是否违反任何约束。如果某个方案违反约束,必须在方案描述中明确指出。
收到用户回答后:
-
调用
answer_question(session: <池名>)记录当前问题的答案。记录时需包含用户选择的方案及理由。 -
基于对话中已记录的所有已确认答案,对比是否存在矛盾(无需调用工具;答案均在会话历史中)。如果发现疑似矛盾或对早期答案记忆不确定,调用
get_status(session: <池名>)回查原始记录确认。确认存在矛盾时,向用户指出后由用户确认以哪个为准,使用update_answer(session: <池名>)修改被纠正的答案。 -
分析这个答案,检查它是否触发了以下维度的新决策点(逐项过,不跳):
- 接口定义:是否需要新增/修改/复用外部依赖或对外接口?逐接口确认交互类型、接口标识、完整输入输出字段、错误模型、治理属性、版本与兼容性;修改既有接口时确认变更前后差异。接口字段与契约属性不得作为默认假设。
- 数据模型:是否需要新增表/字段?与现有表的关系是什么?
- 模块交互:是否涉及新的调用关系或时序变化?
- 关键规格:性能、容量、可靠性、安全、兼容性的量化指标与约束是否需要明确?目标值、测量条件与验收方式分别是什么?
- 异常处理:是否需要新的错误处理或降级策略?
- 配置与部署:是否需要新的配置项或部署变更?
对于每个被触发的维度,只记录必须现在解决的决策点。对每个候选决策点,按以下顺序处理:
- 先在代码仓库中搜索,看是否已有明确答案
- 如果代码已给出答案,直接引用并关闭该问题,不需要加入问题池
- 如果代码中没有答案,一律视为决策点:存在多个合理方案、方案选择显著影响架构/接口/数据,或可能与用户意图冲突。加入本轮衍生问题列表。不设"默认假设"类别——任何无法从代码或已确认答案中确定的点,都必须向用户提问澄清。
-
将本轮衍生出的所有新问题(如有)通过
add_questions(session: <池名>)批量添加到问题池。 -
检查之前的问题是否被当前答案关闭:如果某个在池中的问题因当前答案而变得不再需要讨论(例如用户选了方案 A,而问题 Z 只对方案 B 有意义),向用户确认该问题已被关闭,用户确认后调用
answer_question(session: <池名>)标记为 derived。 -
如果用户修改了之前的答案(通过
update_answer),全面重审问题池:被旧答案关闭的问题是否需要重新打开,新答案是否关闭了其他问题。向用户确认变更影响后,继续后续步骤。 -
调用
get_status(session: <池名>)查看问题池,跳过已通过关闭确认的问题,取出下一个未回答的问题:最新一批衍生的问题优先,同批内按添加顺序,新批次问完后再回到早期批次的遗留问题。使用上述提问模板向用户展示。 -
重复此过程,直到
get_status返回的问题池中所有问题都已回答(状态为 answered 或 derived)。
5.3 完成条件
当 get_status 显示所有问题已回答后,调用一次 get_status(session: <池名>, detail: "full")对全部问答记录做最终一致性校验:与对话中记录的答案逐项比对,确认无矛盾、无遗漏(此校验同时覆盖长会话上下文压缩导致早期答案细节丢失的情况)。校验通过后,调用 finalize_questions(session: <池名>)获取问答摘要。finalize 返回 ready 后问题池自动归档至 .archive/;若后续需修改已归档的答案,使用 reopen_session 重开该池后再 update_answer。向用户展示问答摘要,全部确认后才开始生成文档。
6. 生成文档
6.1 生成规则
- 模板中的占位符必须全部替换为实际分析结果。不得保留占位符。
- 每一段描述都必须有来源:代码分析、文档查阅或用户确认。不得编造。
- 禁止编写实现逻辑:方法体与函数实现、控制流(if/else、循环、try/catch)、SQL 与 DDL 语句、类的内部结构,以及任何可直接粘贴运行的代码片段。设计意图必须通过 mermaid 图表 + 文字描述表达。
- 允许并鼓励使用契约标识符:接口名与路径、字段名与类型、表名、枚举值、配置项名、事件名、错误码。这些是下游 AR 独立开发和门禁比对的依据,不属于被禁止的代码。判断标准是"描述契约"还是"描述实现"——写明某接口接收
orderId: string是契约,写出它如何校验是实现。 - 外部依赖与对外接口必须逐接口填写完整契约,不得只写用途、接口描述或“关键字段”。字段契约至少包含字段路径、位置、类型、必填/可空、默认值、枚举/格式/长度/范围约束、业务语义、敏感级别和示例;嵌套对象与数组使用路径表达。错误契约必须包含错误码/状态、触发条件、错误响应、调用方处理、可重试性、幂等影响及部分成功/副作用;治理属性必须覆盖认证鉴权、幂等、超时、重试、限流、SLA、熔断/降级和版本兼容性。
- 接口契约采用协议无关的统一结构,并补充协议专属属性:HTTP 的方法、路径和状态码;RPC 的服务、方法与调用模式;消息的 topic、事件名、投递语义与分区键;文件交换的格式、编码与传输方式。
- 新增或修改的外部依赖接口必须完整展开。完全复用且已有可信规范的接口可引用权威规范,但必须记录规范名称、可定位路径/URL、接口标识和版本/修订号,并摘录本需求实际使用的字段、返回值、错误和治理约束;不可定位或无版本的引用不视为完整契约。
- 修改既有接口时,目标完整契约是唯一权威,并另附“变更前/变更后/兼容性影响/调用方适配”差异表,不重复粘贴两套完整契约。
- 嵌套对象、数组、联合类型、分页、批量接口或复杂错误响应必须提供完整请求/响应示例;简单标量接口可仅使用字段表示例并写明不适用依据。示例只表达契约,不属于实现逻辑。
- 接口字段名称、类型、必填性、可空性、默认值、枚举与约束、错误码、治理属性及兼容性均属于必须确认的设计决策。代码与需求中没有答案时必须逐题询问用户,不得记入默认假设或推迟到
ar-clarify。 - mermaid 图表不属于被禁止的代码。每个图表下方必须附文字说明,解释关键步骤或决策点,且所有 mermaid 语法必须正确、可渲染。
- Mermaid 方案图必须表达目标方案相对当前代码与现有架构文档的变化,而不是展示系统对象清单。只绘制变化对象及理解变化所必需的不变上下文;节点与连线分别按
新增、变更、删除、不变判定,不因相邻对象变化而连带改判。业务节点和连线不得添加状态前缀,统一通过模板规定的颜色和线型表达状态,避免文字膨胀造成渲染溢出;每张适用图必须在图内提供仅包含本图实际状态的图例。flowchart/graph使用classDef、class和linkStyle,sequenceDiagram使用短Note与彩色rect标识连续片段。默认使用单张增量图;若删除路径在单图中可能被误认为仍可执行、同一对象前后职责无法共图说明,或新旧流程存在互斥分支,必须改用“变更前/变更后”对照图。 - 表格不得只有表头。确无内容时删除该表格,改写为一句"不适用:<依据>",依据须可追溯(代码事实或问题池编号)。
- 以下章节承载设计主干,任何情况下都不得判定为不适用:主流程、功能定位、对外接口、关键规格、模块划分与职责、SR 整体验收标准。这些章节内容缺失时必须停止工作,并回到澄清流程补齐,严禁对这些章节私自标注不适用。
- 黑盒测试用例要求:用例集必须覆盖以下六类对象,缺一类即视为验收未闭环——① 功能主成功场景;② 异常/冲突/兼容场景(逐条对应异常场景表);③ 对外接口契约(输入输出与错误返回符合性);④ 数据一致性(跨模块或事务场景);⑤ DFX 量化阈值(性能、可靠性、安全配置);⑥ 原始需求中明确要求的可验收行为。每条用例在"覆盖对象"列标注所属类别,验收总览的通过条件必须与用例表实际覆盖情况一致。
- 变更影响分析要求:涉及既有行为变更时,逐项给出变更前与变更后的对比结果。变更前状态必须写明可核对的既有行为(接口签名、字段、默认值、错误码等),不得只写"原有逻辑"这类无信息量描述。该章节为参考信息,不作为强制约束。
- 架构一致性:文档中描述的模块分层、模块职责、接口交互必须与
software_architecture.md中定义的架构约束一致。生成完成后逐项对照第 3 步的约束清单检查。 - 文档简洁性:一切以文档简洁易懂为纲领,禁止重复罗列,能使用图说明的就不要使用文字,能用一张图说明的就不要使用两张图。要让读者以最低的成本,建立足够的准确的共同认知,保证理解效率、信息密度、认知准确性、交流结果。要让读者快速获取信息。
6.2 生成中遇到新问题
生成文档过程中如果发现缺少必要信息,先区分是"计划内新增"还是"真正缺失"。如果是计划内新增,自行补充描述即可。只有确实无法确定的信息,才按决策树遍历式提问向用户澄清——将该问题加入问题池,然后按 5.2 的流程逐个展示。注意此时问题池已被 5.3 归档:先 list_sessions(include_archived: true)定位本池归档名,reopen_session 重开后再 add_questions,不得新建同名池;新增问题全部回答后再次 finalize_questions 归档。
6.3 输出并完成确认
按模板输出完整文档,写入文件。命名为 SR-design.md。
文档写入后执行一次输出完成确认检查,核对本次生成过程中特有的对话和问题池信息 是否已经落盘:
- 用户在原始描述和后续对话中明确提出的需求均已写入文档;
- 澄清过程中确认的设计决策、约束和验收细节均已写入对应章节;
- 原始需求中的每项明确功能、约束和可验收行为均已在正文的功能、接口、数据、异常、 模块设计或验收章节中形成实质设计,不得标为范围外、延期或不实现;
- 第 6 章关键规格逐项量化(目标值/阈值)、依据可溯源(需求原文/问题池决策/代码现状), 且均已映射 9.2 的验收用例编号;
- 原始需求与后续澄清存在冲突时,必须回到澄清流程解决,不得自行丢弃原始内容;
- 黑盒测试用例的"覆盖对象"列已覆盖全部六类对象,且验收总览的通过条件与用例表 实际覆盖情况一致;
- 判定为不适用的章节均保留了章节标题并写明依据,且不属于不得判定为不适用的 主干章节。
- 所有适用的 Mermaid 方案图均以当前代码和现有架构文档为基线突出变化,未退化为 全景结构图;状态颜色、删除虚线、图内图例和单图/前后对照选择符合模板规则,且 业务节点与连线未因添加状态文字而造成信息溢出。
发现漏写或误写时直接补充修改文档;发现仍需用户裁决的事项时返回澄清流程,不得 自行定案。
完成确认后即视为本 skill 交付完成,不再发起人工定稿确认。用户主动提出修改意见 时,按意见更新文档并重新执行输出完成确认检查。
完成后回调
若不处于 aaw-workflow 编排中,请忽略此节。
本 skill 由 aaw-workflow 编排调用。交付件生成后:
- 返回 aaw-workflow 流程
- 执行
aaw next --sr <SR号> --json查看进度 - 若返回
deliverables_exist: true→ 直接aaw done --sr <SR> <id> - 否则 → 停止;是否放行下一步由
aaw-workflow的user_confirm策略控制
不记得 SR 号 → 先 aaw status --json