用途
Grill Requirements 用于为 IEC 62304 项目定义或细化软件需求(REQ 条目)。它通过一次只问一个问题的访谈方式,与用户就某项能力达成共同理解,并在每条需求确定后立即写入需求台账。该技能还负责维护项目术语表和架构决策记录(ADR)。
主要能力
- 一对一访谈:每条消息只问一个问题,每个问题都附带推荐答案及理由。能从环境(代码、文档、git 历史)查证的事实不询问用户,但每个决策仍交由用户确认。
- 决策树遍历:逐一走完决策树的每个分支,一次解决一个决策之间的依赖。
- 压力测试:用具体场景检验答案,构造边界情况以迫使精确边界。
- 失败行为追问:对于 B 类和 C 类软件,针对每项能力追问“失败时必须发生什么?”,每个答案也是一条需求。C 类还会质疑软件项之间的边界。
- 写入前探测:在需求确定前运行两个子代理探测——重叠探测和架构探测。重叠探测查找已覆盖该行为的条目,返回 ID、一行摘要和 file:line;架构探测查找 SAD 中的 SDD 和 LLR 条目,回答三个问题:是否已有软件项拥有该行为、需求措辞是否强制了 SAD 禁止的结构、满足它是否需要新软件项或新 SOUP。
- 需求写入:逐条更新需求台账,不批量写入。新条目写入本次变更自己的文件
docs/requirements/<YYYY-MM-DD>-<slug>.md。条目形式为**<ID>**: The software shall <single, testable behavior>.,ID 通过.guardrails/scripts/new-id.sh REQ获取,不手写。 - 派生需求处理:仅因设计结果而存在的需求标记为
satisfies: derived,并移交 analyze-risks。实现风险控制的需求以(implements: RC-…)结尾。 - 取代与退役:取代或退役通过注解记录,绝不删除。取代时旧条目加
superseded-by: <new ID>,新条目加supersedes: <old ID>;退役时旧条目加retired: YYYY-MM-DD — <reason>。被取代或退役的条目不再有效,不承担测试,也不履行任何覆盖。 - 依赖声明:在多单元仓库中,添加
depends_on:前需与用户逐一检查提供方的导出面、RMF、ADR、开放问题报告及其传递 SOUP。发现的缺口写为消费者 REQ,带expects: <unit>和opened: YYYY-MM-DD。 - 术语表维护:
docs/CONTEXT.md是项目术语表,只含定义。术语冲突立即指出,模糊或过载术语提出一个规范术语并将被拒同义词记入_Avoid_。多单元时默认写入单元自己的术语表,接口术语升级到根术语表。 - ADR 记录:仅对同时满足难以逆转、无上下文则令人意外、真实权衡结果三个条件的决策,提议记录 ADR。ID 通过
.guardrails/scripts/new-id.sh ADR生成,每个文件一个决策。
使用方式
开始时宣布:“Using the grill-requirements skill to define requirements.” 前置条件:处于变更工作树中;从 .guardrails/config.yaml 读取 doc_srs、doc_sad 和 safety_class;若存在 .guardrails/units.yaml,则适用其中“声明依赖”和“术语表”下的单元规则。访谈期间不编写实现代码。
适用场景
适用于 IEC 62304 项目的软件需求定义与细化,尤其是需要严格追踪、可测试需求、术语一致性和架构决策记录的场景。也适用于多单元仓库中的依赖声明和跨单元术语管理。
限制
- 不编写实现代码。
- 不直接编辑 SAD;遇到矛盾移交给 design-architecture。
- 不批量写入需求。
- 不手写 ID。
- 不删除需求条目,只取代或退役。
- 不将缺口记录为提供方台账中的问题报告。
- 不发明父需求。
- 探测子代理的台账不得进入当前对话上下文。
完成条件
用户明确确认共同理解;探测发现的所有重叠、歧义或矛盾均已与用户解决;每条新增或变更的 REQ 都在 SRS 中,ID 来自 new-id.sh,且按所写可测试;术语表已更新;满足三部分测试的 ADR 已记录。移交:风险给 analyze-risks,设计给 design-architecture,实现规划给 plan-change,集成给 merge-change。