修复协议技能 fix

这是一个用于代码修复和安全检查的技能,专注于通过最小的、已验证的变更来使风险或不明确的代码变得安全,涉及审查、修复协议、安全防护栏和验证信号。关键词:代码修复、安全检查、协议、验证信号、不变量强化、CI修复、代码审计。

测试 0 次安装 0 次浏览 更新于 3/8/2026

名称: 修复 描述: 审查+修复协议,带有安全防护栏(不健全性、不变量、陷阱、附带复杂性)。当提示说“$修复此PR”、“修复当前分支”、“修复此差异”、“修复CI红色”或“应用最小补丁”时使用,以及当崩溃/损坏/不变量破坏问题需要通过验证信号进行修正时。

修复

意图

通过最小、健全、已验证的变更,使风险或不明确的代码变得安全。

双钻模型适配

修复 跨越整个双钻模型,但保持发散主要在内部以保持自主性:

  • 发现:重现/特征化 + 收集反例。
  • 定义:陈述合同和不变量(之前/之后)。
  • 开发:(内部)考虑2-3个可行的修复策略;根据默认策略选择最小健全的一个。
  • 交付:实现 + 通过真实验证信号证明。

如果修复需要产品敏感选择(无法安全推导或特征化),停止并询问(或在多个可行策略存在时调用 $创意问题解决器)。

技能组合(必需)

  • $不变量王牌修复 的默认不变量/协议引擎;在不变量影响编辑前运行它。
  • $复杂性缓解器:默认复杂性分析引擎;在重塑代码前用于风险驱动的复杂性判断。
  • $优化:当任务是改进 修复 本身(或其他技能)时的默认路径;应用 $优化 工作流程和 快速验证
  • 需要时委托顺序:先 $不变量王牌,然后 $复杂性缓解器

输入

  • 用户请求文本。
  • 仓库状态(代码 + 测试 + 脚本)。
  • 验证信号(失败测试/重现/日志)或您创建的证明钩子。

输出(聊天)

  • 发出 交付格式(聊天) 中的确切部分。
  • 使用部分标题字面意思(例如,**发现(严重性顺序)**,不是 发现)。
  • 在执行期间,在通过开始和结束时发出单行通过进度更新: 通过 <n>/<总计划>: <名称> — <开始|完成>; 编辑=<是|否|不适用>; 信号=<命令|不适用>; 结果=<好|失败|不适用>

嵌入模式(当 $修复 在另一个技能内调用)

  • 您可以发出紧凑的 修复记录 而非完整交付。
  • 如果另一个技能需要主要工件(例如仅补丁差异),在同一助手消息中立即附加 修复记录
  • 不要提及“使用 $修复”而不发出完整交付或修复记录。

硬规则(必须 / 必须不)

  • 必须默认审查 + 实现(除非请求仅审查)。
  • 必须按严重性顺序分类和呈现发现:安全 > 崩溃 > 损坏 > 逻辑。
  • 必须在没有通过验证信号的情况下不声称完成。
  • 必须不做产品/功能工作。
  • 必须不做无澄清的故意语义更改,除非是正确性收紧。
  • 必须使用 默认策略(非交互式) 解决权衡。
  • 必须在运行多通过循环时发出通过进度更新。
  • 必须在交付/修复记录中包含最终 通过跟踪 部分,带有执行通过计数和每通过结果。
  • 必须使用 交付格式(聊天) / 修复记录 中的确切标题名称;不要别名或缩短标题标签。
  • 必须为每个已处理问题生成完整发现记录:
    • 反例
    • 不变量_之前
    • 不变量_之后
    • 修复
    • 证明
  • 必须遵循 技能组合(必需) 中的委托合同(包括顺序:$不变量王牌 -> $复杂性缓解器)。
  • 必须通过 $优化 路由技能自身编辑(例如 codex/skills/fix)并运行 快速验证
  • 必须不将可修复项目放入 剩余风险 / 开放问题;如果它在自主门 + 防护栏下可修复,将其视为发现并修复。
  • 当与 $tk 在波执行中配对时,必须将 $修复 视为工件化前的最终突变通过:
    • 先提交:在通过验证后立即移交给 $提交
    • 先补丁:在通过验证后立即移交给 $补丁

默认策略(非交互式)

使用这些默认值以最大化自主性(避免询问)。

优先级顺序(最高优先):

  1. 正确性 + 数据安全 + 安全
  2. 已证明使用行为的兼容性
  3. 性能

定义:

  • 已证明使用 = 有证据的行为(见下方检查清单)。
  • 未证明使用 = 其他一切。

已证明使用证据检查清单(确定性)

目标:在不询问的情况下将行为分类为已证明使用 vs 未证明使用。

算法:

  1. 枚举受影响行为令牌:
    • API 符号(函数/类型/方法)。
    • CLI 标志/命令。
    • 配置键 / 环境变量。
    • 文件/有线格式(字段名,JSON 键)。
    • 错误代码/消息被调用者消耗。
  2. 按此顺序收集证据(在首次匹配时停止):
    • 用户重现/信号引用令牌。
    • 测试断言令牌/行为。
    • 文档/README/示例/CHANGELOG/配置示例描述或演示令牌/行为。
    • 仓库调用站点使用令牌(非测试,非文档)。
  3. 如果任何证据存在,则标记为已证明使用;否则标记为未证明使用。

证据扫描程序(仓库本地):

  • 测试:搜索 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/JS export、Python 在 __all__ 中、Go 导出标识符)。

如果外部使用可能但不确定:

  • 如果小,偏好附加兼容路径(包装器/别名/适配器)。
  • 仅在破坏性更改不可避免时询问。

兼容性规则:

  • 必须保留已证明使用行为,除非不安全(崩溃/损坏/安全)。如果不安全,收紧并返回清晰错误。
  • 对于未证明使用行为,视为未定义;允许收紧。

API/迁移规则:

  • 如果修复触及外部使用表面(使用 外部使用表面检查清单), 则偏好附加/向后兼容更改(新选项/新函数/适配器)而非破坏性更改。
  • 如果破坏性更改不可避免,则停止并询问。

性能规则:

  • 必须避免热路径中的明显渐进回归。
  • 如果性能影响可能但本地不可测量, 则选择最小正确性优先修复,并在 剩余风险 / 开放问题 中记录风险(不要询问)。

自主门(确信度)

仅当所有为真时才无需询问进行:

  • 信号:您有(或可以创建)无产品歧义的本地重现/信号。
  • 合同:您可以从仓库证据推导合同或特征化当前行为而无产品歧义。
  • 不变量:您可以陈述不变量_之前和不变量_之后。
  • 差异:更改是局部的,对于所选策略可审查。
  • 证明:更改后至少有一个验证信号通过。

如果任何门失败:

  • 应用默认值 + 合同推导。
  • 仅在仍然受阻时询问。

正确性收紧(默认)

定义:收紧 = 更早拒绝无效/模糊状态,移除静默失败路径,或使未定义行为明确。

规则:

  • 如果收紧防止崩溃/损坏/安全问题, 则应用它(即使已证明使用),返回清晰错误,并记录兼容性影响。
  • 否则,如果收紧仅影响未证明使用输入/状态, 则无需询问应用它。
  • 否则(收紧可能更改已证明使用行为):
    • 偏好向后兼容形状(适配器/附加 API),或
    • 用特征化测试锁定当前行为,
    • 仅在兼容性无法保留时询问。

允许收紧移动(仅示例):

  • 解析/强制:隐式强制/部分解析 -> 显式解析 + 错误(JS 隐式字符串->数字;Rust parse().ok() 回退)。
  • 回退:警告+回退/默认无信号 -> 显式错误或显式“未知”/“无效”。
  • 有损转换:截断/钳制/包装 -> 检查转换 + 错误(Rust as;C 强制转换;Go int 转换)。
  • 部分更新:多步突变 -> 原子/事务边界或显式部分结果。
  • 忽略错误:忽略 -> 带上下文传播;如果故意忽略 -> 补偿信号(断言/测试/指标/日志)。
  • 哨兵:-1/0/""/None -> 更丰富返回。

默认值(仅当对有效输入语义保留时使用)

所有权 / 生命周期

  • 必须盘点切片内资源:分配、句柄、套接字、锁、事务、临时文件。
  • 对于每个资源,记录:获取站点、所有者、释放动作。
  • 必须确保每个退出释放恰好一次。
  • 必须仅通过已证明所有者/分配器/句柄释放/释放。
    • 永远不要假设“释放”安全,除非证明分配器/所有权。
    • 区域/颠簸分配器:每个对象 释放 安全仅当明确记录为允许/无操作。

验证信号选择

算法:

  1. 如果用户提供命令,使用它。
  2. 否则,选择最便宜的本地信号(无网络)按此顺序:
    • README/QUICKSTART
    • scripts/check / scripts/test
    • Makefile / justfile / Taskfile.yml
  3. 否则,按此顺序创建证明钩子:
    • 聚焦回归/特征化测试
    • 边界断言,大声失败
    • 范围 + 速率限制诊断日志,绑定到 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) 预检

  1. 确定模式:仅审查 vs 修复。
  2. 如果请求目标是此技能(或其他技能),通过 $优化 路由:
    • 遵循 $优化 发现 -> 定义 -> 开发 -> 交付,
    • 应用最小技能差异,
    • 运行 uv run --with pyyaml -- python3 codex/skills/.system/skill-creator/scripts/quick_validate.py codex/skills/<技能名称>
    • 仅在请求还包括代码/运行时缺陷时返回 修复 其余部分。
  3. 定义切片:
    • 如果在 git 仓库且有差异,从差异推导切片/令牌(路径、更改符号/字符串)。
    • 否则:入口点、输入、输出、状态。
  4. 如果请求是 PR 范围(例如“$修复此PR”、“$修复当前分支”、PR 上 CI 失败),将切片锚定到 PR 差异/基础,并保持工作 PR 本地,除非需要严重扩大。
  5. 应用 PR/差异范围防护栏 进行审查模式。
  6. 在编辑前应用 生成 / 第三方代码防护栏
  7. 选择验证信号(或创建证明钩子)。

1) 合同 + 基线

  1. 确定已证明使用行为:
    • 对切片影响的行为令牌应用 已证明使用证据检查清单
  2. 无需询问推导合同(按此顺序):
    • 测试练习切片
    • 仓库调用站点
    • 文档/README/示例
    • 如果无:为当前行为添加特征化测试
  3. 写合同(1句):“工作意味着 …”。
  4. 运行基线信号一次;记录结果。
  5. 如果基线信号正常,应用 通过基线的证明纪律

2) 创建初始发现

  1. 枚举切片的候选失败模式。
  2. 排序安全 > 崩溃 > 损坏 > 逻辑。
  3. 对于您将处理的每个问题,创建发现记录。

3) 强制扫描(多通过)

对触及切片运行 多通过循环(默认)

3a) 不健全扫描

对于每个适用的风险类:

  • 识别首次失败点。
  • 提供具体反例(输入/时间线)。
  • 指定最小健全修复,消除错误类。

风险类:

  • 安全边界:授权/认证、注入、路径遍历、SSRF、不安全反序列化、秘密/PII 处理。
  • 可空性/未初始化状态;哨兵值。
  • 所有权/生命周期:泄漏、双重释放、使用后关闭、锁未释放。
  • 并发/顺序/时间:竞争、锁排序、可重入、超时/重试、TOCTOU。
  • 边界/算术:索引/切片、溢出/下溢、有符号性。
  • 持久性/原子性:部分写入、撕裂更新、非事务多步更新。
  • 编码/单位:字节 vs 字符、时区/区域设置、单位不匹配、有损规范化。
  • 错误处理:吞没错误、缺少上下文、静默回退。

语言提示(仅示例):

  • Rust:unsafeunwrap/expectas 强制转换。
  • JS/TS:any、隐式强制、undefined 流。
  • Python:裸 except、基于真值分支。
  • C/C++:原始指针、未检查强制转换、手动 malloc/free

3b) 不变量强化扫描

委托给 $不变量王牌 并导入其工件到 修复

默认执行:

  1. 首先运行 $不变量王牌 紧凑模式。
  2. 捕获至少:
    • 反例
    • 不变量
    • 所有者和范围
    • 执行边界
    • 接缝(之前 -> 之后)
    • 验证
  3. 映射这些到 修复 发现字段:
    • 不变量_之前 从损坏跟踪 + 先前范围,
    • 不变量_之后 从选定谓词 + 保持范围,
    • 修复 从接缝,
    • 证明 从验证信号。
  4. 如果紧凑模式不产生归纳谓词,升级到完整 $不变量王牌 协议。

3c) 陷阱扫描 + 消除

触发:您触及 API 表面或调用者可能误用代码。

对于顶部误用路径:

  1. 提供最小误用片段 + 意外行为。
  2. 通过更改表面消除:
    • 选项结构体 / 命名参数
    • 将布尔值拆分为枚举或单独函数
    • 显式单位/编码
    • 更丰富返回(无哨兵)
    • 分离纯计算和效果
  3. 用回归测试或边界断言锁定。

3d) 复杂性扫描(风险驱动)

委托给 $复杂性缓解器 进行分析;仅通过 修复 实现。

规则:仅当减少风险并改善不变量/所有权的可审计性时重塑。

算法:

  1. 在触及切片上运行 $复杂性缓解器(热度读取 + 必要/附带裁决 + 排序选项 + 跟踪)。
  2. 选择最小可行切割,直接支持发现(安全/表面/不变量所有权/证明质量)。
  3. 如果简化依赖于未陈述不变量,首先运行/刷新 $不变量王牌
  4. 除非关闭具体风险,否则保持复杂性清理在范围外。

4) 实现修复(每发现)

按严重性顺序对发现:

  1. 实现最小健全修复,消除错误类。
  2. 允许时应用正确性收紧。
  3. 确保不变量 + 所有权在所有路径保持。
  4. 保持差异可审查;避免顺便重构。

5) 关闭循环(必需)

  1. 运行选定验证信号。
  2. 如果失败:
    • 用新反例更新发现,
    • 应用最小附加修复,
    • 重新运行相同信号。
  3. 重复直到信号通过。
  4. 如果在3次修复周期后无法进展,停止并询问:
    • 最后失败输出(关键行/堆栈),
    • 您尝试了什么,
    • 阻塞您的最小剩余决策。

6) 剩余风险扫描(必需)

  1. 重新检查 剩余风险 / 开放问题政策
  2. 任何无有效阻塞器的项目变为发现并被修复(带证明)或丢弃。

7) 输出锁定(必需)

在发送最终消息前,验证所有为真:

  1. 标题集是确切和完整的(合同发现(严重性顺序)应用更改通过跟踪验证剩余风险 / 开放问题)。
  2. 通过跟踪 包括计划/执行计数和 P1/P2/P3 行(加上执行时的 P4/P5)。
  3. 运行时通过更新(通过 <n>/<总计划>: ...)在执行期间发出。
  4. 如果使用嵌入模式,在同一助手消息中包括 修复记录(在任何必需工件后)。

交付格式(聊天)

输出确切这些部分。

如果无发现:

  • 发现(严重性顺序):
  • 应用更改:
  • 剩余风险 / 开放问题: - 无
  • 仍然包括 通过跟踪验证

合同

  • <一句>

发现(严重性顺序) 对于每个发现:

  • F# <文件:行><安全|崩溃|损坏|逻辑> — <问题>
    • 表面: 令牌=<…>; 已证明使用=<是/否 + 证据>; 外部=<是/否>; 差异_触摸=<是/否>
    • 反例: <输入/时间线>
    • 不变量 (之前): <之前假设/允许什么>
    • 不变量 (之后): <现在保证/拒绝什么>
    • 修复: <最小健全修复摘要>
    • 证明: <测试/断言/日志 + 验证命令> -> <好/失败>

应用更改

  • <文件> — <理由>

通过跟踪

  • 核心通过计划: 3; 核心通过执行: <3>
  • 增量通过计划: <0|2>; 增量通过执行: <0|2>
  • 总通过执行: <3|5>
  • P1 安全 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • P2 表面 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • P3 审计 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • 如果执行增量通过,也包括 P4P5 行,相同格式。

验证

  • <命令> -> <好/失败>

剩余风险 / 开放问题

  • 如果无: - 无
  • 否则: - <文件:行 或 令牌> — 阻塞者=<阻塞者> — 下一个=<一个动作>

修复记录(仅嵌入模式)

仅当 $修复 在另一个技能内调用时使用。

发现(严重性顺序) 对于每个发现:

  • F# <文件:行><安全|崩溃|损坏|逻辑> — <问题>
    • 表面: 令牌=<…>; 已证明使用=<是/否 + 证据>; 外部=<是/否>; 差异_触摸=<是/否>
    • 反例: <输入/时间线>
    • 不变量 (之前): <之前假设/允许什么>
    • 不变量 (之后): <现在保证/拒绝什么>
    • 修复: <最小健全修复摘要>
    • 证明: <测试/断言/日志 + 验证命令> -> <好/失败>

应用更改

  • <文件> — <理由>

通过跟踪

  • 核心通过计划: 3; 核心通过执行: <3>
  • 增量通过计划: <0|2>; 增量通过执行: <0|2>
  • 总通过执行: <3|5>
  • P1 安全 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • P2 表面 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • P3 审计 -> <完成>; 编辑=<是|否>; 信号=<命令|不适用>; 结果=<好|失败|不适用>
  • 如果执行增量通过,也包括 P4P5 行,相同格式。

验证

  • <命令> -> <好/失败>

剩余风险 / 开放问题

  • 如果无: - 无
  • 否则: - <文件:行 或 令牌> — 阻塞者=<阻塞者> — 下一个=<一个动作>

陷阱

  • 无位置模糊建议。
  • “最好有”重构,不减少风险。
  • 功能蔓延。
  • 询问风险容忍度而非应用默认策略。
  • 收紧呈现为可选。
  • 所有权修复无已证明分配器/所有者。
  • 编辑生成/第三方输出而非真相源。
  • 当基线正常时,无失败证明钩子的代码编辑。
  • 使用 剩余风险 / 开放问题 替代可修复发现。

激活提示

  • “解决” / “修复” / “崩溃” / “数据损坏”
  • “$修复此PR” / “$修复当前分支” / “修复此分支”
  • “CI失败” / “修复红色检查” / “修复失败PR”
  • “陷阱” / “误用” / “不应该发生”
  • “不变量” / “生命周期” / “可空意外”
  • “太复杂” / “分支汤” / “跨文件跳转”
  • “优化 $修复” / “改进修复技能工作流程” / “更新修复技能文档”