--- name: aaalice-refactor-parity-loop description: 对 Aaalice NAI Launcher 的大型文件拆分型重构执行多子代理等价性闭环。当任务目标是把大型业务文件按职责拆分、同时保持功能、交互与布局不变时自动使用;不用于普通重构、功能开发、单点 Bug 修复或常规代码审查。 --- # Aaalice 重构等价性闭环 运行环境需要 Git、Flutter/Dart 与可用的 Codex 多代理协作工具。 本 Skill 验证的是“重构前后行为等价”,不是代码是否看起来更整洁。当前主 Agent 对范围、结论、修改、验证和最终交付负责;子代理只提供独立证据或执行边界清晰的修复。 本 Skill 可以自动启用,也可以由用户通过 `$aaalice-refactor-parity-loop` 明确调用。 ## 启动门禁 自动启用时,只有同时满足以下条件才执行后续流程: 1. 当前任务是大型业务文件的职责拆分或同等规模的拆分型重构; 2. 目标要求重构前后功能、交互和布局保持等价,而不是引入新行为。 任一条件不满足时,不执行本 Skill 的多子代理循环,并简要说明它只用于大型文件拆分等价性验证。 先阅读: - [references/agent-prompts.md](references/agent-prompts.md):各阶段子代理任务模板。 - [references/progress-template.md](references/progress-template.md):被忽略的进度记录模板。 ## 适用边界 在以下场景使用: - 把超过 1000 行且经职责、内聚性和扩展成本评估后确有必要拆分的业务文件按职责拆分; - 移动 Widget、Controller、Provider、Service、路由或平台适配代码,但不应改变行为; - 重构后必须保持功能、状态、调用契约、响应式布局和平台行为; - 用户要求多子代理循环审查、对抗性确认和修复。 不在以下场景使用: - 有意改变产品行为的新功能; - 单点 Bug 修复、普通命名整理或机械格式化; - Changelog、Release Notes 或发布差异审查; - 仅为了达到行数指标而继续拆分已经职责清楚的模块。 如果同一批改动同时包含功能变化和结构重构,先在记录中明确“允许变化”和“不允许变化”。任何未列入允许变化的差异都按潜在回归处理。 ## 强制原则 1. 必须使用 Codex 内置多代理协作工具;不得用外部编排器、额外工作树、独立 Codex task 或外部 Agent 代替。项目开发 Runner 使用 `aaalice-dev-sessions` 管理的独立命令行窗口,不属于子代理替代方案。 2. 审查代理和确认代理必须是不同的新代理;任何代理不得确认自己的结论。 3. 审查默认只读;没有经过反证确认的问题不得进入修复。 4. 不把文件行数、个人风格、抽象偏好或“可能以后出错”单独当成回归。 5. 修复代理只能按互不重叠的问题簇并行。涉及同一文件、同一状态机或同一调用链时必须顺序执行。 6. 主 Agent 必须交叉核对所有子代理输出,不按多数票机械裁决,也不把交付责任转移给子代理。 7. 每次修复后必须开始新一轮完整审查;修复发生过的轮次不能直接判定通过。 8. 不设置为了快速结束而存在的轮次上限。遇到外部阻塞、证据不足或连续两轮没有实质进展时停止并如实报告,不伪造成功。 ## 进度记录 为每个任务创建: ```text tool/.tmp/refactor-parity//progress.md tool/.tmp/refactor-parity//workers/ ``` `tool/.tmp/` 已被 Git 忽略。首次创建时复制模板,再补全内容: ```powershell $ErrorActionPreference = 'Stop' $root = 'tool/.tmp/refactor-parity/' New-Item -ItemType Directory -Force "$root/workers" | Out-Null Copy-Item '.agents/skills/aaalice-refactor-parity-loop/references/progress-template.md' "$root/progress.md" ``` 记录是审计轨迹,不是事实来源。后续代理必须重新检查代码、diff、测试和运行证据,不能因为 Markdown 中写了“已确认”就接受结论。 修复代理完成后,必须在以下唯一文件写自己的报告,避免并发修改主记录: ```text tool/.tmp/refactor-parity//workers/round--.md ``` 报告至少包含:负责的问题 ID、修改文件、保持的契约、验证命令与结果、剩余疑点。主 Agent 将其摘要和实际 diff 核验结果写回 `progress.md`。 ## 阶段 0:锁定基线与等价性契约 修改前先完成: 1. 记录仓库路径、当前分支、`HEAD`、比较基线 SHA 和工作区现有改动。 2. 基线优先使用用户指定提交;否则使用重构开始前的精确提交。不得默认用 `origin/main` 覆盖当前功能分支语义。 3. 如果重构已经发生但尚未提交,使用 `git diff` 与 `git show HEAD:` 重建拆分前内容;明确哪些基线证据已经无法获取。 4. 列出目标文件、调用方、公共类型/方法/回调、Provider、路由、平台桥接、资源和测试。 5. 建立等价性矩阵,至少包含: - 输入、输出、异常和副作用; - 状态初始化、更新、销毁、取消和异步竞态; - 路由、返回、焦点、键盘、鼠标、触控和手势; - 空态、加载、错误、有数据、禁用和并发状态; - Windows、Android、桌面窄窗、手机、横屏和平板差异; - 文案、本地化键、语义、可访问性和快捷键; - 受影响布局的尺寸、顺序、显隐、滚动、Overlay 和 SafeArea。 6. 运行预计 60 秒内可完成的重构前针对性测试并记录结果。无法运行时记录原因,不能假定基线通过。 如果改动涉及 UI: - 优先把关键尺寸和状态固化为确定性 widget/layout test。 - 只有用户明确要求自动化运行验收时,才加载 `aaalice-runtime-verify` 获取重构前后的真实截图、交互和日志证据。 - 没有运行态授权且没有直接覆盖受影响状态的确定性布局测试时,不得声称已经证明像素级或真实运行布局完全一致。 ## 阶段 1:执行行为保持型拆分 1. 按职责拆分,不顺手改变交互、样式、文案、业务规则或平台能力。 2. 保持公共入口、调用顺序、Provider 生命周期、Widget key、语义和回调契约,除非等价性矩阵明确允许变化。 3. 每完成一个可编译边界就运行最小检查;不要积累大量未验证移动后再一次性修错。 4. 工作区已有改动默认属于用户,不回滚、不覆盖、不格式化无关文件。 5. 拆分完成后更新拆分清单:旧成员到新文件/新类型的映射,以及有意删除的死代码证据。 ## 阶段 2:多代理独立审查 在当前可用并发槽内优先并行派发 3 个只读子代理;无法同时覆盖的维度在子代理完成后继续派发,范围尽量不重叠: 1. **功能与 API 契约**:调用链、输入输出、回调、副作用、错误和兼容性。 2. **状态与生命周期**:Provider/Controller/State、异步取消、初始化、销毁、导航和资源释放。 3. **UI 与布局**:Widget 树、constraints、响应式、Overlay、滚动、焦点、手势、语义和平台差异。 4. **接线完整性**:import/export、生成代码、路由、依赖注入、本地化、资源、测试入口和死代码。 5. **平台专项(按需)**:Windows、Android 或原生桥接的等价性。 所有审查代理必须独立比较基线与当前实现,不读取其他代理结论。每条发现必须包含:稳定 ID、基线行为、当前行为、准确路径/行号、可触发条件、影响、置信度和最小验证方式。 以下内容不得单独登记为问题: - “文件仍然很长”; - “我更喜欢另一种抽象”; - 没有调用链或行为证据的假设性风险; - 与本次 diff 无关的既有问题; - 仅缺少额外测试但没有发现行为差异。 主 Agent 去重后把候选发现写入当前轮次,但此时状态只能是 `待确认`。 ## 阶段 3:多代理对抗性确认 派发至少 2 个新的只读子代理。将候选发现按调用链或文件簇分配,重要问题至少由两个确认代理独立检查。 确认代理必须先尝试反证: - 查找 guard、fallback、最近作用域处理、共享命令入口、测试和框架真实机制; - 判断差异是否属于等价性矩阵允许变化; - 构造最小反例或针对性测试思路; - 区分“当前真实回归”“维护风险”“纯风格偏好”和“误报”。 分类规则: - `已确认`:存在直接代码、测试、日志或运行证据,且能说明触发路径和行为差异。 - `已反证`:框架机制、现有 guard、测试或调用链证明原结论不成立。 - `未决`:证据不足或结论依赖未验证环境。 `未决` 不能进入修复。主 Agent必须追加只读检查或最小测试来解决;无法解决时本轮不能通过。 如果独立审查没有发现问题,确认代理仍要执行“清洁轮挑战”:尝试寻找审查遗漏、验证关键等价性矩阵和测试覆盖。只有挑战也没有产生 `已确认`/`未决` 问题,才算干净轮候选。 如果审查发现的问题全部被反证,且确认代理没有发现新问题,可以进入完成门禁,不需要为了“做点修改”而制造修复。 ## 阶段 4:分组修复已确认问题 1. 只修复 `已确认` 且由本次重构引入的问题。 2. 按互不重叠的文件和调用链建立修复簇,派发多个修复子代理;强耦合问题由一个代理完整处理。 3. 每个修复代理获得:问题 ID、基线契约、允许修改文件、禁止范围、预期验证和独立报告路径。 4. 修复代理不得扩大功能、修改 Changelog、隐藏异常、降低测试或自行宣布整轮通过。 5. 主 Agent 逐个检查 worker 报告、实际 diff、调用方和测试,解决冲突并执行必要整合。 6. 修复完成后更新主记录,然后回到阶段 2,启动全新的完整审查轮。 ## 阶段 5:完成门禁 只有同时满足以下条件才能把状态写为 `PASS`: 1. 最近一轮在所有相关审查维度上完成了独立审查。 2. 新确认代理完成了对抗性确认或清洁轮挑战。 3. 最近一轮没有 `已确认` 或 `未决` 问题;候选问题可以为空或全部被可靠反证。 4. 最近一轮之后没有再修改生产代码;如果修改过,必须重新开轮。 5. 等价性矩阵全部有代码、测试、日志或运行证据;不适用项有理由。 6. 针对性测试、相关集成测试和 scoped analyze 通过;既有或环境失败已区分并记录。 7. 最终 diff 只有任务范围内的结构变化和必要回归修复,没有第二事实来源、静默降级、宽泛吞错、死代码或无关格式化。 8. UI 重构具备直接布局证据。若既没有对应 widget/layout test,也没有经用户授权的运行态对比,状态必须保持 `BLOCKED_LAYOUT_EVIDENCE`,不能声称完整布局对齐。 完成时在 `progress.md` 写明:最终状态、干净轮编号、基线与最终 SHA/diff、验证命令、运行态是否执行、所有已反证问题及依据、剩余非阻塞事项。 ## 最终回复 简洁报告: - 拆分范围和新模块边界; - 审查轮数、确认轮数和修复问题数量; - 最终干净轮及进度记录路径; - 实际执行的测试、分析和运行态验证; - `PASS`、`BLOCKED_LAYOUT_EVIDENCE` 或其他阻塞状态。 没有满足完成门禁时不得使用“完全对齐”“已经成功”或“无回归”。