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
Seat registration — domain:devx @ objectui. Lane scope and standing duties live in the pm-dispatch skill (references/lanes/devx.md); this post carries current state only. Readers: body + comments later than the body's last edit.
1 · Current PM
> ## ⚪ RELEASED — last held by PM session session_019aCUUSwWefnbCJ4Xk1vqQW (GitHub login os-sales), R41 + R42, 2026-09-03T04:31Z → 16:50Z
>
> Released on the maintainer's instruction (「当前任务处理完,合并后就下班」). The shift-end brief is the comment posted immediately after this edit; it is the release marker.
Rounds
R41 and R42 closed. R41 released at 07:40Z; the seat was re-taken at 07:50Z on the maintainer's instruction (「你应该自主继续派发」) because #5174 was sitting dispatchable in the queue — releasing with dispatchable work in the queue was the wrong call and is recorded as such
Dispatched
10 dispatches on 7 cards, all mode:subagent — #6467 (patch round + merge round), #6600 (×2, after a fable-quota kill), #7185 (diagnosis, then the clause), #5174 b9/b10/b11, #3240 (resumed once after a server 500)
#5250 (three consumers, three mechanisms, discriminators for each) · #6653 (14/14 measurement; byte-exact body-write counter-measurement) · #7035 (wider metric-card measurement, recorded rather than filed as a near-duplicate)
Queue at close
#5174pm:queue — next ledger batch, scope measured below · #6653pm:queue p2 (triage re-judged it out of pm:retriage today) · #4853pm:retriage · #6342 another identity's claim
2 · Inherited ledger
⚠️ objectui now has a central triage seat (maintainer ruling 2026-09-03, 「objectui 也纳入,分仓报数」). It re-judged #6653 out of pm:retriage and moved #5250 into needs-user-decision during this shift. The execution seat's "evidence only, ⛔ never grade" posture is now correct and has a counterpart — keep it.
Next UNGATED_DOCS batch (re-take the census on main, ⛔ do not inherit): takeable by density are plugin-chatbot, auth, plugin-calendar, react (~10 blocks each). ⛔ plugin-gantt (18, the largest) and plugin-kanban stay owned by #7302 / PARTIAL_EXCERPTS — plugin-gantt being biggest is exactly what a density-first instinct reaches for.
Lane facts — corrections and additions from this shift:
⛔ "REST is 403, MCP only" is FALSE. Repo-scoped REST reads and writes return 200/201; only /search/* is 403, and that 403 is the local egress proxy, not GitHub ("sessions are bound to their configured repositories"). Three devs ran entire deliveries at zero MCP calls. ⚠️ The PM seat cannot do REST writes — the permission classifier blocks curl to the GitHub API — so PM writes remain MCP-only and the PM is the quota bottleneck, not the devs.
⛔ MCP issue_read mangles bodies on the READ side; the stored body is intact. Byte-confirmed in two forms (angle-bracket fragments eaten, titles HTML-entity-escaped).
Shallow clone: git merge-base returns an empty string rather than failing; git rev-list --left-right --count then reads plausibly and wrongly. git fetch origin --deepen=500 first.
node --check passes a file whose block comment was truncated by a stray */. Verify config edits with a real import().
enable_pr_auto_merge prints both a populated and an empty confirmation for the same call — the output is not a signal. The queue ref is the receipt, it is transient, and auto_merge: not armed on a queued PR is the normal post-enqueue state.
Console eager-closure margin is ~9.5 KB (3181.9 / 3191.4). It moves with main, so a docs-only PR showing a delta is the base moving, not the diff.
Batches 10 and 11 ran in parallel and merged as a clean union. The licence is removals only — verified +0/-2 on both before release, and merge-tested against each other beforehand. ⛔ Removal-vs-insertion is not the case that fact was measured on (batch 9 was serialised behind #7449 for exactly that reason).
the whole config surface is in one PR; ⛔ nothing else should touch it until that merges or closes
4 · Notes
#3240 is the shift's most consequential delivery and is not merged. Direction A was ruled 2026-08-06, and the card sat held from 2026-08-25 behind a scheduling condition — "board drained or near-drained, single dev, no other work in flight" — that existed only as prose in a comment. Nothing evaluates prose, so the card stayed held through periods when its own condition was true. R42 wrote that condition into the body as a machine-readable Restart-when:, measured it true, and dispatched into the ruled exclusive window.
⚠️And immediately got it wrong once: the first version required "zero other pm:queue cards", which dropped the ruling's "or near-drained" and made the condition unreachable while #5174 cycles batches. An invisible condition replaced by an unsatisfiable one is the same defect in a machine-readable coat. Corrected the same day. Whoever backfills the other twelve should expect exactly that failure mode: transcribing prose into a predicate is where meaning gets narrowed.
The recurring discipline, and it was mostly the PM failing it. A control proves your probe is alive; it does not prove your scope is right. Four instances this shift, three of them mine: a filename-shaped grep that missed a pin test which exists; a guessed workflow filename returning zero with a control that also returned zero; a 403 read as GitHub's when its body said "local proxy"; and a count differenced against a stale comment's count, where the comment had simply miscounted. Devs caught three of the four.
The devs modelled the inverse repeatedly: three consecutive batches predicted in writing that a probe would come back green, then used that green to bound where a gate's checking starts — producing discriminators for three distinct "green about nothing" mechanisms (BaseSchema's index signature, a bare-any props parameter, and the labelled-block parse trap, whose tell turns out to be key count). #3240's dev went further: executing the ruling literally would have moved 14 packages onto the vite.config fallback route and re-opened the hole #5406 closed, so it closed that route first.
Standing constraints. Governed surface (.claude/**, docs/adr/**, skills/**, AGENTS.md, CLAUDE.md): draft only, request review from os-zhuang and hotlong with draft: true in the same call, ⛔ never ready / enqueued / auto-merged / approved by this seat. Release is human-only. Entry to the merge queue requires every check green, not the required subset. Closing strips pm:* on the card being closed; ⛔ no bulk cleanup of leftover pm:* on already-closed cards.
Seat registration —
domain:devx@objectui. Lane scope and standing duties live in the pm-dispatch skill (references/lanes/devx.md); this post carries current state only. Readers: body + comments later than the body's last edit.1 · Current PM
> ## ⚪ RELEASED — last held by PM session
session_019aCUUSwWefnbCJ4Xk1vqQW(GitHub loginos-sales), R41 + R42, 2026-09-03T04:31Z → 16:50Z>
> Released on the maintainer's instruction (「当前任务处理完,合并后就下班」). The shift-end brief is the comment posted immediately after this edit; it is the release marker.
mode:subagent— #6467 (patch round + merge round), #6600 (×2, after a fable-quota kill), #7185 (diagnosis, then the clause), #5174 b9/b10/b11, #3240 (resumed once after a server 500)mainby content, never by the merge eventAGENTS.md), so a human merges it. ⛔ Never nagUNGATED_DOCS.mdxhalf is now empty — all 26 remaining are package READMEs plus the rootpm:queue— next ledger batch, scope measured below · #6653pm:queuep2 (triage re-judged it out ofpm:retriagetoday) · #4853pm:retriage· #6342 another identity's claim2 · Inherited ledger
pm:retriageand moved #5250 intoneeds-user-decisionduring this shift. The execution seat's "evidence only, ⛔ never grade" posture is now correct and has a counterpart — keep it.Awaiting a human:
skip-changesetlabel exists on this repo, but no workflow reads it — the repo's own test records that neither the workflow nor the label was ever real #4912 —pm:awaiting-maintainer: delete theskip-changesetlabel. Independently re-confirmed dead twice this shift (two devs checked at the gate; a pin test forbids applying it).pm:awaiting-maintainer: the patrol anchor is unset for this repo, sohalf-state-patrol.ymlhas nowhere to land and produces no H-lines.Next
UNGATED_DOCSbatch (re-take the census onmain, ⛔ do not inherit): takeable by density areplugin-chatbot,auth,plugin-calendar,react(~10 blocks each). ⛔plugin-gantt(18, the largest) andplugin-kanbanstay owned by #7302 /PARTIAL_EXCERPTS—plugin-ganttbeing biggest is exactly what a density-first instinct reaches for.Lane facts — corrections and additions from this shift:
/search/*is 403, and that 403 is the local egress proxy, not GitHub ("sessions are bound to their configured repositories"). Three devs ran entire deliveries at zero MCP calls.issue_readmangles bodies on the READ side; the stored body is intact. Byte-confirmed in two forms (angle-bracket fragments eaten, titles HTML-entity-escaped).domain:uipm:blockedcards carry no machine-readableBlocked-by:line — they are invisible to the unlock scan's reverse index #6653.)draft: trueexplicitly in the sameupdate_pull_requestcall and read back. Verified working on test(repo): one vitest config, one verdict — delete the 17 per-package configs (#3240) #7523 — draft survived. docs(agents): record how the Actions workflow registry is keyed, and the paginated-listing rule #6183 is the incident where it did not.git merge-basereturns an empty string rather than failing;git rev-list --left-right --countthen reads plausibly and wrongly.git fetch origin --deepen=500first.node --checkpasses a file whose block comment was truncated by a stray*/. Verify config edits with a realimport().enable_pr_auto_mergeprints both a populated and an empty confirmation for the same call — the output is not a signal. The queue ref is the receipt, it is transient, andauto_merge: not armedon a queued PR is the normal post-enqueue state.main, so a docs-only PR showing a delta is the base moving, not the diff.3 · Hot-file serial queue
scripts/check-doc-snippet-types.mjs(UNGATED_DOCS)+0/-2on both before release, and merge-tested against each other beforehand. ⛔ Removal-vs-insertion is not the case that fact was measured on (batch 9 was serialised behind #7449 for exactly that reason).apps/*/docs/**; the fences/snippets walk-equality pin still couples two of themAGENTS.md(governed and hot)packages/*/vite.config.ts+vitest.config.*4 · Notes
#3240 is the shift's most consequential delivery and is not merged. Direction A was ruled 2026-08-06, and the card sat held from 2026-08-25 behind a scheduling condition — "board drained or near-drained, single dev, no other work in flight" — that existed only as prose in a comment. Nothing evaluates prose, so the card stayed held through periods when its own condition was true. R42 wrote that condition into the body as a machine-readable
Restart-when:, measured it true, and dispatched into the ruled exclusive window.pm:queuecards", which dropped the ruling's "or near-drained" and made the condition unreachable while #5174 cycles batches. An invisible condition replaced by an unsatisfiable one is the same defect in a machine-readable coat. Corrected the same day. Whoever backfills the other twelve should expect exactly that failure mode: transcribing prose into a predicate is where meaning gets narrowed.The recurring discipline, and it was mostly the PM failing it. A control proves your probe is alive; it does not prove your scope is right. Four instances this shift, three of them mine: a filename-shaped grep that missed a pin test which exists; a guessed workflow filename returning zero with a control that also returned zero; a 403 read as GitHub's when its body said "local proxy"; and a count differenced against a stale comment's count, where the comment had simply miscounted. Devs caught three of the four.
The devs modelled the inverse repeatedly: three consecutive batches predicted in writing that a probe would come back green, then used that green to bound where a gate's checking starts — producing discriminators for three distinct "green about nothing" mechanisms (
BaseSchema's index signature, a bare-anyprops parameter, and the labelled-block parse trap, whose tell turns out to be key count). #3240's dev went further: executing the ruling literally would have moved 14 packages onto thevite.configfallback route and re-opened the hole #5406 closed, so it closed that route first.Standing constraints. Governed surface (
.claude/**,docs/adr/**,skills/**,AGENTS.md,CLAUDE.md): draft only, request review fromos-zhuangandhotlongwithdraft: truein the same call, ⛔ never ready / enqueued / auto-merged / approved by this seat. Release is human-only. Entry to the merge queue requires every check green, not the required subset. Closing stripspm:*on the card being closed; ⛔ no bulk cleanup of leftoverpm:*on already-closed cards.