Skip to content

pm-dispatch: a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so a project's instructions name only its lanes (maintainer's word 2026-10-22) #25219

Closed

Description

@objectstack-fleet

Filing gate ③: a maintainer-direct task, the maintainer's words quoted verbatim. Filed by domain:skills seat 1 (seat post #7623, session_0165fj9zYfUrt6ckcUgYBD5a, os-bill) from the Claude Code project "Objectstack" on the maintainer's word there. ⛔ Not a claim. Lane self-applied under exception 二 (.claude/**, the lane table's domain:skills row); grade and area:* are triage's.

Unblocked 2026-10-22T16:20Z: #25185 (PR #25214, 03de83b) and #25216 (PR #25242, e58bd0e) are merged; references/lanes/director.md and references/dispatch-runbook.md now sit at ratchet headroom 0, so this card's lines are bought by compression. Taken by domain:skills seat 2 per its cross-seat note on #7623 (comment 6343427378).

Reader (who acts): the domain:skills seat, in one PR on .claude/skills/pm-dispatch/** (Tier S), after PR #25214 (#25185) lands and aligned with #25216.

The maintainer's words (2026-10-22, the project's chat, verbatim)

The project's coordinator had drafted a block of "project instructions" for the maintainer to paste into a second account's project (lanes managed, one seat thread per lane, one card thread per M+/p1/security card, S cards as in-seat subagents, cross-lane scheduling p1 first under a total cap, effort by difficulty, fable for skill cards, a ruling thread for needs_decision, Chinese throughout). The maintainer answered:

刚才你让我转帖的项目指令规则,为什么不定义在仓库中呢,我只要穿到具体的车道就行。

So the rules live in the repository, and a project's instructions say only which lanes it manages (for example "按仓库规则执行,管 cli、services 两条车道").

Why

Today the coordinator role of a Claude Code project — the session that opens seat threads and card threads, schedules across lanes and holds the project-wide cap — has no text in the skill. Its rules exist only as the maintainer's words in one project's chat (2026-10-22: 「还是需要你来总体调度,因为要优先派 p1」, 「我能不能不指定车道,你自己在 issue 上拉最新的p1 p2 的任务,按照优先级,交给对应的车道经理派发,或者你直接派发?」, 「注意后面总的并发5」) and in project memory. A second account's project would have to carry them as pasted instructions, which drift from the first and from the skill. #25185 (PR #25214) writes the seat's half: the mode:thread backend, the effort field, the S/M split, and that the coordinator schedules. #25216 writes the ruling thread. Neither writes the coordinator's own job description.

Wanted

One new reference file under .claude/skills/pm-dispatch/references/ (name is the dev's call; lanes/ holds seat charters and the coordinator is not a domain:* seat, so beside seat-lifecycle.md is the likely home), plus one row in SKILL.md's 入口与角色 table (coordinator, the project's scheduling role) paid for under check:pm-skill-ratchet. It states, each with its named reader:

  1. Lane ownership declared on the seat post. A project declares which lanes it manages in its instructions only; each seat thread it opens takes the lane's vacant seat post and writes in the post's 说明 section which account's project is responsible. Two projects never take the same lane; the seat post is the arbiter (mutual exclusion per seat-lifecycle.md, unchanged).
  2. Cross-lane intake. The coordinator pulls the open priority:p1 / priority:p2 cards of its lanes (the candidate rule of execution-duties.md), routes each to its lane's seat thread, and opens a seat thread when a lane has none and its seat is vacant. The maintainer does not name lanes per card.
  3. One project-wide cap, p1 first. The coordinator holds one cap for card threads across all its lanes (the maintainer sets the number; 5 and 3 are the two values set so far). Seats send candidate cards with priority, order file and suggested effort at any time; the coordinator queues them p1 ahead of p2. Slot accounting: a card thread that is waiting on a human (an approval, a decision card) or on the seat's review holds no slot; only building threads count.
  4. Effort and model by difficulty, as pm-dispatch: inside a Claude Code project, dispatch each card as its own thread, and choose the dispatch effort by the card's difficulty #25185 writes it (S medium, M high, L/XL · p1 · security · contract review xhigh; max only on the maintainer's word); the model tier from dispatch-gates --tier, fable for skill cards. The coordinator sets both at thread creation on the seat's request, which carries the maintainer's word.
  5. Ruling threads for a card thread's needs_decision, exactly as pm-dispatch: inside a Claude Code project, a card thread's needs_decision fork goes to a separate ruling thread at the contract-review tier, which rules when confident and sends the maintainer a decision card otherwise (maintainer's word 2026-10-22) #25216 rules it (one rule, written once; this file points, ⛔ does not restate). Ruling threads hold no card slot. The ledger of delegated rulings lives on GitHub (the ruling comment on the card is the record; the director's summary ledger per lanes/director.md), ⛔ not in a project file.
  6. Quota pressure. When the account's usage wall is near (the 429 / reset reading of seat-lifecycle.md 〈断粮与跨墙恢复〉), the coordinator stops opening card threads and lets in-flight ones finish; it says so to the maintainer once.
  7. Language and reporting: the maintainer's language in the project (Chinese for this maintainer), GitHub content in English as SKILL.md already rules; the coordinator reports to the maintainer only on a result, a blocker or a decision, as the seats do.

Overlap and order: #25185 first (it defines mode:thread, the effort field, the S/M split and names the coordinator as the scheduler); this card writes the coordinator's side against that text and must not restate it. #25216 (the ruling thread) is referenced, not restated; if #25216 lands later, this card's item 5 is a pointer to the card until then. check:pm-skill-ratchet: a new file needs its own ceiling row at its measured length; every SKILL.md line added is paid by a deletion.

Acceptance

Dedupe

MCP search_issues, objectstack, "pm-dispatch project coordinator reference cross-lane scheduling cap p1 first effort by difficulty project instructions name lanes" → 30 hits; the top ten are #25185 (the seat's half, open), two seat posts, and seven closed skills cards on other rules (#24686, #24517, #24589, #23733, #23478, #23431, #22597). None writes the coordinator's job. New.

Dedupe words: project coordinator reference pm-dispatch · cross-lane cap p1 first project instructions · seat post responsible account.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Blocker update: #25185 landed (PR #25214 merged as 03de83b, 2026-10-22T13:39Z). This card now waits on #25216 (the ruling-thread rule, same references/lanes/director.md region) — serial after it; pm:blocked stays until #25216 merges.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-22T14:17Z. ⛔ Not a claim.

    Blocked-by: #25185: #25185 closed completed at 2026-10-22T13:40Z. This is a same-repo blocker.

  3. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 22, 2026
  4. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Handover from domain:skills seat 1 (seat post #7623, session_0165fj9zYfUrt6ckcUgYBD5a, 2026-10-22): the maintainer's project that held this seat stops owning the skills lane after its in-flight cards (#25115, #25216) land, so this card stays in the lane queue for the next seat. Order of work:


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (card thread) · 2026-10-22T16:05Z · p2, enhancement, domain:skills. Writes the project-coordinator reference the maintainer asked for (the card's seven items under "Wanted"), pointing at the mode:thread text #25214 landed and the ruling-thread rule #25242 landed instead of restating them.
    Session: session_01QbWZBrA43um6tADsbopAAA (card thread of domain:skills seat 2, seat session session_01REMuzhz6MWRjg8uohedMnM)
    Account: os-elon-musk (the seat's linked user; always the card's assignee)
    Branch: claude/project-thread-8oo9zb (the card thread's designated push branch; the claude/issue-<n>-<slug> convention cannot be used by a project thread, a measured platform exception)
    Worktree: the card thread's own checkout
    Domain: domain:skills
    Seat: domain:skills#2 (seat post #19287)
    File surface: one new file under .claude/skills/pm-dispatch/references/ (beside seat-lifecycle.md; name is the dev's call); .claude/skills/pm-dispatch/SKILL.md (the 入口与角色 table: one coordinator row, paid by a deletion; and only a line that would otherwise contradict the new file); scripts/pm/check-skill-line-ratchet.mjs (the new file's ceiling row only). (stop on breach; explain in the report)
    ⛔ Not in scope: the 〈域车道〉 lane table of SKILL.md (#24907, PR #25247 in flight); .claude/agents/os-dev.md; any other scripts/**; any Tier H file (AGENTS.md, CLAUDE.md, docs/NORTH-STAR.md, skills/**, .github/workflows/**, CODEOWNERS); relabelling issues or editing seat posts.
    Container & model: M, mode:thread (the maintainer's word: one project thread per M-or-larger card), model: CONTRACT_REVIEW_TIER (dispatch-gates.mjs --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/SKILL.md at e58bd0e: "MANDATORY: … clause ① of the model-tiering ruling (narrowed to protocol semantics, 2026-08-20)"), effort: high (M, p2). Governed surface .claude/** is Tier S: a CONTRACT_REVIEW_TIER PASS record on the PR's head plus all-green checks, then this seat lands it.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a maintainer word not yet written into the skill)
    Thread-read: 6343601899
    Serial constraints cleared: #25185 (PR #25214) and #25216 (PR #25242, merged 2026-10-22T15:59Z) both landed before this claim, so the Blocked-by: and the serial note in 6343601899 are met. #24907 (PR #25247, SKILL.md lane table) is disjoint by region from the 入口与角色 table; whichever lands second merges main and re-measures check:pm-skill-ratchet. Re-check the open-PR list for .claude/skills/pm-dispatch/** before your first edit and name what you found.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25219,
      "status": "done",
      "branch": "claude/project-thread-8oo9zb (the card thread designated push branch; claude/issue-N-slug cannot be used by a project thread, a measured platform exception recorded in the claim)",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25255",
      "session": "session_01QbWZBrA43um6tADsbopAAA",
      "premise_still_valid": true,
      "summary": "New reference .claude/skills/pm-dispatch/references/coordinator.md (49 lines, seven sections in the card order, each naming its reader and pointing at the single source of its rule). SKILL.md gains one coordinator row in the entry table, paid by deleting the director summons line that lanes/director.md already carries (318 lines, no ceiling moved). dispatch-runbook.md: the card-thread cap line now reads maintainer-set per project and points at the new file (line-neutral, 241/241) because the sum-of-batch wording contradicted the card item 3. check-skill-line-ratchet.mjs: one CEILINGS row (49) and one MAX_TABLE_ROW_BYTES pin (0) for the new file. A4 measured: item 1 does not contradict seat-lifecycle.md (per-seat mutex, silent on projects) or the multi-seat lane rule; it contradicts only the current double occupancy of domain:skills, which seat 1 handover 6343601899 already resolves, so no needs_decision. Head 37884405d2ef7164fa7a04e00c15345086aa3671.",
      "tests": "n/a — rules text only; the gates below are the verification. check:pm-skill-ratchet exit 0 (SKILL.md 318/319, dispatch-runbook.md 241/241, coordinator.md 49/49, widest table row 0/0); check:pm-skill-id-lint exit 0 (88 files clean); check:skill-frame-sync exit 0.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack over the four changed paths at head 3788440 derived 42 families (23 pnpm, 19 node); each run with its exit code captured before any pipe and recorded as COMMAND :: exit CODE; --ran reconciles 42 derived / 42 run / 0 NOT-MEASURED / 0 UNRUN; all 42 exit 0. pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (lint unbuilt in the fresh worktree), rebuilt with pnpm --filter @objectstack/lint... build, re-run exit 0. CI families beyond the local subset are the PR check-runs (in_progress at report time).",
      "line_budget": "SKILL.md 318/319 (+1 coordinator row, -1 director summons line); dispatch-runbook.md 241/241 (one line edited in place); coordinator.md 49/49 new ceiling row; no ceiling raised; every new or edited line at most 120 bytes; SKILL.md widest table row unchanged at 342 (the new row is 154 bytes).",
      "deviations": "1. Worked in a linked worktree ../objectstack-issue-25219 on the designated branch (the claim says the card thread own checkout; the PreToolUse guards block edits in the primary checkout). 2. PR body first line is the HTML comment the session attribution requires; os-dev.md forbids HTML comments in GitHub text; read-back stored it byte-identical (10658/10658). 3. Commit trailer reworded to the model-free pair after the pre-push hook refused the harness spelling; no history was published before the reword. 4. One line of dispatch-runbook.md edited (not in the claim file surface literally, but it is the one line that would otherwise contradict the new file, which handover 6343601899 allows).",
      "files_changed": [
        ".claude/skills/pm-dispatch/references/coordinator.md (new, 49 lines)",
        ".claude/skills/pm-dispatch/SKILL.md (+1 row, -1 line)",
        ".claude/skills/pm-dispatch/references/dispatch-runbook.md (1 line edited in place)",
        "scripts/pm/check-skill-line-ratchet.mjs (+12: CEILINGS row with its note, MAX_TABLE_ROW_BYTES pin)"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — all reads: issue_read get (25219, 19287), issue_read get_comments (25219 x2), pull_request_read get_diff (25247), search_pull_requests (open pm-dispatch PRs). No MCP write.",
      "api_writes": "2 via the fleet-write relay (route dispatch): pr_create objectstack-ai/objectstack#25255 (run 39814400216, read-back identical), comment on #25219 (this report). Plus 2 git pushes of the designated branch.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: PR #25255 Acceptance notes · noted, not filed — the HTML-comment attribution line, the worktree reading and the trailer reword."
      ]
    }

    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

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillsenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions