关于 fail-fast
fail-fast 是用于排查代码库中隐式回退行为的技能,并指导将其改为明确契约、验证或有意保留的测试夹具。它涵盖扫描、分类、定向修改及确定性失败验证。
主要功能
- 01扫描代码中的回退模式
- 02按移除、要求、验证或保留分类
- 03将隐式默认值改为明确契约
- 04添加确定性失败测试
- 05重新运行扫描器和项目检查
适用场景
- 01审查代码库中的隐式回退
- 02在边界验证必需配置
- 03移除过时的兼容分支
- 04通过测试和 CI 检查回退修复
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ howells/ skills --skill fail-fast安装后在 Claude Code 中输入/fail-fast确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/remediation.mdscripts/scan-fallbacks.py详细介绍
快速失败
使用此技能,通过查找并移除隐藏的回退行为,让代码库更具确定性。此类行为本应是明确的契约、验证错误、迁移或测试夹具。
请在开头说明你正在使用 fail-fast 技能。
核心规则
优先选择一条规范路径和一种明确的失败模式。
只有当回退是真实的产品需求、已记录的迁移窗口或有意设置的本地测试夹具时,才允许使用。其他情况都应改为验证错误、必填输入、显式分支、删除兼容层或类型化配置契约。
工作流
-
确定目标代码库及其包管理器。
-
编辑前运行扫描器(路径相对于此技能所在目录):
python3 scripts/scan-fallbacks.py /path/to/repo有用的标志:
--json(为大型审查或后续工具提供机器可读的输出)、--include-tests和--include-docs(扫描默认跳过的文件)、--fail-on medium|high(作为 CI 门禁,退出时返回非零状态)。python3 scripts/scan-fallbacks.py /path/to/repo --json -
如果发现涉及环境变量、旧版兼容性、宽泛的 catch 块或分阶段迁移,请阅读
references/remediation.md。 -
对每项发现进行分类:
remove:无用的兼容逻辑、旧版别名、重复的选项名称、没有实际调用方的回退分支。require:缺少配置、依赖不存在、用户输入无效,或应加入环境变量架构的环境变量。validate:边界输入必须接受未知数据,但应清晰拒绝无效状态。keep:已记录的产品行为、真实的外部 API 兼容性,或有负责人和移除日期的临时迁移。
-
精简地编辑。移除回退状态,并更新调用点和测试,使其使用规范路径。
-
添加或更新测试,证明依赖、输入、配置或架构中声明的环境变量缺失时,代码会以确定的方式失败。
-
再次运行扫描器,以及代码库相关的测试、类型检查、lint 或构建。
-
明确报告剩余的回退行为。不要让它们悄无声息地遗留。
环境变量
环境变量是配置契约,不是可选建议。
在使用经过验证的环境变量架构的项目中,必填值应在应用代码使用前通过验证,缺失时立即失败。从项目的环境变量模块导入类型化的值。如果架构中缺少必填项,应在该处声明并验证,而不是添加应用层回退。
使用项目现有的环境变量验证和构建检查。检查其脚本和验证器文档,确认实际命令;不要仅为遵循此技能而安装新包。
只有在环境变量架构模块、生成的环境变量接线代码、NODE_ENV 和 CI 等范围有限的系统键,或有明确文档说明的迁移逃生口中,才接受直接读取 process.env。
移除如下模式:
const apiKey = process.env.OPENAI_API_KEY || "dev-key";
const databaseUrl = process.env.DATABASE_URL ?? "postgres://localhost";
替换为类型化的环境变量访问:
const apiKey = env.OPENAI_API_KEY;
如果不存在环境变量架构,请按照项目现有约定,在配置边界显式验证必填值。
错误处理
快速失败不意味着含糊地崩溃,而是要在边界处以有用、类型化或带上下文的错误失败。
优先采用:
- 对外部输入进行架构验证,
- 对不可能出现的内部状态显式抛出错误,
- 使用范围有限的
catch块,并附带上下文重新抛出错误, - 启动前预检必需的配置和服务。
避免:
- 空的
catch块, - 返回虚假成功结果的
catch块, - 会悄然降低必需功能的可选依赖导入,
- 让测试通过、却导致生产行为出错的回退数据。
兼容性
必须有意识地处理向后兼容性。
区分永久支持的契约与临时迁移。保留公共 API、协议或受支持的产品行为所要求的兼容性;这类兼容性不需要设定移除日期,也不需要逐一列出使用方。临时兼容性应明确负责人、迁移期限,并对两种路径进行检查。文档缺失是调查并记录契约的理由,而不是可以安全删除的证明。只有在确认没有受支持的调用方或契约仍需要它们后,才能移除别名、旧版分支和适配器。
必须保留兼容性时,应明确标示:
// TODO(compat): remove after API clients stop sending `workspaceId` on 2026-07-01.
标记开头应使用 TODO/FIXME/HACK,以便扫描器的 todo-compat 规则检测到它——单独的 // Compatibility: 注释不会被标记(关键词规则会跳过注释行)。
扫描器
scripts/scan-fallbacks.py 会对源代码进行确定性扫描,以查找常见的回退问题:
- 环境变量默认值(
os.getenv/os.environ.get/process.env.X ||)和直接读取环境变量, ||/??回退值,- legacy、deprecated、backwards-compatible 和 migration 等关键词,
- 空的或吞掉异常的
catch块(JS/TS)和吞掉异常的except块(Python), - 可选依赖回退,
- 别名和双配置键。
检测注意事项:legacy/compatibility 关键词规则只会匹配代码行,不会匹配注释行,因此单独的 // Compatibility: ... 标记不会被检测到。只有以 TODO/FIXME/HACK/XXX 开头的临时兼容性注释才会被检测到(由 todo-compat 规则处理)——请参阅“兼容性”部分的标记格式。关键词规则还会跳过声明式清单(package.json、tsconfig.json),以避免匹配依赖名称。--fail-on 只接受 medium 或 high(没有低严重级别的规则)——之前可接受的 --fail-on low 现在会因 argparse 错误而退出,因此请更新所有传入该参数的脚本。
扫描器不能代替判断。应将其视为待检查位置的索引,然后让代码变得更简单、更确定。
完成检查
完成前,请确认:
- 每个发现项都已分类(移除 / 必须保留 / 验证 / 保留),而不只是列出。
- 已移除的回退有更新调用点,并有测试证明在缺少依赖、输入、配置或环境变量时会确定性地失败。
- 保留的回退有明确理由(产品需求、外部契约,或由负责人负责且有明确期限的迁移)。
- 编辑后重新运行了扫描器,以及代码库中相关的测试/类型检查/lint/构建。
- 明确报告了所有剩余的回退,而不是将其隐去。