Retract the path-dependent bypass claim: it was one refusal, generalised - #47
Merged
Merged
Conversation
#46 asserted that the ruleset bypass does not apply to the REST merge endpoint, under a confident heading, on the strength of a single 405. That is wrong and it is now on main, so this retracts it in place rather than quietly editing it away. The evidence that settles it: PUT /repos/{owner}/{repo}/pulls/44/merge -> 405, ruleset active, 0 approvals the same call minutes later -> {"merged": true, "sha": a52da61} a52da61 is the commit on main, committed 2026-08-30T03:39:27Z ruleset was active from 2026-08-22T13:34:12Z until 2026-08-30T04:19:19Z Same endpoint, same actor, same ruleset state; refused once, succeeded once. The 405 was transient. The leading explanation is GitHub's asynchronous mergeability recomputation -- the ref had just been force-pushed, and the merge endpoint answers 405 while mergeable is null, not only when it is false. Recorded as the leading explanation, not as established fact, because it has not been confirmed against GitHub's implementation. The mistake is the reusable part and is written down as such. One negative result was treated as a property of the system instead of as a measurement that might not repeat, and the claim was published with a heading in capital letters. The check that would have caught it was running the same call twice, which cost nothing. This happened inside an entry whose own subject is not substituting a report for an observation. Also corrects a second claim with the same root. Two commits were described as "missed by the squash". They were not: both were pushed to branches whose pull requests had already merged. Nothing dropped them. The fix is to check whether the pull request is still open before pushing, not a convention about pushing relative to CI. Docs only. No count moved.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes, and why
#46 published a wrong finding and it is on
main. This retracts it in place rather than quietly editing it away. Docs only —docs/OUTSTANDING.md.#46 asserted, under a capitalised heading, that the ruleset bypass does not apply to the REST merge endpoint. It does. The claim rested on a single
405.The evidence that settles it
PUT /repos/{owner}/{repo}/pulls/44/merge→405 Pull Request is not mergeable{"merged": true, "sha": "a52da61"}a52da61is the commit onmainactive2026-08-22T13:34:12Z; firstdisabledagain2026-08-30T04:19:19Z; merge committed2026-08-30T03:39:27ZSame endpoint, same actor, same ruleset state. Refused once, succeeded once — so the 405 was transient, not structural.
The leading explanation is GitHub's asynchronous mergeability recomputation: the ref had just been force-pushed,
mergeableis computed in the background, and the merge endpoint answers 405 while it isnull, not only when it isfalse. That is recorded as the leading explanation, not as established fact — it has not been confirmed against GitHub's implementation, and asserting it would repeat the error being corrected.The corrected route table
PUT /pulls/{n}/mergegh pr merge --adminenforcement: disabled, where the flag is a no-opNote the middle row also changed: #46 recorded the UI as "observed to work, this is how #44 landed". It is not how #44 landed. #44 landed via REST.
A second correction, same root
Two commits were described on that page and in PR descriptions as "missed by the squash". They were not. Both were pushed to branches whose PRs had already merged — #44 merged at
03:39:27Zand the follow-up was pushed after it. Nothing dropped them; they went to a dead ref.So the fix is not a convention about pushing relative to CI, which is what #46 proposed. It is: check whether the PR is still open before pushing to its branch.
Evidence
python -m pytest tests/ -qpasses.python tests/test_evasion.py— 34/34.ruff check src tests eval toolspasses.python tools/readme_facts.py --checkpasses — no count moved.python tools/verify.py— 16 passed, 0 failed, 0 not evaluated.If this changes detection / an evasion
src/changes.Anything a reviewer should push back on
PRIOR-ART.mdhandles the claims research retired — but it makes the entry longer again, and a reasonable reviewer could prefer a clean replacement with the history in the commit message only.Generated by Claude Code