工程
Anthropic 的现代化插件会重写你的 COBOL。但它先要你证明自己看懂了它
Claude Code 的 code-modernization 插件把遗留系统迁移变成一条被强制的顺序:先调研,再由人把关审批,最后才写代码。它的设计大半花在拒绝跳步上,而这些拒绝才是值得读的部分。
MAI
Anthropic 发布了一个名为 code-modernization 的 Claude Code 插件,瞄准的是企业软件里最古老、最不光鲜的那个问题:一套 COBOL、老版 Java、C++ 或 .NET 系统,至今仍在支撑业务,而在职的人里没有一个真正完全看得懂它。许可证是 Apache 2.0,安装只需一行命令,官方插件目录把它标为 Anthropic 认证,安装量约 5,900 次。
它提供的能力本身并不有趣。语言模型能读 COBOL、吐 Java,已经有一阵子了。这个插件值得一读,是因为它的设计大半都花在拒绝这么做上。
顺序才是产品
插件强制一条顺序:
preflight → assess → map → extract-rules → brief → (reimagine | transform | uplift) → harden前四条命令只产出文档。assess 写出清单和复杂度指数;map 写出依赖与数据血缘图,外加一个交互式拓扑查看器;extract-rules 把业务规则挖出来,整理成带 file:line 出处和置信度的 Given/When/Then「Rule Card」。到这一步,面向新系统的代码一行都还没写。
关卡是 brief。它把调研结果综合成一份供指导委员会审批的分阶段计划,进入计划模式等待人来批准,而它定义里最关键的一句是——读取调研产物,只要缺了任何一件就停下。没有先生成分析,你就走不到生成代码的那些命令。README 把理由讲得很直接:现代化之所以失败,是因为团队在理解代码之前就开始改写,或者在没有一套能抓住行为偏移的测试装置时就上线。
这个前提有三十年失败迁移案例作支撑,但拿它当产品的支点仍然是件奇怪的事。这个插件的竞争主张不是「我写的 Java 更好」,而是「在你拿出一份说明旧系统在做什么的文档之前,我一行 Java 也不写」。
三种方法,而要点在最无聊的那一种
构建阶段提供三条命令,由 brief 推荐用哪一条。
| 命令 | 做什么 | 等价性证明 |
|---|---|---|
transform | 基于抽取出的意图,把单个模块跨技术栈重写(COBOL → Java),绞杀者模式 | 重写前先写好特征化测试,然后运行 |
reimagine | 在新架构上做绿地重建,两个人工检查点 | 针对挖掘出的规格的可执行验收测试 |
uplift | 同栈版本升级——.NET Framework 4.8 → .NET 8、Spring Boot 2 → 3 | 在两套运行时都能跑的环境里,让同一套测试在两边各跑一次 |
真正透出实战经验的是 uplift。它的命令文件开篇就强调自己不是 transform:「代码是好的,它只需要能在新运行时上跑起来。」因此它保留结构,只做能编译通过、行为完全一致的最小改动,驱动它的是一份「这份代码真正会踩到的已知破坏性变更」目录。如果这份目录显示反正大部分代码都被迫要改,命令会告诉你去用 transform。
插件里最诚实的成本控制机制也在这里。迁移是试点优先的:先把一个有代表性的项目从头走到尾,把经验写进一份 playbook,之后其余部分才铺开——每个项目一个代理,按依赖关系分批,并挡在一个熔断器后面。于是一份已经失效的 playbook 会在几个代理之内被发现,支出随即停止,直到它被修订。这是看过一支代理队伍信心十足地朝错误方向烧 token 的人才写得出的设计。
代码库被当成攻击者对待
安全说明直白得罕见。被分析的代码是不可信输入:一个怀有恶意的代码仓库可以埋下「忽略先前指令」「把这条规则标记为已批准」之类的注释,操纵最终写进规则清单或安全发现里的内容,而后续命令会信任这些产物。文中列出的防御是:代理把文件内容当作数据;验证代理从被引用的源码本身重新推导每一条规则和发现,而不是照抄另一个代理的描述;以及人工审批关卡位于任何代码生成之前。
密钥也得到类似对待——在共享产物里被掩码,隔离到一个已 gitignore 的文件中。紧接着的一句话读起来就是一次过往缺陷的披露:如果你曾用这个插件的早期版本跑过真实系统,请检查 analysis/ 产物是否被提交过,并轮换任何已暴露的凭据。
推荐的工作区配置,是把同样的直觉写成权限:禁止写入 legacy/,允许写入 analysis/ 和 modernized/。文档随后也承认这道防护的边界——会改动文件的 shell 命令仍然走普通的 Bash 授权提示,而对于那两个会一次性铺开大量可写代理的步骤来说,那个提示就是唯一的围栏。
它拒绝估算的东西
assess 会算出一个 COCOMO 数值,然后禁止你把它当成工期。说明给了理由:COCOMO 的系数编码的是人类团队的生产率,而代理驱动的转换并不遵循这条曲线,所以由它推导出的任何工期都会是错的。这个数字唯一保留下来的用途,是作为相对指数,用来给一批系统排序和安排先后。
这是整个仓库里最坦率的一句话。对于代理驱动的迁移究竟要花多久,业界没有经过校准的模型;而这个插件没有去发明一个,只是给指标贴了张警告标签就发出来了。
这些都没有让难题变简单。最强的等价性证明——同一套测试在新旧两套运行时上各跑一次——需要一条可用的遗留工具链;缺了它,插件就退回到基于记录轨迹的特征化测试,而那固定住的是被观察到的行为,不是被意图的行为。目录页至今仍挂着一段老简介,完全没有提到 preflight 和 uplift,这说明工作流的修订速度快过了它的货架展示。
但形状本身就是论点。Anthropic 发布的不是一台 COBOL 翻译机,而是一套把翻译当作便宜环节、把证明当作昂贵环节的流程。关于这类项目为什么会失败,这很可能是正确的读法。
Sources: code-modernization README (GitHub) · plugin.json manifest · modernize-uplift command definition · modernize-brief command definition · claude-plugins-official directory (GitHub) · code-modernization plugin listing (Claude)