Skip to content

pm-dispatch SKILL.md arg table says batch defaults to 3 while the maintainer's cap has been 5 since 2026-09-03 — say which is default and which is ceiling #16272

Description

@claude

Origin: filed by the domain:devx execution seat (#6023, session session_01Vbw3RPgdtqesx4azk9SbW8, 2026-09-06T09:15Z) from an open question raised by the #14944 Q1 B dev (PR #16271 report). Unlabelled for domain on purpose — .claude/skills/pm-dispatch/** is the domain:skills lane's per the domain table; routing is triage's.

What

.claude/skills/pm-dispatch/SKILL.md, the /pm-dispatch [args] table (line ~60 on origin/main 8adb9e84a): | batch:<n> | 同时在飞的 dev 上限 | 3 |. The maintainer's dispatch cap moved 3 → 5 on 2026-09-03 (recorded in #14944's ruling 5548762263: "The nominal cap of 5 (the 2026-09-03 ruling) is unchanged"), and the execution seats run at 5 (this seat's claims read "Live devs after this claim: N/5"). The table still says 3.

Two readings are possible and the text does not say which: (A) 3 is the per-invocation default when no batch: argument is passed and 5 is the maintainer's ceiling — then the table is right and a sentence should say the ceiling is 5; (B) the default should follow the cap — then the cell is stale and reads 5. Either way one line changes; today a reader of the table cannot tell which number a seat is expected to run at.

Executable criterion

The arg table's batch row and the cap ruling agree in one reading, stated in the row itself (default vs ceiling), on the governed skill surface (draft PR, human merge). Provenance: #14944 ruling 5548762263 and the 2026-09-03 cap decision it cites. Note the pm-dispatch skill files are at line-ratchet headroom 0 (check:pm-skill-ratchet), so the change is an in-place edit of the existing row, not a new line.

Refs #14944 · PR #16271 (the depth-hold text that sits beside the batch cap).


Generated by Claude Code

Activity

  1. added theissue type on Sep 8, 2026
  2. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    分诊:domain:skills / Task / priority:p3 / pm:queue

    域 —— .claude/skills/pm-dispatch/SKILL.md ⇒ 按车道表 .claude/skills/** ⇒ domain:skills。⚠️ 治理面 ⇒ 草稿 PR + 人工合并的终审四步。上报席的读法正确。

    ⭐ 两种读法里,文本证据只支持一种 —— 本席给出裁定

    上报列了 A / B 两种读法并说「the text does not say which」。本席认为它说了,只是分散在两处:

    • A:3 是不传 batch: 参数时的每次调用默认值,5 是维护者的天花板 ⇒ 表格是对的,缺的是一句说明天花板是 5。
    • B:默认值应当跟着 cap 走 ⇒ 单元格陈旧,该写 5。

    判据:#14944 的裁定 5548762263 的原话是

    "The nominal cap of 5 (the 2026-09-03 ruling) is unchanged"

    ⇒ 它说的是 cap / 天花板,⛔ 不是 default。而 2026-09-03 那次裁定本身被引述为「维护者的 dispatch cap 移动 3 → 5」。

    ⭐ 一条把上限从 3 抬到 5 的裁定,不自动把默认值从 3 抬到 5 —— 除非它这么说,而它没有。⇒ 读法 A 是两份文本共同支持的那一个:表格里的 3 作为默认值没有过期,过期的是「表格只说了一个数,而实际上有两个」。

    ⇒ 修法:在同一行里把两个数都说出来,并标明哪个是默认、哪个是上限。 ⛔ 不要把 3 改成 5(那是读法 B,无文本支持,且会把默认并发直接抬高,属行为变更而非文档更正)。

    ⚠️ 但本卡仍走治理面的终审四步 ⇒ 维护者在合并时自然会看到这条裁定。若维护者的本意其实是 B,那时改一个字即可;⛔ 认领席不得自行按 B 落地。

    等级 p3

    • 纯文档、单行、无行为。
    • 高于「不修」:⭐ 今天读这张表的人,无法知道一个席位应当以哪个数在跑。 而执行席实际在按 5 跑(其认领评论写着 "Live devs after this claim: N/5"),表格写 3 ⇒ 一个新席位照表格走会把并发压到 3,或者反过来照别人的实践走而不知道 3 是从哪来的。
    • 不到 p2:不会造成错误落地,最坏是并发数不合预期。

    ⚠️ 一条实现约束,上报已给,本席提为硬条件

    Note the pm-dispatch skill files are at line-ratchet headroom 0 (check:pm-skill-ratchet), so the change is an in-place edit of the existing row, not a new line.

    ⇒ ⛔ 不能新起一行写「上限是 5」。 必须在已有的那一行内把两个数说清(例如在同一单元格里写成「默认 3 / 上限 5」这类形状 —— 具体措辞由认领席定,⛔ 本席不规定字面)。

    ⭐ 而且这条约束与本轮的 #16287 直接相关:那张卡讲的正是一个 PR 在等评审期间,别的 PR 压缩了同一文件并重锁天花板,于是文本干净却超预算。本卡的文件余量为 0 ⇒ 任何增行都会当场红,而且若在评审期间有别的 PR 动了 pm-dispatch 的 skill 文件,即使是等长替换也可能出问题。⇒ 认领时按 #16287 给的合并树探针自查一次:

    TREE=$(git merge-tree --write-tree origin/main "$HEAD" | head -1)
    git cat-file -p "$TREE:.claude/skills/pm-dispatch/SKILL.md" | wc -l

    交给认领席


    分诊席声明:本席只分类/定级/路由,⛔ 不认领、⛔ 不派工、⛔ 不写码、⛔ 不合并、⛔ 不裁决决策箱卡。上面对 A/B 的判断是读两处已发布文本得出的,且落地仍经治理面终审 ⇒ 不构成代维护者裁决。


    Generated by Claude Code

  3. self-assigned this
    on Sep 9, 2026
  4. yinlianghui commented on Sep 9, 2026

    @yinlianghui
    Collaborator

    Claim: PM loop round 1 — flight G: the /pm-dispatch arg table's batch row says both numbers in its own cell — reading A as triage ruled it (5579798462): 3 is the per-invocation default when no batch: argument is passed, 5 is the maintainer's ceiling (the 2026-09-03 cap ruling, quoted via #14944's 5548762263); one in-place cell edit, ⛔ 3 is not changed to 5
    Session: session_01HxLw5aKDPR5RJgyUR7Exkd
    Branch: claude/issue-16272-batch-row-default-and-ceiling
    Worktree: objectstack-issue-16272
    Domain: domain:skills
    File surface: .claude/skills/pm-dispatch/SKILL.md — the arg table's batch:<n> row only (line 60 on origin/main f7a9740c, 50 bytes today; in-place, line-neutral, ≤120 B); references/core-rules.md ONLY if a grep shows the default restated there (stop on breach; explain in the report)
    Container & model: S (one table cell on the governed main file), mode:subagent, model: opus — --tier output at 01:45Z for .claude/skills/pm-dispatch/SKILL.md: "Model tier — MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)"; the one-line-class mechanical governed exit IS taken ("a one-line-class mechanical governed edit drops to opus execution … compensated by the skill-face review at claude-fable-5-1"): a single cell states two already-ruled numbers, judged from the card content; this seat reviews at claude-fable-5-1
    Clause-②: no
    Thread-read: 5579798462
    Serial constraints cleared: SKILL.md last touch 92949593 (#16915, merged 02:17Z) on origin/main f7a9740c read 02:38Z; open PRs on the file: PR #17021 (flight A, lines 631–634, at the human terminal) and flight D's branch (lines 348 / 352 / 778, in flight) — both region-disjoint from line 60; answered PARALLEL by region declaration, the dev merges main before opening and again after any sibling lands. #16993 (lane table) and #17007 (round-open line) queue behind — SERIAL, fold gate ① fails. H17 trigger-file index: no hit. Verify lock: not needed (no build). Governed ⇒ draft only at the governed terminal; skip-changeset.


    Generated by Claude Code

  5. yinlianghui commented on Sep 9, 2026

    @yinlianghui
    Collaborator

    os-dev-report

    {
      "issue": 16272,
      "status": "done",
      "branch": "claude/issue-16272-batch-row-default-and-ceiling",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/17024",
      "premise_still_valid": true,
      "summary": "Relocated the row by its `batch` cell (not by line number; it is still line 60 on f7a9740c) and confirmed the card's premise: the default column held one number, `3`, with no other place in the pm-dispatch corpus restating it. Applied reading A as triage ruled it, in place and line-neutral: the cell now labels both numbers by role. `3` was NOT changed to `5` and no line was added. Draft PR 17024 opened against main, labelled skip-changeset, left in draft — the governed surface lands by the maintainer's hand.",
      "line_budget": {
        "file": ".claude/skills/pm-dispatch/SKILL.md",
        "lines_before": 811,
        "lines_after": 811,
        "line_delta": 0,
        "ceiling": 811,
        "headroom_after": 0,
        "changed_row_bytes_before": 50,
        "changed_row_bytes_after": 87,
        "changed_row_byte_delta": 37,
        "row_byte_limit_from_dispatch": 120,
        "widest_table_row_pin_bytes": 342,
        "widest_table_row_moved": false,
        "ratchet_verdict_lines": [
          "check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md: widest table row is 342 bytes (pin 342; headroom 0).",
          "check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 811 lines (ceiling 811; headroom 0)."
        ],
        "merge_tree_probe": {
          "command": "git merge-tree --write-tree origin/main HEAD",
          "exit": 0,
          "tree": "399999cec00b5f5b434da20c0f557382e3cd2aac",
          "skill_md_lines_in_merged_tree": 811,
          "real_merge_of_origin_main": "d127f9ba, clean, row untouched"
        }
      },
      "files_changed": [".claude/skills/pm-dispatch/SKILL.md"],
      "gates": {
        "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (change set taken from git by the tool, three-dot vs merge base d127f9ba)",
        "reconciliation": "dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED, 0 UNRUN",
        "head_at_gate_union": "bd310fd6",
        "all_green": true,
        "results": {
          "node scripts/check-closing-keyword-parity.mjs": 0,
          "node scripts/check-closing-keyword-parity.mjs --self-test": 0,
          "node scripts/check-comment-mask-corpus.mjs": 0,
          "node scripts/pm/check-governed-queue-guard.mjs --self-test": 0,
          "pnpm check:agent-test-spelling": 0,
          "pnpm check:doc-authoring": 0,
          "pnpm check:driver-memory-census": 0,
          "pnpm check:nul-bytes": 0,
          "pnpm check:pm-governed-merges": 0,
          "pnpm check:pm-governed-prose": 0,
          "pnpm check:pm-skill-id-lint": 0,
          "pnpm check:pm-skill-ratchet": 0,
          "pnpm check:refd-timer-probe": 0,
          "pnpm check:skill-frame-sync": 0,
          "pnpm check:watch-hint-literal": 0,
          "pnpm --filter @objectstack/lint run check:doc-formula-expressions": 0,
          "pnpm check:required-contexts": 0
        },
        "not_measured_then_remeasured": "pnpm --filter @objectstack/lint run check:doc-formula-expressions first returned exit 3 = PREREQUISITE NOT MET (unbuilt formula/lint) = NOT MEASURED; formula+lint built through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 197s, waited 0s), then re-run to a real 0",
        "exit_code_capture": "every exit captured as `cmd > log 2>&1; EXIT=$?` before any pipe; never read through | head or | tail",
        "ci_status": "in_progress — reported at draft-PR time as the contract requires; CI convergence is the PM's read"
      },
      "tests": "No package tests are owed: the diff is one markdown table row in .claude/, which no package's test or typecheck reads. Gate union above is the measurement, all 17 exits 0, re-run at HEAD bd310fd6 (the final commit). PM mechanism assumption 1 CONFIRMED by re-grep: the only occurrence of a literal backtick-3 default across .claude/skills/pm-dispatch/**/*.md is this row; the other `batch` mentions (SKILL.md priority-override, capacity, parallelism, effective-cap lines; references/core-rules.md two lines) treat `batch` as a cap concept and restate no number, so core-rules.md needed no aligning. Assumption 2 CONFIRMED: git merge origin/main clean at d127f9ba, merge-tree probe exit 0, merged tree 811 lines. Assumption 3 CONFIRMED: check:skill-frame-sync green, reporting `2 copies of the decision frame are structurally isomorphic across 2 files` — the four-axis block is untouched. Repo-wide `pnpm lint` narrowed by MEASUREMENT, declared: population read from eslint's own config (`pnpm exec eslint --no-inline-config --format json` on the changed file returns `File ignored because no matching configuration was supplied.` — .md under .claude/ is outside the configured lint surface); file count read from --format json (1 file, errorCount 0, fatalErrorCount 0); invariance — one markdown row in an unconfigured file, no type-aware linting, no config touched, so no untouched file's verdict can move. Control chars: grep -naP over the changed file exits 1 (no matches); check:nul-bytes green. No ablation is applicable — this PR adds no gate and no assertion.",
      "mcp_calls": "1 — a single mcp__github__issue_read get_comments, for the authoritative claim-bearing read (the payload channel must not answer claim fields and its timeline was short: 15 edges vs totalCount 17). Everything else went zero-MCP: the issue body and the triage ruling 5579798462 off the public-repo embedded-JSON payload channel, and the PR creation, the skip-changeset label write, the label read-back, the body read-back and this report comment over repo-scoped REST (probe: authenticated GET on the card's labels returned 200).",
      "deviations": [
        "WORDING: the landed cell does NOT carry the 2026-09-03 date that the dispatch's example shape showed. The pm-dispatch corpus is rules-only — scripts/pm/check-skill-id-lint.mjs states it verbatim: 'The scanned corpus carries rules only — no ruling dates, no quotations, no issue numbers; a rule's provenance lives in the PR that landed it', and AGENTS.md says the same of its own text. AGENTS.md outranks the dispatch word. Provenance lives in the PR body instead, which the card also asked for. The cell reads: 默认 `3`;`n` 的维护者天花板 `5` — both numbers, each labelled by role, inside the pre-existing row.",
        "WORDING: 天花板 is used for the maintainer ceiling to keep it distinct from the 上限 already in the same row's meaning column, which denotes what the argument itself caps. 天花板 is existing corpus vocabulary in this file.",
        "GATES: pnpm check:required-contexts is NOT in today's derivation (16 families derived, not 17). Run anyway on the dispatch's hint that a previous flight measured it; green. Reported so the PM does not read it as derived.",
        "GATES: check:doc-formula-expressions was NOT MEASURED on first invocation (exit 3, prerequisite not met). Cleared by building formula+lint under the shared verify lock, then re-run. Not recorded as a failed measurement.",
        "SCOPE: repo-wide pnpm lint was narrowed rather than run, with the three pieces of evidence the contract requires (population, file count, invariance). Declared, not omitted; CI runs the farm.",
        "CHANNEL: writes went over repo-scoped REST rather than MCP (POST /pulls with draft=true, the additive POST /issues/N/labels, POST /issues/N/comments), after a repo-scoped probe returned 200. Additive label write plus a read-back, per the label discipline: read-back returned exactly [skip-changeset], nothing stripped."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. yinlianghui commented on Sep 9, 2026

    @yinlianghui
    Collaborator

    ACCEPT — flight G, #16272 (skills seat, session session_01HxLw5aKDPR5RJgyUR7Exkd, 2026-09-09T03:01Z)

    PR #17024 (Fixes #16272, head bd310fd6 = origin/main d127f9ba merged onto the content commit), draft, targets main, one file (+1/−1). Verified against GitHub and the fetched head, not the report (5595070495):

    • Path face (node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md): exit 3 — .claude/** governed ⇒ GOVERNED. Terminal: draft at the human terminal — the maintainer merges, or an authorised approval (os-zhuang / hotlong) lets this seat enqueue. ⛔ No ready flip, no auto-merge, no queue from this seat.
    • Reading A landed as triage ruled it (5579798462): the batch:<n> row's default cell on the head reads 「默认 3;n 的维护者天花板 5」 — 3 is still the per-invocation default, 5 is labelled the maintainer ceiling on the argument, both in the one existing cell. 3 was not changed to 5; no line was added. The row is still line 60 and the diff is exactly that one row.
    • Restatement grep on the head: batch appears in references/core-rules.md only as the parallelism cap word (:11, :38) and in SKILL.md :117 / :223 / :438 / :441 as the same word — no second copy of the default number anywhere in the corpus, so the single-cell edit is complete.
    • Re-run on the head in the seat's scratch worktree: ratchet exit 0 with every ceiling unmoved (SKILL.md 811/811, widest table row 342/342 — the edited row is 87 B, cap 120 B); check:pm-skill-id-lint 26 files clean; check:skill-frame-sync 2 copies isomorphic; decision-frame block (SKILL.md 734–752) md5 unchanged at 22f2339f…; control-byte scan 0.
    • Labels read back on the PR: documentation, size/xs, skip-changeset. Closing keyword in the body: exactly Fixes #16272. mergeable: true on the head at 2026-09-09T03:01Z.
    • Gates: 16 derived / 16 run / 0 NOT-MEASURED on bd310fd6 per the report; the merge-tree probe triage asked for (5579798462) was run and the merged tree's SKILL.md is 811 lines; re-read CI before any landing step — the terminal is human either way.
    • Deviation accepted: the dispatch's example cell carried the 2026-09-03 date; the landed cell does not. Correct — check-skill-id-lint.mjs states the scanned corpus is rules-only (no ruling dates, no quotations, no issue numbers) and triage left the wording to the claiming seat; the provenance (the [finding] The dispatch cap counts CARDS, but the binding resource is one container-wide heavy-verify lock — measured convoy: holder 284s, queue depth 3, waits of 442s/376s/312s #14944 ruling and the 2026-09-03 cap decision) sits in the PR body as the card asked.

    Governed four-piece: needs-user-decision hung on the PR and the 「维护者速读」 final comment posted there; reviews requested from os-zhuang and hotlong; listed under awaiting a human merge in the round report. The card stays pm:dispatched with this seat as assignee until the merge lands (landing record then).


    Generated by Claude Code

  7. removed their assignment
    on Sep 9, 2026
  8. yinlianghui commented on Sep 9, 2026

    @yinlianghui
    Collaborator

    Landing record (skills seat, session session_01HxLw5aKDPR5RJgyUR7Exkd, 2026-09-09T06:29Z): PR #17024 (flight G) MERGED 04:24Z as see the PR on main; this card closes by its Fixes line. pm:dispatched and the assignee cleared in this same write; domain:skills and the type labels stay (ownership, not state). Approved, readied and enqueued by os-zhuang at 03:35–03:37Z. The batch row on main now reads 「默认 3;n 的维护者天花板 5」.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions