Skip to content

pm-dispatch: retire the fleet one-tooling-slot rule — the take-order alone sequences tooling cards, and a lane's "open P0/P1" is an undispatched one (maintainer direct dispatch) #20957

Description

@objectstack-fleet

Filing gate: ③ a task the maintainer dispatched directly — the order is quoted verbatim below. Path: none (an instrument card; the fleet decision is the maintainer's order). Self-triaged by the domain:skills seat under the lane's own-finding exception (references/lanes/skills.md: 本车道 finding 自分诊).

Filed by the domain:skills execution seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623) and dispatched by it in the same round on the maintainer's word (message 3 below).

The order (出处三件)

What the rule does today (measured 2026-09-30T22:50Z, main at 013f97df9)

What changes (the order, as work items)

  1. Retire the fleet one-tooling-slot line at execution-duties.md:22. Its second half (an Unblocks: card inherits the product card's priority) survives only where it already has another home: read docs/NORTH-STAR.md 优先级 3 ("解锁产品 P0/P1 的仪器卡沿链继承其优先级") and execution-duties.md "p0/p1 优先级沿链传递" first; if both carry it, the whole line goes.
  2. The tooling label row at SKILL.md:112: "四具名读者" loses 舰队一张在飞 and becomes three named readers. Measure the fourth reader (普查半态行) while there: grep -n tooling scripts/pm/check-half-states.mjs finds no such row today. If that holds, report it under the PR's ## Acceptance notes; ⛔ do not widen this PR to it.
  3. "Open P0/P1" means undispatched. At execution-duties.md:45 and triage-duties.md:64, say in the line itself that the P0/P1 which holds a lane's p2/p3 tooling cards back is one still in the queue, not yet dispatched (no pm:dispatched, no assignee); a P0/P1 in development holds nothing back. The take-order (execution-duties.md:46-47) is then the only sequencing: the higher-priority candidate is taken first, and an in-flight card of any priority never blocks a candidate.
  4. Census. Re-read .claude/**, AGENTS.md and scripts/pm/** for any other restatement (一张在飞, 舰队至多, 第二张等, tooling slot, "one tooling") and retire it in the same PR; the PR body names the query and its count.

What does not change

File surface and budget

.claude/skills/pm-dispatch/references/execution-duties.md, .claude/skills/pm-dispatch/SKILL.md (the one row), .claude/skills/pm-dispatch/references/triage-duties.md, plus scripts/pm/check-skill-line-ratchet.mjs only to LOWER a ceiling row. All three files sit AT their ratchet ceiling (319 / 183 / 120 lines): net lines ≤ 0 per file, ⛔ no re-wrap to make room, ⛔ no ceiling raise. Item 1 frees one line in execution-duties.md; items 2 and 3 are in-line rewrites. Skill text cites no issue numbers (check:pm-skill-id-lint).

Tier: .claude/** is governed Tier S — the PR lands on the seat's contract-review-tier review PASS, then ready → queue; no human approval. Draft PR, first body line Fixes #<this card>, Clause-②: no.

Dedupe

GET /repos/objectstack-ai/objectstack/issues?labels=tooling&state=all&per_page=100, pages 1–4 (300 cards, open and closed), titles and bodies grepped for tooling slot | one tooling | 一张在飞 | 舰队 | 名额 | fleet slot | at most one | tooling…dispatched: 0 on-topic cards. The three regex hits (#20613 release.yml, #20511 scenario requires, #20245 view overlay) are unrelated.

Hands-on reader: the os-dev this seat dispatches on this card in this round; the seat reviews and lands the PR.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 10
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-20957-retire-fleet-tooling-slot
    Worktree: objectstack-issue-20957
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/execution-duties.md (:22, :45), .claude/skills/pm-dispatch/SKILL.md (:112, the tooling label row), .claude/skills/pm-dispatch/references/triage-duties.md (:64), plus scripts/pm/check-skill-line-ratchet.mjs only to lower a ceiling row. ⛔ Not docs/NORTH-STAR.md, ⛔ not AGENTS.md, ⛔ no other script. Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: fable (dispatch-gates --tier at 013f97df9: .claude/skills/pm-dispatch/SKILL.md ⇒ claude-fable-5-1 MANDATORY, clause ① of the model-tiering ruling; no exit taken — item 3 is protocol semantics, not a one-line mechanical edit). Tier S (.claude/**): the landing record is the seat's contract-review-tier review PASS, then ready → queue.
    Clause-②: no
    Thread-read: none
    Serial constraints cleared:


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 20957,
      "status": "done",
      "branch": "claude/issue-20957-retire-fleet-tooling-slot",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/20967",
      "session": "session_01KTZmMfzVzjNvyaLyQ8mHvg",
      "premise_still_valid": true,
      "head_sha": "2f2869206",
      "base_sha": "3693a1b50",
      "summary": "Retired the fleet one-tooling-slot line (execution-duties.md:22 deleted whole; its Unblocks inheritance half already lives at docs/NORTH-STAR.md:114 rule 3 and execution-duties.md:44, plus dispatch-runbook.md:162). Stated in the two P0/P1 gate lines that open = undispatched (no pm:dispatched, no assignee) and an in-flight P0/P1 holds no candidate back: a new line directly under execution-duties.md:45 (spent from the freed line, because MAX_LINE_BYTES=120 leaves no room in :45 itself) and an in-line rewrite of triage-duties.md:64. SKILL.md:112 tooling row: four named readers become three (fleet in-flight count removed; the frame block :240-:260 untouched). Census hit one restatement outside the six named spellings, the tooling label's provenance comment in scripts/pm/ensure-pm-labels.sh:282-289 (Four named consumers ... the fleet-wide one-tooling-card-in-flight count), rewritten to three; comment only, the entry condition and label description unchanged. Draft PR #20967 on the seat's Tier S path; no label, no assignee written.",
      "tests": "Derived: node scripts/pm/dispatch-gates.mjs --commands (no paths; change set from merge base 3693a1b50) = 36 families at 2f2869206 (the dispatch's 21 plus 15 scripts/** families pulled in by ensure-pm-labels.sh). All 36 run, all exit 0, exit codes recorded per line; reconcile: '✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED (a DERIVED zero — all 36 recorded an exit code and none of them is 3)'. Verdicts: '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 183 lines (ceiling 183; headroom 0)' / triage-duties.md 120 (ceiling 120) / SKILL.md 319 (ceiling 319) / SKILL.md widest table row 342 (pin 342); '✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent'; '✓ check-skill-id-lint: 34 file(s) clean (pattern /#[0-9]{3,}/g)'; '✓ check-governed-prose: 2 instruction surface(s) name all 6 registered governed surfaces ... and claim no others'; '✓ check-half-states self-test: 4912 cases pass'; '✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 458 files / 1382 TS blocks judged clean' after pnpm --filter '@objectstack/lint...' build under os-verify-lock.sh ('VERDICT command-exit 0 · held the lock 93s · waited 0s'). Control-character self-scan of the four files: grep exit 1 (clean); pnpm check:nul-bytes exit 0. Changed non-table lines 113 and 113 bytes (budget 120); edited table row 227 to 206 bytes (pin 342). No ablation owed: no gate logic changed. CI-measured only: check-governed-queue-guard (reads the workflow payload).",
      "gates": {
        "head_sha": "2f2869206",
        "derived": 36,
        "run": 36,
        "not_measured": 0,
        "exit_0": ["node scripts/check-ci-filter-parity.mjs", "node scripts/check-closing-keyword-parity.mjs", "node scripts/check-closing-keyword-parity.mjs --self-test", "node scripts/check-comment-mask-corpus.mjs", "node scripts/check-scripts-symbol-anchors.mjs", "node scripts/check-scripts-symbol-anchors.mjs --self-test", "node scripts/check-self-test-wired.mjs", "node scripts/check-self-test-wired.mjs --self-test", "node scripts/check-self-test-workflow-commands.mjs", "node scripts/check-self-test-workflow-commands.mjs --self-test", "node scripts/check-whole-set-label-write.mjs", "node scripts/check-whole-set-label-write.mjs --self-test", "node scripts/pm/check-governed-queue-guard.mjs --self-test", "node scripts/pm/check-harness-current.mjs --self-test", "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "pnpm check:agent-test-spelling", "pnpm check:bash32-floor", "pnpm check:cli-command-ids", "pnpm check:cross-package-test-inputs", "pnpm check:doc-authoring", "pnpm check:driver-memory-census", "pnpm check:entry-guard", "pnpm check:gitlink-declared", "pnpm check:nul-bytes", "pnpm check:parse-guard", "pnpm check:pm-expected-skips", "pnpm check:pm-governed-merges", "pnpm check:pm-governed-prose", "pnpm check:pm-half-states", "pnpm check:pm-label-desc-cap", "pnpm check:pm-skill-id-lint", "pnpm check:pm-skill-ratchet", "pnpm check:pnpm-filter-targets", "pnpm check:refd-timer-probe", "pnpm check:skill-frame-sync", "pnpm check:watch-hint-literal"],
        "non_zero": [],
        "ci_only": ["node scripts/pm/check-governed-queue-guard.mjs"],
        "ci_status": "in_progress — not awaited, per the report-on-local-verification rule"
      },
      "line_budget": {
        ".claude/skills/pm-dispatch/SKILL.md": { "before": 319, "after": 319, "ceiling": 319, "net": 0, "widest_row_before": 342, "widest_row_after": 342, "row_pin": 342, "edited_row_bytes": "227 to 206" },
        ".claude/skills/pm-dispatch/references/execution-duties.md": { "before": 183, "after": 183, "ceiling": 183, "net": 0, "changed_line_bytes": [113] },
        ".claude/skills/pm-dispatch/references/triage-duties.md": { "before": 120, "after": 120, "ceiling": 120, "net": 0, "changed_line_bytes": [113] },
        "ratchet_rows_moved": "none — the script judges at-most (over the ceiling goes red; headroom only prints a hint), and every file still sits at headroom 0"
      },
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/execution-duties.md",
        ".claude/skills/pm-dispatch/references/triage-duties.md",
        "scripts/pm/ensure-pm-labels.sh"
      ],
      "census": {
        "trees": [".claude/**", "AGENTS.md", "scripts/pm/**", "scripts/*.mjs"],
        "tree": "3693a1b50",
        "named_queries": { "一张在飞": 1, "舰队至多": 1, "第二张等": 1, "tooling slot": 0, "one `tooling`": 0, "at most one .tooling": 0 },
        "widened_queries": { "one-tooling": 1, "in-flight count": 1, "dispatched fleet-wide": 1, "fleet-wide (near tooling)": 2, "名额": 0, "第二张 (on topic)": 1 },
        "retired": ["execution-duties.md:22", "SKILL.md:112 (fleet reader)", "scripts/pm/ensure-pm-labels.sh:286 (comment)"],
        "left_as_history": ["scripts/pm/check-skill-line-ratchet.mjs:346-347 — provenance comment of a past ruled ceiling raise"],
        "AGENTS.md": "0 hits; not edited"
      },
      "item_3_inheritance_homes": ["docs/NORTH-STAR.md:114 (优先级 rule 3)", "execution-duties.md:44", "dispatch-runbook.md:162"],
      "item_4_fourth_reader": "holds — grep -n tooling scripts/pm/check-half-states.mjs exit 1, no row reads the label; kept in the row as one of three readers per the order, reported under the PR's Acceptance notes, not fixed",
      "mcp_calls": "0 — no MCP GitHub tool called. Reads (card body, claim comment 5921125191, PR read-back) went through unauthenticated REST GET via curl (gh is not installed in this container).",
      "api_writes": "2 REST writes, both through the fleet-write relay as objectstack-fleet[bot]: (1) pr_create POST /repos/objectstack-ai/objectstack/pulls → #20967, run 36790690235, read-back identical 9490/9490 bytes; (2) comment POST /repos/objectstack-ai/objectstack/issues/20957/comments (this report, via post-stamped.mjs). git push: 3 (empty-branch probe, then the two commits; not REST). No label write, no assignee write, no PATCH, no MCP.",
      "deviations": [
        "scripts/pm/ensure-pm-labels.sh edited (comment lines 282-289 only): outside the claim comment's named surface (⛔ no other script), inside the dispatch order's census clause (plus whatever item 2's census finds inside scripts/pm/**); the order's later word was followed and the edit is declared in the PR body. The seat may drop that commit (2f2869206) if it reads the claim as controlling.",
        "The open-P0/P1 reading in execution-duties.md is a line of its own under :45, not an in-line rewrite: :45 is 111 bytes against the 120-byte MAX_LINE_BYTES budget; paid from the line :22 freed, net 0.",
        "No ratchet row lowered: the dispatch's conditional (lower to 182 if the script demands equality) did not fire — the rule is at-most and no headroom was created.",
        "First commit attempt carried the harness attribution reminder's model-named Co-Authored-By trailer; the pre-push hook (check:commit-card-trailers) refused it; amended before publication to the repo's model-free pair. No published history rewritten.",
        "Bot labels documentation and size/s appeared on #20967 from the path labeler and size-labeler; not mine, not touched."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "class: none (observation, not a finding class) · SKILL.md:112 names 普查半态行 as a reader of tooling, and ensure-pm-labels.sh:287-288 restates it, but check-half-states.mjs has no row reading the tooling label (grep exit 1; Unblocks appears there only in fixture text) · reach: no public door, seat-protocol text only · carrier: the domain:skills seat reviewing #20967 · noted in the PR Acceptance notes, not filed · dedupe words: tooling half-state row, 普查半态行, check-half-states tooling, fourth reader, stale reader",
        "class: none (history) · check-skill-line-ratchet.mjs:346-347 provenance comment records 'at most one tooling card is dispatched fleet-wide' as the content of a past ruled raise · carrier: none · noted, not filed"
      ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T23:42Z. PR #20967 @ 2f2869206 (dev report 5921492175).

    Work items, each read on the head:

    1. execution-duties.md:22 deleted whole — filed: n/a; the Unblocks: inheritance keeps its homes at docs/NORTH-STAR.md 优先级 3, execution-duties.md:43 and dispatch-runbook.md:162 (the review re-verified all three). ✓
    2. SKILL.md:112 — 四具名读者 → 三具名读者, 舰队一张在飞 gone; the four-axis frame block byte-identical to main. ✓
    3. 「开放 = 未派发」 — a line of its own under execution-duties.md:45 and an in-line rewrite of triage-duties.md:64; NORTH-STAR rule 3 untouched and, per the state model (pm:queue leaves in the same write that adds pm:dispatched), executed rather than contradicted. ✓
    4. Census at the head: no operative restatement survives (一张在飞 0 · 舰队至多 0 · 第二张等 0 · tooling slot 0); the one ensure-pm-labels.sh comment restating it is rewritten in this PR; check-skill-line-ratchet.mjs:346-347 is a past raise's provenance comment, left as history. ✓

    Deviations (5921492175), each accepted: the ensure-pm-labels.sh comment edit is inside the card's census clause and changes no behaviour or description string; the own-line placement is forced by MAX_LINE_BYTES 120 (old :45 is 111 bytes) and paid from the freed line, net 0 per file; no ratchet row lowered because the script judges at-most and every file stays at headroom 0; the pre-push hook refused a model-named trailer and the dev amended before publication; bot labels are the labelers'; api_writes 2 = pr_create + os-dev-report, the skip-changeset label and assignee are the seat's.

    Acceptance notes → disposition:

    • 普查半态行 is named as a reader of tooling at SKILL.md:112 and ensure-pm-labels.sh:286-287, and nothing implements it (check-half-states.mjs has no such row; no census script reads the label) — noted, not filed: pre-existing at main, internal protocol (.claude/**, outside NORTH-STAR rule 4's shipped surfaces), a 协议观察 the seat post carries. It rides the next PR that edits that row: either add the half-state row or drop the reader from both places in one write.
    • The :45 parenthetical read alone could count a pm:blocked P0/P1 as 开放; :44's 「本车道队列」 and the exclusive state model resolve it — noted, not filed, same carrier; 7 bytes of headroom for a later tightening.

    Landing record (Tier S, .claude/**): contract review PASS 5921711202 on 2f2869206 (isolated claude-fable-5-1 subagent, served model verified); check-governed-merges --pr 20967 → Tier S, +8/−7, scripts/pm/ensure-pm-labels.sh off the register; CI green on the head (22 success, 9 path-filtered skipped; the first Check Changeset failure predates the label and its re-run is skipped); skip-changeset seat-applied — .claude/** and scripts/pm/** sit in no package's files[]. The seat now relays pr_ready + automerge_enable; landing = MERGED through the queue, then this card closes.

    This card was dispatched against the line it retires, on the maintainer's word (claim 5921125191); with this PR the line is gone and the take-order alone sequences tooling cards.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed completed — skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T00:11Z.

    Delivered by PR #20967, MERGED 2026-10-01T00:10Z through the merge queue as 212d613ca.

    • Content on origin/main: the fleet one-tooling-slot line is gone from execution-duties.md (0 hits for 舰队至多); the take-order (取卡全序 / 标签序) is the only sequencing of tooling cards. execution-duties.md:45 now reads 「开放 = 未派发(无 pm:dispatched、无 assignee);在飞的 P0/P1 不挡任何候选,只余取卡全序。」 and triage-duties.md:64 「…P0/P1 开着(= 未派发,在飞不算)时…」; the tooling label row names three readers; the ensure-pm-labels.sh comment says the same. Three skill files at net 0 lines, every ceiling held.
    • Landing record: Tier S (.claude/**). Contract review PASS 5921711202 on 2f2869206 (isolated claude-fable-5-1 subagent); ACCEPT 5921724238; check-governed-merges Tier S, +8/−7; CI green on the head; the seat flipped it ready and armed auto-merge at 23:43Z; queued 23:45Z, merged 00:10Z.
    • Noted, not filed (named in the ACCEPT; the seat post carries both): 普查半态行 is named as a reader of tooling at SKILL.md:112 and ensure-pm-labels.sh:286-287 and nothing implements it — rides the next PR that edits that row (add the half-state row, or drop the reader from both places in one write); the :45 parenthetical read alone could count a pm:blocked P0/P1 as 开放, resolved by :44's 「本车道队列」 — 7 bytes of headroom for a later tightening.
    • Closing: Fixes #20957 closed this card at merge. The seat strips pm:dispatched and the assignee here. The maintainer's order is executed: this was the last card dispatched against the retired line.

    Generated by Claude Code

  5. added a commit that references this issue on Oct 7, 2026
    212d613
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p2Medium: important, M3tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions