研发协作
持续盯守 GitHub PR:自动轮询评审意见与 CI…
当需要让 AI 持续监控一个已创建的 GitHub PR(评审评论、CI 检查、可合并状态)并自动处理失败与反馈时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
持续盯守 GitHub PR:自动轮询评特定
解决思路
- 用户要求 monitor/watch/babysit 一个 PR 时,默认启动 watcher 的持续模式(--watch),除非只是有意做一次性诊断快照。
- 运行 watcher 脚本对 PR/评审/CI 状态做快照(或消费 --watch 流式输出的每个快照)。
- 检查 JSON 响应中的 actions 列表。
- 若出现 diagnose_ci_failure,检查失败运行的日志并对失败进行分类。
- 若失败很可能由当前分支引起,则在本地修补代码、提交并推送;不要修补随机 flaky 测试、CI 基础设施、依赖中断、runner 问题等与分支无关的失败。
- 若出现 process_review_comment,检查浮现的已发布评审项并决定是否处理。
- 若某评审项可执行且正确,在本地修补代码、提交、推送,然后仅在 GitHub 状态变更策略允许时解决相关评审线程。
- 不要自动回复人类撰写的评审评论/线程,除非用户明确确认确切的回复内容;若人类评审项不可执行、已处理或无效,把该项和建议回复呈现给用户,而不是在 GitHub 上回复。
- 若失败很可能是 flaky/无关且出现 retry_failed_checks,用 --retry-failed-now 重跑失败任务。
- 若同时存在可执行的评审反馈和 retry_failed_checks,优先处理评审反馈;新提交会重新触发 CI,因此避免在旧 SHA 上重跑 flaky 检查,除非有意推迟评审改动。
- 每一轮循环先查找新浮现的评审反馈,再处理 CI 失败或可合并状态,然后结合 CI 一并核实可合并性/合并冲突状态(例如通过 gh pr view)。
- 任何推送或重跑动作之后,立即回到第 1 步,在更新后的 SHA/状态上继续轮询。
- 若在暂停去修补/提交/推送之前一直在用 --watch,推送后要在同一轮立即自行重新启动 --watch(不要等用户再次调用该技能)。
- 重复轮询直到出现 stop_pr_closed 或到达需要用户帮助的阻塞点;绿色 + 评审干净 + 可合并只是一个进度里程碑,PR 仍开着时不是停止 watcher 的理由。
- 保持终端/会话所有权:babysitting 活跃期间,在同一轮持续消费 watcher 输出;不要留下一个脱离的 --watch 进程然后结束回合,仿佛监控已完成。
- 一次性快照命令:python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --once。
- 持续监听命令(JSONL):python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --watch。
- 触发 flaky 重试循环(仅在 watcher 指示时):python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --retry-failed-now。
- 显式指定 PR 目标:python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr <number-or-url> --once。
- 用 gh 命令在决定重跑前检查失败运行:gh run view <run-id> --json jobs,name,workflowName,conclusion,status,url,headSha;gh api repos/<owner>/<repo>/actions/runs/<run-id>/jobs -X GET -f per_page=100;gh api repos/<owner>/<repo>/actions/jobs/<job-id>/logs > /tmp/codex-gh-job-<job-id>-logs.zip;以及作为兜底的 gh run view <run-id> --log-failed。
- gh run view --log-failed 是工作流运行级别的,可能要到整个运行结束才暴露失败任务日志;为更快诊断,先轮询该运行的 jobs,一旦某个具体 job 失败,立即从 Actions job logs 端点直接抓取该 job 的日志。watcher 在 GitHub 暴露时会包含 failed_jobs 列表,含每个失败 job 的 job_id 和 logs_endpoint。
- 当失败任务日志指向被改动代码(涉及区域的编译/测试/lint/类型检查/快照/静态分析)时,优先把失败视为分支相关。
- 当日志显示瞬态基础设施/外部问题(超时、runner 供应失败、registry/网络中断、GitHub Actions 基础设施错误)时,优先把失败视为 flaky/无关。
- 不要试图通过改测试、构建脚本、CI 配置、依赖版本或基础设施相关代码来修复 flaky/无关失败,除非日志明确把失败与 PR 分支关联;对 flaky/无关失败,仅在 watcher 建议 retry_failed_checks 时重跑,否则等待或停下来求助用户。
- 若分类模糊,先做一次手动诊断再选择重跑。
- 阅读 .codex/skills/babysit-pr/references/heuristics.md 获取简明检查清单。
- 评审项来源:PR issue 评论、行内评审评论、评审提交(COMMENT / APPROVED / CHANGES_REQUESTED)。
- 只处理已发布的反馈;忽略 GitHub 中处于 PENDING 状态的评审提交及其附带的待审行内评论;不要把待审反馈标记为已见,它应在评审者提交评审后才有资格浮现。
- 除人类评审者反馈外,watcher 会有意浮现 Codex 评审机器人反馈(例如来自 chatgpt-codex-connector[bot] 的评论/评审);大多数无关机器人噪音仍应忽略。
- 出于安全,watcher 只自动浮现受信任的人类评审作者(例如仓库 OWNER/MEMBER/COLLABORATOR 以及已认证操作者)和受认可的评审机器人(如 Codex)。
- 在全新的 watcher 状态文件上,已存在但未处理的已发布评审反馈可能立即浮现(不只是监控开始后到达的评论);这是有意为之,以免漏掉已开着的评审评论。
- 当你同意某条评论且其可执行时:在本地修补代码;用 codex: address PR review feedback (#<n>) 提交;推送到 PR head 分支;推送成功后仅在 GitHub 状态变更策略允许时解决相关 GitHub 评审线程;立即在新 SHA 上恢复监听(报告推送后不要停);若监控以 --watch 模式运行,推送后在同一轮立即重启 --watch,不要等用户再要求。
- 不要自动回复人类撰写的 GitHub 评审评论/线程;若你不同意某条人类评论、认为其不可执行/已处理或需要回答一个问题,把该项连同建议回复报告给用户,等待明确确认后再在 GitHub 上发布任何内容;若用户批准某回复,给它加上 [codex] 前缀,以表明该回复是自动化的而非来自人类用户。
- 若 watcher 之后浮现你自己已批准的回复(因为已认证操作者被视为受信任评审作者),把这条自己撰写的内容视为已处理,不要再次回复。
- 若某条代码评审评论/线程在 GitHub 中已标记为已解决,视为不可执行并安全忽略,除非出现新的未解决后续反馈。
- GitHub 状态变更策略:可以读取任何监控所需的 PR 状态;写入必须遵守该策略。
- 可以推送 PR 以更新被评审代码或强制 CI 重跑,如上所述。
- 可以解决由请求 babysitting 的人类或 Codex 评审机器人发起的评审评论线程;解决时留下以 [from Codex]: 为前缀的评论,说明你做了哪些改动以及包含这些改动的提交;若除请求 babysitting 的用户外还有其他人类参与,不要动这些评审线程。
- 在做任何改动之前,自行获取 PR 状态,而不是依赖 PR watcher 脚本的输出。
- 除非明确要求,不要:评论他人的评审线程(改为在聊天中与用户沟通);解决非用户的人类评审线程;与用户以外的人类交互;把 PR 标记为草稿或可评审;关闭或重新打开 PR。
- 总体而言,绝不要在 GitHub 上做出让人难以分辨是你还是用户做了对他人可见的操作的行为;拿不准时,在聊天中向用户澄清。
- Git 安全规则:只在 PR head 分支上工作;避免破坏性 git 命令;除非恢复上下文必要,不要切换分支;编辑前检查是否有无关的未提交改动,若有则停下询问用户;每次成功修复后提交并 git push,然后重跑 watcher;若为做修复中断了活跃的 --watch 会话,推送后在同一轮立即重启 --watch;不要为同一 PR/状态文件运行多个并发 --watch 进程,保持一个 watcher 会话活跃并复用它直到停止或你有意重启;推送不是终态结果,除非满足严格停止条件,否则继续监控循环。
- 提交信息默认值:codex: fix CI failure on PR #<n>;codex: address PR review feedback (#<n>)。
- 监控循环模式(在活跃 Codex 会话中使用):运行 --once;读取 actions;先检查 PR 是否已合并或已关闭,若是则报告终态并立即停止轮询;检查 CI 摘要、新评审项和可合并性/冲突状态;诊断 CI 失败并分类为分支相关 vs flaky/无关,若整体运行仍 pending 但 failed_jobs 已包含失败 job,立即抓取该 job 日志诊断,而不是等整个工作流运行结束,仅在失败与分支相关时修补;对每个来自其他作者的浮现评审项,若可执行则修补/提交/推送,然后仅在 GitHub 状态变更策略允许时解决它,若不可执行、已处理或需要书面回答,则把该项连同建议回复呈现给用户而不是自动发布,若后续快照浮现你自己已批准的回复,视为信息性内容并继续、不再回复;当两者同时存在时,先处理可执行评审评论再做 flaky 重跑,若评审修复需要提交,推送它并跳过在旧 SHA 上重跑失败检查;仅在 retry_failed_checks 存在且你不会用评审/CI 修复提交替换当前 SHA 时重跑失败检查,不要为无关 flake 或基础设施失败做代码改动只为让 CI 变绿;若你推送了提交、解决了符合条件的评审线程或触发了重跑,简要报告该动作并继续轮询(不要停),若某条人类评审评论需要书面 GitHub 回复,停下并在发布前请求确认;评审修复推送后,除非已到达严格停止条件,主动在同一轮重启持续监控(--watch);若一切通过、可合并、未被必需评审批准阻塞且没有未处理评审项,报告 PR 当前已可合并,但保持 watcher 运行,以便 PR 仍开着时新评审评论能快速浮现;若被需要用户帮助的问题阻塞(基础设施故障、flaky 重试耗尽、评审者请求不明确、权限),报告阻塞点并停止;否则按下面的轮询节奏休眠并重复。
- 当用户明确要求 monitor/watch/babysit 一个 PR 时,优先用 --watch,让轮询在一个命令中自主持续;仅在调试、本地测试或用户明确要求一次性检查时使用重复的 --once 快照。
- 不要停下来问用户是否继续轮询;自主继续直到满足严格停止条件或用户明确打断。
- 不要因为评审修复推送产生了新 SHA 就把控制权交还用户;重启 watcher 并重新进入轮询循环是同一 babysitting 任务的一部分。
- 若 --watch 进程仍在运行且未达到严格停止条件,babysitting 任务仍在进行中;继续流式消费 watcher 输出,而不是结束回合。
- 轮询节奏:保持评审轮询积极,即使 CI 变绿也继续监控。
- CI 未变绿(pending/running/queued 或失败)时:每 1 分钟轮询一次。
- CI 变绿后:PR 仍开着时保持基础节奏轮询,以便新发布的评审评论快速浮现,而不是等长长的绿色状态退避。
- 任何变化(新提交/SHA、检查状态变化、新评审评论、可合并性变化、评审决定变化)时立即重置节奏。
- 若 CI 再次不再绿色(新提交、重跑或回归):保持基础轮询节奏。
- 若任何一次轮询显示 PR 已合并或已关闭:立即停止轮询并报告终态。
- 严格停止条件:仅在以下之一为真时停止——PR 已合并或已关闭(一旦轮询/快照确认就立即停止);需要用户介入且 Codex 无法安全独自继续。
- 以下情况继续轮询:actions 只含 idle 但检查仍 pending;CI 仍在运行/排队;评审状态安静但 CI 未终态;CI 绿色但可合并性未知/pending;CI 绿色且可合并但 PR 仍开着、在等待可能的新评审评论或合并冲突变化;PR 绿色但被评审批准阻塞(REVIEW_REQUIRED 或类似),继续按基础节奏轮询并浮现任何新评审评论,无需请求确认是否继续看。
- 输出期望:监控期间提供简洁进度更新,最终总结包含:最终 PR SHA、CI 状态摘要、可合并性/冲突状态、已推送的修复、已用的 flaky 重试循环、剩余未解决的失败或评审评论。
- 长时间无变化的监控期间,避免每次轮询都发完整更新;只总结状态变化加上偶尔的心跳更新。
- 把推送确认、中间 CI 快照、可合并快照和评审动作更新视为进度更新;除非满足严格停止条件,不要发出最终总结或结束 babysitting 会话。
- 用户要求 monitor 不能靠几次抽样轮询就满足;保持循环直到严格停止条件或用户明确打断。
- 评审修复提交 + 推送不是完成事件;立即在同一轮恢复实时监控(--watch)并继续报告进度更新。
- 当 CI 首次对当前 SHA 转为全绿时,发出一次性的庆祝进度更新(不要在每次绿色轮询时重复);推荐风格:🚀 CI is all green! 33/33 passed. Still on watch for review approval.
- 当 watcher 终端仍在运行时不要发送最终总结,除非 watcher 已发出/确认严格停止条件;否则继续进度更新。
适用边界 · 注意事项
- PR 已合并或已关闭时(应立即停止轮询并报告终态)。
- 需要用户介入且无法安全独自继续时(如 CI 基础设施故障、flaky 重试预算耗尽、权限问题、无法安全解决的歧义)。
- 失败与分支无关(flaky/基础设施/依赖中断/runner 问题)时,不应通过改测试、构建脚本、CI 配置、依赖版本或基础设施相关代码来修复。