Commit ba0a846
ci: at most one open PR may modify a declared single-writer path (#9598)
* ci: at most one open PR may modify a declared single-writer path
Two PRs reached green independently shipping one physical change: both
rewrote the objectui pin from the same old sha to the same new sha and
both added the same generated changeset -- a byte-identical hunk under
two card numbers. The first entered the merge queue; the second was
green and one flip from enqueueing behind it.
The card-keyed Duplicate Fix Guard answered correctly and is untouched:
the two PRs claimed two genuinely different, independently filed cards.
The duplication existed only in the diff. This adds the second question
and the two gates run side by side.
The key is a declared list, not repo-wide diff intersection, and that is
measured rather than assumed. Over the 300 most recent PRs, pairs whose
open windows overlapped and which shared a changed path: 68 for the
repo-wide key (top collisions: the lock file 33, one plugin manifest 21,
the root manifest 15), 0 for the declared list. A repo-wide key would be
~68 false accusations per 300 PRs, each naming two authors who did
nothing wrong.
Cost is bounded by asking the cheap question first: the gate lists this
PR's own files, intersects with the declared list, and returns after one
paginated call when the intersection is empty. 1 of those 300 PRs
touched a listed path, so the branch that walks other open PRs runs on
~0.3% of runs.
First come, first served, unchanged from the sibling gate: the earlier
PR keeps its claim and the later one goes red naming it by number, URL
and branch.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
* test: the wiring permission assertions must read executable lines only
Found by this gate's own ablation sweep. Revoking `contents: read` from
the guard workflow -- which would kill the job in its checkout step,
before the gate judges anything -- left the self-test GREEN, because the
comment explaining why that scope is needed contains those same two
words and the assertion scanned the whole file.
A phantom check: green because of the prose describing the thing it was
meant to verify. Both permission assertions now scan the comment-stripped
workflow, as the package-manager assertion beside them already did, and
the ablation reddens with the string still present in the file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent f902d0f commit ba0a846
4 files changed
Lines changed: 692 additions & 0 deletions
File tree
- .github/workflows
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
224 | 224 | | |
225 | 225 | | |
226 | 226 | | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
227 | 250 | | |
228 | 251 | | |
229 | 252 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
| 57 | + | |
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| |||
0 commit comments