[bug] Required check names collapse checks and statuses that GitHub requires separately
Summary
DeployBot collapses status-check rollup entries by display name only. GitHub's required-status-check documentation says that if a check run and a commit status have the same name, and that name is selected as required, both the check and the status are required.
Because DeployBot stores only one latest state per name, one passing entry can hide another same-name required entry that is failed or still pending.
Evidence
Impact
DeployBot can mark a pull request ready when GitHub still requires another same-name check/status to pass. Depending on branch protection and ruleset configuration, this can cause late merge rejection, misleading queue comments, or an unsafe DeployBot decision if repository protection is not an exact mirror of DeployBot's .mergequeue.toml.
This is especially risky for repositories migrating from legacy commit statuses to GitHub Checks, where duplicate names are common during transition.
Proposed fix
- Preserve the check/status identity when reducing rollup entries, or aggregate same-name required contexts fail-closed.
- For a required name, evaluate all matching rollup entries:
- any failed terminal entry =>
failed
- else any pending/in-progress entry =>
pending
- else all terminal passing entries =>
passed
- Add a regression test where a check run named
CI passes but a commit status named CI fails or remains pending, and assert DeployBot does not mark CI passed.
Verification
python3 -m pytest tests/test_cli.py -q
python3 -m pytest -q
[bug] Required check names collapse checks and statuses that GitHub requires separately
Summary
DeployBot collapses status-check rollup entries by display name only. GitHub's required-status-check documentation says that if a check run and a commit status have the same name, and that name is selected as required, both the check and the status are required.
Because DeployBot stores only one latest state per name, one passing entry can hide another same-name required entry that is failed or still pending.
Evidence
check_states()usesname = check.get("name") or check.get("context"), then stores onegrouped[name]value insrc/agent_merge_queue/cli.pylines 132-152.QueueEntry.classify()checks required checks by name usingself.checks.get(name)insrc/agent_merge_queue/cli.pylines 624-629.Impact
DeployBot can mark a pull request ready when GitHub still requires another same-name check/status to pass. Depending on branch protection and ruleset configuration, this can cause late merge rejection, misleading queue comments, or an unsafe DeployBot decision if repository protection is not an exact mirror of DeployBot's
.mergequeue.toml.This is especially risky for repositories migrating from legacy commit statuses to GitHub Checks, where duplicate names are common during transition.
Proposed fix
failedpendingpassedCIpasses but a commit status namedCIfails or remains pending, and assert DeployBot does not markCIpassed.Verification
python3 -m pytest tests/test_cli.py -qpython3 -m pytest -q