docs(backlog): file BACKLOG #1460 and #1461 -- the dispatch gate names retired seats - #936
docs(backlog): file BACKLOG #1460 and #1461 -- the dispatch gate names retired seats#936wshallwshall wants to merge 1 commit into
Conversation
…d seats Two constants carry stale seat assignments, and neither is fixed here. CLOSING_SEAT at scripts/docs/backlog_status_check.py:122 names the ASVS Tracker, the Liaison and the Dispatcher. GATED_VERDICTS at scripts/coord/dispatch_gate.py:160 independently names two of them, so correcting one constant leaves the other emitting. Measured over 670 ledger rows, 132 get a dispatch reason naming a retired seat. A fourth value is a wrong assignment rather than a dangling name: CLOSING_SEAT["code"] tells a Builder the Lander flips the banner, while backlog-hygiene.yml demands the ledger edit of that Builder's own PR. #1461 is the vault half. Three role playbooks hold the same old assignment, including BUILDER.md:216 forbidding the Builder the edit CLAUDE.md:286 assigns it. That is a write outside this repository, so the Lander performs it and needs no owner approval. Filed, not fixed. The 97-row scorecard-rescore value needs PR 929 on main first. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
This pull request is green and nobody has marked it read. Every check that has reported is passing and the To clear it, IN THIS ORDER:
DO NOT TRIAGE THIS FROM A seat can find every pull request in this state in one call: The |
|
Superseded by #940, which merged at 11:52 CT as Closed by the Lander, not rejected. Eight ledger-only pull requests were consolidated into one so that nine filings cost one merge cycle rather than eight. Under The consolidation merged each branch rather than cherry-picking, so every number arrived carried by a real merge parent, and it re-applied only this branch's own sections onto main's current file. That mattered: taking any of these branches wholesale would have silently reverted #1426, #1440, #1454, #1455 and #1456. Final state verified at 443 rows against a target computed before building, 678 additions and zero deletions, no duplicate numbers. Nothing here needs re-filing. |
Files two ledger rows and changes no code.
docs/BACKLOG.mdis the only file touched, verified:git diff --name-only origin/main..HEADreturns that one path, and a grep of that list for.pyor.ymlexits 1.Handoff: a concurrent session is implementing the code half
A separate session at worktree
priceless-easley-1cb72a, branchclaude/elastic-fermat-2d7bf2, is fixing the constants. Its announced intent coversCLOSING_SEAT["scorecard-rescore"]inscripts/docs/backlog_status_check.pyand that dict's staleBUILDER.mdline citations. I was told to stand down on the code half after I had already chosen to file only, so no fix was written on this branch and nothing was discarded.Read this before landing that session's work, because its stated scope is narrower than the defect.
CLOSING_SEATatscripts/docs/backlog_status_check.py:122andGATED_VERDICTSatscripts/coord/dispatch_gate.py:160. The peer's announced intent names only the first. If it fixes one and not the other, 35 ledger rows keep emitting a retired seat name and nothing reports a problem. #1460 is the record of why.CLOSING_SEAT["code"]tells a Builder the Lander flips the banner, while the required checka PR that implements BACKLOG #N must update BACKLOG.mddemands the ledger edit of that Builder's own PR.LIAISONassertions are not where they look.tests/test_coord_dispatch_gate.py:247and:274come fromGATED_VERDICTS, notCLOSING_SEAT, because both tests driveclosing-act: code, which short-circuits theCLOSING_SEATbranch. A fixer who patches onlyCLOSING_SEATwill see those two still passing and conclude wrongly that they are unrelated.What is filed
BACKLOG #1460 -- the primary. Both constants, their five pinning assertions, the fourth defect, the reach measurement, and the dead
BUILDER.md:253/:148anchors in the justifying comment. The row specifies the fix completely so whoever lands it does not re-derive it.BACKLOG #1461 -- the vault half. Three role playbooks hold the same old assignment, including
roles/BUILDER.md:216forbidding the Builder the exact editCLAUDE.md:286assigns it. That is a write to a separate repository, so a Builder cannot close it.CLAUDE.md:289gives the Lander standing authority on the vault with no per-action owner approval, and the row says so.Nothing is filed for prose in this repository that merely names a retired seat.
CLAUDE.md:274-276already tells a reader to treat such naming as stale, and filing it would duplicate a rule that works.The dependency that made filing-only right independently
I had already chosen to file rather than fix, before the stand-down, and the reason still matters to whoever lands the code.
The
scorecard-rescorevalue is the 97-row half. Correcting it needs a successor for the ASVS Tracker, and the owner ruled that on 2026-09-05: the Lander performs the vault scorecard re-score. PR 929 records that ruling inCLAUDE.mdsection 5's Lander row. I checked, and 929 has not merged --gh pr view 929 --json state,mergedAtreturnedstate OPEN,mergedAt null. Until it is onmain, writing that successor into a machine-read constant puts an operative instruction into shipped source citing a section that does not yet say it. The concurrent session's fix inherits this dependency. I did not editCLAUDE.md.The other independent parts do not depend on 929, and #1460 says which are which. Successors for the other two come straight off the roster table: Liaison becomes Console (
CLAUDE.md:285), and the Dispatcher's recording half becomes Lander (CLAUDE.md:289).Decisions this brief left open
Closing-act: banner-onlyon #1461. The menu iscode | scorecard-rescore | owner-ruling | banner-only, and none obviously covers a write to another repository. Leaving the field off madejudge()returnrefuse, whose docstring reserves that level for "an item whose state nobody has declared" -- false here, and the exact failure the gate exists to catch.codewas wrong because it sits inBUILDER_CLOSABLE_ACTS, so the gate would tell a dispatcher a Builder closes it.banner-onlyis right on the merits: the work lands in the vault, so nothing reaches this repository except the banner. It now gradesadviseand correctly says a Builder does not close it.That makes #1461 the first ledger row ever to declare
banner-only, so the entry renders for the first time -- and what it prints names the Dispatcher, demonstrating #1460 live. #1460's reach table is dated toc57903c2cand carries a note saying this row changed its zero, rather than leaving a number that silently went stale.The concurrent session's worktree and branch are named here and deliberately not in the ledger rows. A session path is ephemeral; a ledger row is durable, and a row citing a worktree that no longer exists is worse than one that never did.
Corrections to the survey this was built on
The survey drafting these rows recommended three items. I filed two: its item 2 asked for an owner ruling on who performs an ASVS re-score, and the owner had already ruled while the survey ran.
Two of its numbers did not reproduce. It reported the LANDER banner sentence on 120 open rows; I measure 119. It reported the sentence on 161 rows in one finding and 166 in the recommendation; 166 is right, and the row explains the one-row gap against the 167-row
codecensus (#1343 gradesadvisefor an unrelated reason, so it never reaches theokpath that prints the string).I also could not confirm one thing my brief told me. It said the survey "refuted the stronger claim that this is a required gate". The refutation I read says the opposite on that half: it re-verified that
tests/test_coord_dispatch_gate.pyis intooling_manifest.txt:84, thattoolingis inci-gate'sneeds, and thatCI gateis a required context. I re-measured branch protection myself andCI gateis live among 13 contexts. What the survey actually refuted was a different claim -- that patchingCLOSING_SEATalone would red theLIAISONassertions, which it does not. The constants and their assertions must still move in one PR, and the concurrent session needs that, not the brief's summary of it.Verification
Every number in both rows was re-derived here from a clean checkout at
c57903c2c, not carried in from the survey. Controls that could have fired and did not:Steward,Regulator,Console): 0 rows, against 132 for retired names.BUILDER_CLOSABLE_ACTSmoved 166. This is what holds the item at P2: the staleness misdirects a reader, it does not change a verdict.CLOSING_SEAT0 and 0, against a same-corpus "banner" control of 513 and 57 and a dead needle at 0 and 0.GATED_VERDICTSreturns 3, all inside #1334, which covers a different question.gh pr list --limit 200, asserted strictly below the limit): 0 touch the three code files, while 64 touchdocs/BACKLOG.mdon the identical loop.One instrument of mine was broken and I am recording it rather than quietly dropping it:
gh api --paginate "repos/:owner/:repo/pulls?state=open"returned 6 PRs wheregh pr listreturned 67. I used the second.Both rows parse under
parse_itemsas open, unduplicated, and scored.#1460gradesok,#1461gradesadvise.Checks
ruff check .ruff format --check .mypy messagefoundry(strict)pyteston 8 backlog/ledger/dispatch modulesscripts/docs/backlog_status_check.pypre-commitat commit timeU+00B7middot (x4, the house score separator) andU+1F522(x2, the sanctioned open banner)The pytest modules were
test_coord_dispatch_gate,test_backlog_status_check,test_backlog_citation_check,test_backlog_dependency_census,test_backlog_hygiene_claim_extraction,test_backlog_score_advisory,test_ledger_checkandtest_backlog348_cancel_dirty_release.Skipped: the full pytest suite, and every hosted-runner-only leg. Since this changes one Markdown file and no code, the legs worth reading after merge are
a PR that implements BACKLOG #N must update BACKLOG.mdand thebacklog-hygieneworkflow. The pre-existing advisory warning on#1426in the status check comes frommain(PR 806), not from this branch.Rebased on
origin/mainat5b2bd59f0, clean, no ledger conflict. Auto-merge is not armed.Generated with Claude Code (https://claude.com/claude-code)