名称: 修复 描述: 审查+修复协议,带有安全防护栏(不健全性、不变量、陷阱、附带复杂性)。当提示说“$修复此PR”、“修复当前分支”、“修复此差异”、“修复CI红色”或“应用最小补丁”时使用,以及当崩溃/损坏/不变量破坏问题需要通过验证信号进行修正时。
修复
意图
通过最小、健全、已验证的变更,使风险或不明确的代码变得安全。
双钻模型适配
修复 跨越整个双钻模型,但保持发散主要在内部以保持自主性:
- 发现:重现/特征化 + 收集反例。
- 定义:陈述合同和不变量(之前/之后)。
- 开发:(内部)考虑2-3个可行的修复策略;根据默认策略选择最小健全的一个。
- 交付:实现 + 通过真实验证信号证明。
如果修复需要产品敏感选择(无法安全推导或特征化),停止并询问(或在多个可行策略存在时调用 $创意问题解决器)。
技能组合(必需)
$不变量王牌:修复的默认不变量/协议引擎;在不变量影响编辑前运行它。$复杂性缓解器:默认复杂性分析引擎;在重塑代码前用于风险驱动的复杂性判断。$优化:当任务是改进修复本身(或其他技能)时的默认路径;应用$优化工作流程和快速验证。- 需要时委托顺序:先
$不变量王牌,然后$复杂性缓解器。
输入
- 用户请求文本。
- 仓库状态(代码 + 测试 + 脚本)。
- 验证信号(失败测试/重现/日志)或您创建的证明钩子。
输出(聊天)
- 发出
交付格式(聊天)中的确切部分。 - 使用部分标题字面意思(例如,
**发现(严重性顺序)**,不是发现)。 - 在执行期间,在通过开始和结束时发出单行通过进度更新:
通过 <n>/<总计划>: <名称> — <开始|完成>; 编辑=<是|否|不适用>; 信号=<命令|不适用>; 结果=<好|失败|不适用>。
嵌入模式(当 $修复 在另一个技能内调用)
- 您可以发出紧凑的 修复记录 而非完整交付。
- 如果另一个技能需要主要工件(例如仅补丁差异),在同一助手消息中立即附加 修复记录。
- 不要提及“使用 $修复”而不发出完整交付或修复记录。
硬规则(必须 / 必须不)
- 必须默认审查 + 实现(除非请求仅审查)。
- 必须按严重性顺序分类和呈现发现:安全 > 崩溃 > 损坏 > 逻辑。
- 必须在没有通过验证信号的情况下不声称完成。
- 必须不做产品/功能工作。
- 必须不做无澄清的故意语义更改,除非是正确性收紧。
- 必须使用
默认策略(非交互式)解决权衡。 - 必须在运行多通过循环时发出通过进度更新。
- 必须在交付/修复记录中包含最终
通过跟踪部分,带有执行通过计数和每通过结果。 - 必须使用
交付格式(聊天)/修复记录中的确切标题名称;不要别名或缩短标题标签。 - 必须为每个已处理问题生成完整发现记录:
- 反例
- 不变量_之前
- 不变量_之后
- 修复
- 证明
- 必须遵循
技能组合(必需)中的委托合同(包括顺序:$不变量王牌->$复杂性缓解器)。 - 必须通过
$优化路由技能自身编辑(例如codex/skills/fix)并运行快速验证。 - 必须不将可修复项目放入
剩余风险 / 开放问题;如果它在自主门 + 防护栏下可修复,将其视为发现并修复。 - 当与
$tk在波执行中配对时,必须将$修复视为工件化前的最终突变通过:先提交:在通过验证后立即移交给$提交。先补丁:在通过验证后立即移交给$补丁。
默认策略(非交互式)
使用这些默认值以最大化自主性(避免询问)。
优先级顺序(最高优先):
- 正确性 + 数据安全 + 安全
- 已证明使用行为的兼容性
- 性能
定义:
- 已证明使用 = 有证据的行为(见下方检查清单)。
- 未证明使用 = 其他一切。
已证明使用证据检查清单(确定性)
目标:在不询问的情况下将行为分类为已证明使用 vs 未证明使用。
算法:
- 枚举受影响行为令牌:
- API 符号(函数/类型/方法)。
- CLI 标志/命令。
- 配置键 / 环境变量。
- 文件/有线格式(字段名,JSON 键)。
- 错误代码/消息被调用者消耗。
- 按此顺序收集证据(在首次匹配时停止):
- 用户重现/信号引用令牌。
- 测试断言令牌/行为。
- 文档/README/示例/CHANGELOG/配置示例描述或演示令牌/行为。
- 仓库调用站点使用令牌(非测试,非文档)。
- 如果任何证据存在,则标记为已证明使用;否则标记为未证明使用。
证据扫描程序(仓库本地):
- 测试:搜索
tests/,test/,__tests__/,spec/,以及匹配*test*/*.spec.*的文件。 - 文档/示例:搜索
README*,docs/,examples/,CHANGELOG*,config.example*,以及*.md。 - 调用站点:搜索剩余源文件。
- CI/配置表面:也扫描
.github/workflows/以查找环境变量、标志和脚本入口点。
工具提示:偏好使用 rg -n "<token>" 带 --glob 过滤器。
外部使用表面检查清单(确定性)
如果任何为真,则将表面视为外部:
- 令牌出现在文档/README/示例中。
- 令牌是 CLI 标志/命令、配置键、环境变量或文件格式字段。
- 令牌是导出/公共 API(示例:Rust
pub、TS/JSexport、Python 在__all__中、Go 导出标识符)。
如果外部使用可能但不确定:
- 如果小,偏好附加兼容路径(包装器/别名/适配器)。
- 仅在破坏性更改不可避免时询问。
兼容性规则:
- 必须保留已证明使用行为,除非不安全(崩溃/损坏/安全)。如果不安全,收紧并返回清晰错误。
- 对于未证明使用行为,视为未定义;允许收紧。
API/迁移规则:
- 如果修复触及外部使用表面(使用
外部使用表面检查清单), 则偏好附加/向后兼容更改(新选项/新函数/适配器)而非破坏性更改。 - 如果破坏性更改不可避免,则停止并询问。
性能规则:
- 必须避免热路径中的明显渐进回归。
- 如果性能影响可能但本地不可测量,
则选择最小正确性优先修复,并在
剩余风险 / 开放问题中记录风险(不要询问)。
自主门(确信度)
仅当所有为真时才无需询问进行:
- 信号:您有(或可以创建)无产品歧义的本地重现/信号。
- 合同:您可以从仓库证据推导合同或特征化当前行为而无产品歧义。
- 不变量:您可以陈述不变量_之前和不变量_之后。
- 差异:更改是局部的,对于所选策略可审查。
- 证明:更改后至少有一个验证信号通过。
如果任何门失败:
- 应用默认值 + 合同推导。
- 仅在仍然受阻时询问。
正确性收紧(默认)
定义:收紧 = 更早拒绝无效/模糊状态,移除静默失败路径,或使未定义行为明确。
规则:
- 如果收紧防止崩溃/损坏/安全问题, 则应用它(即使已证明使用),返回清晰错误,并记录兼容性影响。
- 否则,如果收紧仅影响未证明使用输入/状态, 则无需询问应用它。
- 否则(收紧可能更改已证明使用行为):
- 偏好向后兼容形状(适配器/附加 API),或
- 用特征化测试锁定当前行为,
- 仅在兼容性无法保留时询问。
允许收紧移动(仅示例):
- 解析/强制:隐式强制/部分解析 -> 显式解析 + 错误(JS 隐式字符串->数字;Rust
parse().ok()回退)。 - 回退:警告+回退/默认无信号 -> 显式错误或显式“未知”/“无效”。
- 有损转换:截断/钳制/包装 -> 检查转换 + 错误(Rust
as;C 强制转换;Go int 转换)。 - 部分更新:多步突变 -> 原子/事务边界或显式部分结果。
- 忽略错误:忽略 -> 带上下文传播;如果故意忽略 -> 补偿信号(断言/测试/指标/日志)。
- 哨兵:
-1/0/""/None-> 更丰富返回。
默认值(仅当对有效输入语义保留时使用)
所有权 / 生命周期
- 必须盘点切片内资源:分配、句柄、套接字、锁、事务、临时文件。
- 对于每个资源,记录:获取站点、所有者、释放动作。
- 必须确保每个退出释放恰好一次。
- 必须仅通过已证明所有者/分配器/句柄释放/释放。
- 永远不要假设“释放”安全,除非证明分配器/所有权。
- 区域/颠簸分配器:每个对象
释放安全仅当明确记录为允许/无操作。
验证信号选择
算法:
- 如果用户提供命令,使用它。
- 否则,选择最便宜的本地信号(无网络)按此顺序:
- README/QUICKSTART
scripts/check/scripts/testMakefile/justfile/Taskfile.yml
- 否则,按此顺序创建证明钩子:
- 聚焦回归/特征化测试
- 边界断言,大声失败
- 范围 + 速率限制诊断日志,绑定到 ONE 不变量(永远不记录秘密/PII)
PR/差异范围防护栏(审查模式默认)
- 默认切片 = 更改行/路径(git 差异/PR 差异) + 最多一个边界接缝(解析/构造/API 边缘)以使修复健全。
- 不要修复切片外的预先存在的问题,除非:
- 严重性是安全/崩溃/损坏,且
- 修复是局部的,无需扩大切片即可证明。
- 否则:记录为
剩余风险 / 开放问题。
生成 / 第三方代码防护栏
- 如果文件似乎是生成的或属于第三方/构建输出,不要直接编辑它。
- 偏好定位真相源 + 重新生成步骤;在那里应用修复并视需要重新生成。
- 常见无编辑区(示例):
dist/,build/,vendor/,node_modules/。
通过基线的证明纪律
当基线信号正常时:
- 对于每个已处理发现,偏好失败修复前的证明钩子(聚焦回归/特征化测试)。
- 如果您无法产生失败证明钩子,不要编辑;首先尝试通过以下方式创建:
- 将反例转换为聚焦回归/特征化测试
- 在单个边界接缝(解析/优化一次)强制执行不变量,并测试新错误
- 减少效果到纯助手并单元测试它
- 使用现有模糊器/属性测试工具(如果存在)
- 仅当您仍然无法创建无产品歧义的证明钩子时,记录阻塞器为剩余风险。
剩余风险 / 开放问题政策(最后手段)
剩余风险是您无法安全修复的记录(非待办列表)。
规则:
- 在发出剩余项目前,尝试将其转换为可操作发现:
- 产生具体反例
- 附加失败修复前的证明钩子(测试/断言)
- 应用防护栏内最小局部修复
- 重新运行验证信号
- 仅发出真正被以下阻塞器之一阻塞的剩余项目:
产品歧义(语义无法安全推导/特征化)破坏性更改(无附加路径;修复将是破坏性)无重现或证明(无法本地创建重现/证明钩子)范围防护栏(在差异切片外且不足够严重以扩大)生成输出(生成/第三方输出;需要真相源 + 重新生成)外部依赖(需要网络/凭证/服务/硬件)性能不可测量(影响可能;无本地测量)
- 每个剩余项目必须包括:位置或令牌,
blocked_by=<...>,和next=<一个动作>。 - 如果没有剩余项目,输出
- 无。
多通过循环(默认)
目标:减少 PR/差异审查中的遗漏问题,无需扩大范围。
运行3个核心通过(强制)。仅当通过3编辑代码时,运行2个附加增量通过。
通过1)安全(最高严重性)
- 范围:差异驱动切片 + 必要边界接缝。
- 焦点:安全/崩溃/损坏风险、不安全收紧、缺少错误传播。
- 更改预算:仅最小健全修复。
通过2)表面(兼容 + 误用)
- 范围:差异触及的外部使用表面(导出/CLI/配置/格式/文档)。
- 焦点:附加兼容性、消除顶部陷阱、更清晰错误。
- 更改预算:偏好附加/包装器/适配器;破坏性更改 => 停止并询问。
通过3)审计(不变量 + 所有权 + 证明质量)
- 范围:最终差异切片。
- 焦点:不变量在最强廉价边界强制执行;所有权在所有路径释放;证明强度。
- 委托:首先运行
$不变量王牌进行不变量框架,然后$复杂性缓解器进行影响可审计性的复杂性裁决。 - 更改预算:无重构,除非它们直接减少不变量风险/可审计性。
提前退出(通过3后停止):
- 如果通过3应用无编辑,停止(在运行/确认主要验证信号后)。
增量通过(仅当通过3应用编辑)
通过4)安全增量重新扫描
- 范围:仅通过1-3更改的行/路径及其立即边界。
- 焦点:由修复引入的新安全/崩溃/损坏风险。
通过5)表面 + 证明增量重新扫描
- 从最终差异(包括新引入错误/标志/导出/配置键)重新枚举行为令牌。
- 为新引入令牌重新运行已证明使用/外部表面检查。
- 确保证明对最终差异仍然强。
规则:
- 在任何编辑代码的通过后,运行本地信号再继续。
- 不要基于怀疑编辑:每个编辑必须有具体反例、不变量_之前/之后和证明钩子。
- 跨通过合并/去重发现;最终输出格式保持不变。
- 在执行期间实时发出通过开始/结束的通过进度更新;这些更新是必需的,不替代最终
通过跟踪部分。
更改前澄清
仅在以下任何为真时停止并询问:
- 行为矛盾/产品敏感且无法从测试/文档/调用站点推导且无法安全特征化。
- 破坏性 API 更改或不可逆迁移不可避免(无向后兼容路径)。
- 无本地信号/证明钩子可以找到或创建而无产品歧义。
发现记录模式(内部)
对于您处理的每个问题,在编辑前构建此记录:
- id:
F<编号> - 位置:
文件:行 - 严重性:
安全|崩溃|损坏|逻辑 - 问题: <一句>
- 令牌: <受影响行为令牌;无则空>
- 已证明使用: <是/否 + 证据如果是>
- 外部表面: <是/否 + 为什么>
- 差异_触摸: <是/否>
- 反例: <输入/时间线>
- 不变量_之前: <今天允许/假设什么>
- 不变量_之后: <现在保证/拒绝什么>
- 修复: <最小健全修复摘要>
- 证明: <测试/断言/日志 + 验证命令 + 结果>
工作流程(算法)
0) 预检
- 确定模式:仅审查 vs 修复。
- 如果请求目标是此技能(或其他技能),通过
$优化路由:- 遵循
$优化发现 -> 定义 -> 开发 -> 交付, - 应用最小技能差异,
- 运行
uv run --with pyyaml -- python3 codex/skills/.system/skill-creator/scripts/quick_validate.py codex/skills/<技能名称>。 - 仅在请求还包括代码/运行时缺陷时返回
修复其余部分。
- 遵循
- 定义切片:
- 如果在 git 仓库且有差异,从差异推导切片/令牌(路径、更改符号/字符串)。
- 否则:入口点、输入、输出、状态。
- 如果请求是 PR 范围(例如“
$修复此PR”、“$修复当前分支”、PR 上 CI 失败),将切片锚定到 PR 差异/基础,并保持工作 PR 本地,除非需要严重扩大。 - 应用
PR/差异范围防护栏进行审查模式。 - 在编辑前应用
生成 / 第三方代码防护栏。 - 选择验证信号(或创建证明钩子)。
1) 合同 + 基线
- 确定已证明使用行为:
- 对切片影响的行为令牌应用
已证明使用证据检查清单。
- 对切片影响的行为令牌应用
- 无需询问推导合同(按此顺序):
- 测试练习切片
- 仓库调用站点
- 文档/README/示例
- 如果无:为当前行为添加特征化测试
- 写合同(1句):“工作意味着 …”。
- 运行基线信号一次;记录结果。
- 如果基线信号正常,应用
通过基线的证明纪律。
2) 创建初始发现
- 枚举切片的候选失败模式。
- 排序安全 > 崩溃 > 损坏 > 逻辑。
- 对于您将处理的每个问题,创建发现记录。
3) 强制扫描(多通过)
对触及切片运行 多通过循环(默认)。
3a) 不健全扫描
对于每个适用的风险类:
- 识别首次失败点。
- 提供具体反例(输入/时间线)。
- 指定最小健全修复,消除错误类。
风险类:
- 安全边界:授权/认证、注入、路径遍历、SSRF、不安全反序列化、秘密/PII 处理。
- 可空性/未初始化状态;哨兵值。
- 所有权/生命周期:泄漏、双重释放、使用后关闭、锁未释放。
- 并发/顺序/时间:竞争、锁排序、可重入、超时/重试、TOCTOU。
- 边界/算术:索引/切片、溢出/下溢、有符号性。
- 持久性/原子性:部分写入、撕裂更新、非事务多步更新。
- 编码/单位:字节 vs 字符、时区/区域设置、单位不匹配、有损规范化。
- 错误处理:吞没错误、缺少上下文、静默回退。
语言提示(仅示例):
- Rust:
unsafe、unwrap/expect、as强制转换。 - JS/TS:
any、隐式强制、undefined流。 - Python:裸
except、基于真值分支。 - C/C++:原始指针、未检查强制转换、手动
malloc/free。
3b) 不变量强化扫描
委托给 $不变量王牌 并导入其工件到 修复。
默认执行:
- 首先运行
$不变量王牌紧凑模式。 - 捕获至少:
反例不变量所有者和范围执行边界接缝(之前 -> 之后)验证
- 映射这些到
修复发现字段:不变量_之前从损坏跟踪 + 先前范围,不变量_之后从选定谓词 + 保持范围,修复从接缝,证明从验证信号。
- 如果紧凑模式不产生归纳谓词,升级到完整
$不变量王牌协议。
3c) 陷阱扫描 + 消除
触发:您触及 API 表面或调用者可能误用代码。
对于顶部误用路径:
- 提供最小误用片段 + 意外行为。
- 通过更改表面消除:
- 选项结构体 / 命名参数
- 将布尔值拆分为枚举或单独函数
- 显式单位/编码
- 更丰富返回(无哨兵)
- 分离纯计算和效果
- 用回归测试或边界断言锁定。
3d) 复杂性扫描(风险驱动)
委托给 $复杂性缓解器 进行分析;仅通过 修复 实现。
规则:仅当减少风险并改善不变量/所有权的可审计性时重塑。
算法:
- 在触及切片上运行
$复杂性缓解器(热度读取 + 必要/附带裁决 + 排序选项 + 跟踪)。 - 选择最小可行切割,直接支持发现(安全/表面/不变量所有权/证明质量)。
- 如果简化依赖于未陈述不变量,首先运行/刷新
$不变量王牌。 - 除非关闭具体风险,否则保持复杂性清理在范围外。
4) 实现修复(每发现)
按严重性顺序对发现:
- 实现最小健全修复,消除错误类。
- 允许时应用正确性收紧。
- 确保不变量 + 所有权在所有路径保持。
- 保持差异可审查;避免顺便重构。
5) 关闭循环(必需)
- 运行选定验证信号。
- 如果失败:
- 用新反例更新发现,
- 应用最小附加修复,
- 重新运行相同信号。
- 重复直到信号通过。
- 如果在3次修复周期后无法进展,停止并询问:
- 最后失败输出(关键行/堆栈),
- 您尝试了什么,
- 阻塞您的最小剩余决策。
6) 剩余风险扫描(必需)
- 重新检查
剩余风险 / 开放问题政策。 - 任何无有效阻塞器的项目变为发现并被修复(带证明)或丢弃。
7) 输出锁定(必需)
在发送最终消息前,验证所有为真:
- 标题集是确切和完整的(
合同、发现(严重性顺序)、应用更改、通过跟踪、验证、剩余风险 / 开放问题)。 通过跟踪包括计划/执行计数和 P1/P2/P3 行(加上执行时的 P4/P5)。- 运行时通过更新(
通过 <n>/<总计划>: ...)在执行期间发出。 - 如果使用嵌入模式,在同一助手消息中包括 修复记录(在任何必需工件后)。
交付格式(聊天)
输出确切这些部分。
如果无发现:
- 发现(严重性顺序):
无。 - 应用更改:
无。 - 剩余风险 / 开放问题:
- 无。 - 仍然包括 通过跟踪 和 验证。
合同
- <一句>
发现(严重性顺序) 对于每个发现:
F#<文件:行>—<安全|崩溃|损坏|逻辑>— <问题>- 表面: 令牌=<…>; 已证明使用=<是/否 + 证据>; 外部=<是/否>; 差异_触摸=<是/否>
- 反例: <输入/时间线>
- 不变量 (之前): <之前假设/允许什么>
- 不变量 (之后): <现在保证/拒绝什么>
- 修复: <最小健全修复摘要>
- 证明: <测试/断言/日志 + 验证命令> -> <好/失败>
应用更改
- <文件> — <理由>
通过跟踪
- 核心通过计划:
3; 核心通过执行:<3> - 增量通过计划:
<0|2>; 增量通过执行:<0|2> - 总通过执行:
<3|5> P1 安全-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>P2 表面-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>P3 审计-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>- 如果执行增量通过,也包括
P4和P5行,相同格式。
验证
- <命令> -> <好/失败>
剩余风险 / 开放问题
- 如果无:
- 无 - 否则:
- <文件:行 或 令牌> — 阻塞者=<阻塞者> — 下一个=<一个动作>
修复记录(仅嵌入模式)
仅当 $修复 在另一个技能内调用时使用。
发现(严重性顺序) 对于每个发现:
F#<文件:行>—<安全|崩溃|损坏|逻辑>— <问题>- 表面: 令牌=<…>; 已证明使用=<是/否 + 证据>; 外部=<是/否>; 差异_触摸=<是/否>
- 反例: <输入/时间线>
- 不变量 (之前): <之前假设/允许什么>
- 不变量 (之后): <现在保证/拒绝什么>
- 修复: <最小健全修复摘要>
- 证明: <测试/断言/日志 + 验证命令> -> <好/失败>
应用更改
- <文件> — <理由>
通过跟踪
- 核心通过计划:
3; 核心通过执行:<3> - 增量通过计划:
<0|2>; 增量通过执行:<0|2> - 总通过执行:
<3|5> P1 安全-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>P2 表面-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>P3 审计-><完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>- 如果执行增量通过,也包括
P4和P5行,相同格式。
验证
- <命令> -> <好/失败>
剩余风险 / 开放问题
- 如果无:
- 无 - 否则:
- <文件:行 或 令牌> — 阻塞者=<阻塞者> — 下一个=<一个动作>
陷阱
- 无位置模糊建议。
- “最好有”重构,不减少风险。
- 功能蔓延。
- 询问风险容忍度而非应用默认策略。
- 收紧呈现为可选。
- 所有权修复无已证明分配器/所有者。
- 编辑生成/第三方输出而非真相源。
- 当基线正常时,无失败证明钩子的代码编辑。
- 使用
剩余风险 / 开放问题替代可修复发现。
激活提示
- “解决” / “修复” / “崩溃” / “数据损坏”
- “$修复此PR” / “$修复当前分支” / “修复此分支”
- “CI失败” / “修复红色检查” / “修复失败PR”
- “陷阱” / “误用” / “不应该发生”
- “不变量” / “生命周期” / “可空意外”
- “太复杂” / “分支汤” / “跨文件跳转”
- “优化 $修复” / “改进修复技能工作流程” / “更新修复技能文档”