This post is the single authoritative registration of the skills seat (seat 1, domain:skills#1). Four-section template; the job description is versioned at .claude/skills/pm-dispatch/references/lanes/skills.md — ⛔ not copied here. Body r123 , written 2026-10-01T03:48Z by session_01KTZmMfzVzjNvyaLyQ8mHvg (os-warren) at stand-down, on the maintainer's order in that session, verbatim 「当前任务处理完就下班」. r122 (R11 dispatch) and earlier revisions are in the edit history, ⛔ not restated; r102's and r117's carried lists stay carried BY REFERENCE.
Current PM
⏳ vacant · last incumbent session_01KTZmMfzVzjNvyaLyQ8mHvg (os-warren), seated 2026-09-30T04:10Z on the maintainer's /pm-dispatch skills, stood down 2026-10-01T03:48Z. The seat's patrol Routine (trig_014UfhpWroArwBsHBSK2YKPv) is deleted; no one-shot timer of this session is live; the three PR subscriptions were released at stand-down. Hand-over: /pm-dispatch skills + read this post, then objectstack-ai/objectui#11311 (the lane's objectui board, same seat).
Maintainer items open at stand-down (留守 — each lands by the recipe in references/landing-operations.md; the next seat is the default caretaker):
PR docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, opt the two showcase react pages in (#20395) #21045 (docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, and opt the two showcase react pages in (ruling A on objectui#10887 member 3) #20395 , Tier H skills/objectstack-ui/**): review PASS 5924298890 on c1770a387, ACCEPT 5924305052, 速读 5924310268, needs-user-decision, review requested from os-zhuang and hotlong; skip-changeset + assignee applied. At stand-down three required contexts were still running (Lint & Repo Gates, the Test Core and TypeScript Type Check rollups). After an APPROVED review and green CI: clear needs-user-decision, relay pr_ready + automerge_enable, confirm MERGED, close docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, and opt the two showcase react pages in (ruling A on objectui#10887 member 3) #20395 (strip pm:dispatched + assignee; Fixes closes it).
objectui PR packages/cli e2e tests that spawn bin/run.js as "the SHIPPED entrypoint" never reach dist/ — oclif's ts-path reroutes them to src/ under NODE_ENV=test|development #11317 (objectui#11183, Tier H AGENTS.md + skills/**): review PASS 5924066480 on f580661be, ACCEPT 5924123994, 速读 5924129531, needs-user-decision, reviewers requested; CI green. Lands BEFORE PR objectui#11069 (objectui#5250 carries Blocked-by: #11183). Same landing recipe with --repo objectstack-ai/objectui; objectui has no skip-changeset gate — the empty-frontmatter changeset is the mechanism, ⛔ never apply that phantom label there.
objectui PR spec(api): declare mappingName on ImportRequestSchema with the mutual-exclusion refine (#10330) #11316 (objectui#11011, Tier H skills/**): review PASS 5924031392 on e98c3c93c, ACCEPT 5924034829, 速读 5924039524, needs-user-decision, reviewers requested; CI green (all 8 required contexts). Same recipe.
pm-dispatch: a claim's Container & model: line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — two rules conflict on every governed sister-repo claim #21048 (finding tooling domain:skills, bare): the claim template's Container & model: line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — filed under 「两条细则冲突 ⇒ 按更严的一条行动并立卡」; this lane self-triages it at first touch. Until it lands, write objectui comments without model identifiers except where the claim recogniser forces one.
objectui#11321 (finding, bare): three public-block examples outside fix(plugin-security): compose controlled_by_parent across a chain (#11082) #11183 's roots still flat + the unnamed host feed slots — triage grades and routes (domain:ui / domain:devx, the objectui#10872 family).
Maintainer's standing word this shift (kept for the next seat's reading): when a dev's skip-changeset / PR-assignee write is refused by its session classifier, the seat applies them itself after checking the diff publishes nothing, and re-runs the stale Check Changeset. Dispatches from R4 on gave the dev no label write at all. Also this shift: the fleet one-tooling-slot rule is retired on main (PR #20967 , the maintainer's direct order); objectui's skills/** and .claude/** joined this seat's surface (「objecui 仓库的 skills你应该也要处理」, attached with API access on the maintainer's grant).
Inherited + running ledger
Landed this shift: 15 PRs, 17 cards closed completed (PR docs(adr): ADR-0005 appendix (c) — the persisted document is the parsed body once every round-trip key is declared #20777 , docs(skills): objectstack-automation routes an outbound credential to a connector credentialRef and drops the Slack webhook-url example #20778 , docs(skills): objectstack-query — engine aggregate row admits search / searchFields #20776 , docs(governed): the retirement route is retiredKey() on any shape, with the retiredAfter stamp and the step-18 registry shape #20797 , docs(skills): objectstack-automation calls the api flow secret required and routes explicit-only starts to autolaunched #20796 , fix(fleet-write): read every relayed body back — a stored body that is not the bytes sent exits 4, never 0 #20806 , fix(pm): check-expected-skips derives schedule/dispatch-only jobs as expected skips under their raw name #20835 , docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845 , docs(skills): retirement kit routes a RETIRED_KEYS_BY_MAJOR entry through entries/retired-keys/ and gen:migration-registry, and an enum-value narrowing through enumWithRetiredValues() #20828 , docs(skills): objectstack-query teaches the served route for a related record's column, not the refused nested form #20811 , docs(agents,pm-dispatch): a draft conversion drops only an unqueued PR's auto-merge; a queued governed pull-back goes to the maintainer #20854 , fix(pm): the queue guard's refusal remedies send a queued PR to the maintainer's manual removal, never claiming a DRAFT conversion dequeues it #20894 , docs(skills): objectstack-query states the served nested-relation filter in where, its limits, and the two-step route past them #20902 , docs(adr): ADR-0005 appendix (c) — the storage switch is in force for view, and a saved view stores the parsed value of every key its body carried (ruling B) #20899 , pm-dispatch: retire the fleet one-tooling-slot rule; a lane’s open P0/P1 is an undispatched one #20967 — records on each card). In flight at stand-down: 3 PRs awaiting a human (items 1–3 above). Dispatched 16 cards; 1 claim released undispatched (finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011 , 5924141171).
Queue at stand-down (objectstack domain:skills, read 2026-10-01T03:48Z): pm:queue finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011 (p2, bug, dispatch-gates never derives check:i18n-coverage for examples/ — released claim 5924141171 holds its readings), pm tooling: issue-transfer.mjs reports exit 4 "the card did not move" after a transfer that landed: its read-back reads the source issue before GitHub serves the 301, and never asks the target #21020 (p3, bug, issue-transfer.mjs exit 4 after a landed transfer). pm:blocked [finding] objectui's half-state findings reach no reader: the board has no anchor by ruling, and its copy of check-half-states still refuses in agent containers with the conclusion #13544 disproved #18290 (behind [decision] 半状态巡逻的送法与形状:每天都在改的仪器靠「手工复制三个文件」分发,副本必然掉队——换成引用并把「写坏的」那半搬到写侧 #18471 , open). Program [program] CLAUDE.md is a pointer to AGENTS.md in every repo — no second instruction set to maintain (maintainer 2026-09-09) #17161 . Decision box (this lane): 0. Seat 2 [PM seat] domain:skills · seat 2 — ⏳ vacant · last incumbent session_017ETYWqMQD4qMtZzAGovWNi (os-steve) · no own output since 2026-09-21 · liveness patrol 2026-09-25 #19287 ⏳ vacant. objectui board: [PM seat] domain:skills @ objectui — ⏳ vacant · last session_01KTZmMfzVzjNvyaLyQ8mHvg · 2 PRs awaiting approval (#11316 #11317) · queue 3 · landed 0 objectui#11311 .
Filed by this seat this shift : [finding] two content/docs sentences enumerate the engine aggregate option set as "only where / groupBy / aggregations" — false by context, having, search, searchFields (the docs half of #20500) #20792 (devx), [finding] retirement kit §3 and build-schemas.ts gate (b) tell an author to paste the RETIRED_KEYS_BY_MAJOR entry into migrations/registry.ts, which is generated from entries/ since #7297 #20803 , [finding] AGENTS.md says a draft conversion removes a PR from the merge queue — every measured queued draft in this repo stayed queued and merged (Prime Directive #14's pull-back rests on it) #20847 , [finding] the Governed Surface Queue Guard's refusal text tells a seat to dequeue a governed PR by converting it to DRAFT — measured not to dequeue in this repo (same family as #20847) #20855 (closed), [finding] docs: query-syntax.mdx "Filtering Across Relationships" says SqlDriver compiles a nested relation object and emits a dotted key to Knex — both are refused at the engine before any driver since 4b4ee88f #20876 (docs lane), pm-dispatch: retire the fleet one-tooling-slot rule — the take-order alone sequences tooling cards, and a lane's "open P0/P1" is an undispatched one (maintainer direct dispatch) #20957 (closed), pm-dispatch: a claim's Container & model: line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — two rules conflict on every governed sister-repo claim #21048 (bare), objectui#11311 (seat post), objectui#11321 (bare).
Closing keyword : Fixes closed no card on the first eleven queue merges and every card on the last four; close-cards skips a closed card, so the seat posts the closing note and strips pm:dispatched + the assignee by hand.
Watch items : spec: gate (b) of build-schemas.ts tells an author to paste RETIRED_KEYS_BY_MAJOR lines into migrations/registry.ts, which is generated from entries/ since #7297; two guidance-slot docblocks describe the old retirement route (spec half of #20803) #20809 (domain:spec) quotes PR docs(skills): retirement kit routes a RETIRED_KEYS_BY_MAJOR entry through entries/retired-keys/ and gen:migration-registry, and an enum-value narrowing through enumWithRetiredValues() #20828 's kit wording when it lands; #20802 analytics half (domain:services): the cube read and the analytics read scope answer { relation: { field: value } } as the engine seam now serves it — as the caller, capped, one answer on every face #20887 (domain:services, analytics half of the nested-relation filter) — the skill says nothing about analytics until it lands.
Hot-file serial queue
content/docs/ui/react-pages.mdx, skills/objectstack-ui/rules/pages.md, skills/objectstack-ui/references/react-blocks.md (+ generator packages/spec/scripts/build-react-blocks-contract.ts), examples/app-showcase/src/ui/pages/{crm-workbench,renewals-pipeline}.page.ts, examples/app-showcase/test/react-page-adapter-query-contract.test.ts → PR docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, opt the two showcase react pages in (#20395) #21045 until MERGED.
scripts/pm/dispatch-gates.mjs, scripts/check-i18n-coverage.mjs → finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011 (queued, no claim).
Every other file of the lane: FREE. objectui's hot files: [PM seat] domain:skills @ objectui — ⏳ vacant · last session_01KTZmMfzVzjNvyaLyQ8mHvg · 2 PRs awaiting approval (#11316 #11317) · queue 3 · landed 0 objectui#11311 .
Notes
This post is the single authoritative registration of the skills seat (seat 1,
domain:skills#1). Four-section template; the job description is versioned at.claude/skills/pm-dispatch/references/lanes/skills.md— ⛔ not copied here. Body r123, written 2026-10-01T03:48Z bysession_01KTZmMfzVzjNvyaLyQ8mHvg(os-warren) at stand-down, on the maintainer's order in that session, verbatim 「当前任务处理完就下班」. r122 (R11 dispatch) and earlier revisions are in the edit history, ⛔ not restated; r102's and r117's carried lists stay carried BY REFERENCE.Current PM
⏳ vacant · last incumbent
session_01KTZmMfzVzjNvyaLyQ8mHvg(os-warren), seated 2026-09-30T04:10Z on the maintainer's/pm-dispatch skills, stood down 2026-10-01T03:48Z. The seat's patrol Routine (trig_014UfhpWroArwBsHBSK2YKPv) is deleted; no one-shot timer of this session is live; the three PR subscriptions were released at stand-down. Hand-over:/pm-dispatch skills+ read this post, then objectstack-ai/objectui#11311 (the lane's objectui board, same seat).Maintainer items open at stand-down (留守 — each lands by the recipe in
references/landing-operations.md; the next seat is the default caretaker):skills/objectstack-ui/**): review PASS 5924298890 onc1770a387, ACCEPT 5924305052, 速读 5924310268,needs-user-decision, review requested fromos-zhuangandhotlong;skip-changeset+ assignee applied. At stand-down three required contexts were still running (Lint & Repo Gates, theTest CoreandTypeScript Type Checkrollups). After an APPROVED review and green CI: clearneeds-user-decision, relaypr_ready+automerge_enable, confirm MERGED, close docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, and opt the two showcase react pages in (ruling A on objectui#10887 member 3) #20395 (strippm:dispatched+ assignee;Fixescloses it).bin/run.jsas "the SHIPPED entrypoint" never reachdist/— oclif's ts-path reroutes them tosrc/under NODE_ENV=test|development #11317 (objectui#11183, Tier HAGENTS.md+skills/**): review PASS 5924066480 onf580661be, ACCEPT 5924123994, 速读 5924129531,needs-user-decision, reviewers requested; CI green. Lands BEFORE PR objectui#11069 (objectui#5250 carriesBlocked-by: #11183). Same landing recipe with--repo objectstack-ai/objectui; objectui has noskip-changesetgate — the empty-frontmatter changeset is the mechanism, ⛔ never apply that phantom label there.skills/**): review PASS 5924031392 one98c3c93c, ACCEPT 5924034829, 速读 5924039524,needs-user-decision, reviewers requested; CI green (all 8 required contexts). Same recipe.Container & model:line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — two rules conflict on every governed sister-repo claim #21048 (findingtoolingdomain:skills, bare): the claim template'sContainer & model:line can only be spelled with a model identifier, which objectui'sAGENTS.mdbans in comments — filed under 「两条细则冲突 ⇒ 按更严的一条行动并立卡」; this lane self-triages it at first touch. Until it lands, write objectui comments without model identifiers except where the claim recogniser forces one.finding, bare): three public-block examples outside fix(plugin-security): compose controlled_by_parent across a chain (#11082) #11183's roots still flat + the unnamed host feed slots — triage grades and routes (domain:ui/domain:devx, the objectui#10872 family).Maintainer's standing word this shift (kept for the next seat's reading): when a dev's
skip-changeset/ PR-assignee write is refused by its session classifier, the seat applies them itself after checking the diff publishes nothing, and re-runs the staleCheck Changeset. Dispatches from R4 on gave the dev no label write at all. Also this shift: the fleet one-tooling-slot rule is retired onmain(PR #20967, the maintainer's direct order); objectui'sskills/**and.claude/**joined this seat's surface (「objecui 仓库的 skills你应该也要处理」, attached with API access on the maintainer's grant).Inherited + running ledger
completed(PR docs(adr): ADR-0005 appendix (c) — the persisted document is the parsed body once every round-trip key is declared #20777, docs(skills): objectstack-automation routes an outbound credential to a connector credentialRef and drops the Slack webhook-url example #20778, docs(skills): objectstack-query — engine aggregate row admits search / searchFields #20776, docs(governed): the retirement route is retiredKey() on any shape, with the retiredAfter stamp and the step-18 registry shape #20797, docs(skills): objectstack-automation calls the api flow secret required and routes explicit-only starts to autolaunched #20796, fix(fleet-write): read every relayed body back — a stored body that is not the bytes sent exits 4, never 0 #20806, fix(pm): check-expected-skips derives schedule/dispatch-only jobs as expected skips under their raw name #20835, docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845, docs(skills): retirement kit routes a RETIRED_KEYS_BY_MAJOR entry through entries/retired-keys/ and gen:migration-registry, and an enum-value narrowing through enumWithRetiredValues() #20828, docs(skills): objectstack-query teaches the served route for a related record's column, not the refused nested form #20811, docs(agents,pm-dispatch): a draft conversion drops only an unqueued PR's auto-merge; a queued governed pull-back goes to the maintainer #20854, fix(pm): the queue guard's refusal remedies send a queued PR to the maintainer's manual removal, never claiming a DRAFT conversion dequeues it #20894, docs(skills): objectstack-query states the served nested-relation filter in where, its limits, and the two-step route past them #20902, docs(adr): ADR-0005 appendix (c) — the storage switch is in force for view, and a saved view stores the parsed value of every key its body carried (ruling B) #20899, pm-dispatch: retire the fleet one-tooling-slot rule; a lane’s open P0/P1 is an undispatched one #20967 — records on each card). In flight at stand-down: 3 PRs awaiting a human (items 1–3 above). Dispatched 16 cards; 1 claim released undispatched (finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011, 5924141171).domain:skills, read 2026-10-01T03:48Z):pm:queuefinding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011 (p2,bug,dispatch-gatesnever derivescheck:i18n-coverageforexamples/— released claim 5924141171 holds its readings), pm tooling: issue-transfer.mjs reports exit 4 "the card did not move" after a transfer that landed: its read-back reads the source issue before GitHub serves the 301, and never asks the target #21020 (p3,bug,issue-transfer.mjsexit 4 after a landed transfer).pm:blocked[finding] objectui's half-state findings reach no reader: the board has no anchor by ruling, and its copy of check-half-states still refuses in agent containers with the conclusion #13544 disproved #18290 (behind [decision] 半状态巡逻的送法与形状:每天都在改的仪器靠「手工复制三个文件」分发,副本必然掉队——换成引用并把「写坏的」那半搬到写侧 #18471, open). Program [program] CLAUDE.md is a pointer to AGENTS.md in every repo — no second instruction set to maintain (maintainer 2026-09-09) #17161. Decision box (this lane): 0. Seat 2 [PM seat] domain:skills · seat 2 — ⏳ vacant · last incumbent session_017ETYWqMQD4qMtZzAGovWNi (os-steve) · no own output since 2026-09-21 · liveness patrol 2026-09-25 #19287 ⏳ vacant. objectui board: [PM seat] domain:skills @ objectui — ⏳ vacant · last session_01KTZmMfzVzjNvyaLyQ8mHvg · 2 PRs awaiting approval (#11316 #11317) · queue 3 · landed 0 objectui#11311.context,having,search,searchFields(the docs half of #20500) #20792 (devx), [finding] retirement kit §3 andbuild-schemas.tsgate (b) tell an author to paste theRETIRED_KEYS_BY_MAJORentry intomigrations/registry.ts, which is generated fromentries/since #7297 #20803, [finding] AGENTS.md says a draft conversion removes a PR from the merge queue — every measured queued draft in this repo stayed queued and merged (Prime Directive #14's pull-back rests on it) #20847, [finding] the Governed Surface Queue Guard's refusal text tells a seat to dequeue a governed PR by converting it to DRAFT — measured not to dequeue in this repo (same family as #20847) #20855 (closed), [finding] docs: query-syntax.mdx "Filtering Across Relationships" says SqlDriver compiles a nested relation object and emits a dotted key to Knex — both are refused at the engine before any driver since 4b4ee88f #20876 (docs lane), pm-dispatch: retire the fleet one-tooling-slot rule — the take-order alone sequences tooling cards, and a lane's "open P0/P1" is an undispatched one (maintainer direct dispatch) #20957 (closed), pm-dispatch: a claim'sContainer & model:line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — two rules conflict on every governed sister-repo claim #21048 (bare), objectui#11311 (seat post), objectui#11321 (bare).Fixesclosed no card on the first eleven queue merges and every card on the last four;close-cardsskips a closed card, so the seat posts the closing note and stripspm:dispatched+ the assignee by hand.domain:spec) quotes PR docs(skills): retirement kit routes a RETIRED_KEYS_BY_MAJOR entry through entries/retired-keys/ and gen:migration-registry, and an enum-value narrowing through enumWithRetiredValues() #20828's kit wording when it lands; #20802 analytics half (domain:services): the cube read and the analytics read scope answer{ relation: { field: value } }as the engine seam now serves it — as the caller, capped, one answer on every face #20887 (domain:services, analytics half of the nested-relation filter) — the skill says nothing about analytics until it lands.Hot-file serial queue
content/docs/ui/react-pages.mdx,skills/objectstack-ui/rules/pages.md,skills/objectstack-ui/references/react-blocks.md(+ generatorpackages/spec/scripts/build-react-blocks-contract.ts),examples/app-showcase/src/ui/pages/{crm-workbench,renewals-pipeline}.page.ts,examples/app-showcase/test/react-page-adapter-query-contract.test.ts→ PR docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, opt the two showcase react pages in (#20395) #21045 until MERGED.scripts/pm/dispatch-gates.mjs,scripts/check-i18n-coverage.mjs→ finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011 (queued, no claim).Notes
references/lanes/skills.md; content writes only throughscripts/pm/post-stamped.mjs/label-write.mjs/issue-create.mjs/close-cards.mjsandfleet-write/dispatch.mjs --actions-file(all accept--repo objectstack-ai/objectui); a body refresh needs--ack-through=ID.needs-user-decisionand lands (pr_ready+automerge_enable), unless the approver already did; Tier S (.claude/**) = at-tier review PASS then the seat lands; non-governed = CI + the seat's read. Landing = MERGED through the queue.issue-createUNCONFIRMED on a list lag twice ([finding] retirement kit §3 andbuild-schemas.tsgate (b) tell an author to paste theRETIRED_KEYS_BY_MAJORentry intomigrations/registry.ts, which is generated fromentries/since #7297 #20803, pm-dispatch: a claim'sContainer & model:line can only be spelled with a model identifier, which objectui's AGENTS.md bans in comments — two rules conflict on every governed sister-repo claim #21048 — both existed); a dev's label write is refused by its classifier on most PRs;label-writeanswers "NOTHING WAS WRITTEN" when a--removelabel is already absent;check:skill-eval-tokensin objectui is the eval must_contain oracle, not a size meter, and objectui has no skills line/token ratchet; objectui's labels API lists a phantomskip-changesetlabel wired to nothing./home/user/objectstack(fast-forwarded to2f2fa11d7this shift) and/home/user/objectui(b28bde8);check-harness-current.mjsCURRENT at the R1 marker.