Prhub

#30585 Enhance mechanical-refactor-verify skill with a whole-chain verifier, new relocation primitives, and generator inference

原始 PR 作者 fzyzcjy 合并时间 2026-07-14 16:45 文件变更 30 提交数 60 评论 2 代码增减 +4328 / -207

执行摘要

新增链验证器、重定位原语和生成器推断

此前技能只能证明单次重定位commit,无法对整个重构分支/PR给出统一机器裁决。本PR补全了 split→construct→verify 的完整工作流,使reviewer可以信任整个chain而不必逐行审阅。

值得精读,尤其是链验证器、分类规则和增量缓存的设计模式。对于构建自动化验证管线的团队有重要参考价值。

讨论亮点

PR作者在提交评论中指出,初始版本的单commit模式未校验extract_function,导致生成正确脚本但报告UNSUPPORTED并错误退出。后续修复(c73ca03)增加了计数,并补充了委托、导入/赋值边界情况的测试覆盖。

实现拆解

  1. 全链验证器(mechanical_refactor_reproduction_cli.py):新增CLI入口,遍历 base..branch 的每个commit,根据commit message中的分类词(mechanical_provable / non_mechanical_provable)分别调用证明脚本或标记为人工审查。支持并发运行(--jobs)和增量缓存(--skip-passed)。
  2. 扩展重定位原语(reproduction_utils.py):新增move_assign(移动模块级常量)、extract_function(剪切内联块)、route_call_sites_through_field(路由调用至字段)、add/remove_imported_name(增减导入名)等原语,并增强move_symbol支持after=锚点和leave_delegate委托存根。
  3. 生成器推断(proof_generator.py):新增extract_function推断(识别从兄弟函数切出的内联块)和类移动推断(识别整个ClassDef的跨文件迁移),并扩展对转发委托和常量伴随移动的推断。
  4. 分类与验证契约:commit message必须包含 exactly一个分类词,机器根据该词选择验证路径;non_mechanical_provable声明必须诚实,不得包含可证明的重定位(向导中明确禁止)。
  5. 测试覆盖:添加了约21个测试文件,覆盖链验证、分类、原语、缓存、报告生成、故障注入等场景。
文件 模块 状态 重要度
.claude/skills/mechanical-refactor-verify/scripts/mechanical_refactor_reproduction_cli.py 验证工具 added 9.25
.claude/skills/mechanical-refactor-verify/scripts/mechanical_refactor_proof_generator.py 生成器 modified 8.93
.claude/skills/mechanical-refactor-verify/scripts/mechanical_refactor_reproduction_utils.py 原语库 modified 8.93
.claude/skills/mechanical-refactor-verify/scripts/tests/proof_generator/test_infer_extract_functions.py 测试集 added 8.14
.claude/skills/mechanical-refactor-verify/scripts/tests/reproduction_cli/test_verify_chain.py 测试集 added 8.09

关键符号

verify_chain render_report infer_recipe build_repro move_symbol move_assign extract_function route_call_sites_through_field add_import add_imported_name remove_imported_name _delegate_stub_attr _next_sibling_assign_or_def _symbol_named

关键源码片段

.claude/skills/mechanical-refactor-verify/scripts/mechanical_refactor_reproduction_cli.py core-logic

新增链验证器 CLI,是工作流的核心入口,负责分类、证明调度和报告生成。

# 关键类:CommitVerdict 和 ChainResult
# 每一个 commit 的验证结果,ok 表示 PASS 或 HUMAN_REVIEW
@dataclass(frozen=True)
class CommitVerdict:
    sha: str
    subject: str
    kind: str | None # 'mechanical_provable' 或 'non_mechanical_provable'
    verdict: str # PASS / FAIL / HUMAN_REVIEW 等
    detail: str = ""
    cached: bool = False
​
    @property
    def ok(self) -> bool:
        return self.verdict in (VERDICT_PASS, VERDICT_HUMAN_REVIEW)
​
​
@dataclass(frozen=True)
class ChainResult:
    base: str
    branch: str
    proof_dir: Path
    verdicts: list[CommitVerdict] = field(default_factory=list)
​
    @property
    def passed(self) -> bool:
        # 所有 commit 的 verdict 均为 ok 则认为 chain 通过
        return bool(self.verdicts) and all(v.ok for v in self.verdicts)

评论区精华

单 commit 模式遗漏 extract_function 导致假失败 正确性

作者在 PR 评论中指出,初始版本的单 commit 路径未检查 extract_functions,导致正确脚本被报告为 UNSUPPORTED 并退出 1。

结论:后续提交 c73ca03 修复了计数,并补充了委托和导入 / 赋值的边界情况测试。 · 已解决

风险与影响

  1. 证明脚本假阳性风险:如果proof脚本本身有bug但碰巧产生空diff,验证可能错误通过。
  2. 缓存一致性问题:--skip-passed基于内容哈希,若脚本正确性依赖环境(如git版本、formatter版本),不同机器可能结果不同。
  3. 分类词误用:作者可能误用分类词(如将non_mechanical_provable用于纯重构),工具不做强制检查,依赖审阅者监督。

对用户无直接影响。对团队重构流程有显著改善:大规模重构(如model_runner拆分)可通过链验证器自动获得证明,减少人工审阅负担。测试框架和CI可集成验证步骤。

证明脚本假阳性风险 缓存环境依赖风险 分类词误用缺乏机器校验

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论