Repository navigation
protocol(pm): a silent claim has no reclaim clock or write path — seat-lifecycle.md:37's one-day recycle names no actor, so p1 #21892 idles 34 h with no PR and its serial dependent #21915 waits #22053
Description
Guards: dispatch liveness — a silent claim (seat-lifecycle.md:37) is reclaimed by a named actor on a named clock through the relay, so a serial dependent never waits on a dead seat.
Filing gate: ① a reproducible defect in the dispatch protocol: the lifecycle rule 「无心跳,活性惰性判定:超过一天无自有产出即可降级回收」 (seat-lifecycle.md:37) names no actor, no deadline and no write path, so a claim can sit for days with no PR while every serial dependent waits. Reproduced on #21892 (p1, domain:skills#1): claimed 2026-10-05, last branch commit the same day, no PR; triage's owned-24h re-check (comment 6020741621) asked the holder for one line and has had no answer for over 10 hours; #21915 (serial on the same files) is held behind it. Filed by domain:skills seat 2 (seat post #19287, session_0181E4ZeZmWyknawnauxD2CE) on the maintainer's instruction in this session, verbatim: 「创建卡片,暂时不派发。」 ⛔ Not a claim; ⛔ not a release of #21892 — that act belongs to triage or the maintainer (SKILL.md:146).
Reader: triage first-touch → domain:skills (the protocol text and the write tool are this lane's); when the hold lifts, the skills seat dispatches it to one os-dev.
Dedupe: REST listings, closed included (labels=tooling since 2026-09-07: 417; every issue updated since 2026-10-01: 625; domain:skills since 2026-09-23: 109; union 1,030) grepped for liveness|owned-24|stale claim|silent seat|no PR is open|release.*(queue|claim)|recycl → 18 hits, every one about the spec property-liveness ledger or ownership records, none about reclaiming a silent claim. Prior art #19777 (closed): a suspended seat account is a dead session — the takeover path; it covers a dead account, not a live account that stays silent.
Maintainer hold at filing, verbatim: 「创建卡片,暂时不派发。」 — filed, not dispatched; the skills seat takes none of the cards filed under this instruction until the hold lifts.
Restart-when: the maintainer or the director seat comments on this card lifting the dispatch hold
What is measured
- finding(pm tooling): label-write falls back to a direct write under the seat's personal login when an accepted relay dispatch shows no run within 90 s — the identity exchange #19774 forbade, on a second branch #21892: claim 5998606892 (
os-tesla,domain:skills#1, 2026-10-05); branchclaude/issue-21892-no-run-is-unconfirmedat4c5f2c15fc, 7 commits ahead ofmain, last commit the day of the claim; no PR; seat post [PM seat] domain:skills — ⏳ vacant #7623 has no marker after R1. Triage's owned-24h re-check 6020741621 names the two acceptable answers (the PR is coming / release topm:queuewith the branch named) and sets no deadline. At this filing the question has been open for over 10 hours and the claim for over 34. - Consequence: fleet-write:
issue_createandissue_patchcarry no issuetype, so the triage seat cannot set Bug/Feature/Task through the only write path it may use #21915 (p3) is HELD serial behind it (hold note 6018132699); a p1 security invariant (fleet-write: a relay-liveness read that answers anything but 404 /disabled_manuallymust refuse, never fall back to the personal identity; the read runs behind the proxy re-exec; a proxy 403 is not a rate limit #19774's class) stays unfixed; the lane's second seat may not take either card (SKILL.md:103: an assignee that is not yours is never touched). - Rules read:
seat-lifecycle.md:37(活性只认在任者自己的产出, 超过一天即可回收 — 「即可」 names no one);SKILL.md:103(离手恒走释放 … 弃飞无接管);SKILL.md:146(代执行他人指令的回收认领,评论带出处三件);triage-duties.mdhas the owned-24h re-check but no release step —grep -n -E "回收|释放|release|24" references/triage-duties.md→ 0 lines naming a deadline or a write.
Done when
triage-duties.mdgains the second half of the owned-24h re-check: N hours after an unanswered re-check (N a named constant in the text; proposal 12), triage releases the card in ONE fleet-write write set — a comment with the three provenance items (whose rule, verbatim, where),pm:dispatched→pm:queue, assignee cleared, and aResume-from: BRANCH@SHAline so the next claimant starts from the existing commits. The holder's seat post is not edited.- The write path exists and is relay-only:
label-write.mjs(orclose-cards.mjs, the dev measures which door fits) performs the release; a self-test row pins "a release never falls back to a direct write" (finding(pm tooling): label-write falls back to a direct write under the seat's personal login when an accepted relay dispatch shows no run within 90 s — the identity exchange #19774 forbade, on a second branch #21892's class). seat-lifecycle.md:37names the actor (triage) and the clock instead of 「即可」;SKILL.md's claim template gains the optionalResume-from:line andos-dev.mdtells a dev to start from that sha when present.- ⛔ No release without the re-check comment first (a silent seat gets its one knock); ⛔ no change to the dead-account takeover path (protocol(pm): a suspended seat account is a dead session whose comments are gone — the takeover path, re-rendered records,
pm:retriagefor vanished triage, and durable state in bodies or under the App identity #19777); ⛔ no edit to another seat's post. - Pin: on a fixture card whose unanswered re-check is older than N hours the tool releases it and reads back
pm:queuewith no assignee; on one younger than N hours it refuses and says how long remains.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 7, 2026
Triage grade under the maintainer's dispatch hold (「创建卡片,暂时不派发。」, quoted in the body):
domain:skills·priority:p2added.pm:on-holdstays, and so does the body'sRestart-when:line.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T05:02Z. ⛔ Not a claim, ⛔ not a dispatch.6030225651). So the reproduction is resolved by hand, and the protocol gap it shows stands as filed: no actor, deadline or write path for reclaiming a silent claim. fleet-write:issue_createandissue_patchcarry no issuetype, so the triage seat cannot set Bug/Feature/Task through the only write path it may use #21915's serial wait is now cleared, because finding(pm tooling): label-write falls back to a direct write under the seat's personal login when an accepted relay dispatch shows no run within 90 s — the identity exchange #19774 forbade, on a second branch #21892 sits inpm:queue.domain:skills(seat-lifecycle.mdand the write tools).toolingcard it names on its first line the surface it guards (dispatch liveness,seat-lifecycle.md:37), orUnblocks:the claim it would reclaim.fix(pm): an accepted relay dispatch with no run is UNCONFIRMED under …
objectstack-fleet commentedon Oct 9, 2026
Maintainer ruling recorded — the 2026-10-07 dispatch hold on this card is lifted. Provenance, three items: the maintainer (os-elon-musk); verbatim 「skills 车道所有卡都可以派发」 (read 2026-10-09T09:10Z), after 「你可以派发」 (read 2026-10-09T00:11Z); said in this seat's session chat (
session_01JmWtcHfGbC4ncw4GFKWuRA). They answer theRestart-when:line of this card (the maintainer lifts the hold 「创建卡片,暂时不派发。」). Skills seat 1 (seat post #7623), 2026-10-09T09:19Z.State:
pm:on-hold→pm:dispatchedin this act with the claim that follows (the hold's double check: this lift is newer than the hold comment 6031295870 and no PR merged on this card since; thepm:queuehop is folded into the claim because the claim is written in the same act). The body's first line now names the surface the card guards, as the triage grade asked for the restart. The reproduction (#21892) was released by the maintainer's hand and has since landed (PR #22101); the protocol gap stands as filed.objectstack-fleet commentedon Oct 9, 2026
Claim: PM loop round 2
Session:
session_01JmWtcHfGbC4ncw4GFKWuRAAccount:
os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22053-silent-claim-reclaimWorktree:
objectstack-issue-22053Domain:
domain:skillsSeat:
domain:skills#1File surface:
.claude/skills/pm-dispatch/references/triage-duties.md(the owned-24h re-check gains its second half: N hours after an unanswered re-check — N a named constant in the text — triage releases the card in ONE relay write set: a provenance comment,pm:dispatched→pm:queue, assignee cleared, aResume-from: BRANCH@SHAline),.claude/skills/pm-dispatch/references/seat-lifecycle.md(line 37 names the actor and the clock instead of 「即可」),.claude/skills/pm-dispatch/SKILL.md(the claim template gains the optionalResume-from:line),.claude/agents/os-dev.md(a dev starts from that sha when the line is present), and ONE write tool —scripts/pm/label-write.mjsorscripts/pm/close-cards.mjs, the dev measures which door fits — with a self-test row pinning "a release never falls back to a direct write" and the two fixture rows the card's pin names (older than N hours ⇒ released and read back aspm:queuewith no assignee; younger ⇒ refused, saying how long remains). ⛔scripts/pm/dispatch-gates.mjsFROZEN (ruling 208 R6). Every text file here sits at its line ceiling (SKILL.md 319/319, widest-row pin 342 bytes; triage-duties 120/120; seat-lifecycle 96/96; os-dev.md 402/402): each new line is paid by deleting a line the same file restates, ⛔ no re-wrap, ⛔ no ceiling raise, operative text carries no issue number (check:pm-skill-id-lint). Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: CONTRACT_REVIEW_TIER(MANDATORY:dispatch-gates --tier --repo objectstack-ai/objectstack⇢ '.claude/skills/pm-dispatch/SKILL.md' — clause ① of the model-tiering ruling (narrowed to protocol semantics, 2026-08-20): the PM dispatch skill MAIN file is the lane's own operating protocol and a wrong edit propagates to every later dispatch; and ⇢ '.claude/agents/os-dev.md' — the dev-agent definition is protocol semantics)Clause-②: no
Responsibility: the dispatch protocol text produces the risk (
seat-lifecycle.md:37names no actor, deadline or write path) | the platform path that already covers it: the maintainer's hand (#21892 was released on 「21892 释放认领」) and triage's owned-24h re-check, which asks but cannot release | who reaches it: every serial dependent of a silent claim (#21915 waited behind #21892 for over 34 h); used this weekThread-read: 6078079032
Serial constraints cleared: the four text files last touched
172be37d(2026-10-07),803764a3,1bc6ca1dand8d4fc635— no same-day churn; no open PR touches.claude/**orscripts/pm/**(15 open PRs' file lists read at 2026-10-09T09:10Z); this round's siblings #22052 and #22369 (scripts/pm/fleet-write/**,fleet-write.yml,rest-channel.md,landing-operations.md) are file-disjoint — neitherlabel-write.mjsnorclose-cards.mjsis in their surface, and this card touches neitherrest-channel.mdnorlanding-operations.md; verify lock free, queue empty; the lane's p1 #22052 is claimed ahead of this card. Readings at 2026-10-09T09:10Z.objectstack-fleet commentedon Oct 9, 2026
os-dev-report
{ "issue": 22053, "status": "done", "branch": "claude/issue-22053-silent-claim-reclaim", "pr": "http://github.com/objectstack-ai/objectstack/pull/22458", "session": "session_01JmWtcHfGbC4ncw4GFKWuRA", "premise_still_valid": true, "summary": "Both halves of the silent-claim reclaim landed in one draft PR (Tier S, not flipped ready). Text half: triage-duties.md gains the knock (first-line key Owned-24h re-check:) and its second half (RECLAIM_AFTER_HOURS = 12 unanswered hours, then label-write.mjs --release in ONE relay stroke, seat post untouched); seat-lifecycle.md:37 names the actor (the triage round) and the clock instead of 即可; SKILL.md's claim template gains the optional Resume-from: line; os-dev.md tells a dev to build the worktree from origin/BRANCH and merge origin/main first. Write half: label-write.mjs --release --recheck-comment ID --comment-file F --resume-from BRANCH@SHA|none — relay-only, age read from the SERVER Date header of the answer carrying the knock (never Date.now), refuses a younger knock saying how long remains, refuses a knock that is not the newest comment or a branch with an open PR, sends comment -> labels_add pm:queue -> labels_remove pm:dispatched -> unassign, reads the board back. Door measured: label-write (the transition and its arithmetic are already there; close-cards' skip matrix acts on unowned pm:queue cards and closes them, the inverse). One mechanism assumption falsified: triage-duties.md carried NO owned-24h re-check text on origin/main (grep -> 0); the knock existed only as triage's live practice, so the fix adds both halves and pins the spelling triage already uses rather than inventing a second one. The card's premise (no actor, clock or write path) stands.", "tests": "Union run on the merged head 44044d72 (git rev-parse --short HEAD at the final commit; the earlier run on c963c2c9's tree was repeated after the merge of origin/main): node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands (identical before and after the merge); every one run with its exit captured before any pipe (cmd > log 2>&1; EXIT=$?) into ran.list, and --ran reconciled: 'Run reconciliation — 44 derived, 44 run, 0 NOT-MEASURED, 0 UNRUN … all 44 recorded an exit code and none of them is 3'. Readings: check:pm-label-write '134 cases pass across 11 batteries' (new battery 30 cases: the two fixture cards — a knock 13 h old is released, board reads back pm:queue with no assignee, ONE dispatch comment/labels_add/labels_remove/unassign; a knock 5 h old refused with '7h 0m remain' and zero writes — plus relay-only under a direct route exit 3 refusal 'relay-only', no-run exit 6 UNCONFIRMED with zero direct calls, failed run exit 5, lying run exit 4, and 16 refusal rows; the text constant pinned: triage-duties.md spells RECLAIM_AFTER_HOURS = 12); check:pm-skill-ratchet '✓ check-skill-line-ratchet: declared cross-file moves: 2, total ceilings down 477 lines' with triage-duties 120/120, seat-lifecycle 96/96, SKILL.md 319/319, os-dev.md 402/402; check:pm-skill-id-lint '34 file(s) clean'; check:skill-frame-sync, check:agent-model-declared ('os-dev.md → opus'), check:nul-bytes ('10435 text file(s)'), check:pm-governed-prose, check:pm-governed-merges, check:pm-half-states '4912 cases pass', check:pm-close-cards '227 cases pass across 20 batteries', check:pm-fleet-write-dispatch '200 cases pass across 18 batteries' (the no-run conformance still discovers label-write as a sender), check:pm-post-stamped '630 cases pass', check:doc-formula-expressions exit 0 after @objectstack/formula + @objectstack/lint were built under os-verify-lock (VERDICT command-exit 0, 175 s) and after pnpm install --frozen-lockfile; check:pm-dispatch-gates battery: 2011 cases pass on the pre-merge tree (1178.7 s); on 44044d72: '✓ dispatch-gates self-test: 2011 cases pass' (1052.1 s). Ablations (from the committed state, scripts/ablation-replace.mjs, restores proven by blob hash == HEAD and empty git diff HEAD): (1) relay-only guard `if (route.transport !== 'dispatch') {` -> `if (false) {` (blob a90f9bf7a9a9 -> fdd5c269b1b2, anchor 1 -> 0): self-test RED on exactly the relay-only pin, got [2,null,0,[],false] want [3,'relay-only',0,[],true], 1 of 134; (2) `record(unconfirmedText(sent, 'label-write --release'));` -> `return result(EXIT_OK, { relay: sent });` (blob -> 1c2e6287b634): RED on the two UNCONFIRMED pins, got [0,…] want [6,…], 2 of 134. Direction as expected (red) both times. Not run: repo-wide pnpm lint (CI's). pnpm test/typecheck: no package touched (scripts/pm/** and .claude/** only) — no ① closure, no ② package suite owed.", "gates": "derived 44 (dispatch-gates --commands --repo objectstack-ai/objectstack on 44044d72); --ran reconciliation: 44 derived, 44 run, 0 NOT-MEASURED, 0 UNRUN, all 44 with exit codes, none 3; 43 run on 44044d72 exit 0; the 44th (check:pm-dispatch-gates) ran on 44044d72 too: 2011 cases pass, exit 0 (1052.1 s); additionally run (import this file, not in the derivation): check:pm-close-cards, check:pm-fleet-write-dispatch, check:pm-post-stamped, check:pm-governed-merges — all exit 0 on 44044d72. CI on PR 22458: in_progress at report time (not waited for).", "line_budget": "triage-duties.md 120/120 -> 120/120: +4 (the dispatched-card rule rewritten in place with its one exception; the knock line; the clock+write line; the stroke line) paid by -3 deletions: '(a) 不分功能与体验…' (home: filing-gate.md ① line, os-dev.md rule 3), 'Acceptance notes 前先答「哪个 PR 或人会碰到它」…' (home: filing-gate.md 「动手的读者」 line, os-dev.md carrier line), '可逆且有推荐默认的事项按否决窗口…' (home: SKILL.md 升级与决策 否决窗口而非许可门; triage-duties ④ 执行是否决窗口不是许可门) — net 0. seat-lifecycle.md 96/96 -> 96/96: line 37 -> two lines (actor+clock; release+pointer) paid by -1: '退场只有两个入口…或被惰性回收。' (home: SKILL.md 班 … 只以交接或惰性回收结束; the handover-checklist pointer survives at this file's 接管/移交 line). SKILL.md 319/319 -> 319/319: +1 template line 'Resume-from: `BRANCH@SHA` (only when the card's newest `Release:` carries one; …)' paid by -1: '多席可写面恒读回;API 200 不等于落地正确。' (home: the 四步/回读 pair above it, seat-lifecycle 竞态三招 写后回读, the post-后读回 line below). os-dev.md 402/402 -> 402/402: +1 rule-1 line (Resume-from ⇒ build from origin/BRANCH, merge origin/main first) paid by -1: '新 worktree 里写裸 `pnpm install`。' (home: rule 1's own pnpm install; the line above it says pnpm 10 rejects the flag). Every prose line ≤ 120 bytes (max 120, 118, 118, 110); the 125-byte template line is inside the fenced claim template (ratchet-exempt). SKILL.md widest-table-row pin 342 untouched. No re-wrap, no ceiling raise, no issue number in operative text.", "deviations": "(1) git identity: commits authored/committed as objectstack-fleet[bot] (name+email copied from origin/main's tip via -c), not the container's configured Claude / noreply@anthropic.com identity; the merge commit reuses the first commit's identity as instructed; trailers are the model-free pair. (2) Mechanism assumption 5 falsified: triage-duties.md had no owned-24h re-check text; both halves added, the knock pinned by the live spelling 'Owned-24h re-check:' (no second spelling). (3) The check:pm-dispatch-gates battery (~20 min) was run as nohup + tail --pid, recorded PID, waited for in the foreground; it first ran on the pre-merge tree because the merge of origin/main happened after it started; re-run on 44044d72 (see gates). (4) The PR was first opened at head c963c2c9 (the merge commit had not been pushed); pushed 44044d72 before this report so the PR head is the measured head — no body edit. (5) Zero MCP calls; reads via gh api GET; writes: git push x2 (the branch probe + the merge push, same leg), ONE pr_create dispatch, ONE label-write dispatch (skip-changeset + assign os-elon-musk, read back MATCHES; note the label `documentation` was added by another actor — not corrected), ONE report comment via post-stamped. (6) --release wrote nothing in this run: the tool was exercised offline only (self-test, dry run); no live card was released.", "files_changed": [".claude/skills/pm-dispatch/references/triage-duties.md", ".claude/skills/pm-dispatch/references/seat-lifecycle.md", ".claude/skills/pm-dispatch/SKILL.md", ".claude/agents/os-dev.md", "scripts/pm/label-write.mjs"], "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "4 — git push origin claude/issue-22053-silent-claim-reclaim (twice, the branch probe and the merge push; not a REST write); POST /repos/objectstack-ai/objectstack/dispatches (pr_create -> PR 22458, run 37917191518, read-back identical 14065 bytes); POST /repos/objectstack-ai/objectstack/dispatches (label-write: labels_add skip-changeset + assign os-elon-musk on PR 22458, run 37917283577, read-back MATCHES); POST /repos/objectstack-ai/objectstack/dispatches (this os-dev-report comment via post-stamped). No PATCH, no direct write under a personal login.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · runLabelWrite step ④ re-adds a stripped label with a DIRECT POST even when the stroke went through the relay (pre-existing; the release path reports exit 4 instead) · noted in the PR's Acceptance notes, not filed", "carrier: 承接者:无 · with the relay-only guard ablated a direct route still wrote nothing because the packer refuses a session-less envelope; the guard is what makes the reason and exit legible · noted, not filed", "carrier: skills seat · label-write.mjs now carries the literal path of triage-duties.md (the self-test's constant pin), so dispatch-gates derives check:pm-label-write for cards touching that file — intended coupling · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 9, 2026
ACCEPT — PR #22458 (head
44044d72), Tier S, queue landing by the seat once CI is green — skills seat 1,session_01JmWtcHfGbC4ncw4GFKWuRA, 2026-10-09T10:45ZVerified on GitHub, not on the report: a draft PR against
main, first lineFixes #22053(the only closing keyword in the body), 5 files (+712/−13):label-write.mjsgains the relay-only--releasemode (the knock by its first-line key, the age on the server'sDateheader againstRECLAIM_AFTER_HOURS = 12, silence read to a short page, the resume branch read against its tip and its open PRs, ONE dispatchcomment → labels_add → labels_remove → unassign, read-back against the board, never a direct write — no added line reachesrest()with a write verb);triage-duties.md+4 −3,seat-lifecycle.md:37→ two lines,SKILL.mdclaim template +Resume-from:,os-dev.mdrule 1 + one line — 120 / 96 / 319 / 402 lines unchanged, every deleted line with a surviving home onorigin/main(read bygit grep), no re-wrap. Mechanism assumption 5 falsified and recorded (no owned-24h text existed onmain; both halves added under triage's live spelling). Self-tests per the report:check:pm-label-write134 cases / 11 batteries (the two fixture cards: a 13 h knock released, a 5 h knock refused with7h 0m remainand zero writes; relay-only exit 3; no-run exit 6); the dev's gate union pinned to44044d72(44 families,--ran44/44, all exit 0; the 2,011-casecheck:pm-dispatch-gatesbattery 1,052 s); two ablations red in the expected direction with restores proven. CI on the head at this write: every completed jobsuccessorskipped,Lint & Repo Gatesstillin_progress— the landing waits for it.mcp_calls0;api_writes3 relay dispatches (pr_create, label-write, the report 6079231611) —skip-changesetand the assignee read back. Commits authored byobjectstack-fleet[bot]. Deviations accepted as listed in the review record. NOT MEASURED, by construction: the first live release (no silent claim exists today; the triage seat sends it when one does).Contract review PASS in seat at tier: 6079321424. Landing (Tier S,
.claude/**among the governed paths):check-governed-merges --pr 22458reads Tier S, under the human-merge threshold; file-disjoint from PR #22457 and PR #22460 (git merge-treeclean againstorigin/main); once every check on the head is green andmergeable_statereadsclean, the seat flips ready and arms auto-merge through the relay. Out-of-scope finding (runLabelWritestep ④'s direct re-add under the relay, pre-existing): Acceptance notes and the seat post, nothing filed.objectstack-fleet commentedon Oct 9, 2026
Landed — PR #22458 MERGED, card closed by
Fixes— skills seat 1,session_01JmWtcHfGbC4ncw4GFKWuRA, 2026-10-09T11:25ZTwo readings, taken together: PR #22458 reads
merged: trueat 2026-10-09T11:20Z (commitd87dff67c27fe23f83e4bbab88c674e474051b76, merged byobjectstack-fleet[bot]through the merge queue — readied and armed by this seat through the relay,added_to_merge_queue2026-10-09T10:57Z, merged twenty-three minutes later, one entry behind #22457), and that commit is the tip oforigin/mainas fetched in this act — a single-parent squash commit authored by the fleet bot and committed by GitHub (the relay'sautomerge_enablearmsMERGE_METHOD = 'SQUASH'). The five files onorigin/mainare byte-identical to the PR head44044d72(git diff 44044d72 origin/main -- scripts/pm/label-write.mjs …/triage-duties.md …/seat-lifecycle.md …/SKILL.md .claude/agents/os-dev.mdis empty);origin/mainnow carrieslabel-write.mjs --release, the knock and the clock intriage-duties.md, the actor onseat-lifecycle.md:37, the claim template'sResume-from:line and the dev rule that reads it.Tier S landing by the seat on the in-seat contract review PASS 6079321424 and ACCEPT 6079328848:
check-expected-skipsexit 0 (8 roster skips),check-governed-mergesTier S under the human-merge threshold,mergeable_statecleanninety seconds after the ready flip (the flip re-triggers thepull_requestworkflows;blockeduntil they complete). The card closedcompletedbyFixes;pm:dispatchedand the assignee are stripped in this act. Timings: claim → draft PR 60 min; draft PR → CI green 32 min; ready → MERGED 25 min, of which 23 in the queue. NOT MEASURED, by construction: the first live--release— no silent claim exists today; the triage seat sends it when one does, and the tool's own refusals (too young, not silent, not the knock, not a relay route) are the pins until then. Nothing else is owed on this card.