Skip to content

[自动合并 P2-8] auto-fix 上限 + 额度/成本熔断 #93

Description

@randypanding

目标

给 agent 的自动修复循环加装两道生存护栏:(a) auto-fix 尝试上限——修红循环 N 次(建议 3)后自动关 PR + 开 issue;(b) 额度/成本熔断——Actions 分钟数与 token 预算的阈值告警与硬停。一人公司这条是生存问题。

背景(源自 #81 §6)

一个坏循环能烧掉整月 Actions 额度:agent 修红 → 失败 → 再修 → 再失败,无人值守下没有自然终止条件。成本同理——Actions 分钟、LLM token 都没有硬顶。无人值守系统必须自带"烧钱刹车"。

涉及文件

  • agent 运行时侧:修复循环计数逻辑(agent-platform / agent 工作流定义处,按实际实现位置)
  • governance/policy/(上限阈值声明:auto-fix 次数、Actions 分钟/月、告警档位)
  • .github/workflows/governance-drift.yml 或新增 cost-check workflow(周期拉取 billing/usage API)
  • repository variable / org variable(熔断标志位,如 AUTO_MERGE_DISABLED,被 gate 或 automerge 流程消费)

执行步骤

  1. auto-fix 上限:agent 修红循环必须携带尝试计数(PR label 或 commit 元数据记录),达到 N 次仍红 → 自动关 PR + 开 issue 说明失败历史,不再重试。
  2. 成本熔断:周期任务(可并入 governance-drift 或独立 cron)调用 GitHub billing/usage API(/orgs/{org}/settings/billing/actions),达 80% 告警开 issue,达 100% 置熔断标志硬停 agent 任务派发与 auto-merge。
  3. 熔断标志的消费点明确:agent 派发入口与 automerge 流程启动前检查标志,置位即停并开 P0 issue。
  4. 人工复位路径写明(谁、怎么复位,复位动作留痕)。

验收标准

  • 永远修不好的 PR 在第 N 次失败后自动关闭且不再被重试,伴随说明 issue。
  • billing 用量(测试时用模拟值注入)达阈值时告警/硬停按档位触发。
  • 熔断置位后 agent 任务与 auto-merge 全部停止;人工复位后恢复。

测试方法(预先指定)

T1 auto-fix 上限(核心,负向)

  1. 构造一个永远修不好的失败(如 PR 引用不存在的模块,测试必红)。
  2. 让 agent 自动修复循环跑起来(可用测试仓 + 加速参数)。
  3. 断言:第 N 次失败后——PR 被自动关闭;产生 issue(含 N 次失败的 run 链接);无第 N+1 次运行(Actions 用量佐证:该 PR 的 workflow run 数 == N 次修复 × 每次 run 数,无多余)。

T2 计费熔断(核心,注入式)

  • billing API 返回真实值不便构造超支场景,设计时要求用量获取逻辑支持注入(环境变量/测试输入覆盖 API 返回值):
    1. 注入 79% → 断言无告警;
    2. 注入 85% → 断言开出告警 issue(不硬停);
    3. 注入 100% → 断言熔断标志置位、P0 issue 开出、模拟的 agent 派发请求被拒绝、auto-merge 流程拒绝启动;
    4. 人工复位 → 断言全流程恢复。

T3 计数持久性(负向):agent 修复循环中途 workflow 重启/runner 崩溃后,计数不丢(重跑 T1 并在第 2 次修复后人为 cancel workflow)→ 断言恢复后计数续接而非清零重来(清零 = 上限失效 = 死循环烧额度)。

依赖

  • P1 全部(无人值守链路已通,才轮到保护它不被烧穿)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agentAgent 运行时相关auto-merge自动合并计划(#81)工作卡governance治理体系相关

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions