feat(queen): refuse to publish a task the Queen could never dispatch - #4724
Merged
Merged
Conversation
An issue with no `## Boundary` is not work she declines, it is work she cannot see: she reserves files before dispatching, so with nothing to reserve the issue is skipped every round, for good. On 2026-09-23 that was 565 of 649 candidates, twenty lanes idle, refusal="nothing to choose" over six hundred open issues. Every one of them was opened by something that never checked. feed_untested, feed_defects, feed_empty_bodies and refile all called `gh issue create` with no gate, so the swarm has been filling its own backlog with rows it cannot dispatch. needs_boundary.py labels them a day later and propose_boundary.py drafts what is missing; both are repairs after the fact. `task_shape.py` is the gate, and its rule is a PINNED TWIN of `boundaryPathsOf` in queen-tick.ts. That matters both ways: a gate stricter than the Queen rejects work she would have taken, and a looser one passes work she will silently skip. Verified against 40 issues she had already parsed - 40 agreements, 0 disagreements - not only against its own cases. Each pinned case surprised once: the section ends at the next `## ` heading and NOT at a blank line, a line contributes its FIRST path token and not every one, backticks and trailing punctuation are stripped, `### Boundary` is not the heading she reads, `## Границы` is. It refuses and never closes: an issue may be a real problem badly filed, and deleting a person's report to keep a queue tidy is the wrong trade. `roadmap` and `epic` stay exempt because a goal is not a task, and a documentation-only boundary warns rather than refuses - whether prose-only work may be dispatched is the operator's call, not this gate's. Also `propose_boundary.py --resolve-bare`: a file named without its directory (`compiler.rs`, `octree.t27`) is read as the path the tree holds for it, when the tree holds exactly one. 8025 of 8323 basenames are unique here, which turned 65 issues that looked like they named nothing into issues whose boundary was written all along. Closes #4723 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
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.
Closes #4723
The swarm was filling its own backlog with rows it cannot dispatch
An issue with no
## Boundaryis not work the Queen declines — it is work she cannot see. She reserves files before dispatching, so with nothing to reserve the issue is skipped every round, for good.Every one of those was opened by something that never checked.
feed_untested,feed_defects,feed_empty_bodiesandrefileall calledgh issue createwith no gate.needs_boundary.pylabels them a day later,propose_boundary.pydrafts what is missing — both are repairs after the fact.The rule is the Queen's, copied
task_shape.boundary_pathsis a pinned twin ofboundaryPathsOfinqueen-tick.ts. That matters in both directions: a gate stricter than she is rejects work she would have taken, and a looser one passes work she will silently skip — which is the failure this exists to end.Verified against 40 issues she had already parsed: 40 agreements, 0 disagreements — not only against its own cases.
Each pinned case surprised once:
##heading### Boundary## ГраницыWhat it refuses to do
It never closes an issue. One may be a real problem badly filed, and deleting a person's report to keep a queue tidy is the wrong trade.
roadmapandepicstay exempt — a goal is not a task. A documentation-only boundary warns rather than refuses: whether prose-only work may be dispatched is the operator's call, not this gate's.It does not check that the path exists, either. A port task names the
.t27it is about to create, and a gate demanding the file first would refuse every one of them.Also here: a filename without its directory is still a filename
--resolve-barereadscompiler.rsasbootstrap/src/compiler.rsandoctree.t27asspecs/tri/trees/octree.t27— but only when the tree holds exactly one file with that name.Cargo.tomlis thirty-two of them, so it resolves to nothing, exactly as a two-path issue writes nothing.8025 of 8323 basenames are unique in this tree. That turned 65 issues that looked like they named nothing into issues whose boundary was written all along, just without a directory in front of it — 83 more bodies written.
Not in this change
The workflow applying the same gate to issues opened by hand (
.github/workflows/queen-task-shape.yml) needs a token with theworkflowscope, which this one does not carry. The gate that matters more is here: the feeds are where the 565 came from.🤖 Generated with Claude Code