关于 ratchet
ratchet 是为新项目搭建 guardrails,并在现有仓库中逐步采用或升级 guardrails 的技能。它指导项目盘点、配置、安全分类和验证设置。
主要功能
- 01为新项目搭建 guardrails
- 02分析现有项目的差距
- 03配置单元或多单元仓库
- 04访谈确定软件安全等级
- 05设置验证与工具资质记录
适用场景
- 01为新建仓库添加 guardrails
- 02规划旧项目的渐进式管控
- 03升级现有 guardrails 脚本与模板
- 04设置期间评估软件安全风险
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jan-jan/ guardrails --skill ratchet安装后在 Claude Code 中输入/ratchet确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/multi-unit.mdrationale.mdsetup-checklist.mdupgrade-notes.md详细介绍
Ratchet — 为项目引导或强化防护措施
开始时宣布:“正在使用 ratchet 技能,为此项目设置防护措施。”
前置条件
- 用户调用了
/ratchet,或要求为项目设置、补充或更新防护措施。当前目录就是该项目。 - 对于现有项目,逐步强化执行力度。绝不放宽门禁,也绝不覆盖人工编写的内容。
步骤
步骤 0:定位防护措施源文件
防护措施源文件是与此 SKILL.md 同级、名为 .guardrails-source 的目录(install.sh --copy),否则就是它上两级的仓库;其中包含 templates/ 和 scripts/。读取之前,运行 git clone -q <checkout> <guardrails>,将其克隆到 <tmp>/guardrails;<tmp> 是项目外的临时目录。所有复制操作和测试套件均从该克隆读取;ratchet 完成后删除克隆(references/rationale.md)。
步骤 1:判断模式
Greenfield = 除脚手架外没有其他提交,且没有源文件和现有 AGENTS.md/文档。其他情况均为 retrofit。如果项目已有 .guardrails/scripts/,且需要更新版本,则属于 upgrade:按下方专用流程操作,不做差距分析(references/rationale.md)。
git rev-list --count HEAD 2>/dev/null # none or few → likely greenfield
ls src lib app AGENTS.md docs 2>/dev/null
除非显然是一个程序的仓库,否则要提问(一次只问一个问题,并推荐一个答案):是一个系统包含多个包,还是一个仓库包含多个系统? 一起进行版本管理、发布并承担风险的包属于同一系统:单一单元项目不需要清单,其余步骤照常执行。需要分别满足合规要求的系统,应先进行单元访谈(步骤 1b),再复制任何文件。
步骤 1b:单元访谈(仅适用于多单元仓库)
/ratchet 用于声明事实;规则不可配置。一次只问一个问题,推荐一个答案,并按照表格指示记录每项事实:
| 询问内容 | 写入位置 |
|---|---|
| 单元有哪些?(每个单元都是相对目录) | .guardrails/units.yaml 中的 units: |
| 哪些内容不纳入合规范围,原因是什么? | 清单中的 not_a_unit:;原因作为 # 注释放在对应条目旁 |
| 每个单元的安全等级是什么? | 该单元配置中的 safety_class: — 步骤 4 的访谈,每个单元重复一次 |
| 每个单元依赖什么? | 消费方单元配置中的 depends_on: — 每条边都会触发依赖评估(grill-requirements,“声明依赖”) |
| 是否有依赖被隔离?依据哪项控制措施? | 消费方配置中的 segregated_from:,并注明 (RC-…)、(adr: <path>) 或 (ADR-<token>)(文件位于根目录或消费方的 docs/adr/);check-units.sh:未注明来源的条目会被标记为 INCOMPLETE-SEGREGATION |
不要询问是否适用等级下限、某个单元是否可以查看其他单元的内部内容,或哪些单元会在合并时运行。
按顺序逐步采用,每次只进行一步。强制的第一步是创建清单、各单元配置和免责声明;depends_on: 为空的单元,是一个与其他项目共用仓库、独立运行的防护措施项目。清单中只列出一个单元、其他所有内容均声明为不纳入范围,是有效且可通过检查的第一步。只有在耦合确实存在时,才声明依赖边(depends_on:、导出项和预期)。
然后运行 .guardrails/scripts/check-units.sh。其发现项(尤其是 UNCLAIMED-PATH)就是免责声明问题的待办清单。
步骤 2(从零搭建):脚手架
-
如果还不是 Git 仓库,运行
git init(默认分支名不限);如果尚无提交,创建一次初始提交(工作树需要一个基底)。 -
为脚手架创建工作树(
worktree-discipline)。 -
从
<guardrails>复制以下内容:- 单单元:
templates/config.yaml→.guardrails/config.yaml - 多单元:将访谈结果填入
templates/units.yaml,复制到.guardrails/units.yaml;并将templates/config.yaml→<unit>/.guardrails/config.yaml,为每个单元调整其doc_*路径和verify_commands。清单仓库中不得存在根目录下的 .guardrails/config.yaml:在每个关卡中,一个目录树由两个权威配置管理会导致退出代码为 2。references/multi-unit.md说明了哪些文件应放在各单元中。 scripts/*.sh→.guardrails/scripts/(保留可执行权限)templates/srs.md→docs/requirements/README.mdtemplates/rmf.md→docs/risk/README.mdtemplates/sad.md→docs/architecture/README.mdtemplates/soup.md→docs/architecture/soup.mdtemplates/problems.md→docs/problems/README.mdtemplates/CONTEXT.md→docs/CONTEXT.mdtemplates/*_GUIDELINES.md→.guardrails/templates/templates/CLAUDE.md→CLAUDE.md(如果已存在则跳过)templates/AGENTS-block.md→ 新建AGENTS.md的正文
requirements、risk、architecture 和 problems 目录是按变更记录的日志:每次变更新增一个文件,命名为
YYYY-MM-DD-<slug>.md,日期为创建该变更的当天。每个 README 都包含条目格式说明。 - 单单元:
-
创建
docs/adr/、docs/plans/和docs/verification/,并将templates/verification.md复制到.guardrails/templates/verification.md。切勿将模板放入docs/verification/:其中的每个*.md都会被视为记录。如果记录保存在其他位置,请设置doc_verification。将以下缺失项添加到.gitignore:.worktrees/ .claude/worktrees/ *.bak即使项目此前只使用过一个工作树,也要添加两条工作树排除项:
.claude/worktrees/用于 harness 的变更工作树,.worktrees/用于手动回退方案和每个任务工作树;任务工作树嵌套在变更工作树中(worktree-discipline步骤 1)。 -
确保提交中存在每个已配置路径;否则
check-trace.sh会以退出代码 2 结束,而 Git 不会跟踪空目录。strict_paths/test_paths条目是 Git 路径规范,必须至少匹配一个已提交文件;在空的src/中放置.gitkeep即可。doc_*值必须是文件,或其中直接包含*.md文件的目录。目录中必须有实际的*.md文件,不能只有.gitkeep:保留子步骤 3 中的 README。- 目录尚无内容时,切勿省略某个键。若要关闭某个关卡,请从
id_prefixes中移除其前缀,并记录原因。
-
进行安全等级访谈(步骤 4),将答案写入
safety_class:,替换TBD占位值,并将verify_commands设置为项目实际使用的测试命令。对TEST、CODE和ARCHITECTURE运行tailor-guidelines(对于需要单独文件的每个单元,再运行一次)。 -
在工作树中提交,然后使用
merge-change集成。检查脚本必须在集成结果上通过。
升级现有项目中的脚本
在工作树中进行,并作为单独的变更处理。
- 按照
references/upgrade-notes.md中的工作顺序执行;其中前三项必须在步骤 2 之前完成。 - 复制前,为每个指南文件在升级模式下运行
tailor-guidelines。然后从<guardrails>复制scripts/*.sh→.guardrails/scripts/,保留可执行位;并复制templates/*_GUIDELINES.md→.guardrails/templates/。如果存在,请删除.guardrails/scripts/finalize-ids.sh、finalize-docs.sh和prune-plans.sh。 - 更新说明语法规则的文件,使其与脚本保持一致。 从同一 guardrails 版本重新复制四个账本 README 和验证模板,并重新替换 AGENTS.md 中的受管区块。如果项目修改过某个 README,请先比较差异,再重新应用其新增内容。
- 运行
check-trace.sh;修复每项失败,并在步骤 5 写入验证记录时,逐项列出新增警告。现有账本会报告存在问题的status:/opened:、互为对应的取代关系以及DANGLING-FILE。 现在会声明派生评估:如果 RMF 中没有assesses:行,派生的 REQ/LLR 将标记为红色。 - 重新记录工具鉴定(步骤 5),然后通过
merge-change集成。
步骤 3(改造):先分析差距,再逐步收紧
- 盘点(只读):AGENTS.md/CLAUDE.md 的内容,以及与 guardrails 冲突的规则(“直接提交到基准分支”);现有需求、风险和架构文档;错误跟踪器或问题日志;值得归档到
docs/verification/下的验证证据;测试布局和命令;CI 配置;近期提交的签名情况(git log -20 --format='%h %G? %s')。 - 将差距分析写入
docs/plans/<YYYY-MM-DD>-ratchet-gap-analysis.md:说明现有内容、缺失内容、冲突内容以及建议的采用顺序。这是本次变更的计划,在通过门禁前将其移除:步骤 5 写入验证记录后,将采用顺序复制到该记录中。 - 第一齿:安装
.guardrails/(配置、脚本和模板,或来自步骤 1b 的清单和单元级配置),将受管区块合并到 AGENTS.md,添加缺失的文档骨架,并按步骤 2.4 所列扩展.gitignore。本次变更中不要迁移现有文档。 对于多单元仓库,请先阅读references/multi-unit.md。- 如果 `` 存在,只替换标记之间的区块。否则,将
templates/AGENTS-block.md全文追加。向用户说明冲突规则;不要删除这些规则。 - 将
strict_paths设为较小的路径列表,其中仅包含已符合要求或新建的路径。现有未追踪的代码视为既有内容,不受此要求约束。
- 如果 `` 存在,只替换标记之间的区块。否则,将
- 后续齿(单独的变更,列入改造的验证记录):通过
grill-requirements/analyze-risks迁移旧版需求和风险文档;为每个指南文件运行tailor-guidelines;逐个区域扩展strict_paths。 每个doc_*键都接受文件或目录,因此srs.md仍可继续使用;对于多开发者仓库,建议先将每个整体式doc_*文件移入目录,作为该目录中带日期的首个文件,并附上 README,以避免变更相互冲突。 - 通过
merge-change集成。
步骤 4:安全等级访谈(IEC 62304 4.3)
每次只问一个问题,并建议一个答案:
- 此软件发生故障是否可能导致危险情况? 如果否 → A 类。
- 如果是:考虑软件之外的外部风险控制后,可能造成的伤害是否会是严重伤害或死亡?如果是 → C 类;如果是非严重伤害 → B 类。
- 将理由记录为 ADR(
grill-requirements,“ADRs”)。
如果用户不确定,请先梳理预期用途、可预见的误用和硬件防护措施。若介于两个类别之间,在有充分理由支持其他结论前,按较高类别处理。
对于多单元仓库,请为每个单元重复此访谈,并在该单元的配置中记录其类别。
步骤 5:人工设置检查清单
现在编写本次变更的验证记录:将
.guardrails/templates/verification.md 复制到
docs/verification/<date>-<branch>.md;将填写并打印好的
references/setup-checklist.md 放在 ## Tool qualification 下。
签名事项是逐步收紧的门槛。 只有 .guardrails/scripts/check-signing.sh --setup 以状态码 0 退出,才算完成:
请在步骤 2.7 / 步骤 3.5 前满足这些要求。对于改造,
请尽早说明:现有项目必须先配置提交签名,
才能完成采用 guardrails 的过程。如果缺少某位提交者的公钥,
请停止并指出缺少的公钥。
工具资格认定。 在配置和该记录中记录 guardrails_version 和
guardrails_commit(git -C <guardrails> rev-parse HEAD),
并记录测试套件结果。切勿
修改目标项目中的脚本。
测试套件在克隆目录中运行,绝不在目标项目中运行,且绝不安装 bats。 切勿将 bats 添加到目标项目。每次更新记录一次符合要求的运行,或记录 suite not run at install time: <reason>。
直接从运行命令本身获取退出状态,绝不要通过管道获取,否则
记录的通过/失败状态对应的命令就会出错:运行
<guardrails>/tests/run-tests.sh > <tmp>/ratchet.log 2>&1; rc=$?,并先读取
$rc。将日志保存在克隆目录之外;日志必须包含
run-tests: testing commit <guardrails_commit>;任何其他以 run-tests: 开头的行都表示日志描述的不是某个提交:请重新运行
(references/rationale.md)。
危险信号
| 想法 | 实际情况 |
|---|---|
| “我直接覆盖他们的 AGENTS.md 就行了” | 改造绝不覆盖。只使用托管区块。 |
| “现在就在所有地方启用严格检查” | 这会阻止所有针对旧代码的工作。一次只收紧一个齿位。 |
| “签名可以以后再加” | 第一次合并就会强制执行:没有经过验证的签名,就不能清理。 |
| “脚手架不用 worktree” | 与任何变更一样,使用 worktree 和签名 squash 合并。 |
| “safety_class 可以先留空” | 在设置它之前,其他事项都无法正确扩展。 |
| “脚本都复制好了,所以升级完成了” | README、模板和托管区块也必须刷新。 |
完成条件
- 已设置
safety_class(如果有多个单元,则逐单元设置),并附有其 ADR。 - 改造的验证记录包含差距分析中的采用顺序。
- 升级时,从同一个 guardrails 版本复制了脚本和语法文件,修复了每一项失败,并在验证记录中列出了每一条新警告。
- 已保存设置检查清单及资格认定依据。
check-signing.sh --setup以状态码 0 退出。- 变更已通过
merge-change合并,且检查脚本通过。
参考资料
references/upgrade-notes.md— 更新已有.guardrails/scripts/的项目时,在复制新脚本前阅读。references/multi-unit.md— 如果步骤 1b 发现多个单元,在步骤 2.3 或步骤 3.3 安装任何文件前阅读。references/setup-checklist.md— 到达步骤 5 时阅读。references/rationale.md— 认为此处某条规则有误时,或准备提议修改某条规则前阅读。