CI gap: path-filtered checks never gate a merge; add the shepherd-posted ci-gate status (#4825 step 1) and stop auto-merge on red
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 38/100
調査の方向性
Start by reading shepherd_gh.decide() and the shepherd-event and shepherd-reconcile workflows, then inspect REQUIRED_CHECKS and ADVISORY; the issue does not name their file paths. Implement the ci-gate status rules described here, ensure real failures disable auto-merge, and check the workflows that trigger reconciliation. Done means open PRs receive the specified pending, failure, or success status and a red check blocks auto-merge; the owner still needs to decide whether equivalence-e2e is advisory.
索引モデルが issue の本文から書いたものです。
説明
The gap (found 2026-10-28)
Path-filtered workflows run when a change can affect them (#6278), but their result never gates a merge. #6881, #6894, #6895 and #6899 all merged with DOOM-rosetta and/or call-graph-accuracy-audit red, and main stayed red for both until #6908.
How they got through:
- Churn gives a
mergeverdict and addsshepherd:mergebefore full CI has run on that head (it relies on the worker'spr_gates --fast). - The shepherd turns on auto-merge, and GitHub merges once the ruleset's required checks pass.
- Ruleset 24824983 requires only
det,full-suite,ground-truth,mypy-auditandruff-audit. - In
shepherd_gh.decide(), a real failure of any other check only addsshepherd:needs-fixand a digest comment. It never joinsblocked, so auto-merge stays on. #6881, #6894 and #6895 merged wearing bothshepherd:mergeandshepherd:needs-fix. - There's also a timing race. #6899's DOOM-rosetta run (40715491522) started at 15:23:39Z and took 31.5 min; GitHub merged at 15:54:37Z, about half a minute before it finished. A shepherd that blocks on red can't catch a check that hasn't finished.
#4825 step 1 planned the fix: one always-reporting ci-gate, required by the ruleset, with path-filtered workflows feeding into it. What shipped was the five core checks only.
Fix
A. A ci-gate commit status, posted by the shepherd (not a polling job).
A polling job would hold a runner for up to 30+ min per PR. The shepherd already reads every check run and status on the head, on every push (shepherd-event) and after CI (shepherd-reconcile). So it posts the status ci-gate on the PR head:
pending: a draft PR (its heavy checks are skipped, #5104), any check still running or being retried after an infra failure, a failure caused by main (waiting-on-main), or a required check (REQUIRED_CHECKS) that hasn't reported yet. Required checks always report (#4826), so this also covers check runs that haven't been created yet right after a push.failure: any real failure, from any workflow.success: otherwise.- The shepherd's own runs and the
ci-gatestatus itself are left out of the verdict. shepherd-reconcilealso triggers on DOOM-rosetta and Call Graph Accuracy Audit completions. Other workflows are picked up by the 20-min cron.ci-gateis posted for every open PR, not just labelled ones, so a merge by hand is gated too.
C. A real failure turns auto-merge off. A needs-fix finding joins blocked, so the shepherd disables auto-merge until the head is green again.
Rollout (owner steps)
- Merge the shepherd change.
ci-gatestarts reporting but is not yet required. - Make sure the squid-shepherd App has Commit statuses: write. Without it the post fails and the PAT fallback is used.
- After ci-gate has reported on every open PR for a while, add
ci-gateto ruleset 24824983 (status from the squid-shepherd app integration).
Open question for the owner
equivalence-e2e is documented as not required "so its wall time never holds a merge" (docs/ci.md). With ci-gate, every workflow that runs gates the merge, E2E included. Should E2E be advisory instead? It would be one entry in the ADVISORY tuple.
Related: #4825, #6278, #6770, #6266, #6908
- 主要言語
- Python
- スター
- 57
- フォーク
- 11
- 平均マージ
- 1時間 14分
- マージ済み PR(30日)
- 967
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
squid-protocol/gitgalaxy のほかの issue
-
scope:sweep testing
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
squid-protocol/gitgalaxy#7011 ·
メンテナーはふだん 1 日以内に返信
-
priority: high scope:core
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
squid-protocol/gitgalaxy#6974 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
claim:melek enhancement legacy-modernization priority: high scope:core testing
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
squid-protocol/gitgalaxy#6967 · コメント 10 件 ·
メンテナーはふだん 1 日以内に返信
-
enhancement legacy-modernization priority: low scope:frontier
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
squid-protocol/gitgalaxy#6926 ·
メンテナーはふだん 1 日以内に返信
-
bug call-graph core-engine priority: high scope:core
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
squid-protocol/gitgalaxy#6904 ·
メンテナーはふだん 1 日以内に返信
squid-protocol/gitgalaxy の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 79/100
aws-samples/sample-per-model-bedrock#639 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 86/100
awslabs/visual-asset-management-system#937 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 79/100
project-codeflare/codeflare-sdk#1195 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
pandas-dev/pandas-stubs#2051 ·
メンテナーはふだん 1 日以内に返信