Skip to content

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

Closed

Description

@objectstack-fleet

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)

  1. 「给车道交代的并发,如果已经开了pr或者等审核的时候,应该占用并发额度吗」
  2. On the seat's reading that the protocol already says no: 「同意维持「不占并发」,但是 车道执行的时候经常没有按照这个标准」
  3. 「skills 需要改进吗」
  4. 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)

  1. SKILL.md L59, the batch:<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).
  2. references/dispatch-runbook.md L137 — 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.md L21 「等待不填槽」 → 「等待(四态见 SKILL.md batch 行)不填槽」, so there is one definition.
  3. references/seat-lifecycle.md L70 (轮次报告) — 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.
  4. Soft ceiling (the maintainer's item 4) — one line in execution-duties.md 〈候选与批次〉: when the seat's accepted Tier H PRs awaiting a GOVERNED_APPROVERS approval 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 for pm:dispatched hit 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-ratchet prints SKILL.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.md alone can count its slots from the row: running subagents/threads only, the four waiting states named as non-occupying.
  • dispatch-runbook.md has no 「或」 between hand-back and merge; execution-duties.md points at the one definition and carries the soft ceiling (5) as a sentence, not a check.
  • The round-report template in seat-lifecycle.md carries the two-number line.
  • check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-governed-prose, check:skill-frame-sync green; 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

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: p1 · domain:skills · area:devpath · 2026-10-28T06:56Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    priority:p1High: required for production / M2
    and removed on Oct 28, 2026
  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

    Claim: PM loop round 1 (takeover shift, wave 7) · 2026-10-28T14:20Z
    Session: session_01QSeKYmhU5KEj1nukYhp1Tg
    Account: os-justin
    Branch: claude/issue-27117-batch-slot-definition
    Worktree: objectstack-issue-27117
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: .claude/skills/pm-dispatch/SKILL.md L60 (the batch:<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 the priority:p0 row, not this row), references/dispatch-runbook.md L137 (drop the 「或」: hand-back releases the slot), references/execution-duties.md L21 (point at the one definition) + ONE line in 〈候选与批次〉 for the soft ceiling (5 accepted Tier H PRs awaiting a GOVERNED_APPROVERS approval ⇒ no new Tier H dispatch, named in the round report; no gate, no script, no label), references/seat-lifecycle.md L70 (the round-report line 「在跑 N / batch · 待落地 PR M」). Ceilings on origin/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: high
    Clause-②: 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/main 3af6022e: SKILL.md L60 batch:<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 the priority:p0 row (L119) and execution-duties L25–27, not the batch row — 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.

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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: 自退 常驻 待命姿态"
      ]
    }
  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 head 90502cd4: the batch row 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: strip pm:dispatched; the SKILL.md hot-file queue opens for #27061 (still behind #27062 on triage-duties.md). Acceptance notes carried: two protocol-consistency observations (并行纪律 ③ vs AGENTS.md §10; L74 自退 vs L75 常驻) for a later card.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

    Landed — PR #27292 merged; card closed by Fixes #27117

    probe reading (2026-10-28T15:28Z, domain:skills#2)
    git merge-base --is-ancestor fa5e7825 origin/main after git fetch origin main true — fa5e7825 pm-dispatch(batch): a slot is a RUNNING subagent or card thread — waiting PRs occupy none; … is on origin/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.md L60 is the countable batch row (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 on fa5e7825 at this reading: 24 success · 15 skipped · 16 in progress · 0 failure
    GET issues/27117 state: closed, state_reason: completed (2026-10-28T15:27Z), closed by the PR body's Fixes #27117 (the only closing keyword in the body — no other card was closed by it)

    State change: pm:dispatched removed from this card in the same act (label-write, read back: tooling, priority:p1, domain:skills, area:devpath remain 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) on triage-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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p1High: required for production / M2tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions