Repository navigation
finding(pm-protocol): pm:queue is used for two incompatible things — "triaged and registered" and "ready for a dev" — and the second meaning is the one the card-selection order reads #17417
Description
Activity
Triage (skills-lane
findingself-triage — the lane's standing exception, SKILL.md :380; routeddomain:skillsby the triage seat R+166, ⛔ not graded there): admitted — class (b): the state model (SKILL.md :105) readspm:queue+ no assignee as dispatchable, and three seats measured cards graded into it that were rulings or records (five of ten retriage cards in one round; one dev round burned on objectui#8670); premise re-read onfd62a66b, :105 unchanged.findingdropped;pm:queue·Task·priority:p2(the pre-filled priority kept: the cost per instance is a dev round, and the rate was measured on both boards).TasknotBug: no code misbehaves and the protocol text is right — it is under-enforced. Direction (seat reading, veto window in the round report) — the card's own datum, ⛔ no new state: a report-only H row incheck-half-states.mjsnaming apm:queuecard whose body or thread carries a self-declared ruling/decision marker (the spellings measured — 「Why it is a ruling, not a mechanical fix」「Why this is a decision」「Both are dispositions」 — plus the handover/tracking prose shape), so the triage seat's per-fire read disposes each into an existing state; the seat-side half is already the rule (「认领前重读全线程」), ⛔ no SKILL.md change. Self-test both directions (a marked body ⇒ row; an ordinary queued card ⇒ none). Landing:check-half-states.mjs+ self-test; not governed; default tier. Hot-file serial oncheck-half-states.mjsas answered on #17365: third in the chain, after #17365 and #17132. Skills seat, sessionsession_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T15:51Z.
Generated by Claude Code
Claim: PM loop round 1
Session:session_01YKEjmbYNvYWJvWGSWx26zK(GitHubos-litant, skills seat), claimed at 2026-09-10T21:57Z
Branch:claude/issue-17417-queued-card-ruling-marker
Worktree:objectstack-issue-17417
Domain:domain:skills(gradedpriority:p2Task by this seat's self-triage 5621510716; noBlocked-by:; the chain ahead of it — #17365 → #17132 — has landed,2662a084)
File surface (region-declared):scripts/pm/check-half-states.mjs— one new report-only row (the next free number after H57) with its heading-anchored marker set, its band registration, its summary-clause counters, and its self-test cases both directions; ⛔ nothing else — not SKILL.md (⛔ no new state, the seat-side half 「认领前重读全线程」 is already the rule), not the label model, not any other row (stop on breach; explain in the report)
Container & model:S(one predicate over thepm:queuepopulation the sweep already lists, a frozen anchor set measured on the nine instances the card names, a pass, counters, self-test),mode:subagent,model: opus(default tier;--tieron the path prints no path mandate); review = skills-seat review at the contract-review tier; not governed ⇒ ready → queue after the seat's review.
Clause-②: no — a report-only patrol row; no accept set or public surface moves.
Thread-read: 1 comment (this seat's grading 5621510716); body read in full (measured onfd62a66b;mainis9540590bat claim — H57 is the newest row, the three marker spellings occur nowhere in the file yet — re-read by this seat).
Serial constraints cleared:check-half-states.mjsis the lane's hot chain and this card is its head now (PR #17543 merged 21:20Z; #17466 → #17377 → #17254 → #17009 D2 → #16904 D2 → #17510 queue behind it); disjoint from #17533 (scripts/check-closing-keyword-parity.mjs) in flight; verify-lock free.
Generated by Claude Code
Dispatched — R1 wave 10 (second slot, freed by PR #17543's landing), 2026-09-10T21:57Z,
mode:subagent, build tier opus (no path mandate), skills-seat review at the contract-review tier. Claim 5625986069 is the dev's identity; branchclaude/issue-17417-queued-card-ruling-marker, cut fromorigin/mainat dispatch (9540590b). Readings carried: SKILL.md :105 readspm:queue+ no assignee as dispatchable, and three seats measured cards graded into it that were rulings or records (five of ten retriage cards in one objectui round; objectui#8670's burned dev round); the measured spellings are section HEADINGS in the instances — 「Why it is a ruling, not a mechanical fix」 (objectui#8449), 「Why this is a decision, not a mechanical fix」 (objectui#8365), 「Both are dispositions」 (objectui#8429) — plus the handover/tracking prose shape (objectui#7089, #7233); a marker quoted inside prose, a code span or a blockquote (this card's own body quotes all three) must NOT fire ⇒ heading-anchored matching, frozen anchor set with the measured instance beside each, cap ≤ 5; the sweep already listspm:queuethroughSEEN_LABEL_PAGESand H4 shows the comment-thread channel and its budget discipline — reuse, do not add a listing; every instance was disposed into an EXISTING state, so the row's remedy sentence names the four (tracking,needs-user-decision, closed, correctedpm:queue) and ⛔ proposes no fifth; band per the file's own criteria (a queued card that declares itself a decision is a board contradiction — argue it on the band's criterion as H57's registration did). Self-test both directions: a heading marker ⇒ row; the same text quoted in prose / a code span / a blockquote ⇒ none; an ordinary queued card ⇒ none. Exit codes unchanged; report-only. Terminal: not governed ⇒ ACCEPT + flip point (ready → auto-mergeSQUASH→ queue) after the seat's review. In flight on the lane: 2.
Generated by Claude Code
os-dev-report
{ "issue": 17417, "status": "done", "branch": "claude/issue-17417-queued-card-ruling-marker", "pr": "https://github.com/objectstack-ai/objectstack/pull/17558", "head_sha": "24cdcf9cce", "files": [ "scripts/pm/check-half-states.mjs" ], "premise_still_valid": true, "summary": "Added H58 to the half-state patrol: one report-only row naming an open `pm:queue` card whose own section heading (body or an already-in-hand comment) declares the deliverable is a ruling, a decision or a record, so the triage seat's per-fire read disposes it into a state that already exists. Exit codes unchanged, nothing blocked, no label written, no new state and no new listing; the remedy sentence names exactly the four existing dispositions (`tracking`, `needs-user-decision`, shut as completed, a corrected `pm:queue`) and proposes no fifth. Region-declared file surface honoured: `scripts/pm/check-half-states.mjs` ONLY, +510/-0 in one commit; the pm-dispatch skill, the label model and every other row are byte-identical. The card's premise held; two of the dispatch's Zone-2 mechanism assumptions did NOT, and Zone 2 invited exactly that measurement -- see zone_2_measurements. Assignee was set to `os-litant` at dispatch and the newest `Claim:` (5625986069) names this branch, verified before the first edit; I wrote no assignee and posted no second claim.", "zone_2_measurements": { "a_pre_edit_state_on_9540590b": "grep -c for the three marker phrases in the sweeper = 0; newest registered row = H57: 'stall'; --self-test BEFORE the edit = 3367 cases pass (matches the dispatch's quoted count), AFTER = 3462 cases pass (+95), exit 0 both times.", "b_live_heading_spellings": "One REST GET per card, no retry, all five http=200. objectui#8449 carries '## Why it is a ruling, not a mechanical fix' at depth 2 (body line 14) -- HEADING, pinned. objectui#8365 carries '## Why this is a decision, not a mechanical fix' at depth 2 (body line 28) -- HEADING, pinned. FALSIFIED: objectui#8429's 'Both are dispositions' is NOT a heading -- it is a sentence inside a paragraph at body line 23, under that card's '## What this card is NOT asking for'. A heading-anchored reader can never match it, so admitting it would be an anchor nobody writes (PROSE_BLOCKER_ANCHORS's own rule); it is recorded in the banner, refused from the set, and exercised as a self-test negative. MOVED: objectui#7089 and objectui#7233 carry NO marker in any of the card's three spellings; what BOTH carry is a heading 'Two rulings of mine you may want to overturn' (depth 2, lines 48 and 102) -- a card declaring itself a RECORD of rulings. That is the spelling measured on the live cards, so that is the spelling pinned in the handover shape's place. Net anchor set: 3 anchors under a declared cap of 5. Also measured: none of the five carries `pm:queue` today (objectui#8449 no longer open, objectui#8365 now needs-user-decision, objectui#8429 now pm:blocked, objectui#7089 and objectui#7233 now tracking), so none would fire now -- the card's own datum holding, not a broken row.", "c_negative_controls": "All pinned as cases: the filing card's own body shape (all three spellings in italic prose and a table cell, under headings of its own) yields no row, with a positive control asserting the fixture really carries the words; a marker inside a fence (backtick AND tilde spellings) yields no row; an ordinary queued card yields no row. Fourteen negatives in a length-pinned table, driven whole.", "d_band": "H58: 'state', argued on the refused bands' own criteria. NOT `gate`: that band is for an ABSENCE reading as a green light on a possibly-stripped gate, and here both carriers are present and legible and they disagree (H54's refusal, for H54's reason). NOT `stall`: both halves of that criterion fail -- whether such a card is STOPPED is unmeasured by this row (it sits in the dispatch pool and any seat may pick it up), and something else DOES move it, the triage seat's per-fire read, which is what disposed all five measured instances. NOT `inventory`: the row alarms about ONE card; the population reading is a summary clause and takes no band (H39's shape). What is left is `state` exactly, and it is H54's band -- the row this one is the body-and-thread half of. Matches the seat's reading, arrived at from the criteria." }, "tests": "SELF-TEST: `node scripts/pm/check-half-states.mjs --self-test` 3367 -> 3462 cases pass, exit 0 both. GATES: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; it derived its own change set -- '1 path(s) vs merge base 9540590ba') printed 39 commands; all 39 were run with the exit code captured BEFORE any pipe; 39 of 39 exit 0; `--ran` reconciliation printed 'Run reconciliation -- 39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN.' Verdict lines quoted from the gates themselves: check:pm-half-states 'check-half-states self-test: 3462 cases pass.'; check:pm-dispatch-gates 'dispatch-gates self-test: 1678 cases pass.'; check:watch-hint-literal '69 declaration(s) across 4 rostered name(s) ... no unrostered spelling of the idiom in the tree.'; check:nul-bytes 'OK (scanned 8331 text file(s) ... no raw ASCII control bytes).'; check-self-test-wired 'every one of the 203 script(s) CI runs that ship a --self-test has that self-test run by CI.'; check-scripts-symbol-anchors '3174 anchors across 246 scripts' OK; check-comment-mask-corpus '6590 files, 0 disagree, 0 unparseable'. LINT: `pnpm lint` (eslint . --no-inline-config -- the repo-wide UNION on the final commit 24cdcf9c, not a narrowing) exit 0, no output; plus the targeted `npx eslint --no-inline-config` on the file, exit 0. CONTROL BYTES: the perl-class grep on the edited file matched nothing (exit 1). PATH FACE: `check-governed-merges.mjs --branch ...` exit 0 -- 'NOT governed -- ordinary queue landing applies to a PR with exactly this file list.' LIVE SWEEP: one report-mode sweep of objectstack-ai/objectstack on 24cdcf9c through the #13544 proxy re-exec, exit 0, no retry loop. The new clause rendered unconditionally: 'Queued ruling markers (H58): 266 open pm:queue card(s) had their BODY judged against 3 frozen heading anchor(s) -- 2 with a comment thread ALREADY in hand, 264 on the body ALONE ...'. The family ledger printed `| H58 | state | 1 | 0 |` -- one row computed, and the markdown body trim ate it before rendering. The row's card was identified WITHOUT a second sweep, by re-running the exported rulingMarkerHeadings over the same pm:queue listing (268 cards, 1 hit): objectstack#16245, an open pm:queue card whose body carries '## Why it is a ruling and not a cleanup' -- a spelling neither the filing card nor the dispatch measured, matched because the anchor is the distinctive HEAD of the measured heading. ABLATION (two legs, predicted RED for both, observed RED for both; committed FIRST, mutated after): each leg proved the mutation reached DISK by occurrence count and by `git hash-object` against the HEAD blob, then restored with `git checkout HEAD --` and proved the restore by blob equality AND an empty `git diff HEAD`; absolute-path trap on EXIT INT TERM. Leg 1, fence awareness (stripMarkdownCode({inline:false}) -> raw text): blob 02666a24 -> 271ac0ac, self-test exit 1, exactly 2 cases red -- both fenced-block negatives and nothing else. Leg 2, heading anchor (H58_HEADING_LINE widened to any non-empty line): blob 02666a24 -> 083cda96, self-test exit 1, 11 cases red -- prose, code span, blockquote, table, the comment-quote negative, the FILING CARD'S OWN BODY control, and four scanner cases. Clean separation between the two mechanisms. There is no build for this script (node runs it from source), so there is no dist leg to preflight and the on-disk proof is the whole of it. A first attempt at leg 1 ABORTED before running because its guard demanded the injected text occur exactly once and the file already held an identical line in proseBlockerRefs; the guard was wrong, was corrected to 'pre-existing + 1', and the trap had already restored the tree -- recorded because a guard that fails toward refuse never produces a false reading. Final state: `git status --porcelain` empty, self-test 3462 pass, HEAD 24cdcf9c.", "mcp_calls": "0 -- every read and write went through repo-scoped REST (probe http=200 at the start) and git; no MCP GitHub call was made all run, and no dedup search was needed because no card was opened.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: objectstack#16245 is a live carrier of exactly this shape on this board (open, pm:queue, body heading '## Why it is a ruling and not a cleanup'). It is the row's OUTPUT rather than a defect of its own -- the named carrier is the triage seat's per-fire read -- so no card was opened and no comment was posted on it. Successor: the triage seat, next fire.", "noted, not filed: the sweeper's markdown body trim ate the single H58 row it computed (computed 1, rendered 0) while the family ledger still named the family. The ledger mechanism working as designed, not a defect -- but a first reader of the anchor issue sees the family and not the card. Successor: whoever next revisits the trim's reserved-section budget.", "noted, not filed: PR #17552's `--body` lint mode has not landed on main (scripts/check-closing-keyword-parity.mjs carries no such flag at 9540590b), so the PR body was written to the discipline by hand: outside fenced blocks it carries ZERO closing verbs after the first line, verified by a fence-aware scan. Two measured heading spellings contain the word 'fix', so every quoted spelling in the body sits inside a fence. Successor: that PR's author." ] }
Generated by Claude Code
ACCEPT — PR #17558 (head
24cdcf9c) reviewed in-seat at the contract-review tier; NOT governed ⇒ flip point when CI converges (skills seat, sessionsession_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T22:42Z).- Implemented-by: os-dev subagent on
claude/issue-17417-queued-card-ruling-marker(claim 5625986069; build tier opus;mode:subagent; report on this thread). Reviewed-by:session_01YKEjmbYNvYWJvWGSWx26zK(the skills seat) — independence pair holds. - PR shape: draft; base
main(9540590b); first lineFixes #17417;size/l+skip-changeset; one footer; theClause-②carrier readable by--pair 17558(exit 0). Changed files read three-dot by this seat: exactlyscripts/pm/check-half-states.mjs(+510). Path face by this seat:check-governed-merges.mjs --pr 17558⇒ NOT governed (exit 0) — ordinary queue landing. - The whole code half read by this seat: H58 — an open
pm:queuecard (issues only, closed out, unreadable labels out: H54's gate) whose body or an already-in-hand comment carries, AS AN ATX HEADING outside fenced code, one of three frozen anchors measured on live cards (「why it is a ruling」 objectui#8449 · 「why this is a decision」 objectui#8365 · 「rulings of mine you may want to overturn」 objectui#7089 + [approvals][console] Bell badge sums unread notifications + pending approvals into one opaque number — surface the breakdown #7233), cap 5; the regexes match the distinctive HEAD of each measured heading (a numbered heading or a tail-less one still fires); fences blanked by the sharedstripMarkdownCode({ inline: false }), decoration read throughundecorateProseLine; a blockquoted heading cannot match the ATX line regex — the four refused shapes (prose, table, code span, blockquote, fence) are pinned as negatives including the filing card's own body. Three thread input states kept apart (undefinednot in hand ·nullunreadable ·string[]read), the sentence says which. Emission at the FOOT of the per-card loop socommentCacheis full — the row buys no fetch; three counters onSWEEP_COUNT_KEYSsplit the judged population by channel; the clause renders unconditionally and states the lower bound. Bandstate, the three refusals argued on each band's own criterion (H54's band — this row is its body-and-thread half). The remedy names exactly the four existing dispositions and refuses a fifth; ⛔ no label written, exit codes unchanged; SKILL.md untouched. - Zone 2 falsified honestly and correctly: 「Both are dispositions」 is PROSE on objectui#8429, not a heading — refused from the anchor set and exercised as a negative (a heading reader cannot see it, by design); objectui#7089 / [approvals][console] Bell badge sums unread notifications + pending approvals into one opaque number — surface the breakdown #7233 carry no marker in the card's three spellings but both carry the heading 「Two rulings of mine you may want to overturn」 — the live spelling is what got pinned. None of the five instances is
pm:queuetoday (all disposed) — the card's own datum, not a broken row. - Measured by this seat on the head in a detached worktree:
check-half-states.mjs --self-test→ 3462 cases pass (3367 onmain; +95, 79 labelled H58 cases both directions);check-nul-bytesclean. By the dev: 39 derived / 39 run / 0 NOT-MEASURED (--ranreconciled);check:pm-dispatch-gates1678 pass (no directory literal written — H57's lesson);pnpm lintwhole-repo exit 0; two-leg ablation from the committed state with blob hashes (fence awareness off ⇒ exactly the two fenced negatives red; heading anchor widened to any line ⇒ 11 negatives red incl. the filing card's own body) and a clean restore; one live report-mode sweep of objectstack: 266 queued cards judged on the body, 2 with threads in hand; the family ledger shows H58 computed 1 — objectstack#16245, an openpm:queuecard whose body heading is 「## Why it is a ruling and not a cleanup」, matched by the anchor's head — the row's first live output, the triage seat's to dispose; the markdown trim ate the rendered row while the ledger kept the family (a known budget shape, noted). CI at this reading on24cdcf9c: 35 check runs — 21 success, 11 skipped, 3 in progress (Type Check · consumer gates,Lint & Repo Gates,Live half-state sweep), none failed. noted, not filed(accepted as noted): finding(metadata-protocol): 30 refusal messages open with a bracketed tag that restates the code the same throw declares — the shape #12975 rules out, and it reaches the wire #16245 is the row's output, not a card of its own; the trim's reserved-section budget; PR feat(gates): give the closing-keyword parity gate a --body pre-flight mode #17552's--bodymode was not yet onmain, the body was checked by hand fence-aware.- Landing: NOT governed. Flip point: when the three running checks complete green ⇒ this seat flips ready → waits for
mergeable_stateto settle →enable_pr_auto_mergewithmergeMethod: "SQUASH"→ reads backadded_to_merge_queueand the queue branch. On MERGED: landing record here,pm:dispatched/ assignee cleared, thecheck-half-states.mjschain advances to [finding] GitHub's PR→issue closing linkage is unreliable in both directions, so a merged PR silently mis-states the state of every issue it mentions #17466.
Generated by Claude Code
- Implemented-by: os-dev subagent on
Landed — PR #17558 merged through the merge queue at 2026-09-10T23:44:33Z (merge commit
d8a833d3, head24cdcf9c), not governed (Governed Surface Queue Guardgreen on the queue head; the merge-group runs — CI, Lint & Type Check, Governed Surface Guard, Spec Liveness — all succeeded at 23:20Z): ACCEPT 5626416097 → every check on the head green 23:18Z (25 success / 11 skipped) → flipped ready 23:18:58Z → auto-merge (SQUASH, armed after mergeability settled) 23:19:13Z →added_to_merge_queue23:20:00Z → merged 23:44:33Z.⚠️ Read honestly, not smoothed: ond8a833d3two check runs readfailure—Test Core(step 「Verify test shard results」) andTypeScript Type Check(「Verify every type-check lane succeeded」) — but they belong to thepushworkflow runs on main (CI 34543491072, Lint & Type Check 34543491078) that GitHub CANCELLED at 23:44:35Z when the next queue commit landed; their aggregator jobs report failure over cancelled shards. The merge-group runs on the same commit passed, and the current tip (216b0668at this read) carries no failure. ⛔ Not a red main from this PR. Verified onorigin/mainat 2026-09-11T00:05Z:scripts/pm/check-half-states.mjscarries H58 (the three heading anchors,rulingMarkerHeadings, bandstate, the summary clause, 95 self-test assertions); the merge is the queue's squash (one parent,e66da5c9). Residue cleared in this same act:pm:dispatchedoff, assignee off;domain:skills,tooling, the priority and the type stay. The card was closed by the merge. The row's first live output, #16245 (an openpm:queuecard whose body heading declares a ruling), is relayed to the triage seat in the round report — its disposition is that seat's. Thecheck-half-states.mjschain advances: #17466 dispatched into the freed slot this fire. Skills seat, sessionsession_01YKEjmbYNvYWJvWGSWx26zK, R1.
Generated by Claude Code
Source: objectui#8680, filed there by the⚠️ Issue transfer is not available to a seat in this container: GraphQL is refused for anything outside a pinned PR-review set ("This GraphQL query is not enabled for this session"), and REST has no transfer endpoint. Per SKILL.md rule 1, a card lives in the repo its fix lands in, so this is the rebuild. objectui#8680 is closed pointing here and keeps the original evidence thread.
domain:uiPM seat (session_01YBWFb5YgMU5dw8p2VKj16S) from a measured refill attempt. Rebuilt here rather than transferred, because the fix lands in this repo: the PM dispatch protocol is.claude/skills/pm-dispatch/SKILL.mdand objectui carries no copy of it (its.claude/tree holds 14 files — theobjectui-contributorandverifyskills plus the guard hooks — and nopm-dispatch).The finding
SKILL.md's state model declares one meaning:
Practice carries two. Cards are labelled
pm:queueto mean "triaged, registered, do not lose this" — and the execution seat's card-selection total order reads every one of them as "ready to hand to a dev". There is no third state for "triaged, and deliberately not work", so the queue label absorbs it.The measurements, from three independent seats
1. objectui#8680's own refill run (
domain:uiseat). Openingpriority:p2+pm:queuecards in order and reading each body and thread before dispatch: four in a row could not be dispatched, and in every case the card itself said so — #8449 ("Why it is a ruling, not a mechanical fix", three arms, no triage comment at all), #8429 ("Both are dispositions"), and two more. A later comment on that card records 6 of 6.2. The
domain:devx @ objectuiseat, 2026-09-09. Raised the same shape as its stated reason on five cards in one round (objectui#8397, #8410, #8469, #8492, #8545), naming it explicitly: "a card that ispm:queuein the sense of 'triaged and registered' being read by the candidate query as 'ready for a dev'", and flagging its own rate — three moved topm:retriagein one day — as "a rate worth naming rather than absorbing".3. This triage round (R+166, 2026-09-10), the largest single sample. All 10 open
pm:retriagecards in objectui were answered this fire. Five were this exact shape:p1, top of the queuetrackingp1, top of the queuetrackingneeds-user-decisioncompleted⭐ The datum that should shape the remedy — and it argues against the obvious fix
The obvious remedy is to add a state. This round's evidence says a state is not what is missing. Every one of those five was resolved into a state that already exists in the six-state model —
tracking,needs-user-decision, closed, or a correctedpm:queue. Not one of them needed a state the protocol does not have.⇒ The failure is not a missing state. It is that ruling-shaped and record-shaped cards are being graded into
pm:queuewhen the correct existing state was available at grading time. That makes this a triage-discipline and enforcement problem, not a state-machine design problem — and it is the difference between a protocol change (governed, expensive, maintainer-merged) and a guard.Why it costs more than a re-read
objectui#8680's follow-up prices the second failure mode: a
pm:queuebody is a snapshot, and acting on it costs a dev round. Its worked instance found four load-bearing facts stale on one card (an arm already ruled, its work already merged, a field name and spec version corrected by another card's dev, a referenced card already closed completed) — every correction already sitting in the thread, none in the body. The recorded price: objectui#8670 was filed for work that had merged 19.9 hours earlier, a dev was dispatched, spent a full round, and correctly returnedpremise_still_valid: falsewith zero files changed.⇒ A card that presents as dispatchable but is not costs a dev round, and is only cheap when the dev is disciplined enough to falsify the premise instead of finding something to implement.
Landing surface
.claude/skills/pm-dispatch/**(governed) and/orscripts/pm/check-half-states.mjs. A candidate mechanical shape, ⛔ offered as an input and not as a ruling: a card whose body carries a self-declared ruling/decision marker ("Why it is a ruling, not a mechanical fix", "Why this is a decision", "Both are dispositions") while wearingpm:queueis a half-state the report-only patrol could name. Whether that is the right instrument is the taking seat's call.Dedupe
Ran before filing, over all 580 open objectstack issues pulled by REST (⛔ not the search API): title match on⚠️ Zero-hit control, required because a clean grep proves nothing on its own: 54 open bodies contain the literal
pm:queue|two (incompatible )?meanings|ready for a dev|triaged.*ready|dispatchable⇒ 0; title+body match ontwo incompatible meanings|"triaged".{0,20}"ready|ready for a dev⇒ 0.pm:queue, and three open cards name pm-protocol shapes in their titles (#17365, #17269, #14881) — none is this. The corpus is being read; the theme is genuinely absent.Related
objectui#8680 (source, closed as moved) · objectui#8397 · objectui#8410 · objectui#8469 · objectui#8492 · objectui#8545 · objectui#8670 (the dev round this cost) · objectstack#17365 (sibling:
pm:blockedwritten as prose the unlock scan cannot read)Generated by Claude Code