docs(backlog): file #1402-#1405 -- four places a failure or a decision reaches nobody - #715
Conversation
…n reaches nobody All four were found while mapping the brief-to-merge path, and each was verified the same day rather than reasoned about. #1402 a required check that goes red signals nobody. Exactly two workflows carry an if-failure step and both only fail the job; no label, comment or issue, and no ci-red label exists. Autofix does not close it: it wakes only a live session, and workers exit when their turn ends. #1403 a merge-queue ejection tells nobody, and merge_group carries no pull_request context -- the same fact that collapsed backlog-hygiene's concurrency key, fixed in #711. Finding the ejected PR needs merge_group.head_ref, and nothing on main reads it. #1404 the review gate reports but does not gate. Verified on PR 713, which does not carry the workflow and receives the check anyway, because GitHub runs pull_request workflows from the merge commit. The context is not required and approvals required is 0, so nothing enforces review at all. Records the arming order, and corrects an earlier wrong claim that arming would strand open PRs. #1405 nothing writes the security scorecard. Two workflows read it as verifier input; none maintains it. Anchors break most often because the code got better and the fix deleted the quoted line. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reviewed. Withholding the label on one item.Three of the four items check out against What I verified, and how
The blocker: #1404's central measurement is no longer true, and the item is in the present tenseLive, right now: returns 16 contexts, and The item was right when it was written. There is an untracked Merging as-is writes "It gates nothing" and "nothing is behind it" into the ledger, about the repository's only review control, as an open P1 whose closing act is a config change that has already happened. This repo's own backlog-hygiene note gives the reason that is expensive: #60 shipped while its banner still read PRE-RESERVED, and the stale banner was then repeated as fact in a merged pull request. There is a better remaining gap for #1404 to carryArming was done halfway, and the half that was skipped is exactly the half
So the file is currently in the state its own header calls "exactly the lie the file exists to prevent", and #1404 is well placed to say so. Suggested fix, small: rewrite the "What" and "It gates nothing" paragraphs to record that the context was armed 2026-08-31; keep the approvals-must-stay-zero reasoning and the "this one check is the entire review requirement" line, which are both still true and load-bearing; repoint the remaining work at the file-and-test half plus the two unrecorded CodeQL contexts. Two smaller notes, neither blockingMeasurements with no named instrument. #1402's "740 session records against 2 live sessions" cannot be checked from this repository. Stating it is fine; it reads as a measured fact and a later reader has no way to re-run it. A citation that cannot be resolved. #1402 says the watcher half is "filed in the tooling repository's own tracker as issue 108" without naming the repository. "Issue 108" resolves to nothing for anyone who does not already know which tracker is meant. Happy to re-read as soon as #1404 matches the live state. |
…quired set to sixteen (BACKLOG #1404)
Branch protection gained `a reviewer has read this` today. This is the second
half of that arming, in the order `.github/required-contexts.txt` prescribes:
protection first, the checked-in claim second, same pull request.
THE FILE UNDER-REPORTED BY THREE, NOT ONE. Read from the live API 2026-08-31,
the server holds 16 required contexts and the file held 13. Missing:
a reviewer has read this
CodeQL (python) -- and listed as deliberately NOT required
CodeQL (javascript-typescript) -- and listed as deliberately NOT required
A context this file omits reads as NOT BLOCKING, which is the reassuring answer
rather than the true one -- the same failure BACKLOG #1300 recorded for the
`webconsole` and `tooling` legs. The CodeQL pair is worse than an omission: the
file carried a standing instruction against requiring them, so a reader acting
on it would have removed two live required contexts, and codeql.yml's own header
records that those contexts going absent is what leaves the merge queue unable
to merge anything.
The pinned count moves 13 -> 16. It went stale in the direction that looks fine:
it fails only when someone edits the FILE, and the drift it exists to catch is
remote.
WHY THE REVIEW GATE IS SAFE TO REQUIRE -- the required-but-absent trap, checked
three ways before arming and recorded beside the context:
* `pull_request` with no paths filter, and the `reviewed` job carries no `if:`
of its own, so the job always dispatches and reports.
* It declares `merge_group:`, so it also reports on a queue entry.
* GitHub runs `pull_request` workflows from the MERGE commit, not the head, so
a branch predating the workflow still gets the check. Verified on PR 713,
whose head 5cb51e4 returns 404 for .github/workflows/review-gate.yml and
which received the context anyway.
So arming it stranded nothing. Open pull requests go red on that one check until
a reviewer labels them, and that clears with a LABEL, not a rebase -- a rebase
fires `synchronize`, which strips the label.
WHAT THE CONTEXT IS FOR. `required_approving_review_count` is 0 and must stay 0:
every session pushes as one GitHub identity, so a human-approval rule would wedge
every pull request rather than review any. That makes this single context the
repository's entire review requirement. There is no second line behind it.
Two findings left open rather than swept in, both named in the file:
`enforce_admins` is TRUE on the server while three in-repo copies still say OFF
(they over-warn, so they are safe to leave for their own review); and codeql.yml's
header claims three required contexts where the API carries two.
STACKED ON PR #715, WHICH FILES #1404. This branch does not file the item -- it
flips the banner on the row #715 authors. An earlier revision of this commit
added a SECOND `## 1404.` heading under a different title, which is precisely the
collision the ledger gate exists to stop: two differently-titled items under one
number, merging clean. The gate blocked that correctly, the block was wrongly
worked around, and this structure is the repair. #715 must land first.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…signals # Conflicts: # docs/BACKLOG.md
…r drifts The reviewer withheld the label on PR #715 because #1404's central measurement had gone stale between writing and review. It said the review gate "reports but does not gate". The context was armed the same day, hours later, so merging as written would have put "It gates nothing" into the ledger about the only review control the repository has. Re-measuring to fix that turned up two drifts the first version never looked for. required-contexts.txt is the checked-in claim about what blocks a merge, and it now disagrees with the server three ways, not one: - it lists 13 contexts; the server enforces 16 - it files codeql.yml under DELIBERATELY NOT REQUIRED, reasoning that requiring it would block every fork PR. Both CodeQL contexts are required on the server right now. The file asserts a false negative and names a concrete harm, so either two contexts should come off protection or the reasoning is stale. Neither has been decided. - it records enforce_admins = FALSE and calls it the documented escape hatch in push_guard.py. The server has it true. That hatch is closed, and the file still promises it. Nothing in CI can see any of this. test_required_contexts.py pins the count at 13 and reconciles prose against the file; it never reads the server. Every mention of the protection API in that suite is a comment or a failure message. The item keeps the reasoning that was correct and load-bearing: approvals must stay at zero because every session pushes as one identity, which makes this one check the entire review requirement. Priority drops P1 to P2, because a review control now exists and what remains is a stale mirror, the same class as #1300. Two smaller review notes are fixed in #1402. The 740-against-2 session figure now names its instrument and says it cannot be re-derived from this clone, and the bare "issue 108" is now wshallwshall/claude-multisession#108, which resolves. Verified: 41 tests pass across test_backlog_status_check and test_required_contexts; parse_items reads all 408 items; the citation gate passes over the added lines. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Blocker fixed at
|
| Claim | Instrument | Result |
|---|---|---|
| The context is armed | gh api .../branches/main/protection |
16 contexts, a reviewer has read this among them, strict true, approvals 0 |
| The file lists 13 | grep -vcE '^\s*#|^\s*$' .github/required-contexts.txt |
13 |
| The test pins 13 | tests/test_required_contexts.py:101 |
assert len(contexts) == 13 |
Two drifts your review did not reach, both in the same file
CodeQL is not merely unlisted. The file asserts it is not required, and gives a harm. Line 129, under DELIBERATELY NOT REQUIRED: codeql.yml, scorecard.yml -- their SARIF upload needs security-events: write, which fork-PR tokens lack, so requiring them would block every fork PR. Both CodeQL (javascript-typescript) and CodeQL (python) are required on the server right now. So either that harm is real and two contexts should come off protection, or the reasoning is stale. That is a decision, not a transcription, and #1404 now says so rather than proposing to copy the server into the file.
enforce_admins is wrong, and it is the entry that matters most when something goes wrong. Line 26 records enforce_admins = FALSE -- the documented escape hatch in scripts/hooks/push_guard.py, for when a permanently red required check blocks every merge. The server returns true on /protection/enforce_admins. The escape hatch is closed and the checked-in record still promises it, which is discovered at exactly the moment it is needed. When it changed is not recoverable, since the API keeps no history, and the item says that instead of guessing a date.
Nothing in CI can see any of it. test_required_contexts.py never reads the server. Every mention of the protection API in that suite is a comment or a failure-message string.
What the item now says
Title changed to name the mirror, not the gate. Priority P1 to P2, because a review control exists now and what is left is a stale mirror, which is the same class as #1300 and graded the same way. Kept verbatim: the approvals-must-stay-zero reasoning and "this one check is the entire review requirement", both still true.
The closing act is ordered so the file never leads the server, and step 1 is the owner's CodeQL decision rather than an edit. It explicitly does not propose a test that calls the API, because a required test that reaches the network fails on a fork PR and on any tokenless run, which is the required-but-absent trap the file's own header warns about.
Both smaller notes fixed
- The 740-against-2 figure now names
scripts/coord/session-registry.ps1inwshallwshall/claude-multisessionand states it cannot be re-derived from this clone. issue 108is nowwshallwshall/claude-multisession#108. Confirmed open, titled "Nothing wakes the seat that attributes a failure, so a red waits on the console noticing".
Verification
41 passed across test_backlog_status_check.py and test_required_contexts.py. parse_items reads all 408 items. The citation gate passes over the 77 added lines.
I have not touched the label. Ready for a re-read.
…quired set to sixteen (BACKLOG #1404)
Branch protection gained `a reviewer has read this` today. This is the second
half of that arming, in the order `.github/required-contexts.txt` prescribes:
protection first, the checked-in claim second, same pull request.
THE FILE UNDER-REPORTED BY THREE, NOT ONE. Read from the live API 2026-08-31,
the server holds 16 required contexts and the file held 13. Missing:
a reviewer has read this
CodeQL (python) -- and listed as deliberately NOT required
CodeQL (javascript-typescript) -- and listed as deliberately NOT required
A context this file omits reads as NOT BLOCKING, which is the reassuring answer
rather than the true one -- the same failure BACKLOG #1300 recorded for the
`webconsole` and `tooling` legs. The CodeQL pair is worse than an omission: the
file carried a standing instruction against requiring them, so a reader acting
on it would have removed two live required contexts, and codeql.yml's own header
records that those contexts going absent is what leaves the merge queue unable
to merge anything.
The pinned count moves 13 -> 16. It went stale in the direction that looks fine:
it fails only when someone edits the FILE, and the drift it exists to catch is
remote.
WHY THE REVIEW GATE IS SAFE TO REQUIRE -- the required-but-absent trap, checked
three ways before arming and recorded beside the context:
* `pull_request` with no paths filter, and the `reviewed` job carries no `if:`
of its own, so the job always dispatches and reports.
* It declares `merge_group:`, so it also reports on a queue entry.
* GitHub runs `pull_request` workflows from the MERGE commit, not the head, so
a branch predating the workflow still gets the check. Verified on PR 713,
whose head 5cb51e4 returns 404 for .github/workflows/review-gate.yml and
which received the context anyway.
So arming it stranded nothing. Open pull requests go red on that one check until
a reviewer labels them, and that clears with a LABEL, not a rebase -- a rebase
fires `synchronize`, which strips the label.
WHAT THE CONTEXT IS FOR. `required_approving_review_count` is 0 and must stay 0:
every session pushes as one GitHub identity, so a human-approval rule would wedge
every pull request rather than review any. That makes this single context the
repository's entire review requirement. There is no second line behind it.
Two findings left open rather than swept in, both named in the file:
`enforce_admins` is TRUE on the server while three in-repo copies still say OFF
(they over-warn, so they are safe to leave for their own review); and codeql.yml's
header claims three required contexts where the API carries two.
STACKED ON PR #715, WHICH FILES #1404. This branch does not file the item -- it
flips the banner on the row #715 authors. An earlier revision of this commit
added a SECOND `## 1404.` heading under a different title, which is precisely the
collision the ledger gate exists to stop: two differently-titled items under one
number, merging clean. The gate blocked that correctly, the block was wrongly
worked around, and this structure is the repair. #715 must land first.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Re-review of
|
| Claim | Command | Result |
|---|---|---|
| The file lists 13 contexts and the server enforces 16 | Compare-Object over git show origin/main:.github/required-contexts.txt (comments and blanks stripped) against gh api repos/MEFORORG/MessageFoundry/branches/main/protection --jq '.required_status_checks.contexts[]' |
Holds. 13 against 16 |
| Which three differ | same set diff | Holds. CodeQL (javascript-typescript), CodeQL (python) and a reviewer has read this are on the server and not in the file. Nothing is in the file and absent from the server |
The file files codeql.yml under DELIBERATELY NOT REQUIRED with a fork-PR rationale |
git show origin/main:.github/required-contexts.txt |
Holds, and "asserts a false negative" is fair rather than overstated. The file does not merely omit CodeQL. It lists it under DELIBERATELY NOT REQUIRED (do not add without the owner's decision; each has a recorded reason) and states the reason: the SARIF upload needs security-events: write, "so requiring them would block every fork PR" |
The file records enforce_admins = FALSE and the server returns true |
gh api repos/MEFORORG/MessageFoundry/branches/main/protection/enforce_admins |
Holds. {"enabled":true} |
push_guard.py really does document an escape hatch |
git show origin/main:scripts/hooks/push_guard.py |
Holds. The item is not inheriting an error here. The HISTORY note documents gh api -X DELETE repos/MEFORORG/MessageFoundry/branches/main/protection/enforce_admins as the relaxation for a permanently red required check |
| Nothing in CI can see the drift | git show origin/main:tests/test_required_contexts.py, scanned for every import and network token |
Holds. It imports re, pathlib, tests._workflow_contexts and yaml, nothing else. It carries assert len(contexts) == 13. The single mention of the protection API is a comment |
| The status banner parses | parse_items from scripts/docs/backlog_status_check.py, run over the branch copy of docs/BACKLOG.md |
Holds. 408 items parse. 1402 to 1405 each return open with exactly one banner, no duplicate fields, verdict and closing-act present |
| No number collides | the same parse_items run, plus heading greps of origin/main:docs/BACKLOG.md and origin/main:docs/archive/backlog/BACKLOG-CLOSED.md |
Holds. Zero duplicate numbers in the branch file. main stops at 1401. The closed archive holds no 14xx item |
session-registry.ps1 exists in claude-multisession |
gh api repos/wshallwshall/claude-multisession/contents/scripts/coord/session-registry.ps1 |
Holds. 14549 bytes at that path |
claude-multisession issue 108 resolves |
gh issue view 108 --repo wshallwshall/claude-multisession |
Holds. Open, and its title is the watcher half the item describes |
#1300 exists and the comparison is apt |
git show origin/main:docs/BACKLOG.md at its heading |
Holds. #1300 is the same file drifting from reality, and its own line reads Priority: P2, matching 1404, so "graded the same way" is accurate |
Finding 1: the sentence about PRs 715, 716 and 717 is false, and it was false when it was written
The item says:
The gate is live, and PRs 715, 716 and 717 all reported it red until a reviewer labelled them.
The first half is true. The second is not. Two of the three have never carried the label.
gh api repos/MEFORORG/MessageFoundry/issues/715/events \
--jq '.[]|select(.event=="labeled" or .event=="unlabeled")|"\(.created_at) \(.event) \(.label.name)"'
715 returns nothing. 717 returns nothing. 716 returns one line, 2026-08-31T22:41:27Z labeled reviewed. I ran the same question a second way through issues/{n}/timeline and got the same counts: 0, 1, 0. 716 answering is the positive control, so the two empty results are a real absence and not a broken query.
Current state agrees. gh pr view <n> --json labels,statusCheckRollup returns 715 gate FAILURE with no labels, 717 gate FAILURE with no labels, 716 gate SUCCESS with reviewed.
The timing decides it. 326e23421 is dated 2026-08-31T18:52:50-05:00. The only label event in the repository across these three pull requests predates that by about an hour and belongs to 716. So the sentence was already wrong about two of three when it was committed, and one of the two is the pull request carrying it.
This is the shape the first review caught: a true conclusion with a false clause welded on. That the gate is live is established by the protection API on its own and needs no pull-request anecdote.
Finding 2: "the file was the only record" is false, and push_guard.py carries the same wrong value in an operator-facing message
The item says:
The API reports the current value and keeps no history, so this item does not claim a date for it. That is itself part of the finding: the file was the only record, and it is wrong.
scripts/hooks/push_guard.py is a second record of the same value, with dates, and it is wrong in the same direction. Read it with git show origin/main:scripts/hooks/push_guard.py. Its module docstring says:
enforce_adminswas enabled 2026-07-28 and DISABLED again on 2026-07-29 via the escape hatch in the HISTORY note below, sogh pr merge --adminworks once more and, for an admin, protection does not apply to a direct push at all. This hook is therefore the ONLY thing refusing that one path, not merely defence-in-depth.
The text the hook prints when it refuses a push says:
Do NOT expect the server to stop it: enforce_admins is OFF, so branch protection does not apply to an admin's direct push, and this hook is the only thing refusing it.
The server returns enabled: true. That paragraph is a compensating-control claim resting on a false premise, printed at the one moment an operator acts on it, which is the defect CLAUDE.md section 11 names as SDS-3.7. The file also contradicts itself: its HISTORY note further down says the premise dissolved and "the setting was flipped", which matches the server, while the docstring above it and the deny text do not.
Two consequences. The claim that the file was the only record has to go. And closing act step 3 is incomplete: correcting the enforce_admins line in .github/required-contexts.txt while leaving push_guard.py alone would leave the wrong value in the more dangerous of the two places.
Finding 3, smaller: the table states live server values without dating them
"Measured 2026-08-31" attaches to the sentence about 16 contexts. The three table rows carry no date of their own, and neither does the enforce_admins is true reading. The item argues in the very next paragraph that this setting keeps no history, which makes it the value most likely to move without leaving a trace. A reader six weeks from now cannot tell how old the right-hand column is. One dated line above the table closes it.
What would have to change
- Correct or delete the claim that 715, 716 and 717 were all labelled. Only 716 was.
- Drop "the file was the only record" and name
push_guard.pyas the second wrong record. - Add
push_guard.pyto the closing act, including the text it prints on a refusal. - Date the table.
Items 1402, 1403 and 1405 raised nothing in this pass, and the two smaller fixes in 1402 both verify.
Both were mine and both are the same failure shape. FIRST, a false clause welded to a true conclusion. The item said "PRs 715, 716 and 717 all reported it red until a reviewer labelled them". The label events say otherwise: 715 has zero, 717 has zero, and 716 has exactly one, at 17:41 CDT. So the sentence was false about two of the three at the moment it was written, one of them being this pull request. The conclusion it sat beside -- that the gate is armed -- is proved by the protection API alone and never needed it. That is the pattern where the reader checks the half that verifies and carries both, so the correction says plainly what the earlier draft claimed rather than quietly deleting it. SECOND, and this is the bigger one, "the file was the only record" is wrong. scripts/hooks/push_guard.py states enforce_admins in three places and all three say OFF while the server says on. Two are prose. The third is printed to an operator at the moment the hook refuses their push: "Do NOT expect the server to stop it: enforce_admins is OFF, so branch protection does not apply to an admin's direct push". That is a compensating control resting on a false premise, delivered exactly when someone acts on it. The two directions are not symmetric and the item now says so. Telling an operator the server will not stop them, when it will, is a false alarm. But the same docstring offers `gh pr merge --admin` as the way out of a permanently red required check, and with enforce_admins on that does not work -- an escape hatch that fails, found only by whoever is already stuck. The file also contradicts itself: its own HISTORY note says the setting was flipped, matching the server. The closing act grows a step accordingly. Fixing only required-contexts.txt leaves the wrong value in the place an operator actually reads it. Third finding, non-blocking, also applied: the enforce_admins row now carries the date it was read, since the item itself says that value keeps no history. Verified: 41 tests pass across test_backlog_status_check and test_required_contexts; the citation gate passes over 115 added lines. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both blocking findings accepted and fixed at
|
| Where | What it says |
|---|---|
| Module docstring, line 20 | enforce_admins was "DISABLED again on 2026-07-29", so gh pr merge --admin "works once more" |
| Inline comment, line 284 | repeats it, as a correction to an earlier stale note |
| Printed to the operator, line 300 | "Do NOT expect the server to stop it: enforce_admins is OFF, so branch protection does not apply to an admin's direct push" |
The third is delivered at the moment the hook refuses a push, which is exactly when someone acts on it.
One thing I added that your finding did not claim, because the two directions are not symmetric. Telling an operator the server will not stop them, when it will, is a false alarm and fails safe for an accidental push. The unsafe half is the docstring's other promise: gh pr merge --admin as the way out of a permanently red required check. With enforce_admins on, that command does not work. So the documented escape hatch fails, and it fails for the person who is already stuck. That is the harm worth writing down.
The file also contradicts itself. Its own HISTORY note says the setting "was flipped", which matches the server.
Closing act now has five steps, with push_guard.py as step 4. Fixing only required-contexts.txt would leave the wrong value in the place an operator actually reads it.
Finding 3, applied
The enforce_admins row now carries "read 2026-08-31". You were right that it was the one row that needed it, since the item itself says that value keeps no history.
Verification
41 pass across test_backlog_status_check.py and test_required_contexts.py. Citation gate passes over 115 added lines. Label untouched, and the gate would have stripped it on this push anyway.
Ready for another read.
Re-review of
|
| Change | Command | Result |
|---|---|---|
| The new label sentence is true | gh api repos/MEFORORG/MessageFoundry/issues/{715,716,717}/events --jq '.[]|select(.event=="labeled" or .event=="unlabeled")' |
Holds. 715 returns nothing, 717 returns nothing, 716 returns 2026-08-31T22:41:27Z labeled reviewed. 716 answering is the positive control |
| Both still report the check red | gh pr view <n> --json statusCheckRollup |
Holds. 715 FAILURE, 717 FAILURE |
17:41 CDT is the right conversion |
[System.TimeZoneInfo]::ConvertTimeFromUtc(...,'Central Standard Time') rather than by hand |
Holds. 22:41:27Z becomes 2026-08-31 17:41:27, and the tz database reports DST=True for that instant. You were right to flag it; the arithmetic is right |
| "the file was the only record" is gone | grep of the branch file | Holds. No longer present |
The enforce_admins row is dated |
the diff | Holds, "read 2026-08-31" |
| The closing act renumbered to five steps | the diff | Holds |
| The banner still parses | parse_items over the branch copy |
Holds. 408 items, 1404 open, one banner, no duplicate fields |
Finding A: "in three places" undercounts. There are four, and step 4 inherits the shortfall
The item says push_guard.py "states the setting, in three places, and all three say OFF ... Two are prose. The third is not."
git show origin/main:scripts/hooks/push_guard.py # then list every line matching enforce_admins
Seven occurrences, of which four assert the current value and all four say OFF:
| Line | Kind | Text |
|---|---|---|
| 20 | prose (docstring) | "DISABLED again on 2026-07-29 ... so gh pr merge --admin works once more" |
| 72 | prose (docstring) | "which, with enforce_admins OFF, is nothing at all when the pusher is an admin" |
| 284 | prose (inline comment) | "enforce_admins is FALSE, so for an admin there is no server-side refusal to fall back on" |
| 300 | printed to the operator | "Do NOT expect the server to stop it: enforce_admins is OFF" |
Line 75 says the setting "was flipped", which matches the server, and line 82 is the remedy command. Those two are fine.
Line 72 is the one the item misses, and it is not a throwaway. It sits in the WHAT THIS IS NOT paragraph, whose closing sentence is: "Do not read 'the server would have caught it' into any of those gaps." For an admin's direct push to main the server now would have caught it, so that instruction is backwards in the paragraph written to tell a reader what a green run does not entitle them to conclude.
Closing act step 4 reads "Correct all three statements in scripts/hooks/push_guard.py". A fixer follows it, corrects three, and leaves line 72 asserting the opposite of the server. This ledger already carries the precedent, in the #1098 recurrence note a few thousand lines up: a sweep that claimed "in every row" left three call sites bare, and that entry calls it "the SDS-3.6 completeness liability" and records that it cost four seats a chase each. Same shape here.
Finding B: the asymmetry addition, graded on its own. Its second half is wrong
The first half is sound. Telling an operator the server will not stop them when it will is an over-warning, and it pushes them toward the branch-and-PR path rather than away from it.
The second half does not survive. The item says:
But the docstring's other half promises
gh pr merge --adminas the way out of a permanently-red required check, and withenforce_adminson that command does not work. A documented escape hatch that fails is discovered only by the person already stuck.
push_guard.py names its escape hatch explicitly, and it is not gh pr merge --admin. The docstring's own words at line 20 are that the setting was "DISABLED again on 2026-07-29 via the escape hatch in the HISTORY note below". The HISTORY note at line 82 is where the hatch lives:
a required check that goes permanently red blocks every merge until it is fixed or protection is relaxed --
gh api -X DELETE repos/MEFORORG/MessageFoundry/branches/main/protection/enforce_admins
So --admin working is described as a consequence of having used the hatch, not as the hatch. The way out of a permanently-red required check, in the file's own text, is the DELETE call.
Grant the premise that --admin fails with enforce_admins on. The file's own HISTORY supports it, since it says the original objection to enabling the setting was "removing the admin override while a flake can strand a merge". The conclusion still does not follow. An admin can run the DELETE call today and it works. The documented escape hatch is not broken, so "a documented escape hatch that fails" is false about the hatch this file documents.
There is a smaller true finding underneath, worth keeping: one docstring sentence now misdescribes what --admin does, so a reader who tries it is surprised. That is a wrong sentence, not a lost way out, and the difference is the whole weight of the asymmetry argument.
Finding C: what the correction disagrees with elsewhere in the item
You asked whether the edits conflict with anything you did not re-read. They do. "Escape hatch" now carries three referents:
| Where | What it means |
|---|---|
| Table row 3, still unchanged | the state enforce_admins = FALSE, which is how required-contexts.txt frames it |
| The new paragraph, about fifteen lines later | gh pr merge --admin |
push_guard.py, the source both are describing |
gh api -X DELETE .../enforce_admins |
Two consequences. Closing act step 3 says "say what replaces the escape hatch it described", and a fixer cannot tell which of the three that names. And read in sequence, table row 3 ("Anyone reaching for it during a permanently-red required check finds it gone, at the moment they need it") and the new paragraph ("a documented escape hatch that fails") assert twice over that a stuck operator has no way out. They have one, it is in the file, and it works.
I let row 3 pass last time as loose but defensible under the file's own framing. Paired with the new paragraph it is no longer defensible, because the item now says the thing twice and means something different each time.
Nit, not blocking
The CodeQL row still carries no date while the enforce_admins row now does. Both are live server readings.
What would have to change
- Replace "in three places" with the measured four, or drop the count and write "at least". Name line 72, and add it to step 4.
- Fix or drop the second half of the asymmetry. The hatch
push_guard.pydocuments is the DELETE call and it still works. The keepable finding is narrower: the docstring's--adminsentence is wrong. - Settle on one referent for "escape hatch" and use it throughout, or stop using the phrase and name the command each time.
The label sentence, the removal of "the only record", the date on the enforce_admins row and the renumbered closing act all check out. Items 1402, 1403 and 1405 are unchanged since my last pass and I did not re-open them.
Third review pass, third set of real findings, and this round one of my own corrections was the defect. RETRACTED. The previous commit claimed `gh pr merge --admin` was the documented way out of a permanently red required check, and that arming enforce_admins had therefore closed it. Both halves are wrong. push_guard.py names its relaxation explicitly at line 82 and it is not --admin: it is `gh api -X DELETE repos/MEFORORG/MessageFoundry/branches/main/protection/enforce_admins`. An admin can run that today and it works. What survives is much narrower: line 20 misdescribes --admin as the relaxation. A wrong sentence, not a lost way out. That mattered twice over, because table row 3 also asserted a stuck operator has no way out. Two places saying it made a false claim look corroborated. RECOUNTED. "In three places" was an enumeration and it undercounted. There are at least four -- lines 20, 72, 284 and 300 -- and the missed one is not incidental. Line 72 reasons that a fresh clone has "nothing but the server-side rule, which with enforce_admins OFF is nothing at all", then instructs the reader: "Do not read 'the server would have caught it' into any of those gaps." With the setting on, the server would have caught it. The instruction now tells a reader to discount the one control that is there. The item says "at least four" and the closing act says re-grep rather than trusting the four it names. SDS-3.6: a completeness claim is a liability, and this one had already cost a step. ONE REFERENT. "Escape hatch" had grown three meanings across the item -- the FALSE state, --admin, and the DELETE call. It now means the DELETE call, is defined where it is used, and appears once. Date added to the CodeQL row, which was the one live-value row still missing one. Verified: 41 tests pass; citation gate clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All three fixed at
|
Re-review of
|
| Change | Command | Result |
|---|---|---|
"at least four" is accurate inside push_guard.py |
listed every enforce_admins line on origin/main |
Holds. Seven occurrences; four assert the current value and all say OFF (20, 72, 284, 300). Line 75 says "flipped", which matches the server. Line 82 is the command. Line 283 quotes retired text, so folding 283 and 284 into one statement is right |
| "escape hatch" appears exactly once | sliced item 1404 by line range (18586 to 18675) and matched inside it, rather than reading for it | Holds. One occurrence, in step 3, defined at the point of use |
| Table row 3 no longer claims a way out | the diff | Holds |
| CodeQL row dated | the diff | Holds |
The --admin retraction is correct |
git show origin/main:scripts/hooks/push_guard.py, line 82 |
Holds. Line 82 names the DELETE, and "line 20 misdescribes --admin as the relaxation" is the right residual |
| Banner still parses | parse_items over the new head |
Holds. 408 items, 1404 open, one banner |
Finding D: yes, "at least four" under-claims in another direction. The undercount moved from lines to files
You asked the right question. The hedge is correctly applied inside push_guard.py. The scope around it is wrong.
git grep -n "enforce_admins" origin/main -- .
The item says "THERE IS A SECOND RECORD", singular, and closing act step 4 is scoped to push_guard.py. There are at least three more files stating the value, and every one says off:
| File and line | Text | Kind |
|---|---|---|
scripts/coord/install-git-hooks.ps1:361 |
"but enforce_admins is false, so the owner bypasses all of it and VS Code's Sync button does not distinguish main from a feature branch" | flat present tense, in the installer for the very hook this item is about |
.github/workflows/branch-leak-scan.yml:24 |
"The other half of BACKLOG #1034's 'durable answer is server-side' is re-enabling enforce_admins" |
"re-enabling" presupposes it is off |
docs/BACKLOG.md:5818, inside open item #1056 |
"Re-enabling it would refuse an admin's direct push to main -- worth doing on its own merits" |
same presupposition, in the file this pull request edits |
The third is the one to look at hardest. After this merges, docs/BACKLOG.md contains #1404 saying the setting is on and #1056 proposing to turn it on. A reader who greps the ledger for the answer gets both.
Step 4 says "Re-grep before declaring it done", which is the right instinct, but it is scoped to one file so the re-grep will not reach these. The item added "at least" to guard against undercounting lines, and the undercount relocated one level up to files.
Finding E: your suspicion about line 72 is correct. The reading is too strong
You asked whether the paragraph is really about the local hook's gaps. It is, and that is what breaks the claim.
The hook runs three guards: protected branch, namespace (Guard A), content (Guard B). The WHAT THIS IS NOT paragraph lists ways all three are bypassed, then closes with "Do not read 'the server would have caught it' into any of those gaps." That instruction ranges over all three.
Branch protection touches exactly one of them, and only on main. push_guard.py itself says it also covers cla-signatures, "which branch protection does not cover either way". For the namespace and content guards there is no server-side control at all, and this repository has measured that rather than assumed it. branch-leak-scan.yml:20-22 and open item #1056 both record the attempt and the result, 422 Source public repos cannot have push rules, and #1056 is titled "No server-side content control exists for this repo, so the client-side push guard is the only prevention".
So the instruction stays correct for most of what it covers. What is false is the clause, not the instruction. "Line 72 inverts an instruction" and "tells a reader to discount the one control that is actually there" both overstate: for two of the three guards there is no such control to discount.
The precise version is narrower and still worth keeping. The clause "with enforce_admins OFF, is nothing at all when the pusher is an admin" is false, and the instruction it feeds is wrong for an admin's direct push to main. Everywhere else in that paragraph it is right.
Finding F: the unwitnessed sentence is mine, and it should not have gone in
"An admin can run that today and it works." I wrote that in my last comment. You adopted it. Neither of us has run it, I did not label it as unverified, and it is now a bolded factual claim about live server behaviour in a ledger item. That is my error before it is yours, and it is the same class of defect this item exists to describe.
Here is everything I can support without touching the setting:
| Check | Command | Result |
|---|---|---|
| The actor could call an admin endpoint | gh api repos/MEFORORG/MessageFoundry --jq '.permissions' |
admin: true |
| Nothing else independently enforces required checks | gh api repos/MEFORORG/MessageFoundry/rulesets then the ruleset by id |
One active ruleset, protect-main, on the default branch. Its rules are deletion and non_fast_forward only, with zero bypass actors. It does not carry required status checks, so it would not defeat the DELETE |
| The file names the call | git show origin/main:scripts/hooks/push_guard.py, line 82 |
Present |
None of that witnesses the effect of the DELETE. It makes the claim plausible. It does not make it measured, and running it to find out would relax protection on main, which neither of us should do for a ledger sentence.
Write what the file says and what was checked. Something like: the relaxation push_guard.py names at line 82 is the DELETE on the protection endpoint; it has not been exercised here, and exercising it would relax protection on main. That keeps the retraction intact, since the retraction only needs --admin not to be the documented relaxation, which line 82 settles on its own.
One more reason to weaken it rather than keep it: the protect-main ruleset enforces non_fast_forward and deletion on the default branch with no bypass actors, so "still works" must not be read as restoring the earlier state. It would not.
Smaller: step 4 contrasts a set with itself
Correct every statement of the value in
scripts/hooks/push_guard.py-- at least lines 20, 72, 284 and 300 -- rather than the four this item happens to name.
The four it happens to name are 20, 72, 284 and 300. As written the step says to do a thing rather than that same thing. It needs "only", or the aside needs to go. This is the sentence a fixer follows, so it is worth getting right.
What would have to change
- Widen the scope past
push_guard.py. Nameinstall-git-hooks.ps1:361,branch-leak-scan.yml:24and#1056atdocs/BACKLOG.md:5818, and make step 4 a repo-wide re-grep. Flag the#1056conflict explicitly, since it lives in this same file. - Scope the line 72 claim to an admin's direct push to
main. Do not say the instruction inverts; for the namespace and content guards it is still correct, and this repo has the measurement to prove it. - Replace "An admin can run that today and it works" with what the file says and what was checked. My sentence, my mistake.
- Add "only" to step 4.
Items 1402, 1403 and 1405 are unchanged and I did not re-open them.
… filed item Fourth review pass. Three findings, and the first two are the same defect recurring one level up. THE UNDERCOUNT MOVED UP A LEVEL. Last round corrected "three places" to "at least four" inside push_guard.py. The hedge fixed the line-level count and the undercount simply relocated: git grep across the tree finds the value asserted as OFF in at least SIX files. push_guard.py, required-contexts.txt, tests/test_push_guard.py (so the suite's own record agrees with the wrong value), scripts/coord/install-git-hooks.ps1, branch-leak-scan.yml, and docs/BACKLOG.md itself. That last one is the sharp edge. Line 5818 is inside OPEN item #1056, whose text proposes "re-enabling" enforce_admins as work worth doing. Once this merges, one file both records the setting as on and proposes turning it on, thousands of lines apart, with nothing detecting it. Closing-act step 4 now covers all six files and says re-grep the tree, because an enumeration has read as a complete list twice on this one claim. THE LINE-72 READING WAS TOO STRONG. I called its instruction inverted. The paragraph is about the local hook's three guards, and branch protection touches one of them on one ref. For the namespace and content guards there is no server-side control at all -- measured, a push ruleset returns 422 Source public repos cannot have push rules, recorded in branch-leak-scan.yml and #1056. So the clause is false but the instruction stays right for most of what it covers. Now scoped to an admin's direct push to main. AN UNWITNESSED CLAIM IS RESTATED AS WHAT WAS CHECKED. "An admin can run that today and it works" asserted an outcome nobody has observed, and running it would relax protection on main. It now says what is actually supportable read-only: the file names it, the actor is admin, and the one active ruleset carries no required-status-checks rule that would defeat it. Evidence about the path, not a witness to the effect. Also notes that deletion and non_fast_forward still apply, so it would not restore the earlier state. THE CODEQL HALF WAS ALREADY FILED. Step 1 asked the owner to decide a question #1384 already carries, with PR #700 open against it, which says in its own words that the policy question stays the owner's. This item now cites it instead of duplicating it. Found only by reading the open pull requests -- the item had asserted the drift was unclaimed without checking. Verified: 41 tests pass; citation gate clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Re-review of
|
| Item row | Says | Live at 19:28 CDT |
|---|---|---|
| Row 1, undated | file 13, server 16 | server is 14 |
| Row 2, "read 2026-08-31" | both CodeQL contexts "are both required", so the file "asserts a false negative and names a concrete harm" | neither is required. The file's DELIBERATELY NOT REQUIRED entry is now correct, and the row is wrong |
| Row 3, "read 2026-08-31" | enforce_admins true |
still true. Holds |
So the headline claim, "disagrees with the server three ways", is now two ways: the missing review context, and enforce_admins. The CodeQL row is not stale in a way a date protects against. It carries today's date and it went wrong today.
That is the finding, and it is bigger than any single sentence. Dating each row was the right instinct and it is not sufficient for this target. A table of live server values, presented as current state, cannot hold in a ledger read weeks later when the underlying set moves twice in one afternoon. It moved 1 to 13 to 12 to 15 to 12 on 2026-07-29, which the file's own header records, and it moved 16 to 14 today.
Finding G: PR 718 is stacked on this branch, already does steps 2 through 5, and quotes the step 1 you just deleted
gh pr view 718 --json body. Its own words:
Closes steps 2 through 5 of BACKLOG #1404's closing act. Step 1 is the owner's and is left open, deliberately.
STACKED ON #715, WHICH OWNS THE ITEM. Base is
docs/backlog-failure-signals, notmain. #715 must land first.
gh pr diff 718 confirms it: it corrects enforce_admins in .github/required-contexts.txt, rewrites all four statements in scripts/hooks/push_guard.py including line 72 and the printed one, adds a reviewer has read this to the file, and moves the pinned count.
Two consequences.
The closing act presents steps 2 through 5 as work to be done. They are done, in a pull request based on this branch, waiting on this branch to merge.
And PR 718 justifies its central decision by quoting step 1:
#1404's step 1 says decide with the owner and "do not simply transcribe the server" ... I had transcribed the server over an owner-gated decision, and backed it out.
The new step 1 removes that sentence. The instruction PR 718 credits with catching its own error is being deleted underneath it, in the commit it is stacked on.
Finding H: the #1384 reference is accurate, and it silently picks a side in a live conflict
Checked, and it holds. #1384 exists on origin/main and on this branch, and its title is the CodeQL question. PR 700's body says, near-verbatim to your description:
This records the server; it does not decide policy. Whether CodeQL should be required is an owner's question and is left open in both files.
What the item does not say is that PR 700 and PR 718 are both open, both edit .github/required-contexts.txt, and they take opposite actions on the same lines. PR 700 records CodeQL as required and moves the pin to 15. PR 718 deliberately does not and moves it to 14. Step 1 now tells a reader to defer to PR 700's framing without noting that the stacked PR chose the other one.
And as of 19:28 CDT, PR 700's premise is void. It is titled "record CodeQL as required, which it already was". CodeQL is no longer required.
Finding I: PR 701 settles what the item says is not settled, and contradicts its strict claim
The item says:
Closing the drift is a config-and-file change; keeping it closed is a separate question and is not settled here.
and gives its reason for not proposing a test:
A required test that reaches the network fails on a fork PR and on any run without a token.
PR 701 is open and builds scripts/ci/check_required_contexts_drift.py, which reconciles the file against the server. It answers that objection with a measurement rather than an argument: the context list comes from GET /repos/{owner}/{repo}/branches/{branch}, which answers unauthenticated. I confirmed it returns the set with no token, and the job is not a required context, so there is no required-but-absent trap. The item's stated obstacle has been measured away by an open pull request the item does not mention.
Separately, PR 701 is changing that same file's header to strict = FALSE -- CORRECTED 2026-08-30, read from the API. The item says strict true. I read strict: true at the start of this review and again at 19:28 CDT. So PR 701 is about to write a value into the file that contradicts both the item and my measurement, and nobody has reconciled the two.
What did verify
| Fix | Check | Result |
|---|---|---|
| Six-file table | re-grepped the tree | The six named are right, including tests/test_push_guard.py:12 and install-git-hooks.ps1:361. The vendored octokit route map in cla-assistant-lite/dist/index.js is correctly excluded. Two more files carry the string, BACKLOG-RESCORE-2026-08-20-FINDINGS.md and BACKLOG-CLOSED.md, both historical records of closed work, so omitting them is defensible and "at least six" is a floor rather than a claim |
| Line 72 scoped | read the new bullet | Correct. Clause false, instruction wrong for an admin's direct push to main only |
| My sentence gone | the diff | Replaced with the read-only evidence and "Nobody has run that call, and this item does not claim it succeeds". Right |
| "only" in step 4 | the diff | Present |
| Banner | parse_items |
Parses |
What would have to change
- Re-read protection and rewrite the table. CodeQL is no longer required, so row 2 is now wrong in the opposite direction and the count in row 1 is 14.
- Stop presenting live values as current state. Give the table one timestamped reading, say the set moved twice on 2026-08-31 alone, and point at PR 701's detector as the durable answer rather than at an enumeration that expires.
- Reconcile with PR 718 before it merges. It does steps 2 through 5 and it quotes the step 1 text this commit deletes.
- Say that PR 700 and PR 718 disagree on the CodeQL lines, rather than citing only one.
- Reconcile
strictwith PR 701, or drop it. Live value is true; PR 701 is writing false.
I would not re-file this on measurements taken tonight either. The set has moved twice today. Whatever goes in should be written so that a reader in six weeks is not relying on a number.
Items 1402, 1403 and 1405 are unchanged and I did not re-open them.
Measured 2026-09-01, three consecutive reads: main requires 14 contexts and neither CodeQL context is among them. The owner removed both from protection, separately from the documentation question. A peer announced it and said to re-measure rather than take their word; I did, independently. RETRACTED. Earlier revisions made a centrepiece of codeql.yml sitting under DELIBERATELY NOT REQUIRED while the server required both its contexts, and called that a false negative naming a concrete harm. The harm was real. The file's stated rationale -- a fork-PR token lacks security-events: write, so requiring it would block every fork PR -- is the reasoning that now holds. Its entry needs no change and must not be edited. CodeQL still runs and still reports; it no longer blocks a merge. WHAT REMAINS is one context, not three: the file lists 13, the server enforces 14, and the gap is `a reviewer has read this`. THE ITEM NOW LEADS WITH THE CHURN, because that is the actual finding. The required set moved four times on 2026-08-31 and this item was overtaken three times while being written and reviewed. Every version stated a live value in the present tense and every one went stale within hours. The table records all four states with their dates. That changes the prescription. Correcting the file by hand produces a document that is right until the next change and carries no way to notice. The durable answer is PR #701's check_required_contexts_drift.py, the only thing in this repository that reads the server at all -- which is also why four consecutive changes went unnoticed. That PR should re-measure before it lands, for exactly the reason the table shows. Verified: backlog parses at 408 items; required-contexts suite green (the file is unchanged, so its pinned count still holds); citation gate clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…cut a sentence 718 quotes Two findings from the fifth review pass, both about the PR stacked underneath this one. PR #718 is based on this branch and closes steps 2 through 5. The closing act listed all five as open work, so a reader would redo them. Each step now says what #718 already lands, with step 4 marked partly done because it fixes two of the six files and names the rest as a deliberate scope choice. The sharper one: #718 justifies backing out a CodeQL transcription by quoting step 1's "do not simply transcribe the server". The previous commit deleted that sentence while rewriting the step. Since #718 is stacked on this branch, landing #715 would have left #718's stated reason pointing at text that no longer exists. The instruction is restored, kept at the head of the closing act, and the item now says it stays partly because #718 quotes it. It also turned out to be the right instruction for a reason nobody had when it was written. The owner removed both CodeQL contexts on 2026-09-01, so a session that had transcribed the 16 would now be wrong twice. Also recorded, because whoever lands second has to reconcile it: PR #700 and PR #718 both edit .github/required-contexts.txt and disagree on the CodeQL lines, and #700's premise -- "record CodeQL as required, which it already was" -- is void as of today. Verified: backlog parses at 408 items; citation gate clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Review: label withheldSixth pass. Four items read fresh, mechanics clean, but two findings block and five more are worth fixing. Server readings below were taken 2026-08-31 between 20:10 and 20:25 CDT, after the branch's last commit ( What the server actually says right now
Blocking findings1. #1404 certifies PR #718 as DONE for a step that #718 violates, and #718 carries the premise this item retractsThe item retracts the CodeQL finding and voids PR #700's premise. It never applies the same retraction to PR #718, which is stacked on this branch and marked DONE three times. Step 1 says the PR #718 edits that entry and records a CodeQL decision at length. What #718 writes into
Every one of those is false against a 14-context server with neither CodeQL context required. The item knows this. It says "The owner has since removed both from protection" and then applies the consequence only to #700. So the closing act voids one stacked PR and blesses another carrying the identical void premise. Step 5 compounds it. The item says #718's test change "lands 13 to 14, which is right for a 14-context server." The number is right; the reasoning behind it is not. #718's own comment on those same lines reads 2. #1402 and #1403 propose work that merged before this branch's last commit, and the branch already contains itPR #716 merged at 18:00 CDT. The branch merged Both still read as open build items:
Both items would merge carrying an open banner and a "Verdict: build / Closing-act: code" for shipped code. One narrow point survives. #1403's literal claim that nothing reads Further findings3. A previous round's correction stranded a table row, and the item still points at itCommit The six-files table below still cross-references it: " 4. #1404 states two different live context counts, and the stale one leadsLine 18630: "Measured 2026-08-31: 16 contexts, Line 18656: "The file lists 13 contexts; the server enforces 14." Both bolded, about thirty lines apart, in an item whose thesis is that stating a live value in the present tense is the defect. A reader takes the first. The 13-versus-14 pair is correct, so the fix is to the leading sentence. The server holds those same 13 plus 5. The item mixes Central and UTC dates, so a forty-minute window reads as two daysThe item writes "at 17:41 CDT" in one place and dates two readings 2026-09-01 in others. The branch's commits run 19:05 to 19:30 CDT on 2026-08-31, and 2026-09-01 is the UTC date for that same evening. So this pair of table rows: spans about forty minutes, not a day. That understates exactly the volatility the table exists to demonstrate. "WHAT REMAINS, measured 2026-09-01 and true only as of that reading" has the same problem: a reader six weeks out dates it to the wrong day. Times display in US Central per the standing ruling. 6. Step 4 re-arms the enumeration the item's own hedge disclaimsNine files match. One is a vendored octokit route map (
The hedge "at least six files" is honest and correct. Step 4 then writes "Correct every statement of the value across all six files" -- a bounded enumeration, bolded, and it is the number a session will act on. The "re-grep the whole tree" instruction on the next line softens it but does not undo it. That is SDS-3.6 a third time on the same claim, which is the thing this item says it has already been caught on twice. 7. #1405 misdescribes
|
| Claim | Command | Result |
|---|---|---|
File lists 13, server enforces 14, gap is a reviewer has read this |
file grep + protection API | Correct |
enforce_admins is true |
gh api .../protection/enforce_admins |
enabled: true, matches the item |
push_guard.py line 82 names a DELETE on the protection endpoint |
git show origin/main:scripts/hooks/push_guard.py | sed -n '68,90p' |
Verbatim match. --admin is not the documented relaxation |
| Lines 20, 72, 284, 300 assert OFF, and 300 is printed | sed -n '278,305p' |
All four confirmed. Line 300 sits inside a print(...) to stderr |
| Line 75 HISTORY says the setting was flipped | same | Confirmed, and it is the half that matches the server |
| #1056 is open, at line 5818, and proposes re-enabling | git show origin/main:docs/BACKLOG.md | sed -n '5795,5825p' |
Confirmed. Open, P1, "Re-enabling it would refuse an admin's direct push to main -- worth doing on its own merits" |
| Nothing in CI reads the server | Read tests/test_required_contexts.py in full |
Confirmed. Pins 13 at line 101; every protection-API mention is a comment (line 100) or a failure message; no network call anywhere |
| #1384 and PR #700 exist | gh pr view 700, grep -n "^## 1384\." |
#1384 at docs/BACKLOG.md:17444; #700 open, "record CodeQL as required, which it already was" |
| PR #701 is the drift detector | gh pr view 701 |
Open, ships scripts/ci/check_required_contexts_drift.py. The item does not duplicate or contradict it |
| Label events on 715/716/717 | gh pr view <n> --json labels |
Still exactly as the item states: only 716 carries reviewed; 715 reports a reviewer has read this red |
| Banners parse | parse_items from scripts/docs/backlog_status_check.py |
408 items on the branch, 404 on main, no exception |
| No number collides | set difference against origin/main and BACKLOG-CLOSED.md |
New numbers are exactly [1402, 1403, 1404, 1405]. Zero collisions either side |
Every #N resolves |
regex over added lines | 108, 700, 701, 711, 718, 1056, 1300, 1384, 1402, 1403, 1405. #108 is namespaced to wshallwshall/claude-multisession. #1056 and #1300 both live in docs/BACKLOG.md, and #1056 is cited beside that path correctly |
| No stray glyphs | Unicode category scan of added lines | Only U+1F522 four times, one status banner per item. Zero other non-ASCII characters |
On #1402's unnamed instrument. The item states "740 session records against 2 live sessions", names scripts/coord/session-registry.ps1 in wshallwshall/claude-multisession, and then says outright that the figure cannot be re-derived from this clone. That is the right shape for a ledger item: the instrument is named, its repository is named, and the reader is warned before trying to reproduce it. No objection. I found no token-rate claim in the current text.
To clear the label
- Reconcile #1404's closing act with what PR ci(review): record the armed review-gate context and reconcile the required set to sixteen (BACKLOG #1404) #718 actually does. Either ci(review): record the armed review-gate context and reconcile the required set to sixteen (BACKLOG #1404) #718 drops its CodeQL block, or the item stops saying that entry must not be edited and stops marking step 2 DONE.
- Extend the CodeQL retraction to ci(review): record the armed review-gate context and reconcile the required set to sixteen (BACKLOG #1404) #718 by name, the way it already covers ci(register): record CodeQL as required, which it already was (BACKLOG #1384) #700.
- Rewrite #1402 and #1403 against the shipped
failure-signal.yml, or close them. - Restore the orphaned table row's header, or fold the row into prose and fix "the row above".
- Fix the leading "16 contexts" sentence.
- Move the two 2026-09-01 dates to Central.
- Change step 4's "all six files" to match the "at least" hedge.
- Correct #1405's
ci.ymlclaim.
… branch Sixth review pass on #715. Two blocking findings, both the same failure: asserting state without reading the tree the claim sits in. #1402 AND #1403 DESCRIBED A GAP THIS BRANCH HAS ALREADY CLOSED. PR #716 merged failure-signal.yml on 2026-08-31, this branch then merged main, so the workflow is in its own tree while the items said no workflow labels a pull request and no ci-red label exists. The workflow's header even names #1403 by number. Both items now record the signal half as shipped and verified firing -- github-actions[bot] labelled 718, 719 and 721 -- and state plainly that what remains is the watcher, which is claude-multisession#108. Neither should close until that lands, and each says so. #1404 BLESSED PR #718 WHILE #718 CARRIES THE PREMISE #1404 RETRACTS. Step 2 said "DONE in PR #718". Reading its diff rather than its body: it rewrites the DELIBERATELY NOT REQUIRED entry that step 1 says must not be edited, adds a block asserting "THEY BLOCK A MERGE TODAY ... branch protection enforces SIXTEEN", and adds a _LIVE_CODEQL_CONTEXTS constant naming both CodeQL contexts. All false against a 14-context server. This item voided PR #700's premise for precisely that reason and never applied the same test to the PR stacked on its own branch. Step 2 now says so and says #718 needs correcting first, since the two land together. I took #718's PR body as evidence for what #718 does. That is the same mistake as taking an item's prose as evidence for what the code does. Also fixed: commit 11199d2 replaced a table but left one row behind it, so a bare pipe row sat under prose with no header. Removed; the prose that follows already carries it. Verified: 41 tests pass across backlog-status and required-contexts; the citation gate passes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both blocking findings fixed at
|
|
Labelled by the Lander seat, on the owner's direct instruction (2026-09-01). The owner has stated that the reviewer item is broken and explicitly approved applying the What this label asserts here, stated plainly so the record is not overread: it records that the owner authorized the merge path while the reviewer mechanism is broken. On PRs that carry a substantive review comment above, that review stands on its own and this label rides on top of it. On PRs that do not, this label is an owner-authorized unblock and not a claim that a reviewer read the diff. I am recording the distinction rather than letting a uniform label imply a uniform amount of reading. That is the property the gate exists to protect, and it is worth preserving even while the gate is bypassed. |
PR 729 (541c519) tail-appended BACKLOG #1415 at the same anchor this branch uses for #1402 to #1405, so docs/BACKLOG.md conflicted append-vs-append at the end of the file. Every other path merged automatically. The resolution keeps BOTH blocks in append order, which is this file's convention rather than numeric order (the existing tail runs 1396, 1398, 1400, 1397, 1282, 1370, 1371, 1401). Main's #1415 stays in its landed position after #1401; this branch's #1402 to #1405 follow it. A blank line was added between the two blocks because this branch was missing the separator before its first new heading. Verified with a set difference over item numbers, read with parse_items from scripts/docs/backlog_status_check.py, because a total count cannot detect two blocks folding into one: main_items 405 branch_items 408 merged_items 409 expected 409 (main UNION branch) LOST 0 [] ADDED 0 [] Positive controls: 1401 present in both sides; 1415 present in main only; 1402 to 1405 present in the branch only. Verbatim-block control: main's #1415 block and this branch's #1402 to #1405 block both survive byte-identical, with a negative control proving the comparison can fail. The merged file diffs against origin/main as 221 insertions and 0 deletions. scripts/docs/backlog_status_check.py passes: 645 items, 409 in docs/BACKLOG.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Reviewed and labelled by the Lander. Ledger control run as a SET DIFFERENCE rather than a count, because a merge can fold two items' blocks into one and leave a correct-looking file short by one item -- a total cannot see that. Read with Result for this PR is recorded in the Lander's status line below. In every case ADDED is exactly the item(s) this PR files and LOST is empty, so nothing already on main is dropped by the merge.
|
Twelve pull requests landed on main today and three of them tail-appended docs/BACKLOG.md, so this branch conflicted append-vs-append at the file tail. Only that one path conflicted; everything else merged automatically. The resolution keeps BOTH sides in APPEND order, which is this file's convention rather than numeric order -- verified by reading main's existing tail before resolving. Main's newly landed #1409, #1410 and #1413 stay in the position they landed in; this branch's #1402 to #1405 follow them. Verified with a set difference rather than a count, because a merge can fold two items' blocks into one and leave a correct-looking file short by one item while the totals still agree: main 408 branch 409 merged 412 expected 412 LOST [] ADDED [] only-on-main folded in [1409, 1410, 1413] only-on-branch preserved [1402, 1403, 1404, 1405] positive control 1401 present on main; negative control 999999 absent backlog_status_check: OK, 648 items, exit 0 Committed from the worktree the #1402-#1405 claims record, which is what satisfies the ledger gate's ownership check on its path key.
|
Re-merged against current main and re-labelled by the Lander. This unblocks PR 718, which is the only open fix for an Thirteen PRs landed today and three of them tail-appended Resolved keeping BOTH sides in APPEND order, which is this file's convention rather than numeric order -- verified by reading main's existing tail before resolving, not assumed. Main's newly landed #1409, #1410 and #1413 stay where they landed; this branch's #1402 to #1405 follow. Verified with a set difference, never a count. A merge can fold two items' blocks into one and leave a correct-looking file short by one item while the totals still agree -- that exact failure dropped a filed item on another branch today, silently, at an unchanged count of 405. Committed from the worktree the #1402-#1405 claims record, which is what satisfies the ledger gate's ownership check on its path key. The gate refused every other worktree, correctly -- the claims' recorded branch key is stale ( No rebase, no force-push, no On the label timing, because getting this wrong is silent: the push fired Content unchanged from the review that labelled it originally: docs-only, files #1402 through #1405. |
Four items, all found while mapping the brief-to-merge path and all verified the same day rather than reasoned about.
if: failure()step, and both only fail the job. No label, comment or issue. Noci-redlabel existsmerge_grouphas nogithub.event.pull_request, the same fact that collapsed backlog-hygiene's concurrency key. Nothing onmainreadsmerge_group.head_refrequired_approving_review_countis 0Two of these are correcting my own earlier claims, and the items say so.
#1404 records that arming the gate would not strand open pull requests. GitHub runs
pull_requestworkflows from the merge commit, so every open PR already reports the context. Open PRs would go red until labelled, which clears with a label rather than a rebase. The required-but-absent trap is real but applies to a workflow that is not onmainor does not trigger onpull_request, and neither holds here.#1402 records that autofix does not close the signalling gap, for two independent reasons: it wakes only a live session, and workers exit when their turn ends -- 740 session records against 2 live sessions, measured the same day.
Cross-repo note. The watcher half of #1402, a cron that reads the label and spawns the attributing seat, belongs to the tooling and is filed in that repository's own tracker rather than given a number here.
Numbers 1402 through 1405 were allocated with
alloc.ps1; the ledger gate passed on commit.🤖 Generated with Claude Code