用途
run-health-review 用于无人值守自动化运行的健康巡检:当交付在夜间或运行期间停摆时,从 GitHub 状态中量化健康状况、命名停滞类型、只做一处改动或不改动,并接手被中断的半成品工作。
适用与不适用
适用:解释“为什么交付停了一夜”“8 小时没有合并”“前几天很好,现在变慢”;自动化报 automation_failed 或有效产出率下降;出现 403/429 速率限制或 CI 分钟、配额耗尽;按计划巡检——活跃无人值守运行期间每 30–60 分钟一次,稳定状态自动化每周一次。
不适用:没有任何无人值守任务在跑(改用 progress-contract);单个 PR 变红(属于 pr-shepherd)。
使用方式
- 设定观察窗口与基线,默认最近 24 小时对比此前 7 天的日均值。
- 一次性只读拉取健康信号:距上次合并到默认分支的时间(核心指标)与距上次发布的时间;已合并 PR、按状态分类的开放 PR(绿色未合并、红色、冲突、等待评审、草稿)及各年龄;就绪池大小;每个自动化或工作单元的运行数、ACTED/NOOP/BLOCKED 构成、按原因分类的失败、最新修订与日期;速率限制与配额命中(403/429 次数、CI 分钟、每合并 PR 的 API 调用);空闲或中断的会话以及停滞以来无提交的分支。
- 健康则保持静默:距上次合并时间低于 STALL_THRESHOLD 且无信号越线时,以 NOOP(healthy) 结束,不发布任何内容。
- 按停滞分类表归类,每处停滞引用证据(运行、PR、日志行或计数)。一处停滞只确定一个主因,次要原因列出但不据此行动。
- 若 TAKEOVER 允许,接管孤儿工作。
- 提出一处或零处改动:选择对核心指标预期影响最大的单一改动,说明预测(如“24 小时内距上次合并时间回到 45 分钟以内”)及验证方式。停滞是暂时的或原因不可控时,“不改动”是有效结论,需说明改为观察什么。
- 仅人工可解的阻塞(权限、预算增加、登录、策略决定)合并为一份清单并附建议答案,在下次定期报告中呈现;同一问题不重复询问,也不因此阻塞工作流。
- 按状态格式报告:距上次合并时间 x → y、合并数、按类别统计的停滞、那一处改动(或无改动)及预测、接管情况、仅人工清单。下次运行先检查上次的预测。
停滞分类(信号 → 典型单一改动)
- 供应:池为空或偏低、工作单元 NOOP(无合格工作)→ 运行 keep-the-pool-full,提高其目标。
- CI:主分支红色,或 PR 在同一任务上变红 → 转 main-red 分诊;隔离已证实的偶发失败。
- 速率限制(次要):403/429 且响应体含速率限制信息或 Retry-After;同一身份多通道突发写入 → 归类为可重试而非权限问题,记录“未尝试,于某时重试”,所有通道共用一份预算并串行写入。
- 配额(主要):每小时 API、CI 分钟或额度上限耗尽 → 降低并发或触发广度;采用共享 API 预算。
- 权限:因缺少工具、范围或规则集而 BLOCKED → 提交一次仅人工请求,或移除需要该权限的步骤。
- 提示漂移:某修订后 BLOCKED 或无效输出上升、人工覆盖输出 → 回退到上一良好修订,或提出一条契约规则改动。
- 孤儿:负责人已停止(宿主机重启、会话中断)的分支或 PR → 按接管协议接手。
- 触发:有合格条目却无运行(过滤过窄),或每条目多次运行(过宽)→ 调整一个触发过滤器;增加清扫。
- 评审/合并:绿色 PR 等待线程解决或批准 → 线程解决清扫;核对自主级别是否符合人工意图。
- 忙碌空转:会话报告忙碌,但超过 IDLE_AFTER 无新轮次或工具调用 → 以最后工具时间戳判断存活而非状态标志,用变化与预期重新唤起。
- 宿主机重启:协调者与子任务在其运行平台的部署后同时空闲 → 先恢复根再恢复子任务;把“恢复自身”作为任何自部署的最后一步。
- 自我回声/空转风暴:空转唤醒超过 50%,或唤醒由智能体自身写入触发 → 收紧唤醒过滤。
- 工具配置不匹配:某工具每次调用都失败,或写入工具处在只读配置中 → 移除或修正配置;每次调用都失败属于配置缺陷而非偶发。
接管协议
寻找候选:无提交时间超过 ORPHAN_AFTER、且负责人会话或自动化已不在运行的开放 PR 或分支。核实状态:head SHA、该 SHA 上的 CI、未解决线程、可合并性、关联议题的验收检查。显式认领:评论“taking over from 于 时间”并指派自己(或将继续的工作单元)。在现有分支上继续,不改写或强推他人提交,在其上追加提交。若工作已过时(被取代、主分支已修复),仅在 TAKEOVER 允许关闭时用一行原因和链接关闭。记录接管;原负责人回来时按当前状态交还。
共享 API 预算
配额是随成功而增长的失败模式。清点所有调用方(每个读取 GitHub 的自动化、工作单元和本地循环)及每次运行的调用数;设定每单位预算,例如所有调用方合计每个合并 PR 最多 75 次 REST 调用,并设低于令牌上限的每小时上限;所有通道共用一份预算而非各自独立,优先级为合并路径工作优先、报告最后;先削减调用再加重试(只读 head SHA、每次唤醒一次批量 GraphQL、有界分页、缓存任务列表、等待事件而非轮询);超支告警——每合并 PR 调用数超预算或出现任何 403/429,即视为速率限制或配额停滞。
可调参数
STALL_THRESHOLD 默认活跃时段 2 小时无合并仅报告;Schedule 活跃运行期每小时、其他每周;TAKEOVER 默认 propose(列出候选不行动),可选 continue、continue_and_close;ORPHAN_AFTER 默认 2 小时无提交且无活跃负责人;Change authority 默认仅提议,提示更改由人工执行,不自行更新自动化;Merge stalled green PRs 默认关闭,可按 docs/autonomy.md 中的级别开启;API budget 默认每合并 PR 75 次 REST 调用;Quiet hours 默认无。
输出
健康报告(健康时静默),含停滞、证据、一处改动或无改动及预测;接管评论与记录;每次运行最多一处提议改动,例如 propose_automation_update 或对提示文件的 PR。要以无人值守方式运行每周自动化部分,可安装 automations/automation-health。
反馈循环与限制
核心指标为每日停滞分钟数,以及每周人工重新唤起或“为什么停摆”的询问次数(目标为零)。对每处提议改动记录预测是否在窗口内实现,保持命中率;若“不改动”运行后同一停滞连续出现两次,则升级其类别。该技能本身不自行更新自动化、默认不合并卡住的绿色 PR、不处理单个变红的 PR,缺失信息(如具体阈值实现细节)暂未提供。