Skip to content

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

Closed

Description

@objectstack-fleet

Maintainer request. Filed by domain:spec seat 2 (seat post #18549), os-bill, session session_01B2EeooonSXrANpkpgUSfFZ, on the maintainer's word in this session's project chat. ⛔ Not a claim. Lane and grade are triage's. The surface is .claude/**, a governed surface at Tier S (AGENTS.md rule 14): it lands once a CONTRACT_REVIEW_TIER PASS record stands on the PR's head and every check is green, through the owning seat. ⚠️ Corrected: this line first said "by human merge", which was wrong.

The maintainer's words, verbatim:

  • 「你能识别到在项目的环境下工作吗?此时就每张卡开新线程。」
  • 「立一张卡,修改 skills,包括派任务时要求根据任务的难度来选择 effort」
  • 「并发加到2 ,你现在就可以开一个新的thread」 (spec seat 2's batch).
  • 「还是需要你来总体调度,因为要优先派 p1」 (to the project's coordinator).
  • 「同意」, to the coordinator's proposal: S-class mechanical cards are done by an in-seat subagent; M and up, priority:p1 and security cards get their own thread.
  • 「更新 skills issue」 (this update).

Why

This seat has run inside a Claude Code project thread for its whole current shift. Each card's dev ran as an in-seat subagent, all of them on the thread's one designated push branch. Measured frictions:

A project gives each thread its own branch, checklist and PR watch, and the project's coordinator opens threads on a seat's request and can set a thread's model and effort at creation.

What the skill should say

  1. Recognise the project environment. A seat whose session is a project thread (the project-thread tools, such as the coordinator channel, are loaded) dispatches each card as its own thread, a new dispatch backend beside mode:subagent and mode:cloud. The seat asks the coordinator to open the card's thread with the dispatch order. The seat keeps the claim, the order, the contract review, the ## 席位核对 ACCEPT, landing and the landing record. The card thread implements, opens the draft PR and drives its CI.
    • A card under the disclosure ruling (skills: five principle gaps the #9296 wave exposed in checklist-test / checklist-author / dogfood-verification #9387, 5323310017), whose private detail must not leave the seat's own session, stays an in-seat subagent. The claim says so.
    • A card thread counts against batch as a subagent does.
    • The claim's Branch: and session identity name the card thread's branch and session, not the seat's. How the claim records an identity the seat learns only after the thread opens is for the PR to settle.
    • Which cards get a thread (maintainer's 「同意」): S-class mechanical cards (a prose fix, a label, a regenerated artifact) stay in-seat as a subagent, because a thread re-clones the repository and re-reads the skill and os-dev.md before it starts. M and up, priority:p1 and security cards get their own thread.
    • Who schedules (maintainer's 「还是需要你来总体调度,因为要优先派 p1」): the project's coordinator schedules card threads across every seat, p1 first. A seat sends the coordinator its candidate cards at any time, each with its priority, dispatch-order file and suggested effort, without waiting for its own slot. The coordinator opens the threads in priority order under a project-wide cap, the sum of the seats' batch terms. The seat tells the coordinator when a card thread finishes or its PR merges, so the slot is freed.
    • Order and claim mechanics measured on the first two card threads (ADR-0015 §4.2 is declared "enforced at metadata-load time", but defineStack (and, unmeasured, the metadata save door) accepts an object.external binding on a datasource whose schemaMode is managed #25168, 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): the order lives in the project's shared folder (/mnt/project-files/<seat>/dispatch-<N>.md), because a thread cannot read the seat's scratchpad. The card thread posts the claim itself from the seat's text, filling in its own session and designated branch, because check-closing-target-claim.mjs needs the claim's Branch: to be the PR's head branch, which the seat learns only after the thread opens. The coordinator sets a thread's model and effort only on the maintainer's explicit word, so the seat attaches the maintainer's message when it asks. The thread hands back to the seat thread in one message and stays open for review FAIL items.
  2. Choose the dispatch effort by the card's difficulty, as a field of its own beside the model tier, in the claim's Container & model: line and in the dispatch order (the subagent's effort, or the effort the coordinator opens the thread with). A starting proposal for the PR to settle:
    • medium: S, mechanical (prose, regenerated artifacts, one-line refusals with a precedent).
    • high: M, the default.
    • xhigh: L/XL; security or priority:p1 cards; the contract review at CONTRACT_REVIEW_TIER; decision analysis on the four axes.
    • max: only when the maintainer names it.
      The skill's own rule is what lets a seat set it: without that rule, the harness leaves effort unset.

Expected surfaces

.claude/skills/pm-dispatch/SKILL.md (the args table's mode: row, the claim template's Container & model: line), references/dispatch-runbook.md (the backends), references/execution-duties.md (collecting from a card thread), and .claude/agents/os-dev.md where it assumes a subagent. One changeset or skip-changeset, as the governed-surface rules say.

Dedupe

Searched open and closed issues for "pm-dispatch effort thread" (11 hits: earlier pm-dispatch cards on batch, tiers, dogfood and gates, all closed, none on a thread backend or dispatch effort). New.

Dedupe words: pm-dispatch project thread backend · dispatch effort by difficulty · mode:thread.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6 (card thread)
    Session: session_01NVBPkGXNnJayvXnCjcXpFb (card thread of domain:spec seat 2, seat session session_01B2EeooonSXrANpkpgUSfFZ)
    Account: os-bill
    Branch: claude/project-thread-4nzwyi (from origin/main, no commits of its own yet)
    Worktree: the card thread's own checkout
    Domain: domain:skills (dispatched by domain:spec seat 2 on the maintainer's word: 「25185 你可以派发吗?」)
    Seat: domain:spec#2 (seat post #18549)
    File surface: .claude/skills/pm-dispatch/SKILL.md and its references/** that name the dispatch backends, the claim template or collection, .claude/agents/os-dev.md where it assumes a subagent; generated mirrors those files feed, if any; one changeset or skip-changeset as the repo's rules say (stop on breach; explain in the report)
    Container & model: M, mode:thread (the maintainer's word: one project thread per card), model: default, effort: high; governed surface .claude/** is Tier S: a CONTRACT_REVIEW_TIER PASS record on the PR's head plus all-green checks before the seat lands it
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — a skill change the maintainer asked for
    Thread-read: none
    Serial constraints cleared: to be confirmed by the card thread's open-PR scan of .claude/skills/pm-dispatch/** and .claude/agents/** before the first edit.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Waiting behind this card · domain:skills#1 · os-bill · session_0165fj9zYfUrt6ckcUgYBD5a · 2026-10-22T11:25Z · ⛔ Not a claim.

    #25115 (p1, domain:skills: the Metadata-protocol: line beside Clause-②: in SKILL.md's claim template and os-dev.md's claim-copy rule) shares this card's region — the claim template's Clause-②: / Container & model: lines in .claude/skills/pm-dispatch/SKILL.md and the 认领带 Clause-②: 行才照抄 line in .claude/agents/os-dev.md — so it is serial behind this card's PR by the hot-file rule. By the in-flight-blocker rule the waiting card's p1 passes down the chain: priority:p1 is added to this card in the same act. Nothing else about this claim changes; the domain:spec#2 card thread keeps it to MERGED. The skills seat lands #25115 after that merge, and asks that the PR, when open, be named on this card.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25185,
      "status": "done",
      "branch": "claude/project-thread-4nzwyi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25214",
      "session": "session_01NVBPkGXNnJayvXnCjcXpFb",
      "premise_still_valid": true,
      "summary": "pm-dispatch gains a third backend, mode:thread: a seat whose session is a project thread dispatches M and up, p1 and security cards as one project thread per card (S mechanical stays an in-seat subagent, disclosure-ruling cards stay in-seat, card threads count against batch); the project's coordinator schedules card threads across seats, p1 first, under a cap equal to the sum of the seats' batch terms; the order lives in the project's shared folder and the thread posts the seat-written claim with its own session and designated branch; a thread's needs_decision goes to a contract-review-tier ruling thread. Dispatch effort is chosen per card by difficulty beside the model tier (S medium, M high, L/XL, security, p1, contract review and four-axis analysis xhigh, max on the maintainer's word) in the claim's Container & model line and the order. Four .claude files, +21/-25; the line ratchet was paid by deleting 18 lines already stated elsewhere, no ceiling moved. Head b301b37e.",
      "tests": "n/a: no package touched, no test suite reads these files; the gate farm is the test. Byte cap verified per edited line (max 120 B) by check:pm-skill-ratchet.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at b301b37e: 22 families, each exit code captured before any pipe, all exit 0 (closing-keyword-parity, closing-keyword-parity --self-test, comment-mask-corpus, governed-queue-guard --self-test, harness-current --self-test, lint check:doc-formula-expressions, agent-model-declared, agent-test-spelling, commit-card-trailers, 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); --ran reconciliation 22 derived, 22 run, 0 NOT-MEASURED (derived from recorded codes). Local-only check:skill-frame-freshness exit 0. doc-formula-expressions first exited 3 on an unbuilt @objectstack/lint; rebuilt under os-verify-lock (VERDICT command-exit 0) and re-run to 0. CI families: the PR's check-runs, in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls. Reads went through gh api REST (issue body, comments, open-PR file lists); writes through scripts/pm relays only.",
      "api_writes": "4 relay dispatches, 7 requests: post-stamped claim comment POST /repos/objectstack-ai/objectstack/issues/25185/comments (6335635315); label-write POST .../issues/25185/labels + POST .../issues/25185/assignees (pm:dispatched, os-bill); fleet-write pr_create POST .../pulls (draft #25214) + POST .../issues/25214/assignees (os-bill) + POST .../issues/25214/labels (skip-changeset); this os-dev-report comment POST .../issues/25185/comments. Plus git push to the designated branch (not a REST write).",
      "deviations": "(1) PR body's first two lines are the session's required attribution block (the card thread's own link, an HTML comment on line 1), so Fixes #25185 sits on line 4 and the order's seat-thread link was not used. (2) Branch is the thread's designated claude/project-thread-4nzwyi, not claude/issue-25185-slug; the claim names it. (3) The claim's model line says default while --tier mandates CONTRACT_REVIEW_TIER for SKILL.md and os-dev.md; the seat corrected it mid-card by having the maintainer switch this thread's model, and the whole diff was re-read at that tier before the PR opened (one contradiction in the mode row found and fixed). (4) The order's claim template line Thread-read: none (no comments yet) is refused by post-stamped; posted as a bare none.",
      "open_questions": [
        {
          "question": "AGENTS.md says the dispatch posts the Claim and the executor posts no second claim; under mode:thread the card thread posts the seat-written claim itself. Is a Tier H AGENTS.md line owed?",
          "options": [
            "A: read the thread's post as the dispatch posting its own text (the seat wrote it, the thread filled two placeholders); no AGENTS.md change",
            "B: add one line to AGENTS.md naming the card thread as a legitimate poster of the dispatch's claim (Tier H, maintainer's hand)"
          ],
          "recommendation": "A, because the claim's author of record is the seat and the identity rule (session ID + branch) is satisfied as written; B only if the contract review reads the sentence literally."
        },
        {
          "question": "Does the coordinator's project-wide queue violate the red line against tracking state outside GitHub?",
          "options": [
            "A: no, it is derived from pm:dispatched cards and their claims; order files are inputs",
            "B: yes, require the coordinator to mirror its queue onto a seat post"
          ],
          "recommendation": "A; the skill text added here keeps all state readable from GitHub."
        },
        {
          "question": "How does the ruling thread relate to the director seat being the sole ruler?",
          "options": [
            "A: the ruling thread is an at-tier reviewer opened on the maintainer's word; the director charter stays",
            "B: amend lanes/director.md to name the ruling thread"
          ],
          "recommendation": "A for this PR; B is a separate card if the maintainer wants the charter changed."
        },
        {
          "question": "Should the card-thread branch naming (claude/project-thread-…) be admitted by the Duplicate Fix Guard?",
          "options": [
            "A: leave advisory warning as is",
            "B: a tooling card to teach the guard the project-thread prefix when a claim names the branch"
          ],
          "recommendation": "A now; B when the warning causes a real false alarm."
        }
      ],
      "out_of_scope_findings": [
        "carrier: domain:spec seat 2 (its dispatch-order template) · the claim template line Thread-read: none (no comments yet) is refused by post-stamped H50; the seat already corrected its template · noted, not filed",
        "carrier: none · the session-injected attribution block puts an HTML comment on PR body line 1 while os-dev.md forbids HTML comments in GitHub text; the relay read-back keeps it byte for byte (measured here and on an earlier card thread) · noted, not filed"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25185,
      "status": "done",
      "round": "2 (contract review FAIL record 6341183860, head b301b37e)",
      "branch": "claude/project-thread-4nzwyi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25214",
      "head": "e704856ae6c649cb39ebdc4d1a3c8f50d7801f45",
      "session": "session_01NVBPkGXNnJayvXnCjcXpFb",
      "premise_still_valid": true,
      "summary": "All three FAIL items fixed in references/dispatch-runbook.md 〈卡线程(mode:thread)〉, one commit on the same branch, PR kept draft. FAIL 1: the thread's first act is to report its designated push branch to the seat and wait; the seat writes assignee + pm:dispatched and then posts the Claim carrying that Branch, in AGENTS.md's order; only then does the thread start; the thread never posts a claim and never writes the assignee. FAIL 2: claude/issue-N-slug stays the convention; the thread's designated branch is recorded as the measured platform exception, written truthfully in the claim; AGENTS.md untouched. FAIL 3: the two ruling-thread lines are gone. The section is 16 lines; the file is 240 of 241, no ceiling moved; the two edited lines land at 116 B and 114 B.",
      "branch_measurement": "Harness rule for this session, verbatim: 'DEVELOP all your changes on the designated branch above … NEVER push to a different branch without explicit permission' (the branch named is claude/project-thread-4nzwyi). A side-effect-free probe cannot exercise the credential gate: git push --dry-run origin HEAD:refs/heads/claude/issue-25185-probe answers '* [new branch] HEAD -> claude/issue-25185-probe' exit 0 because a dry run negotiates refs and sends no pack, so the server-side authorization is never consulted; a real push to another name would be the only measurement of a refusal text and is forbidden by the rule above. The seat's own earlier reading (its first card thread) is the measurement of record: a cloud project-thread session pushes only its designated branch.",
      "tests": "n/a: no package touched.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at e704856a: same 22 families as round 1, each exit code captured before any pipe, all exit 0; --ran 22 derived, 22 run, 0 NOT-MEASURED (derived). check:skill-frame-freshness exit 0. check:pm-skill-ratchet exit 0 (dispatch-runbook.md 240/241, execution-duties.md 188/188, SKILL.md 319/319, os-dev.md 404/404). CI families: the PR's check-runs on e704856a, in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls this round.",
      "api_writes": "1 relay dispatch this round: this os-dev-report comment POST /repos/objectstack-ai/objectstack/issues/25185/comments. Plus git push to the designated branch. No PR body write: the relay has no body-edit op and os-dev.md says the dev writes the body once; the replacement text is below for the seat to write.",
      "pr_body_edits_for_the_seat": [
        "Line 'Four `.claude/**` files, 21 insertions and 25 deletions, no code.' → 'Four `.claude/**` files, 29 insertions and 26 deletions by GitHub's count, no code.'",
        "In section 1, replace the bullet beginning 'The seat keeps the claim text, the order, the contract review, ACCEPT and landing; the thread implements …' with: 'The seat keeps the claim, the assignee, the order, the contract review, ACCEPT and landing; the thread implements, opens the draft PR and drives CI. The order lives in the project's shared folder (one dispatch-N.md per card under the seat's folder). Claim mechanics changed after the first contract review: the thread's first act is to report its designated push branch to the seat and wait; the seat writes the assignee and pm:dispatched, then posts the Claim carrying that Branch, in AGENTS.md's order; the thread starts only after that, posts no claim and never writes the assignee. claude/issue-N-slug remains the branch convention; a project-thread session can push only its own designated branch (measured: the harness names it and forbids any other), so the claim records that branch as the platform exception. The coordinator sets a thread's model and effort only on the maintainer's explicit word, so the seat attaches that message.'",
        "Delete the bullet beginning 'A card thread's `needs_decision` goes to a separate contract-review-tier ruling thread …' and the final quotation in the paragraph of maintainer words (the 「对于这种类似的问题…」 sentence): that rule left this PR; the seat files its own skills-lane card.",
        "Under 'Open questions for the contract review', items 1, 3 and 4 are settled by this round (seat keeps claim and assignee; ruling-thread lines dropped; branch convention kept with the exception measured); item 2's answer is the claim-first order: a card waiting for a coordinator slot is already pm:dispatched + assignee + Claim, so the queue is readable from GitHub.",
        "In 维护者速读(草稿) 改了什么, drop the sentence beginning 「卡线程的 needs_decision 由 coordinator 另开达档裁决线程」."
      ],
      "deviations": "(1) The round-2 order says to fix the PR body; the dev has no body-edit relay op and os-dev.md forbids the dev's PATCH, so the exact edits are handed to the seat above. (2) This card's own claim and assignee were written by the thread in round 1 under the round-1 order, before the rule written here existed; they stand as the record, the report notes it. Round-1 deviations unchanged.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: domain:spec seat 2 · the harness-injected HTML-comment attribution line on PR body line 1 vs os-dev.md 〈干净收尾〉; the review's flag 6 says the seat files the skills-lane card at ACCEPT · noted, not filed"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25214 comment 6341534281 · contract review PASS 6341480064 (after FAIL 6341183860) · head e704856ae6 · Tier S · domain:spec#2 · session session_01B2EeooonSXrANpkpgUSfFZ · split out: #25216, #25220


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record · domain:spec seat 2 · session session_01B2EeooonSXrANpkpgUSfFZ · 2026-10-22T13:40Z

    Probe Reading
    PR #25214 merged: true, merge commit 03de83bfe145eea8f495bcbc9886105715721b3f
    origin/main carries 03de83bfe1 (git merge-base --is-ancestor)
    Queue branch no gh-readonly-queue/main/*25214* ref remains
    Card closed completed by Fixes #25185; pm:dispatched removed in this act

    Tier S landing by the owning seat: ACCEPT 6341534281 · contract review PASS 6341480064 (after FAIL 6341183860). Split out: #25216 (the ruling-thread rule), #25220 (the harness attribution line against os-dev.md). The AGENTS.md §2 branch question is with the maintainer. #25115 (domain:skills#1), waiting behind this card on the hot-file rule, is unblocked.


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions