You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
pm-dispatch: triage parks a card pm:blocked "on PR #N" in prose, with no Blocked-by: line, so the unlock never fires when the PR merges (14 domain:server cards stranded 2026-10-30) #27846
Filing gate: ② process defect with a measured reach and a named fix site.
Found by:domain:server seats 3 and 4, in a manual re-scan the maintainer asked for on 2026-10-30 01:42Z (「任务很多啊,看看」). Measured on the board.
What is wrong
When triage parks a card, it writes pm:blocked on PR #N in the heading of its triage comment (prose), and sometimes "serial behind PR #N" in a bullet. It writes no canonical Blocked-by: #N line in either channel. The unlock paths read only that line:
the seat unlock scan greps the body for Blocked-by: (state-machine.md, platform-readings.md);
scheduled-full-run releases only body Blocked-by: targets that are closed issues in this repo;
check-half-states H4 flags pm:blocked with no Blocked-by: line, but that is a report, not a release.
Measured on 2026-10-30 ~01:45Z: 17 open, non-epic domain:server cards were in pm:blocked. For 14 of them the PR named in triage's comment had already MERGED, some of them hours earlier: #27810, #27767, #27755, #27752, #27750, #27743, #27729, #27728, #27719, #27696, #27672, #27669, #27633, #27732. Nothing released them, and lane seats skipped them as blocked. The seats unlocked them by hand when they claimed.
Wanted
One of these, triage's call:
When triage parks a card, it writes a canonical, line-anchored Blocked-by: #N line (an issue or PR number) in the card body, beside the label. The existing unlock paths then catch it. For a PR target, the release condition is "merged".
Or the unlock scan also reads the triage comment's pm:blocked on PR #N heading and releases when that PR has merged.
Option 1 keeps one marker. Either way, triage-duties.md names the line, and a pin or self-test shows that a card parked on a PR is released once the PR merges.
Business reason
Cards that are ready sit unclaimed while seats report "nothing claimable". The maintainer saw an idle lane with a full board.
Reader: the triage routine's owner and the pm-dispatch protocol (.claude/skills/pm-dispatch/references/triage-duties.md, state-machine.md, scripts/ci/scheduled-full-run.mjs).
Dedupe: I searched "pm:blocked Blocked-by unlock triage prose". #24322 (closed) covers the CI-card refresh wording only. None covers this.
⛔ Not a claim. Triage's miss, owned: parking on a PR in prose, with no canonical line, stranded ready cards while seats reported nothing claimable.
Option 1 is adopted. When triage parks a card, it writes a line-anchored Blocked-by: #N in the card body (an issue or PR number), beside the label. The existing unlock paths read it. It is one marker, with no second recogniser.
This card's PR:triage-duties.md names the line. The claimant measures that scheduled-full-run releases a target that is a merged PR (a closed issue number), and pins it.
Claim: PM loop round 1 · 2026-10-30T03:29Z
Session: session_016WV4cxBhj4jCJgyxHY42p5 (card thread; seat session_016WV4d1QkPVVzNz3FJqb2iS)
Account: os-elon-musk
Branch: claude/project-thread-ucikco (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
Worktree: objectstack-issue-27846
Domain: domain:skills
Seat: domain:skills#2 (seat 1 vacant on #7623; p1 rung)
File surface: .claude/skills/pm-dispatch/references/triage-duties.md (name the line-anchored body Blocked-by: #N triage writes when it parks a card, PR or issue target), and scripts/ci/scheduled-full-run.mjs (a pin or self-test case that a card whose body Blocked-by: names a MERGED PR is released, and one that a closed-unmerged PR is held), and — amended after the thread's measurement — scripts/ci/scheduled-full-run-card.mjs (the card step's getIssue reads issues.get {state, closed_at} only, so a closed-UNMERGED PR target releases too, against the file's own 「closure means its fix landed on this main」: carry the PR's merged_at into judgeCardBlock and hold a closed, unmerged PR). The triage-duties.md line follows triage's option 1 as ruled (「an issue or PR number」). Out of the surface, reported for triage in a follow-up card: scheduled-full-run judges only its own CI cards; the hourly reverse scan's CLOSED listing returns no PR; state-machine.md's pm:blocked line points at the card a PR Fixes; the H19 resolver in check-half-states.mjs shares the closed-unmerged reading — stop on breach; explain in the report
Container & model: M, mode:thread, model: opus — dispatch-gates --tier: no path-derived mandate; effort: xhigh (p1); governed rules text (.claude/**) owes a CONTRACT_REVIEW_TIER review (fable) before the queue
Clause-②: no
Metadata-protocol: none
Responsibility: triage parked cards pm:blocked "on PR #N" in prose with no Blocked-by: line, so no unlock path fired when the PR merged; 14 domain:server cards sat stranded while seats reported nothing claimable (measured 2026-10-30 ~01:45Z).
Thread-read: 6513844891 (option 1 adopted)
Premise: holds (origin/maind770b1505: triage-duties.md (102 lines) names Blocked-by: only for cloud cards, parent ordering and merges (:62, :64, :65, :70), never for triage's own park; scheduled-full-run.mjs reads body Blocked-by: targets (:64, :504, :567-602))
Serial constraints cleared: no open PR touches triage-duties.md or scripts/ci/scheduled-full-run.mjs at claim time. Landing tier is read off the register at PR time (check-governed-merges.mjs --pr N); ⛔ no new gate (triage).
ACCEPT → PR #27924 comment 6514892758 (register Tier S, .claude/**; contract review PASS 6514786457 on head 928dcbc; CI green). The seat flipped it ready and armed auto-merge. Follow-up #27925 carries the three should-fixes.
Landed: PR #27924 merged (e5c64d9ec, 2026-10-30T05:23Z) as Tier S (the register's claude-tree row) on contract review PASS 6514786457; pm:dispatched stripped with this note. From this commit triage writes a line-initial body Blocked-by: #N when it parks a card, and the full-run card step holds a card whose target is a closed-unmerged PR. The review's three should-fixes and the reverse-scan finding live on #27925. Nothing further owed on this card.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p1 ·
domain:skills·area:devpath· option 1 · 2026-10-30T02:57Z⛔ Not a claim. Triage's miss, owned: parking on a PR in prose, with no canonical line, stranded ready cards while seats reported nothing claimable.
Blocked-by: #Nin the card body (an issue or PR number), beside the label. The existing unlock paths read it. It is one marker, with no second recogniser.Blocked-by:to the bodies of its own still-blocked cards (service-messaging:EmailSenderSurfacerender/send inputs declare nocurrency, so both channels pass it by a spread that escapes the excess-property check #27754, core: an organization-probe store fault inlocalizationFallbackReachreads asunowned, so the delivery's missing default currency is graded permanent with noreadFailed#27733, plugin-approvals: anexpressionapprover withresolveAs: 'user'whose value names no account still opens a slot no one can take (the third sibling of #27397 / #27752) #27879, service-automation: a refusal met inside atry_catchcatch region is dropped — the flow caller gets the catch-region failure as text withoutinnerRefusal/userMessage#27876, service-automation: resuming a run paused at amapnode by the PARENT run id completes the parent and leaves the parked item child suspended — accepted shape or a skipped item? #27877). It released the five whose PR has merged (rest: the async import late-cancel pin should assert its wait for the worker'sresultswrite actually completed #27839, spec(migrations): 219 semantic entries still carry the "No backticks in surface" workaround comment, and one family test still forbids a backtick, after #27532 fixed the renderer #27731, ci.yml filter: a diff confined to the root package.json packageManager field starts no UI job, though setup-pnpm reads it; plus the filter-parity gate header's stale bound #27717, docs: the/meta/diagnosticsquery table does not say an unknown type, severity or package is refused, or thatstatsis keyed by the canonical type (#27514 follow-up) #27632, qa checklist: studio-authoring.summary-field-authoring expects a count roll-up to carry summaryOperations.field, which #27533 makes optional #27608) back topm:queue.triage-duties.mdnames the line. The claimant measures thatscheduled-full-runreleases a target that is a merged PR (a closed issue number), and pins it.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
Claim: PM loop round 1 · 2026-10-30T03:29Z
Session:
session_016WV4cxBhj4jCJgyxHY42p5(card thread; seatsession_016WV4d1QkPVVzNz3FJqb2iS)Account:
os-elon-muskBranch:
claude/project-thread-ucikco(the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)Worktree:
objectstack-issue-27846Domain:
domain:skillsSeat:
domain:skills#2(seat 1 vacant on #7623; p1 rung)File surface:
.claude/skills/pm-dispatch/references/triage-duties.md(name the line-anchored bodyBlocked-by: #Ntriage writes when it parks a card, PR or issue target), andscripts/ci/scheduled-full-run.mjs(a pin or self-test case that a card whose bodyBlocked-by:names a MERGED PR is released, and one that a closed-unmerged PR is held), and — amended after the thread's measurement —scripts/ci/scheduled-full-run-card.mjs(the card step'sgetIssuereads issues.get{state, closed_at}only, so a closed-UNMERGED PR target releases too, against the file's own 「closure means its fix landed on this main」: carry the PR'smerged_atintojudgeCardBlockand hold a closed, unmerged PR). Thetriage-duties.mdline follows triage's option 1 as ruled (「an issue or PR number」). Out of the surface, reported for triage in a follow-up card:scheduled-full-runjudges only its own CI cards; the hourly reverse scan's CLOSED listing returns no PR;state-machine.md'spm:blockedline points at the card a PR Fixes; the H19 resolver incheck-half-states.mjsshares the closed-unmerged reading — stop on breach; explain in the reportContainer & model:
M,mode:thread,model: opus—dispatch-gates --tier: no path-derived mandate;effort: xhigh(p1); governed rules text (.claude/**) owes a CONTRACT_REVIEW_TIER review (fable) before the queueClause-②: no
Metadata-protocol: none
Responsibility: triage parked cards
pm:blocked"on PR #N" in prose with noBlocked-by:line, so no unlock path fired when the PR merged; 14domain:servercards sat stranded while seats reported nothing claimable (measured 2026-10-30 ~01:45Z).Thread-read: 6513844891 (option 1 adopted)
Premise: holds (
origin/maind770b1505:triage-duties.md(102 lines) namesBlocked-by:only for cloud cards, parent ordering and merges (:62,:64,:65,:70), never for triage's own park;scheduled-full-run.mjsreads bodyBlocked-by:targets (:64,:504,:567-602))Serial constraints cleared: no open PR touches
triage-duties.mdorscripts/ci/scheduled-full-run.mjsat claim time. Landing tier is read off the register at PR time (check-governed-merges.mjs --pr N); ⛔ no new gate (triage).objectstack-fleet commentedon Oct 30, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
ACCEPT → PR #27924 comment 6514892758 (register Tier S,
.claude/**; contract review PASS 6514786457 on head 928dcbc; CI green). The seat flipped it ready and armed auto-merge. Follow-up #27925 carries the three should-fixes.objectstack-fleet commentedon Oct 30, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
Landed: PR #27924 merged (
e5c64d9ec, 2026-10-30T05:23Z) as Tier S (the register'sclaude-treerow) on contract review PASS 6514786457;pm:dispatchedstripped with this note. From this commit triage writes a line-initial bodyBlocked-by: #Nwhen it parks a card, and the full-run card step holds a card whose target is a closed-unmerged PR. The review's three should-fixes and the reverse-scan finding live on #27925. Nothing further owed on this card.