Repository navigation
pm-dispatch(batch): a slot is a RUNNING subagent or card thread — PRs awaiting approval, the queue, CI or a ruling occupy none; the round report counts running and un-landed separately; a soft ceiling on accepted Tier H PRs awaiting a human #27117
Description
Filing gate ③ (maintainer-directed). Filed by the domain:skills#2 seat (os-justin, session_01QSeKYmhU5KEj1nukYhp1Tg, seat post #19287) from the maintainer's questions in that session on 2026-10-28. ⛔ Not a claim; domain:* pre-labelled because every path is in the skills tree — triage grades.
The maintainer's words (verbatim, in order)
- 「给车道交代的并发,如果已经开了pr或者等审核的时候,应该占用并发额度吗」
- On the seat's reading that the protocol already says no: 「同意维持「不占并发」,但是 车道执行的时候经常没有按照这个标准」
- 「skills 需要改进吗」
- On the seat's four-item proposal (items 1–3 the text fix, item 4 a soft ceiling): 「立卡,带第 4 项」
Business reason
batch exists to bound what burns at once (container CPU and the verify lock, tokens, the seat's review attention). A PR waiting for an approver, the merge queue or CI burns none of that, and the protocol already says so in three places — but seats read 「在飞」 as 「在飞的卡」 (pm:dispatched count) and stop dispatching with four PRs merely waiting for a human. The text leaves that reading open; this card closes it, adds a reading that makes the mix-up visible in every round report, and adds the one cap the batch cannot express: how many accepted Tier H PRs may wait on a human before the seat stops producing more of them.
Reader who acts
The domain:skills seat; Tier S (.claude/**), SKILL.md ⇒ ceiling-tier build + contract review. Serial on SKILL.md behind PR #27082 (#26997, awaiting the maintainer's landing) and coordinated with #27047 (the p0 card also rewrites the batch row's p0 clause — whichever lands second merges origin/main and keeps both meanings).
What lands (one PR; every file is at its line ceiling — 319 / 188 / 245 / 96, headroom 0 — so every edit is IN PLACE, no new line, no re-wrap as currency)
SKILL.mdL59, thebatch:<n>row — today 「席位同时在飞的子代理总上限,按Agent调用、create_session与卡线程计:dev、复核、普查皆计,⛔ 只读不豁免」. Rewrite as a countable definition: a slot is a subagent or card thread RUNNING now; the report landing releases it; four waiting states occupy no slot — awaiting a human approval, in the merge queue, awaiting CI, awaiting a maintainer ruling;⛔ 只读不豁免stays. The word 「在飞」 leaves this row (it names cards elsewhere).references/dispatch-runbook.mdL137 — today 「卡线程交回或其 PR 合入,席位当即告知 coordinator 释放槽位」. Drop the 「或」: hand-back releases the slot at once; the thread stays open through review to take a FAIL and occupies none; a REWORK patch round occupies one again.references/execution-duties.mdL21 「等待不填槽」 → 「等待(四态见 SKILL.mdbatch行)不填槽」, so there is one definition.references/seat-lifecycle.mdL70 (轮次报告) — the report carries one fixed line with two numbers: 「在跑 N / batch · 待落地 PR M」. The two can never legitimately be the same number; a seat that writes them cannot confuse them.- Soft ceiling (the maintainer's item 4) — one line in
execution-duties.md〈候选与批次〉: when the seat's accepted Tier H PRs awaiting aGOVERNED_APPROVERSapproval number more than 5, the seat dispatches no new Tier H card (Tier S and non-governed cards continue) and names the backlog in the round report. A SOFT rule: no gate, no script, no label (「新增门禁默认否」); the round-report line of item 3 is its only reader. Re-measure after two weeks of round reports and keep, move or drop the number.
Premises (each with its re-check)
- P1 — the three texts, as quoted, on
origin/main:grep -n 'batch:<n>' .claude/skills/pm-dispatch/SKILL.md(L59);grep -n '等待不填槽' .claude/skills/pm-dispatch/references/execution-duties.md(L21);grep -n '释放槽位' .claude/skills/pm-dispatch/references/dispatch-runbook.md(L137);grep -n '报告加升级项' .claude/skills/pm-dispatch/references/seat-lifecycle.md(L70). Positive control: the same greps forpm:dispatchedhit every file. - P2 — the observed mis-reading: this seat's own shift on 2026-10-28 counted 「在飞 3/3」 while one subagent ran and four PRs waited (seat post [PM seat] domain:skills · seat 2 — 🟢 os-justin · 直连会话(强制接管) #19287 r69 and the round report); the maintainer's word 2 names it as recurrent across lanes.
- P3 — the ceilings:
pnpm check:pm-skill-ratchetprintsSKILL.md is 319 lines (ceiling 319; headroom 0),execution-duties.md 188 / 188,dispatch-runbook.md 245 / 245,seat-lifecycle.md 96 / 96.
Acceptance
- A seat reading
SKILL.mdalone can count its slots from the row: running subagents/threads only, the four waiting states named as non-occupying. dispatch-runbook.mdhas no 「或」 between hand-back and merge;execution-duties.mdpoints at the one definition and carries the soft ceiling (5) as a sentence, not a check.- The round-report template in
seat-lifecycle.mdcarries the two-number line. check:pm-skill-ratchet,check:pm-skill-id-lint,check:pm-governed-prose,check:skill-frame-syncgreen; line counts unchanged.Clause-②: no·Metadata-protocol: none· Size S · Tier S.
Dedupe (REST list, labels=domain:skills, open 27 + closed 400, title/body grep batch|并发|concurren|WIP|占槽|填槽|slot): open → #27047 only (the p0 card: p0 exempt from batch, a different clause of the same row — serial, not duplicate); closed → #20154 (re-seated PM starts at batch 3 — the default, not the definition), #20957 (retired the one-tooling-slot rule). New.
Activity
objectstack-fleet commentedon Oct 28, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage: p1 ·
domain:skills·area:devpath· 2026-10-28T06:56Z⛔ Not a claim.
SKILL.mdbehind PR pm-dispatch: governed is an approval tier, the lane follows the subject — rule text to skills, workflow wiring to devx #27082 ([Decision] Is "governed" a lane or an approval tier? The lane table gives.github/workflows/**to skills and to spec, while devx carries the AGENTS.md and workflow cards in practice #26997), as the card says.priority:p1,area:devpath,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Claim: PM loop round 1 (takeover shift, wave 7) · 2026-10-28T14:20Z
Session:
session_01QSeKYmhU5KEj1nukYhp1TgAccount:
os-justinBranch:
claude/issue-27117-batch-slot-definitionWorktree:
objectstack-issue-27117Domain:
domain:skillsSeat:
domain:skills#2File surface:
.claude/skills/pm-dispatch/SKILL.mdL60 (thebatch:<n>row — a slot is a RUNNING subagent or card thread; four waiting states occupy none;⛔ 只读不豁免stays; keep the p0 clause PR #27266 just landed in thepriority:p0row, not this row),references/dispatch-runbook.mdL137 (drop the 「或」: hand-back releases the slot),references/execution-duties.mdL21 (point at the one definition) + ONE line in 〈候选与批次〉 for the soft ceiling (5 accepted Tier H PRs awaiting aGOVERNED_APPROVERSapproval ⇒ no new Tier H dispatch, named in the round report; no gate, no script, no label),references/seat-lifecycle.mdL70 (the round-report line 「在跑 N / batch · 待落地 PR M」). Ceilings onorigin/main(headroom 0): SKILL.md 319, execution-duties 188, dispatch-runbook 245, seat-lifecycle 96 — edits IN PLACE, a new line paid by a deletion with a named home, ⛔ no re-wrap as currency (stop on breach; explain in the report)Container & model:
S 级机械卡,mode:subagent,model: fable — MANDATORY: claude-fable-5-1 (derived from the file surface: SKILL.md; dispatch-gates --tier, this act),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card (a rule card on the maintainer's words)Thread-read: 6462756175
Premise: holds — read in this act on
origin/main3af6022e: SKILL.md L60batch:<n>row still reads 「席位同时在飞的子代理总上限,按Agent调用、create_session与卡线程计:dev、复核、普查皆计,⛔ 只读不豁免」; execution-duties L21 「batch封顶全部子代理,等待不填槽;…」; dispatch-runbook L137 and seat-lifecycle L70 carry the quoted texts (grep hits in this act); the four ceilings 319 / 188 / 245 / 96 with headroom 0. The seam with #27047 is settled: PR #27266 (merged 2026-10-28T14:17Z) rewrote thepriority:p0row (L119) and execution-duties L25–27, not thebatchrow — this card edits L60 and leaves L119 alone; triage's first grade 6462756175 (p1) is in the thread.Serial constraints cleared: PR #27266 (#27047, SKILL.md L35/L119, execution-duties L25–27/L51, landing-operations, triage-duties) and PR #27263 (#27113) are MERGED; no open PR touches SKILL.md, execution-duties.md, dispatch-runbook.md or seat-lifecycle.md (open-PR title/branch scan in this act: none); #27062 (claimed this wave) touches contract-review.md, triage-duties.md, record-recognisers.mjs and a new scripts/pm file — disjoint; #27061 (queued, SKILL.md + triage-duties) serialized BEHIND this PR and #27062. Tier S: one draft PR; contract review at
CONTRACT_REVIEW_TIER; the seat lands it on the maintainer's standing word of this shift.objectstack-fleet commentedon Oct 28, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
os-dev-report
{ "issue": 27117, "status": "done", "branch": "claude/issue-27117-batch-slot-definition", "pr": "https://github.com/objectstack-ai/objectstack/pull/27292", "head": "90502cd40874f5b14830d16cad3e34f912589ce3", "session": "session_01QSeKYmhU5KEj1nukYhp1Tg", "premise_still_valid": true, "summary": "The four protocol texts now say 'slot' one way: SKILL.md's batch row is a countable definition (one slot = one subagent via Agent/create_session or one card thread RUNNING now; the report landing releases it; awaiting a human approval / in the merge queue / awaiting CI / awaiting a ruling occupy none; dev、复核、普查皆计 and ⛔ 只读不豁免 stay; 在飞 left the row; p0 is pointed at the priority:p0 row, not restated). dispatch-runbook's card-thread line releases the slot on hand-back alone, keeps the thread open through review occupying none, and makes a REWORK patch round occupy one again. execution-duties points waiting at that one definition and carries the maintainer's item 4 as a soft ceiling line (accepted Tier H PRs awaiting a human approval over 5 ⇒ no new Tier H dispatch; S and non-governed continue; named in the round report; re-measure in two weeks; no gate/script/label). seat-lifecycle's round report carries the fixed line 在跑 N / batch · 待落地 PR M. Every file stays at its ceiling (319/188/245/96); the two new lines are paid by deletions whose content has a named home (line_budget).", "files_changed": [".claude/skills/pm-dispatch/SKILL.md", ".claude/skills/pm-dispatch/references/dispatch-runbook.md", ".claude/skills/pm-dispatch/references/execution-duties.md", ".claude/skills/pm-dispatch/references/seat-lifecycle.md"], "line_budget": { "SKILL.md": "319 → 319 (ceiling 319). L60 batch row edited in place: 202 B → 324 B; table-row pin 341, widest row unchanged at 341 (another row).", "references/dispatch-runbook.md": "245 → 245 (ceiling 245). L137 edited in place: 80 B → 120 B.", "references/execution-duties.md": "188 → 188 (ceiling 188). Old L21 edited in place (now L20): 120 B → 118 B. New L21 soft-ceiling line: 120 B. Paid by deleting old L12 (86 B) 「已排队父单的 open sub-issue 自动是候选,pm:epic 父单的子树除外」 — home: same file L11 (sub-issue 承父卡首触) + L41–42 (derived sub-issue dispatched directly, bypassing triage); .claude/agents/os-dev.md 基本规则 3 归挂不散落 (sub-issue 自动进派发池); the epic exclusion in seat-lifecycle.md 〈Epic 子树车道〉 (label:pm:epic 即父子保留全集,域座位不取;其它 PM 候选获取跳过整棵子树).", "references/seat-lifecycle.md": "96 → 96 (ceiling 96). New L70 two-number line: 111 B, right after the untouched report-content line (old L70, now L69). Paid by deleting old L15 (120 B) 「坐席从 batch 默认 3 起步;前任口径(串行、N、「不开新卡」)维护者对本会话重述才生效」 — home: SKILL.md batch row default column (默认 3) + same file 收班 line (now L40) 「派发口径失效,简报 ⛔ 不列作继承裁决」." }, "tests": "No package touched (.claude/** only): no build closure (①), no package test/typecheck (②), no changeset (skip-changeset on pr_create), no ablation (protocol text, not tested behaviour), test:repo left to CI. Acceptance greps on head 90502cd4: sed -n 60p SKILL.md | grep -c 在飞 → 0 (file-wide line count 8 → 7 as control); sed -n 137p dispatch-runbook.md | grep -c 或 → 0; wc -c of every edited prose line ≤120 (120/118/120/111); check:nul-bytes OK over 22042 files; grep -naP for control bytes over the four files → 0.", "gates": "Local subset, each exit captured by redirect-first (cmd > log 2>&1; EXIT=$?), on head 90502cd4: pnpm check:pm-skill-ratchet 0 (SKILL.md 319/319 headroom 0, widest row 341/341; dispatch-runbook 245/245; seat-lifecycle 96/96; execution-duties 188/188); pnpm check:pm-skill-id-lint 0 (104 files clean); pnpm check:pm-governed-prose 0 (13 surfaces, no others); pnpm check:skill-frame-sync 0; pnpm check:skill-frame-freshness 0 (local-only, current with origin/main); node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 20 families (not the 7 of hypothesis 5): closing-keyword-parity (+--self-test), comment-mask-corpus, governed-queue-guard --self-test, harness-current --self-test, lint check:doc-formula-expressions, agent-test-spelling, cross-package-test-inputs, doc-authoring, driver-memory-census, gitlink-declared, nul-bytes, pm-expected-skips, pm-governed-merges, pm-governed-prose, pm-skill-id-lint, pm-skill-ratchet, refd-timer-probe, skill-frame-sync, watch-hint-literal — all exit 0; doc-formula-expressions first exited 3 PREREQUISITE NOT MET (needs formula+lint dist), built both under the verify lock (os-verify-lock VERDICT command-exit 0 · held 83s · waited 0s) and re-ran → 0. --ran reconciliation: ✓ dispatch-gates --ran: 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED. check:pm-half-states and check:pm-dispatch-gates were NOT derived for this diff and not run locally (CI's). CI check-runs on 90502cd4 at report time: Check Changeset success; Governed Surface Queue Guard success; PR-body guards success; Check PR Size success; Test UI success; Lint · repo & tooling gates / Lint · PM dispatch-gates / Lint · docs & code guards / Lint · ESLint / Lint · CI, release & engine gates / Lint · scoped ×3 / Type Check ×4 / Test Core / Dogfood Regression Gate in_progress; Build Core, Build & E2E UI, Live E2E UI, Lint UI, Type Check UI and the opt-in harnesses skipped by path filter.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub tool called, read or write", "api_writes": "3 — (1) git push ×2 to origin claude/issue-27117-batch-slot-definition (empty-branch probe, then 90502cd4; not REST, no relay); (2) relay pr_create: one POST /repos/objectstack-ai/objectstack/dispatches (fw-20261028T144429Z-f451c8, run 40708936241 success) → PR #27292 draft, assignee os-justin, label skip-changeset (read back: 10735/10735 bytes identical; labels read back on the PR: skip-changeset present, plus the labeler's size/s); (3) post-stamped --comment=27117: this report. REST reads only: GET issues/27117 + its comments, GET pulls/27292, GET commits/90502cd4/check-runs.", "deviations": [ "execution-duties L21 wording: the card's 「等待(四态见 SKILL.md batch 行)不填槽」 does not fit the 120-byte prose cap beside the same-batch independence clause; landed as 「batch 等待不填槽,四态见 SKILL.md 该行;…」 and 「不按包、不按 check 名」 spelled 「不按包或 check 名」 (same meaning, 118 B).", "Hypothesis 3 falsified by measurement: the two-number line cannot replace a clause of seat-lifecycle L70 (every spelling keeping 熔断命中项 and the 48h follow-up count lands at 126–142 B); it is a new line paid by deleting old L15 (home named in line_budget).", "Hypothesis 5 partly falsified: the derivation names 20 families, not 7; check:pm-half-states and check:pm-dispatch-gates are not derived and were left to CI; the 15 extra families were run and are green.", "One build under the verify lock (turbo build --filter=@objectstack/formula --filter=@objectstack/lint) although the diff touches no package — only to satisfy a derived gate's declared prerequisite; no ① closure claimed.", "Commit trailer pair is model-free (Co-authored-by: Claude + Claude-Session) per os-dev.md/AGENTS.md; the harness attribution reminder names a model and was not followed (reporting, no deviation declared).", "origin/main moved during the run (0d45c0e7 → e9c88f7c, 4 commits); none touches the four edited files or the gate scripts read; no merge performed." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed (agent-read protocol text, outside the three classes) · execution-duties 并行纪律 ③ 「兄弟卡落地后再合一次」 vs AGENTS.md §10 (merge main after open only on conflict / main-caused red / queue removal) and dispatch-runbook L223–225 which restate AGENTS.md · dedupe: 兄弟卡 合一次 main 并行纪律", "carrier: none · noted, not filed (same class) · SKILL.md L74 自退 condition vs L75 常驻 vs seat-lifecycle 〈停止条件与待命〉 「队列清空不等于退场」 read against each other; left alone · dedupe: 自退 常驻 待命姿态" ] }objectstack-fleet commentedon Oct 28, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
ACCEPT → PR #27292 comment 6472296287 ·
domain:skills#2· 2026-10-28T14:53Z — ⛔ not a claim. Contract review (CONTRACT_REVIEW_TIER) PASS → PR comment 6472222599 on head90502cd4: thebatchrow is a countable slot definition (running subagents and card threads only; four waiting states occupy none; p0 pointed at its own row), hand-back releases the slot, one definition pointed at from execution-duties, the soft ceiling of 5 accepted Tier H PRs awaiting a human (item 4, a sentence not a check), and the round report's fixed line 「在跑 N / batch · 待落地 PR M」; four files at their ceilings, two paid lines with homes. 45 check-runs green or expected-skip,mergeable_state: clean; the seat lands it through the relay (pr_ready+automerge_enable) in the next act on the maintainer's standing word of this shift. After MERGED: strippm:dispatched; the SKILL.md hot-file queue opens for #27061 (still behind #27062 ontriage-duties.md). Acceptance notes carried: two protocol-consistency observations (并行纪律 ③ vs AGENTS.md §10; L74 自退 vs L75 常驻) for a later card.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Landed — PR #27292 merged; card closed by
Fixes #27117domain:skills#2)git merge-base --is-ancestor fa5e7825 origin/mainaftergit fetch origin mainfa5e7825pm-dispatch(batch): a slot is a RUNNING subagent or card thread — waiting PRs occupy none; …is onorigin/main;GET pulls/27292→merged: true,merge_commit_sha fa5e7825, merged by the queue entry the seat made on the maintainer's standing word (2026-10-28T15:27Z);origin/main:SKILL.mdL60 is the countablebatchrow (a running subagent or card thread; the four waiting states occupy none; 「在飞」 count 8 → 7), execution-duties L20–21 point at it and carry the soft ceiling of 5 accepted Tier H PRs awaiting a human, seat-lifecycle L70 carries 「在跑 N / batch · 待落地 PR M」; the four files read 319 / 188 / 245 / 96 lines on main (headroom 0 each); main's push CI onfa5e7825at this reading: 24 success · 15 skipped · 16 in progress · 0 failureGET issues/27117state: closed,state_reason: completed(2026-10-28T15:27Z), closed by the PR body'sFixes #27117(the only closing keyword in the body — no other card was closed by it)State change:
pm:dispatchedremoved from this card in the same act (label-write, read back:tooling,priority:p1,domain:skills,area:devpathremain as ownership). The SKILL.md / execution-duties / dispatch-runbook / seat-lifecycle hot-file queue this PR headed is released: #27061 is next on SKILL.md but stays behind #27062 (PR #27295, in the merge queue) ontriage-duties.md; no new dispatch this shift on the maintainer's 「当前任务处理完,合并后就下班」. Acceptance notes carried to a later card: 并行纪律 ③ vs AGENTS.md §10 on when to merge main; SKILL.md L74 自退 vs L75 常驻 vs the standby posture.