关于 cut
cut 是一项在实现前建立外部行为证据的测试技能。它记录 GREEN 基线、添加受保护的纯测试预言,并生成规范回执,证明行为在指定接缝处失败。
主要功能
- 01记录 GREEN 项目基线
- 02创建纯测试 RED 跟踪器
- 03核验指定接缝与见证
- 04用摘要保护测试文件
- 05生成规范门禁回执
适用场景
- 01在修改生产代码前验证行为
- 02为已批准的规格补充证据
- 03采用并规范合格的复现用例
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ paulnsorensen/ easy-cheese --skill cut安装后在 Claude Code 中输入/cut确认已加载。
附带文件references/gate-workflow.mdreferences/pressure-eval.md
详细介绍
/cut
/cut 是 Mold 与 Cook 之间由外向内的证据阶段。它会证明一项获批的可观察行为在当前项目中为 GREEN,然后在声明的外部接缝处针对声明的见证失败。它绝不实现该行为。回执是持久边界;回执中列出的测试文件和夹具文件受保护,不得进行生产代码编辑。
契约
cut(spec_ref, reproduction? = null, auto = false) -> GateReceipt
根据 references/gate-workflow.md § 打包命令解析,解析每次验证器调用。系统未安装独立的 red-gate 二进制文件。
从 Mold 获批的 red-required 交接中,或从没有有效回执的 Cook 预检中,显式触发 Cut。读取持久化规范及其门控元数据;不得根据说明文字推断适用性。一项行为必须至少有一个测试契约。没有该表的旧版规范可以在无需新审批的情况下继续,但 Cut 必须在证据中将每个生成的契约标记为 contract_source: inferred。
Cut 只负责测试侧文件:外部追踪器、经过机械论证的契约矩阵用例、夹具以及仅供测试使用的测试框架支持文件。Cut 可以在将符合条件的用户/Pasteurize 复现用例规范化为获批的接缝、argv、cwd 和见证后采用该用例。采用的用例标记为 producer: cut 和 origin: adopted;生成的用例标记为 origin: generated。
流程
-
解析并分类。 读取规范,然后运行
red-gate contracts <spec>。原样保留获批的接口、接缝、预期失败和模式。旧版推断会显示在返回的计划中,无需重新审批。选择运行器前,先验证gate_applicability。 -
尽早结束 N/A。 Mold 批准对一个封闭类别(
docs-only、refactor-only、test-only或appearance-only)声明not-applicable后,会生成非空原因,并且不生成 RED 契约、基线检查、用例、受保护文件、守卫或回执级模式。该声明仍需经过red-gate issue。 -
选择接缝并声明阶段。 沿用项目现有的运行器和惯例。功能性 UI 沿用已声明的浏览器/E2E 接缝。如果没有可用的项目运行器或标准库运行器,则暂停并明确说明测试框架决策;绝不安装或臆造第三方运行器。在
.cheese/cut/下编写严格的阶段计划,其中包含schema_version、producer、work_id、project_key、Cook 可以修改的精确项目相对路径production_paths,以及只包含id、argv和项目相对cwd的基线条目。这些根目录之外的所有内容都是不可变的预言机依赖,除非 Cut 将其添加为受保护的测试文件。 -
在使用预言机之前开始。 创建或采用新的预言机之前,先调用:
red-gate begin .cheese/cut/<slug>.plan.json --out .cheese/cut/<slug>.phase.jsonbegin会按顺序运行所有广泛基线检查,要求退出码为0,并冻结完整的项目快照。其打印的phase_token_ref和phase_token_sha256是候选项的必填字段。缺少基线检查、argv 不安全、退出码非零、输出路径过时或文件系统无法检查时,流程会停止且不生成令牌。切勿手动编写或重复使用阶段令牌。 -
冻结基线证据。 将令牌中精确的基线命令标识复制到候选项中,并将每个观察到的退出码记录为
0。 基线 argv 不得包含受保护的 RED 预言机路径,或者即使预言机存在也必须保持通过,因为回执验证会在创建预言机后重新运行这些命令。写入预言机后,不要重新采集基线。 -
只编写预言机。 每个行为性 curd 添加一个外层追踪器;只有在经过批准且有版本控制的接口能够以机械方式推导出所有指定行时,才添加完整矩阵。矩阵契约须声明
interface_version和唯一的matrix_rows;其回执须将每行精确绑定到一个契约用例。不得更改生产文件、添加生产存根/适配器,也不得要求提交更改。 -
证明 RED。 使用各用例声明的 argv 重新运行每个选定用例(绝不通过 shell 求值)。用例必须因其断言见证而失败。收集、导入、依赖项、夹具、语法或其他测试框架故障不属于行为性 RED。运行后重新检查生产树指纹。 只有直接运行 Python 脚本/
-c、python -m pytest和python -m unittest时,才能提供断言来源证明。对于这些配置之外的现有运行器,必须明确决定测试框架;绝不能根据其渲染的回溯信息或退出文本推断 RED。 -
签发规范证据。 在
.cheese/cut/candidates/下创建候选项,其中包含冻结的 Cut 前baseline_checks、阶段令牌引用及其摘要、受保护测试摘要和初始值为零的防护计数,然后且只调用:red-gate issue <candidate> --token .cheese/cut/<slug>.phase.json --out .cheese/cut/<slug>.jsonred-gate issue是唯一的回执写入器。它会先验证令牌之后的每项项目更改都是精确的受保护测试侧路径,再重新运行测试。生产树已更改、仅测试框架故障、摘要或令牌过时、缺少基线检查、argv 不安全或见证不匹配时,都不会生成成功回执。绝不要手动编写或发布原始 GateReceipt JSON。 -
交接。
issue成功后,写入精简的交接投影,并将回执传给 Cook。在--auto模式下,使用该回执只调度一次 Cook。 在同步 Cook 预检中,将回执返回给调用方,不要递归调度 Cook。
详细的事件顺序、候选字段、拒绝规则和脏树指纹机制见 references/gate-workflow.md。
Receipt 不变量
RED 收据的 producer: cut、非空合约、冻结的 Cut 前
baseline_checks、RED 用例以及受保护的测试侧文件摘要必须齐全。每条
baseline_checks 都是调用 oracle 前记录的项目整体结果;其
id、argv、cwd 和 observed_exit_code 是不可变的收据
证据,不是由 Cook 负责重新采集的数据。收据还包含 oracle 前生成的准确
phase_token_ref 和 phase_token_sha256;Cook 会验证该条目证明,而非信任问题创建时的快照。初始
Cut 收据的 guard_receipt_refs: [];guard 属于后续 Press 证据。
每个普通行为 curd 拥有一个 tracer。只有经过批准并版本化的接口才允许使用合约矩阵:合约记录其非空
interface_version 和唯一的 matrix_rows,其 RED 证据则恰好为每个命名的
matrix_row 包含一个 kind: contract 用例。收据可以混用 tracer 和矩阵模式,因为模式属于各个测试合约。有效用例的来源仍为 generated 或 adopted。
工作树有未提交改动也安全:保留已有差异,只添加 oracle 文件,不创建仅包含 RED 的提交。生产代码摘要发生变化、仅测试框架失败,或缺少 GREEN 基线,都会阻止签发。运行器不可用时,应等待测试框架决策,不得添加第三方依赖。
交接
仅在规范收据存在后,才以以下最小格式写入 .cheese/cut/<slug>.md:
status: ok
next: cook
artifact: .cheese/cut/<slug>.json
规范收据是交接的基线载体:Cook 必须原样使用其中冻结的 baseline_checks,不得覆盖或重新采集。
方向说明行可以解释所选合约和运行器。受阻时使用 halt: <reason>,且不得声称 next: cook。
规范
铁律: 没有 GREEN 基线以及由 red-gate issue 签发的仅测试侧受保护 RED oracle,就不得签发成功的 Cut RED 收据。
警示信号 —— 发现以下情况时请停止:
- 编写 tracer 时修改了生产代码;
- 首次运行在收集、导入、fixture 设置或依赖加载阶段失败;
- 记录基线前测试就已失败;
- 试图通过添加依赖来解决缺少运行器的问题;
- 有人提议创建仅包含 RED 的提交;
- 候选收据被直接序列化为已发布收据;
- 在 Cut 预检中递归调用同步 Cook。
| 理由 | 失败原因 | 必须采取的操作 |
|---|---|---|
| “等 Cook 实现后,我再添加外层测试。” | 这会丢失实现前失败的独立证据。 | 先确认 GREEN,再创建 oracle,随后证明 RED,然后才能修改任何生产代码。 |
| “收集阶段崩溃也算 RED。” | 测试框架故障并未测试获批的行为或见证。 | 修复或报告测试框架问题;不要签发任何内容。 |
| “缺少运行器,所以我会安装一个方便的框架。” | Cut 不能擅自更改目标项目的工具链。 | 暂停并等待明确的测试框架决策。 |
| “工作树已经有未提交改动,所以提交能让收据更安全。” | 收据保护的是文件摘要;仅包含 RED 的提交不属于合约内容。 | 为已有差异生成指纹,不改动提交历史。 |
| “手写的收据包含所有字段。” | 原始 JSON 可能绕过重放、摘要、guard 和规范化检查。 | 每个候选收据都必须经过 red-gate issue。 |
| “Cook 调用了 Cut,所以 Cut 也应该回调 Cook。” | 递归链式调用可能形成循环,并导致预检边界的责任不清。 | 同步返回收据;只有 --auto 才会调度 Cook。 |
压力门槛
在将此工作流视为稳定流程之前,必须先运行一次失败的技能前压力测试。
场景和 oracle 敏感性变异位于
references/pressure-eval.md;AC-12 由
tests/python/test_cut_pressure_eval.py 覆盖。
Pipeline
culture → mold → **cut** → cook → press → age → cure → plate