AITM 如何将完成的工作合并到 dev,如何对合并后的测试失败进行向前修复而不是回滚,以及如何验证 Task 只触及了它应当触及的内容。
合并、合并后修复与 Scope Gate
合并的工作方式
每个 Task 都在自己的 git 分支/Worktree 中运行。当 Pipeline 完成(实现、
审查、测试全部通过)后,Task 会进入 AITM 的 Merge queue—一个串行化的
队列,使并发的 Task 绝不会同时合并到 dev 而相互
覆盖对方的更改。
- 自动合并触发。启用了
autoMergeDev的 Task 在其 Pipeline 完成后 会自动合并到dev—没有手动批准步骤,因此 完成的工作会持续落地,而不是堆积着等待人来点击合并。 - 合并前构建关卡。Task 的分支会先与当前的
dev同步,然后按合并之后的样子进行构建和类型检查。如果检查为红,修复 Agent 有有限次数的尝试机会;dev上已有的错误不会算到该 Task 头上。如果关卡仍为红,该 Task 不会被合并,并以conflict结束,同时附上构建输出。 - 冲突处理。如果 Task 的分支与已经落地到
dev的内容冲突,AITM 会用不同的策略重试合并,然后将冲突文件交给 AI 冲突解决器,由它合并双方的更改并重新运行构建关卡。处于conflict状态等待的 Task 会被自动重新检查;如果原因在此期间已经消失,它会自我修复并继续进行合并。 - 受控地合并到 dev。合并从队列中逐个进行,
因此
dev绝不会处于合并到一半的状态。合并不是一个 Pipeline 步骤:Task 会显示为finished并带有 Finalizing… 标记,待合并落地后变为archived。当某个 Task 停留在conflict状态时,同一标签页中排队的其他 Task 会在其后等待—因此值得尽快解决。
dev。合并后的错误检测与修复
Task 的分支合并到 dev 之后,AITM 会针对 dev 的新状态重新运行受影响的测试。
如果这些测试现在失败,默认的处理方式
是不回滚该合并。
示例:某个 Task 向共享模型添加了一个新字段。它顺利合并, 其自身的测试也通过了。但另一个已在不同分支上进行中的 Task 依赖于 该模型原有的结构—两者都落地之后,一个共享的集成测试开始失败。AITM 不会回滚 任何一次合并(那样也会丢掉每项更改中互不相关的、正常工作的那一半),而是:
- 找出究竟哪些文件/测试在失败,以及是哪个 Task 的 更改造成的。
- 在分支上向前修复—创建一个纠正性 Task,仅针对
失败的区域,基于
dev的当前状态工作(而不是基于任何一个 原始 Task 的 diff)。 - 在该修复被允许再次接近
dev之前,对其进行独立地重新测试。 - 通过与其他 Task 相同的队列合并该修复。
这种“向前修复”的理念避免了连锁性破坏:在其他工作已经建立在某次合并之上后再回滚它, 会迫使一连串进一步的回滚。在其自己的分支上就地修复实际的故障, 可将影响范围限制在所发现的那一个问题上。
Task 范围评估(Business Scope Gate)
每个 Task 都会预先声明它计划触及哪些文件。Task 完成时, Business Scope Gate 会将它实际更改的文件与该声明进行比较。
- 超出 Scope是指被更改的文件从未被声明,且与 Task 所述目标 没有合理的关联—例如,一个关于结账页面的 Task 同时编辑了不相关的管理设置文件。
- Scope 修订。有时触及未声明的文件是合理的 —某个共享类型必须更改,或某个常量位于相邻的文件中。这种情况下, Task 会为额外的文件记录一份简短而明确的理由(“scope amendment”), 而不是悄悄越界。有正当理由的修订会被接受;没有说明的 额外文件则不会。
- 阻断性与建议性违规。并非每个未声明的文件都以相同方式对待:
- 阻断性—被更改的文件与该 Task 确实无关 (属于不同的功能区域、没有共享依赖、也没有给出理由)。这会阻止 合并,直到问题解决。
- 建议性—被更改的文件与声明的 Scope 位于同一目录/模块, 且有合理的关联(例如同一功能文件夹中的同级文件)。这会被标记以供审查,但本身 不会阻止合并。
什么会成为 Bug,什么会成为新 Task
当审查步骤发现了超出当前 diff 的问题时,AITM 会在两种 结果之间作出决定:
- 当发现的问题是阻断性的 Scope 违规, 或是与 Task 本应完成的工作无关的真实缺陷时,它成为 Bug—即 已经存在的故障,需要独立于当前 Task 结果的、自己的修复周期。
- 当发现的问题是一项改进、一个锦上添花的优化,或是在处理 其他事情时浮现的、合理但超出 Scope 的想法时,它成为新的(后续)Task— 它会以自己的方式进入队列,而不是扩大当前 Task 的 Scope。
这种划分使每个 Task 的 diff 始终专注于被要求完成的事情,同时 仍然记录审查者沿途注意到的一切—审查期间观察到的内容 不会被悄悄丢弃,也不会被夹带进一个不相关的更改中。
Task 失败并需要人工介入时
并非每种失败都能自动恢复。AITM 的 Watchdog 和自我修复机制可以自行处理
基础设施方面的小故障以及常规的编译/测试失败,但有些错误是
终结性的—它们需要人来决定,而不是再重试一次。在以下情况下,Task 会以
终结性的 failed 状态结束:
- 配置有误。无效的 API 密钥、错误的设置、格式错误的 JSON—代码无法修复一个损坏的环境。
- AI 缺少数据。Task 的提示词不完整或含糊不清, 未提供必要的上下文,或需求不够明确。
- 存在只有用户才能解决的根本性障碍。架构 需要澄清、Scope 存在争议,或第三方服务宕机,需要 明确确认之后才能继续工作。
示例:假设某个 Task 因需求与现有 架构冲突而失败。AITM 无法猜测哪种设计是正确的—需要人来澄清。此时:
- 该 Task 被标记为
failed。 - 您(与 Claude)在 Chat 或 Brainstorm 中讨论根本原因。
- 由您决定:以更清晰的 Scope 重新排队?先提交一个单独的架构设计 Task? 调整方案?
- 然后根据更明确的理解创建新的 Task,或使用更新后的 提示词重新排队。
并非所有失败都是 Bug—许多失败在没有人工 输入的情况下确实无法解决。失败不等于白费功夫—失败运行留下的诊断信息和日志 仍然能准确告诉您问题出在哪里。而且当 Task 失败时,它是 您与 AITM 之间的一个交流点,而不是死胡同。
分支模型
每个由 AITM 管理的项目都遵循相同的双分支发布模型。
dev是默认/集成分支。每个 Pipeline Task 都合并到dev—完成并通过测试的工作在这里持续落地 (参见上文的 Merge queue)。main是稳定的发布分支。它只在发布时通过dev→main合并进行更新,而不会由单个 Task 更新。- 不存在
master分支。AITM 从不创建也不期待它。 - 导入的项目可以保留自己的集成分支。如果您接入的项目
已经为其集成分支使用了不同的名称,请通过项目
设置中的 Integration branch 设置(
defaultBranch)进行设置,并使用其中的 Verify remote 检查, 确认它能在实际的 git 远程仓库中解析。 - Docker 发布版中内置的 Gitea 创建的演示仓库以
dev作为默认分支,开箱即与同一模型保持一致。
如果某个 Task 所在的项目没有可用的 git 远程仓库,Task 会停止并给出可操作的提示, 引导您前往 Project settings → Verify remote,而不是显示 原始的 git 错误。