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
⚠️This post is the RECORD of state, not the state. Every round, re-read the labels. Never read the counts here as current.
📌 Job description is versioned at .claude/skills/pm-dispatch/references/lanes/engine.md. ⛔ Not hand-copied per term.
1. Current PM
🟢 session session_01LZbWd2jNV1FErXTPSS4Dry · seated 2026-08-27T08:00Z via /pm-dispatch engine.
Predecessor: os-warren (session_01W6HFzyH98W1YaQXhJUJt6o), shift-close 5434298660 at 04:15:25Z.
Round-mutex: CLEAR. All four reads clear — most recent shift-close 04:15:25Z, ~3h45m before fire; no round-open marker after it; newest non-self Claim: on a lane pm:dispatched card older than one round. Marker 5436143969.
⛔ That marker comment states the opposite and is WRONG — corrected here, and the correction is the load-bearing part. This container's clock read 04:19:22Z at fire; GitHub stamped the same write 08:00:52Z. On the bad clock the shift-close looked 4 minutes old, so I reported a mutex violation, recommended standing down, and seated only on a maintainer override. There was nothing to override. A clock is a reading like any other — §6's rule applied to date from the start and I did not apply it. Detected only because a PR timestamp read later than "now". ⇒ Timestamps come from the GitHub object, never from container date.
Body compressed on takeover (standard step, and it clears patrol H6 — the inherited body was 12.9 KB against a ~10 KB bound). Nothing discarded: the predecessor's full 8-section body is in the revision history.
✅ Closed — PR #12596 merged 05:13:52Z (auto-merge armed by the predecessor fired after a skills-seat patch round cleared the debt-ledger red). Landed before I seated.
⚠️Stale dispatch. Card untouched since 2026-08-26T04:49Z; its work lives on PR #12491, untouched since 2026-08-26T05:29Z (~26h). Probe/reclaim this round.
⚠️Two probe traps hit at seating, both recorded because the naive reading was wrong in opposite directions:
git ls-remote refs/heads/claude/issue-12457* → EMPTY with a firing positive control (294 claude/ branches). That is not a dead claim: 缺陷:Setup 导航缺「Packaged automation」入口 —— objectui 页面已合并,framework nav contribution 从未落地(ADR-0126 §7.4,验收卡 A1 必失败) #12457's work sits on claude/new-session-3qgti9, which the issue-number glob cannot see. ⛔ The branch-name probe only answers for branches that followed the convention. Cross-check the PR list by issue reference before calling any claim dead.
34/34 checks green; contract review PASS by the skills seat at CONTRACT_REVIEW_TIER; Governed Surface Queue Guard green at 07:50Z ⇒ not a governed surface. ⚠️ Undrafted by a third party between 06:23Z and 07:50Z — its dev's own report says "PR left draft". Accepted and enqueued by this seat; the cluster: false registration question is filed separately rather than blocking a ruled, green, reviewed PR.
✅ RULED and closed 2026-08-25 — option C, plus pgnative into the Postgres family. ⛔ The inherited §3 carried this as "STILL OPEN, awaiting a letter"; it had been ruled two days earlier. Same shape as §6's dissolved-ruling trap: a citation is not a reading.
3
Fable 5 quota
Measured recovered last term. ⛔ Standing exemption (maintainer 2026-08-13): 「fable 如果用完了,可以用 opus」. ⛔ NEVER re-dispatch a clause ② card below CONTRACT_REVIEW_TIER for throughput.
4. Work at risk
None held by this seat. PM writes no files.
5. Hot-file serial queue
packages/drivers/driver-sql/src/sql-driver.ts
🚨 No CI gate backs this queue.scripts/check-single-claim-paths.mjs declares exactly one path — .objectui-sha — and its header explains why a repo-wide diff-intersection key is unusable (68 false-positive pairs per 300 PRs). ⇒ two green PRs on this file are still a collision. The serial criterion is this seat's to enforce.
Queue occupants: #12017, #12121, #12593 (+ #12586 on driver-turso, separate file). ⛔ Regions UNMEASURED — measure by symbol grep on origin/main, never by prose and never by a card's cited line numbers.
⚠️Traps: three ORDER BY ORDINAL_POSITION occurrences — match on the enclosing method, never the literal. A card citing line ~1958 was citing a commit SHA read as a line number. ⚠️pm:on-hold#8740 and #6009 live in this file but declare restart conditions on symbols — ordinary dispatch does not wake them.
packages/spec/** belongs to the spec seat. ⛔ Engine cards touching it get transferred, not dispatched here.
fold-or-serial
Serial criterion is same FILE, not same package; regions come from diffs and symbol grep, never prose. Parallel work is permitted only at measured, disjoint method-level regions.
6. Readings that must never be taken on faith
⛔ Timestamps come from the GitHub object, never from container date — this container's clock was ~3h41m slow at fire and produced a false mutex violation (§1).
🚨 This checkout is SHALLOW. PR heads with no merge base make git diff origin/main...pr/N answer an empty diff — exit 0, no warning — and the two-dot fallback answers main's own churn. Measure through the API (pull_request_read get_files). Symptom: unrelated PRs reporting identical file lists.
⛔ A zero-hit is not a reading until a positive control fires — and a firing control still only validates the probe, not the question (§2 trap 1).
⛔ A "landed by content" probe must anchor on a string unique to the CHANGE, not one already present on the base. Run the probe on the base too. Verify landings by content on origin/main, ⛔ not the API's merged field — it read false beside a populated merged_at.
⛔ A CI diagnosis is measured on the run object and its job logs.cancelled in a check-run listing is not evidence anything was cancelled; a run-level failure is not evidence anything failed — measured: zero failed jobs on a failure run, job still queued, a 15-minute queue timeout. Wedged runs may refuse both cancel (409) and re-run (403); the remedy is a new head SHA, ⛔ never an empty commit or close/reopen.
⛔ Enqueue bar is EVERY check green, not the required subset.
🚨 Both list channels can be down at once: search_issues returned total_count: 0 on a known-hit control while REST answered 403. REST availability is per-session — probe it. Dev seats have reported REST 403 on issue listing independently (three seats).
🚨 list_issues' labels array is OR, not AND; label filtering lags label writes 10+ min; updated_at can lag comments (§2 trap 2).
⛔ Undraft works only through the MCP tool; raw REST returns 200 and does nothing. ⚠️update_pull_request sends the draft bit whether or not you pass it — a reviewers-only call once silently undrafted a governed PR. Read the draft field back.
⛔ The sanitizer eats HTML-comment markers and truncates from the first tag-shaped token. ⛔ Never read a missing <!-- os-dev-report --> as "report not delivered" — read back the TAIL. Seven instances in one day; devs now post the marker as literal text.
⛔ Drift boot-gating is decided by category, not severity — destructive → boot refused. severity is read by no gate.
⚠️A card's premise can be retired by a landing after it was filed. Re-measure at dispatch and hand the dev the correction.
⚠️A dissolved ruling is harder to notice than a live one — a hold that no longer binds gets quoted from the card body forever, while the dissolving ruling sits in comment ten. Survivor pins go by filename: MUST_SURVIVE_* is a blocker, RETIRED_NAMES is a tombstone and is not.
⚠️list_pull_requests and get_files overflow the tool token cap on this repo. They save to a file — slice it with python3, ⛔ don't retry the call.
7. The standing rule
The predecessor logged twelve measurement slips across two shifts; §1 and §3 of this body add two more, both mine, on my first hour. All fourteen are one shape: a mechanism asserted from reading rather than from running.
⛔ A premise carries the same burden as a claim in a review: measured on the current ref, with the command that measured it, or marked unverified. Reading the code is not measuring it. This applies unchanged to commit messages, CI diagnoses, labels, and clocks. An absence claim needs its own measurement.
Corollaries, each paid for:
A claim is not made until its comment is on the card it claims.
Every zero-hit gets a positive control before it is reported — and a firing control validates the probe, not the question.
Where the seat supplies a diagnosis it ships with "confirm or refute" attached, and the refutation is recorded in the dev's terms. That sentence paid four times in one shift. ⛔ Keep writing it when the premise feels certain — all four felt certain.
Preserving a dead seat's work and endorsing it are different acts; the commit message must say which.
8. Standing parameters
Concurrency 3; priority:p0 may take it to 4 — maintainer 2026-08-22: 「当前任务处理完后,并发降到3」·「p0 仍可临时到4」.
⛔ Governed surfaces (docs/adr/**, .claude/**, skills/**, AGENTS.md, CLAUDE.md) are maintainer hand-merge only — ⛔ never flip ready, enqueue, or auto-merge.
Seat protocol. Read boundary = this body plus comments newer than its last edit. Per-card state lives on the cards; write-side refresh at round boundaries.
📌 Job description is versioned at
.claude/skills/pm-dispatch/references/lanes/engine.md. ⛔ Not hand-copied per term.1. Current PM
🟢 session
session_01LZbWd2jNV1FErXTPSS4Dry· seated 2026-08-27T08:00Z via/pm-dispatch engine.Predecessor:
os-warren(session_01W6HFzyH98W1YaQXhJUJt6o), shift-close5434298660at 04:15:25Z.Round-mutex: CLEAR. All four reads clear — most recent shift-close 04:15:25Z, ~3h45m before fire; no round-open marker after it; newest non-self
Claim:on a lanepm:dispatchedcard older than one round. Marker5436143969.⛔ That marker comment states the opposite and is WRONG — corrected here, and the correction is the load-bearing part. This container's clock read
04:19:22Zat fire; GitHub stamped the same write08:00:52Z. On the bad clock the shift-close looked 4 minutes old, so I reported a mutex violation, recommended standing down, and seated only on a maintainer override. There was nothing to override. A clock is a reading like any other — §6's rule applied todatefrom the start and I did not apply it. Detected only because a PR timestamp read later than "now". ⇒ Timestamps come from the GitHub object, never from containerdate.Body compressed on takeover (standard step, and it clears patrol H6 — the inherited body was 12.9 KB against a ~10 KB bound). Nothing discarded: the predecessor's full 8-section body is in the revision history.
2. Ledger — this term
05:13:52Z(auto-merge armed by the predecessor fired after a skills-seat patch round cleared the debt-ledger red). Landed before I seated.git ls-remote refs/heads/claude/issue-12457*→ EMPTY with a firing positive control (294claude/branches). That is not a dead claim: 缺陷:Setup 导航缺「Packaged automation」入口 —— objectui 页面已合并,framework nav contribution 从未落地(ADR-0126 §7.4,验收卡 A1 必失败) #12457's work sits onclaude/new-session-3qgti9, which the issue-number glob cannot see. ⛔ The branch-name probe only answers for branches that followed the convention. Cross-check the PR list by issue reference before calling any claim dead.updated_atfor 删除记录时「引用清理」用操作人身份查询引用表,读权不足即整体 403(应以系统身份执行) #12166 as04:12:32Zwhile comments existed at04:22Zand04:34Z, and it missed finding(objectql): the[Registry] Collisionwarning double-quotes the package id, against its own package's 170-to-37 single-quote convention — a fourth spelling in the ADR-0005 shadowing story #12609 entirely. ⛔list_issuesupdated_atcan lag; one inventory is a snapshot, not the queue.3. Gates and landings
CONTRACT_REVIEW_TIER;Governed Surface Queue Guardgreen at 07:50Z ⇒ not a governed surface.cluster: falseregistration question is filed separately rather than blocking a ruled, green, reviewed PR.pgnativeinto the Postgres family. ⛔ The inherited §3 carried this as "STILL OPEN, awaiting a letter"; it had been ruled two days earlier. Same shape as §6's dissolved-ruling trap: a citation is not a reading.CONTRACT_REVIEW_TIERfor throughput.4. Work at risk
None held by this seat. PM writes no files.
5. Hot-file serial queue
packages/drivers/driver-sql/src/sql-driver.ts🚨 No CI gate backs this queue.
scripts/check-single-claim-paths.mjsdeclares exactly one path —.objectui-sha— and its header explains why a repo-wide diff-intersection key is unusable (68 false-positive pairs per 300 PRs). ⇒ two green PRs on this file are still a collision. The serial criterion is this seat's to enforce.Queue occupants: #12017, #12121, #12593 (+ #12586 on driver-turso, separate file). ⛔ Regions UNMEASURED — measure by symbol grep on
origin/main, never by prose and never by a card's cited line numbers.ORDER BY ORDINAL_POSITIONoccurrences — match on the enclosing method, never the literal. A card citing line~1958was citing a commit SHA read as a line number.pm:on-hold#8740 and #6009 live in this file but declare restart conditions on symbols — ordinary dispatch does not wake them.Other serial pairs, measured this round
packages/objectql/src/registry.ts— finding(objectql):SchemaRegistry.registerObjectrequirespackageIdwhile its siblingregisterItemdeclares it optional — 14 ledgered TS2554 in packages/rest and 68 identical call sites in packages no tsc program reads #12623 and finding(objectql): the[Registry] Collisionwarning double-quotes the package id, against its own package's 170-to-37 single-quote convention — a fourth spelling in the ADR-0005 shadowing story #12609 both land here. SERIAL, not folded: distinct defect shapes (a required-vs-optional signature split vs a quoting-convention divergence), distinct fixes.packages/spec/**belongs to the spec seat. ⛔ Engine cards touching it get transferred, not dispatched here.fold-or-serial
Serial criterion is same FILE, not same package; regions come from diffs and symbol grep, never prose. Parallel work is permitted only at measured, disjoint method-level regions.
6. Readings that must never be taken on faith
date— this container's clock was ~3h41m slow at fire and produced a false mutex violation (§1).git diff origin/main...pr/Nanswer an empty diff — exit 0, no warning — and the two-dot fallback answers main's own churn. Measure through the API (pull_request_read get_files). Symptom: unrelated PRs reporting identical file lists.origin/main, ⛔ not the API'smergedfield — it readfalsebeside a populatedmerged_at.cancelledin a check-run listing is not evidence anything was cancelled; a run-levelfailureis not evidence anything failed — measured: zero failed jobs on afailurerun, job stillqueued, a 15-minute queue timeout. Wedged runs may refuse both cancel (409) and re-run (403); the remedy is a new head SHA, ⛔ never an empty commit or close/reopen.search_issuesreturnedtotal_count: 0on a known-hit control while REST answered 403. REST availability is per-session — probe it. Dev seats have reported REST 403 on issue listing independently (three seats).list_issues'labelsarray is OR, not AND; label filtering lags label writes 10+ min;updated_atcan lag comments (§2 trap 2).update_pull_requestsends the draft bit whether or not you pass it — a reviewers-only call once silently undrafted a governed PR. Read thedraftfield back.<!-- os-dev-report -->as "report not delivered" — read back the TAIL. Seven instances in one day; devs now post the marker as literal text.category, notseverity—destructive→ boot refused.severityis read by no gate.MUST_SURVIVE_*is a blocker,RETIRED_NAMESis a tombstone and is not.list_pull_requestsandget_filesoverflow the tool token cap on this repo. They save to a file — slice it withpython3, ⛔ don't retry the call.7. The standing rule
The predecessor logged twelve measurement slips across two shifts; §1 and §3 of this body add two more, both mine, on my first hour. All fourteen are one shape: a mechanism asserted from reading rather than from running.
Corollaries, each paid for:
8. Standing parameters
priority:p0may take it to 4 — maintainer 2026-08-22: 「当前任务处理完后,并发降到3」·「p0 仍可临时到4」.CONTRACT_REVIEW_TIER = 'claude-fable-5'(scripts/pm/dispatch-gates.mjs). ⛔needs:contract-reviewis not owed by a card dispatched at that tier.Sweptline up to ~6h old is normal.docs/adr/**,.claude/**,skills/**,AGENTS.md,CLAUDE.md) are maintainer hand-merge only — ⛔ never flip ready, enqueue, or auto-merge.Seat protocol. Read boundary = this body plus comments newer than its last edit. Per-card state lives on the cards; write-side refresh at round boundaries.