Skip to content

pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047

Closed

Description

@objectstack-fleet

Filing gate ③ (maintainer-directed). Filed by the triage seat (session_01AavokzJ5DndAwitDXvKy4U) on the maintainer's instruction, 2026-10-28 ~03:05Z. ⛔ Not a claim.

The maintainer's words (verbatim, in order)

  1. 「main 红为什么不是 p0?」
  2. 「skills 规则应该要求对应车道 p0 的卡立刻派发」
  3. 「不受并发限制,或者宁可其他开发暂停」
  4. 「你需要立卡更新技能」

What happened (why the rule is needed)

Text today

  • SKILL.md label table, priority:p0 row (L118): 「插队:可超 batch、破轮次立即派发;⛔ 不豁免同文件串行、深度等待与认领协议」.
  • references/execution-duties.md L25: 「priority:p0 可超 batch,⛔ 不越过深度等待。」
  • references/landing-operations.md L80–81: main-red convention ① (seat files a p0 anchor, claims and stops the bleed, does not wait for triage or the maintainer).
  • references/triage-duties.md L29: urgent cards (maintainer-named or a p0 suspect) are triaged at once.

Wanted

  1. p0 dispatches at once, in its own lane. On every round and every wake, each lane seat's first read is its lane's open priority:p0 cards. An unclaimed p0 in the lane is claimed and dispatched in that same round.

  2. No concurrency cap holds a p0. batch, the depth wait (LOCK_DEPTH_HOLD) and any per-seat or per-lane concurrency limit do not apply to a p0 dispatch. Rewrite the L118 row and execution-duties L25 to say so.

  3. When there is no room, other development pauses (「宁可其他开发暂停」). If a p0 cannot start for lack of a slot, or because a lower-priority in-flight card holds the same files (same-file serial), the seat pauses the lowest-priority in-flight dev that frees the room. Its branch and PR stay as they are. The card gets a resume line naming the p0, and it restarts when the p0 lands. ⛔ The claim protocol (one writer per card) still holds.

    • ⚠️ Triage's reading, for the maintainer to confirm on the PR: "pause" means stop the dev session and hold the PR draft. The work is not discarded, and nothing is force-pushed or reverted.
  4. A p0 no lane takes is escalated. If a p0 is still unclaimed after one round, triage and the director report it to the maintainer in that round's report, with the card and the lane named.

  5. Triage grades main red and merge-queue red p0 at first touch. That covers a full red on main (push or schedule), and a deterministic red in the merge queue (its anchor and its root-cause card). The generated full-run card counts too. Add one line to triage-duties.md beside L29, and correct the generator's label (scheduled-full-run-card.mjs / scheduled-full-run.mjs: priority:p1 → priority:p0).

  6. Whoever finds it stops the bleed, then it escalates, then triage dispatches. Maintainer, 2026-10-28 ~06:0xZ: 「同意,补到 pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047」 (on "the finder stops the bleed; unclaimed for one round escalates"), then 「同意乙,一起写进 pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047」 (on option B: triage dispatches the stop-bleed of an unclaimed p0).

    • (a) The finder stops the bleed. The seat that first sees a main or merge-queue red files or finds the p0 anchor. If the stop-bleed is mechanical, it does it then and there: revert the commit that introduced the red, or make a fix whose root cause is verified. Otherwise it names the owning lane on the anchor and rings it (mailbox, pm-dispatch(mailbox): one mailbox PR per seat, a closed doorbell vocabulary (request / notify), alternate-pick for multi-seat lanes, and seat-online / seat-offline notices that wake the sibling seats and triage #27077).
    • (b) One round unclaimed → escalation. A p0 anchor still unclaimed one triage round (about 60 min) after filing is named in that round's report to the maintainer, with the owning lane and the card.
    • (c) Still unclaimed → triage dispatches the stop-bleed only. If no lane has claimed it by the triage round after the escalation, triage posts the standard claim line and dispatches one os-dev for the stop-bleed only. That means the revert of the introducing commit by default, or a mechanical fix-forward whose root cause is verified.
      • The root-cause card stays with the owning lane, and triage does not touch it.
      • ⛔ The claim protocol holds: when a lane seat arrives, triage hands the card back through the claim line, and the two never write at once.
      • ⛔ Independence holds: the stop-bleed PR's ACCEPT or contract review is not triage's (triage dispatched it). The owning lane seat or the director gives it. A Tier H path still waits on the governed approver.
      • ⛔ It is one stop-bleed per round. Triage does not become a development lane, and every other card still goes to its lane.
    • This item amends the maintainer's earlier 「你只处理分诊」 for this one case only: an unclaimed p0 stop-bleed.

Surface and order

  • .claude/skills/pm-dispatch/SKILL.md, references/execution-duties.md, references/landing-operations.md, references/triage-duties.md: Tier S. The files are at or near their line ceilings, so edit within existing lines where possible, or carry a measured ceiling change.
  • scripts/ci/scheduled-full-run-card.mjs and scripts/ci/scheduled-full-run.mjs: the label constant and its tests. This is not a workflow file, but it is CI-owned script; check its own pins.
  • One PR. Clause-②: no · Metadata-protocol: none.

Acceptance

  • A reader of SKILL.md alone learns that a p0 is dispatched in the same round, past batch, the depth wait and every concurrency cap, and that lower-priority dev work pauses to make room.
  • The next generated main-red card is filed priority:p0.
  • check:pm-skill-ratchet, check:pm-skill-id-lint and check:pm-governed-prose are green.

Dedupe: open domain:skills issues read for p0, priority:p0, 并发, depth: none.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling recorded: item 6 added (the finder stops the bleed, escalation, triage stop-bleed dispatch) · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-28T06:09Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (takeover shift, wave 6) · 2026-10-28T12:42Z
    Session: session_01QSeKYmhU5KEj1nukYhp1Tg
    Account: os-justin
    Branch: claude/issue-27047-p0-dispatch-at-once
    Worktree: objectstack-issue-27047
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: .claude/skills/pm-dispatch/SKILL.md L118 (the priority:p0 row) and, if a line can be paid, one line in 〈入口与角色〉 or 〈域车道〉 for 「其他开发暂停」; references/execution-duties.md L25 (p0 vs depth wait) and the pause/resume line (〈候选与批次〉); references/landing-operations.md L80–84 (main-red 约定①/② gain the finder-stops-the-bleed / escalation / triage stop-bleed items 6a–c); references/triage-duties.md L29 (p0 grading of main red and deterministic queue red at first touch); scripts/ci/scheduled-full-run-card.mjs L217 and scripts/ci/scheduled-full-run.mjs L366 / L1699 (priority:p1 → priority:p0 and their pins). Ceilings on origin/main (headroom 0): SKILL.md 319, execution-duties 188, landing-operations 101, triage-duties 102 (ceiling 103, 1 line headroom), seat-post-protocol 88 — edits IN PLACE, new lines paid by deleting content with a named home, ⛔ no re-wrap as currency; a ceiling raise is blocked, not a seat act (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: fable — MANDATORY: claude-fable-5-1 (derived from the file surface: SKILL.md; dispatch-gates --tier, this act), effort: xhigh
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a rule card on the maintainer's words)
    Thread-read: 6462070130
    Premise: holds — read in this act on origin/main: SKILL.md L118 「插队:可超 batch、破轮次立即派发;⛔ 不豁免同文件串行、深度等待与认领协议」; execution-duties L25 「priority:p0 可超 batch,⛔ 不越过深度等待。」; landing-operations L80 main-red 约定① / L84 约定② without items 6a–c; triage-duties L29 「紧急卡直接分诊…」 without the p0-at-first-touch rule; scheduled-full-run-card.mjs:217, scheduled-full-run.mjs:366 and :1699 still carry priority:p1. The ruling record 6462070130 (item 6, maintainer 「同意,补到 #27047」 / 「同意乙,一起写进 #27047」) is in the thread and binds the text.
    Serial constraints cleared: PR #27082 (SKILL.md L161/L162/L183) and PR #26749 (SKILL.md L166, execution-duties L175) are MERGED; PR #27143 (SKILL.md L74, execution-duties L37/L54) MERGED; no open PR touches SKILL.md, execution-duties.md, landing-operations.md, triage-duties.md or the two scripts/ci/scheduled-full-run* files (open-PR title/branch scan in this act: none). Queued behind THIS PR on shared files: #27061 (triage-duties, landing-operations, SKILL.md) and #27117 (execution-duties L21, seat-lifecycle L70, SKILL.md batch row); #27113 (dispatched this wave) is disjoint. Tier S: one draft PR; contract review at CONTRACT_REVIEW_TIER; the seat lands it (the maintainer's landing word of this shift is on record).

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 27047,
      "status": "done",
      "branch": "claude/issue-27047-p0-dispatch-at-once",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27266",
      "head": "7b401bfc",
      "session": "session_01QSeKYmhU5KEj1nukYhp1Tg",
      "premise_still_valid": true,
      "summary": "Implemented the card's Wanted 1–6 in place at every ceiling: SKILL.md's priority:p0 row now says same-round dispatch past batch, the depth wait (LOCK_DEPTH_HOLD) and every concurrency cap with lower-priority in-flight dev paused to make room, and the triage red line gains its single exception (unclaimed-p0 stop-bleed, one per round, review not triage's); execution-duties carries the first-read-is-open-p0 rule, p0 crossing the depth wait, and the pause/resume mechanics (stop the session, hold the draft, claim untouched, a Paused-for line on the card, revive when the p0 lands); landing-operations gains 约定①'s non-mechanical branch (name the lane on the anchor, ring its mailbox with Request: main-red) and 约定③ (one round unclaimed → round report; another round → triage dispatches ONE os-dev for the stop-bleed only, with the one-writer, independence and one-per-round limits); triage-duties grades main red and deterministic queue red p0 at first touch (anchor, root-cause card, generated full-run card; a flake anchor only once read deterministic) and points at 约定③; scripts/ci files the generated main-red card priority:p0 (cardIdentity, its self-test fixture, and the card step's pin). Premise held on origin/main 9ff8154c except one reading in the order: triage-duties' ceiling is 102 (not 103), so that file paid two lines, not one. Two edits sit beyond the order's named lines but inside item 6c and are declared: the SKILL.md 红线 exception line (without it 〈优先级〉's stricter-rule resolution voids 6c) and the triage-duties pointer line (that file declares itself the triage seat's complete duties).",
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/execution-duties.md",
        ".claude/skills/pm-dispatch/references/landing-operations.md",
        ".claude/skills/pm-dispatch/references/triage-duties.md",
        "scripts/ci/scheduled-full-run.mjs",
        "scripts/ci/scheduled-full-run-card.mjs"
      ],
      "line_budget": {
        "note": "line numbers are origin/main 9ff8154c; bytes are UTF-8 without the newline; every prose line ≤120 B; ceilings from CEILINGS in check-skill-line-ratchet.mjs, all headroom 0 before and after; no re-wrap used as currency; table rows are metered by MAX_TABLE_ROW_BYTES (SKILL.md pin 341), not the 120-byte rule",
        ".claude/skills/pm-dispatch/SKILL.md": {
          "before": 319,
          "after": 319,
          "ceiling": 319,
          "edits": [
            "after L34 INSERT 111 B: 唯一例外:无主 p0 锚卡一轮即轮报、再一轮分诊只代派止血:每轮一张,复核非分诊。",
            "L118 REPLACE 124 B → 239 B (table row; file's widest row stays L160 at 341 B = pin): priority:p0 row — 插队:同轮立即派发,越过 batch、深度等待(LOCK_DEPTH_HOLD)与一切并发上限;无槽即暂停低级在飞 dev 腾位(机制 references/execution-duties.md);⛔ 不豁免同文件串行与认领协议",
            "L126 DELETE 107 B (hold 放行须双查…) — home: references/state-machine.md L19 (verbatim rule; SKILL.md L125 already points there)"
          ]
        },
        ".claude/skills/pm-dispatch/references/execution-duties.md": {
          "before": 188,
          "after": 188,
          "ceiling": 188,
          "edits": [
            "L25 REPLACE 118 B → 117 B: tail `priority:p0` 可超 batch,⛔ 不越过深度等待 → p0 越过 batch、深度等待与一切并发上限",
            "after L25 INSERT 117 B: p0 无槽或低级在飞同文件挡住 ⇒ 暂停腾位的最低级 dev:停会话、PR 留 draft、认领不动。",
            "after L25 INSERT 119 B: 卡记 Paused-for: #P0 (angle-bracket placeholder in the file),⛔ 不丢弃、不回退、不 force-push;p0 落地即复活该 dev,同认领同分支。",
            "after L48 INSERT 112 B: 每轮每次唤醒首读本车道开着的 priority:p0,无人认领即同轮认领派发,⛔ 不等下轮。",
            "L69 DELETE 113 B (Metadata-protocol: 四值与定级表…) — home: SKILL.md 〈模板与表〉 Metadata-protocol template line L313 + AGENTS.md Post-Task Checklist ③",
            "L74 DELETE 119 B (档位引 dispatch-gates --tier…) — home: SKILL.md 〈模板与表〉 Container & model template line L311",
            "L138 DELETE 116 B (派发令写明 dev ⛔ 不另留认领…) — home: AGENTS.md 〈Claim the issue BEFORE you write any code〉 (newest Claim names its branch; mismatch ⇒ stop and report; no second claim) + os-dev.md 规则 2; the line also contradicted L125 of the same file"
          ]
        },
        ".claude/skills/pm-dispatch/references/landing-operations.md": {
          "before": 101,
          "after": 101,
          "ceiling": 101,
          "edits": [
            "L7 DELETE 108 B (fork PR = 提案…) — home: AGENTS.md Prime Directive 14 + references/external-contributions.md",
            "L8 DELETE 105 B (pm:mailbox 信箱 PR 不欠 CI…) — home: references/project-forms.md 〈信箱 PR〉 L38 (verbatim)",
            "L51 DELETE 119 B (直敲 node scripts/pm/fleet-write/dispatch.mjs…) — home: references/rest-channel.md L49 + L13; L50 still points at rest-channel.md",
            "L74 DELETE 111 B (会话席窗口内 PR 须在挂 subscribe_pr_activity…) — home: references/execution-duties.md 〈收集〉 L156 + L157–158",
            "after L83 INSERT 109 B (6a): 止血非机械 ⇒ 锚卡点名归属车道、敲其信箱 Request: main-red;根因卡恒归该车道。",
            "after L84 INSERT 113 B (6b): 约定③:锚卡一轮分诊(~60 分钟)无人认领 ⇒ 分诊与总监当轮轮报点名卡与归属车道。",
            "after L84 INSERT 119 B (6c): 再一轮无人认领 ⇒ 分诊贴标准认领行、派一个 os-dev 只做止血;每轮一张,分诊不成车道。",
            "after L84 INSERT 113 B (6c limits): 止血 PR 复核归车道席或总监,⛔ 非分诊;Tier H 仍等审批人;车道席到场经认领行交回。"
          ]
        },
        ".claude/skills/pm-dispatch/references/triage-duties.md": {
          "before": 102,
          "after": 102,
          "ceiling": 102,
          "edits": [
            "L5 DELETE 119 B (发版板、pin 链归总监席摘要…;⛔ 无代裁通道) — home: references/lanes/director.md 职责四 L71–75 + L80–81 (bump cards = pin chain); SKILL.md 红线 L30 + the director row of 〈入口与角色〉",
            "after L30 INSERT 119 B (item 5): 主干全量红与确定性队列红首触定 p0(锚卡、根因卡、full-run 卡);flake 锚卡判确定性才升。",
            "after L30 INSERT 114 B (6c pointer): 无主 p0 锚卡一轮即轮报,再一轮本席贴认领行只代派止血(landing-operations.md 约定③)。",
            "L78 DELETE 100 B (retriage 的异议判据认内容…) — home: references/state-machine.md L39–40"
          ]
        },
        "scripts/ci/scheduled-full-run.mjs": "L366 cardIdentity().labels priority:p1 → priority:p0 (live filing path via createIssue L488, run by scheduled-full-run-card.yml through fileCardStep); L1699 CARD_LABELS priority:p1 → priority:p0 (self-test board fixture, executed by --self-test in lint.yml; its assertions are grade-agnostic)",
        "scripts/ci/scheduled-full-run-card.mjs": "L217 expected issues.create labels priority:p1 → priority:p0 (the pin of L366; measured: with L217 at p1 the self-test exits 1 with 5 failures, with both at p0 it is green)"
      },
      "tests": "No package touched ⇒ no build closure (①) and no package test (②) owed. Local subset, each exit captured before any pipe: pnpm check:pm-skill-ratchet exit 0 (SKILL.md 319/319 · execution-duties 188/188 · landing-operations 101/101 · triage-duties 102/102 · SKILL.md widest table row 341 B = pin 341); pnpm check:pm-skill-id-lint exit 0 (104 files clean); pnpm check:pm-governed-prose exit 0; pnpm check:skill-frame-sync exit 0; pnpm check:skill-frame-freshness exit 0 (local-only, frame current with origin/main); node scripts/ci/scheduled-full-run.mjs --self-test exit 0; --check-concurrency exit 0; node scripts/ci/scheduled-full-run-card.mjs --self-test exit 0 (7 cases); pnpm check:pm-half-states exit 0 (5034 cases); pnpm check:pm-dispatch-gates exit 0 (1935 cases, 346 s). Reverse verification of the label pin (one-off, trap-restored): L217 mutated to priority:p1 on disk (grep p0 1→0, p1 0→1) ⇒ card self-test exit 1, 5 failures (issues.create params mismatch); restored via git checkout HEAD -- path, git diff HEAD empty, blob hash = HEAD's 25f07fee…. Ablation: none owed (no tested behaviour changed beyond the pinned constant). Ratchet negative control: triage-duties at 103/102 turned the ratchet red (exit 1) before the second pay-line was deleted. The PR body's Tests section carries the full per-command list.",
      "gates": "Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set from merge base 9ff8154c vs HEAD 7b401bfc; 6 files, +15/−15) ⇒ 43 commands, all run on the final head 7b401bfc in the foreground with exits captured before any pipe (ledger `cmd :: exit N`): 42 × exit 0; 1 × exit 3 = `pnpm --filter @objectstack/lint run check:doc-formula-expressions` PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built; its fix line would build spec, sdui-parser, formula, lint — a closure this diff does not owe) ⇒ NOT MEASURED locally. `dispatch-gates --ran` exit 0: 43 derived accounted for — 42 run, 1 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN. Local-only family check:skill-frame-freshness exit 0 (stays local). CI families for the seat to read on the PR's check-runs (not re-run locally): Lint & Repo Gates (every check:* family incl. the NOT-MEASURED one on a built tree, the scheduled-full-run self-tests in the moved-step-bodies collector), TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard (Tier S: .claude/** paths), Lint UI / Type Check UI / Test UI / Build & E2E UI — status at report time: in_progress (PR just opened).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no GitHub MCP tool used, read or write",
      "api_writes": "3 — ① git push (the empty-branch probe, then commit 7b401bfc); ② POST /repos/objectstack-ai/objectstack/pulls via relay op pr_create (draft) with its legs POST .../issues/27266/assignees and POST .../issues/27266/labels (relay run 40697960249; read-back 30121 bytes sent = 30121 stored, assignees os-justin; a REST GET of the pull shows labels skip-changeset + size/s, so the label leg landed); ③ POST /repos/objectstack-ai/objectstack/issues/27047/comments via post-stamped (this report). A refused relay payload (title over cap) sent nothing. Reads otherwise: GET issue 27047 and its comments, GET pulls/27266, GET the report comment.",
      "deviations": [
        "Order hypothesis 1 falsified in part: triage-duties' ceiling is 102 with headroom 0 (the CEILINGS ledger lowered it 103 → 102 when the whole-card cloud route merged), so item 5 and the 6c pointer there are paid by two deletions (L5, L78), not one; landing-operations needed four new lines for 6a–c (not 2–3) and paid four.",
        "Beyond the order's named lines, inside item 6c: SKILL.md 红线 gains one exception line after 「⛔ 分诊席永不认领、派发或写码」 (paid by L126) — without it SKILL.md 〈优先级〉 (红线 outrank 细则; conflicting rules resolve to the stricter) would void 6c; and triage-duties gains a one-line pointer to 约定③ (its L3 declares the file the triage seat's complete duties). Both declared in the PR body.",
        "scheduled-full-run.mjs L1699 is the self-test's fixture, not a filing site as the card's Contributing-cause reads; changed anyway (order hypothesis 3: both execute — workflow path L366, self-test path L1699) and said so in the PR body.",
        "check:doc-formula-expressions NOT MEASURED locally (exit 3 prerequisite: unbuilt @objectstack/formula/@objectstack/lint; no package touched so no closure owed); CI's Lint & Repo Gates carries it.",
        "The harness attribution reminder names a model in its Co-Authored-By form; per AGENTS.md the commit carries the model-free pair (Claude-Session + Co-authored-by: Claude) — reported, not deviated.",
        "Two foreground waits were moved to the background by the harness's 10-minute cap (the pm-dispatch-gates self-test, then a tail --pid on the union runner); both were read back from their output files and the runner itself was waited on in the foreground to completion; no watcher outlives this run.",
        "The order's PR title (268 bytes) exceeds the relay's 256-byte title cap: the first pr_create payload was REFUSED by the validator with zero writes, and the title was shortened to 255 bytes with the same content ('…past every cap and lower-priority work pauses; finder stops the bleed, then escalation, then triage stop-bleed; … full-run card filed p0'). One write then landed: PR #27266."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — scripts/pm/ensure-pm-labels.sh describes priority:p0 as 'Queue-jump: outranks batch and breaks the round — never exempts claiming or same-file serial'; still true after this change (it never named the depth wait); out of this card's surface.",
        "carrier: none · noted, not filed — check-half-states.mjs H10 already patrols a stale unclaimed p0 (report-only); the ~60-minute round of 6b is protocol text only, no patrol row added (order hypothesis 2)."
      ]
    }

    Report delivered 2026-10-28T13:38Z for PR #27266 (head 7b401bf).

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    Addendum after the seat review finding on PR #27266: new head d29c4e0 (the dangling pointer in references/external-contributions.md L3 rewritten in place). Full report, superseding the earlier one:

    {
      "issue": 27047,
      "status": "done",
      "branch": "claude/issue-27047-p0-dispatch-at-once",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27266",
      "head": "d29c4e08",
      "session": "session_01QSeKYmhU5KEj1nukYhp1Tg",
      "premise_still_valid": true,
      "summary": "Implemented the card's Wanted 1–6 in place at every ceiling: SKILL.md's priority:p0 row now says same-round dispatch past batch, the depth wait (LOCK_DEPTH_HOLD) and every concurrency cap with lower-priority in-flight dev paused to make room, and the triage red line gains its single exception (unclaimed-p0 stop-bleed, one per round, review not triage's); execution-duties carries the first-read-is-open-p0 rule, p0 crossing the depth wait, and the pause/resume mechanics (stop the session, hold the draft, claim untouched, a Paused-for line on the card, revive when the p0 lands); landing-operations gains 约定①'s non-mechanical branch (name the lane on the anchor, ring its mailbox with Request: main-red) and 约定③ (one round unclaimed → round report; another round → triage dispatches ONE os-dev for the stop-bleed only, with the one-writer, independence and one-per-round limits); triage-duties grades main red and deterministic queue red p0 at first touch (anchor, root-cause card, generated full-run card; a flake anchor only once read deterministic) and points at 约定③; scripts/ci files the generated main-red card priority:p0 (cardIdentity, its self-test fixture, and the card step's pin). Premise held on origin/main 9ff8154c except one reading in the order: triage-duties' ceiling is 102 (not 103), so that file paid two lines, not one. Two edits sit beyond the order's named lines but inside item 6c and are declared: the SKILL.md 红线 exception line (without it 〈优先级〉's stricter-rule resolution voids 6c) and the triage-duties pointer line (that file declares itself the triage seat's complete duties). Addendum (seat review finding): references/external-contributions.md L3 pointed back at the landing-operations fork-PR line this branch deleted; rewritten in place (22 → 22 lines, 109 B → 115 B) to name the rule's surviving home, AGENTS.md Prime Directive #14, with this file as the four-step procedure; commit d29c4e08.",
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/execution-duties.md",
        ".claude/skills/pm-dispatch/references/landing-operations.md",
        ".claude/skills/pm-dispatch/references/triage-duties.md",
        "scripts/ci/scheduled-full-run.mjs",
        "scripts/ci/scheduled-full-run-card.mjs",
        ".claude/skills/pm-dispatch/references/external-contributions.md"
      ],
      "line_budget": {
        "note": "line numbers are origin/main 9ff8154c; bytes are UTF-8 without the newline; every prose line ≤120 B; ceilings from CEILINGS in check-skill-line-ratchet.mjs, all headroom 0 before and after; no re-wrap used as currency; table rows are metered by MAX_TABLE_ROW_BYTES (SKILL.md pin 341), not the 120-byte rule",
        ".claude/skills/pm-dispatch/SKILL.md": {
          "before": 319,
          "after": 319,
          "ceiling": 319,
          "edits": [
            "after L34 INSERT 111 B: 唯一例外:无主 p0 锚卡一轮即轮报、再一轮分诊只代派止血:每轮一张,复核非分诊。",
            "L118 REPLACE 124 B → 239 B (table row; file's widest row stays L160 at 341 B = pin): priority:p0 row — 插队:同轮立即派发,越过 batch、深度等待(LOCK_DEPTH_HOLD)与一切并发上限;无槽即暂停低级在飞 dev 腾位(机制 references/execution-duties.md);⛔ 不豁免同文件串行与认领协议",
            "L126 DELETE 107 B (hold 放行须双查…) — home: references/state-machine.md L19 (verbatim rule; SKILL.md L125 already points there)"
          ]
        },
        ".claude/skills/pm-dispatch/references/execution-duties.md": {
          "before": 188,
          "after": 188,
          "ceiling": 188,
          "edits": [
            "L25 REPLACE 118 B → 117 B: tail `priority:p0` 可超 batch,⛔ 不越过深度等待 → p0 越过 batch、深度等待与一切并发上限",
            "after L25 INSERT 117 B: p0 无槽或低级在飞同文件挡住 ⇒ 暂停腾位的最低级 dev:停会话、PR 留 draft、认领不动。",
            "after L25 INSERT 119 B: 卡记 Paused-for: #P0 (angle-bracket placeholder in the file),⛔ 不丢弃、不回退、不 force-push;p0 落地即复活该 dev,同认领同分支。",
            "after L48 INSERT 112 B: 每轮每次唤醒首读本车道开着的 priority:p0,无人认领即同轮认领派发,⛔ 不等下轮。",
            "L69 DELETE 113 B (Metadata-protocol: 四值与定级表…) — home: SKILL.md 〈模板与表〉 Metadata-protocol template line L313 + AGENTS.md Post-Task Checklist ③",
            "L74 DELETE 119 B (档位引 dispatch-gates --tier…) — home: SKILL.md 〈模板与表〉 Container & model template line L311",
            "L138 DELETE 116 B (派发令写明 dev ⛔ 不另留认领…) — home: AGENTS.md 〈Claim the issue BEFORE you write any code〉 (newest Claim names its branch; mismatch ⇒ stop and report; no second claim) + os-dev.md 规则 2; the line also contradicted L125 of the same file"
          ]
        },
        ".claude/skills/pm-dispatch/references/landing-operations.md": {
          "before": 101,
          "after": 101,
          "ceiling": 101,
          "edits": [
            "L7 DELETE 108 B (fork PR = 提案…) — home: AGENTS.md Prime Directive #14; references/external-contributions.md L3 rewritten to stop pointing back at this line",
            "L8 DELETE 105 B (pm:mailbox 信箱 PR 不欠 CI…) — home: references/project-forms.md 〈信箱 PR〉 L38 (verbatim)",
            "L51 DELETE 119 B (直敲 node scripts/pm/fleet-write/dispatch.mjs…) — home: references/rest-channel.md L49 + L13; L50 still points at rest-channel.md",
            "L74 DELETE 111 B (会话席窗口内 PR 须在挂 subscribe_pr_activity…) — home: references/execution-duties.md 〈收集〉 L156 + L157–158",
            "after L83 INSERT 109 B (6a): 止血非机械 ⇒ 锚卡点名归属车道、敲其信箱 Request: main-red;根因卡恒归该车道。",
            "after L84 INSERT 113 B (6b): 约定③:锚卡一轮分诊(~60 分钟)无人认领 ⇒ 分诊与总监当轮轮报点名卡与归属车道。",
            "after L84 INSERT 119 B (6c): 再一轮无人认领 ⇒ 分诊贴标准认领行、派一个 os-dev 只做止血;每轮一张,分诊不成车道。",
            "after L84 INSERT 113 B (6c limits): 止血 PR 复核归车道席或总监,⛔ 非分诊;Tier H 仍等审批人;车道席到场经认领行交回。"
          ]
        },
        ".claude/skills/pm-dispatch/references/triage-duties.md": {
          "before": 102,
          "after": 102,
          "ceiling": 102,
          "edits": [
            "L5 DELETE 119 B (发版板、pin 链归总监席摘要…;⛔ 无代裁通道) — home: references/lanes/director.md 职责四 L71–75 + L80–81 (bump cards = pin chain); SKILL.md 红线 L30 + the director row of 〈入口与角色〉",
            "after L30 INSERT 119 B (item 5): 主干全量红与确定性队列红首触定 p0(锚卡、根因卡、full-run 卡);flake 锚卡判确定性才升。",
            "after L30 INSERT 114 B (6c pointer): 无主 p0 锚卡一轮即轮报,再一轮本席贴认领行只代派止血(landing-operations.md 约定③)。",
            "L78 DELETE 100 B (retriage 的异议判据认内容…) — home: references/state-machine.md L39–40"
          ]
        },
        "scripts/ci/scheduled-full-run.mjs": "L366 cardIdentity().labels priority:p1 → priority:p0 (live filing path via createIssue L488, run by scheduled-full-run-card.yml through fileCardStep); L1699 CARD_LABELS priority:p1 → priority:p0 (self-test board fixture, executed by --self-test in lint.yml; its assertions are grade-agnostic)",
        "scripts/ci/scheduled-full-run-card.mjs": "L217 expected issues.create labels priority:p1 → priority:p0 (the pin of L366; measured: with L217 at p1 the self-test exits 1 with 5 failures, with both at p0 it is green)",
        ".claude/skills/pm-dispatch/references/external-contributions.md": {
          "before": 22,
          "after": 22,
          "ceiling": 22,
          "edits": [
            "L3 REPLACE 109 B → 115 B: 见 landing-operations.md 的 fork PR 行;本文是 fork PR(head 仓 ≠ base 仓)进场到落地的四步。 → fork PR = 提案(AGENTS.md Prime Directive #14);本文是 fork PR(head 仓 ≠ base 仓)进场到落地的四步。 (the dangling back-pointer; no new line)"
          ]
        }
      },
      "tests": "No package touched ⇒ no build closure (①) and no package test (②) owed. Local subset, each exit captured before any pipe: pnpm check:pm-skill-ratchet exit 0 (SKILL.md 319/319 · execution-duties 188/188 · landing-operations 101/101 · triage-duties 102/102 · SKILL.md widest table row 341 B = pin 341); pnpm check:pm-skill-id-lint exit 0 (104 files clean); pnpm check:pm-governed-prose exit 0; pnpm check:skill-frame-sync exit 0; pnpm check:skill-frame-freshness exit 0 (local-only, frame current with origin/main); node scripts/ci/scheduled-full-run.mjs --self-test exit 0; --check-concurrency exit 0; node scripts/ci/scheduled-full-run-card.mjs --self-test exit 0 (7 cases); pnpm check:pm-half-states exit 0 (5034 cases); pnpm check:pm-dispatch-gates exit 0 (1935 cases, 346 s). Reverse verification of the label pin (one-off, trap-restored): L217 mutated to priority:p1 on disk (grep p0 1→0, p1 0→1) ⇒ card self-test exit 1, 5 failures (issues.create params mismatch); restored via git checkout HEAD -- path, git diff HEAD empty, blob hash = HEAD's 25f07fee…. Ablation: none owed (no tested behaviour changed beyond the pinned constant). Ratchet negative control: triage-duties at 103/102 turned the ratchet red (exit 1) before the second pay-line was deleted. The PR body's Tests section carries the full per-command list. Addendum on head d29c4e08: pnpm check:pm-skill-ratchet exit 0 (external-contributions.md 22/22, the four edited files unchanged at their ceilings); pnpm check:pm-skill-id-lint exit 0 (104 files clean); pnpm check:pm-governed-prose exit 0; git grep -n \"fork PR 行\" -- .claude → 0 hits; no line over 120 B in the file.",
      "gates": "Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set from merge base 9ff8154c vs HEAD 7b401bfc; 6 files, +15/−15) ⇒ 43 commands, all run on the final head 7b401bfc in the foreground with exits captured before any pipe (ledger `cmd :: exit N`): 42 × exit 0; 1 × exit 3 = `pnpm --filter @objectstack/lint run check:doc-formula-expressions` PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built; its fix line would build spec, sdui-parser, formula, lint — a closure this diff does not owe) ⇒ NOT MEASURED locally. `dispatch-gates --ran` exit 0: 43 derived accounted for — 42 run, 1 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN. Local-only family check:skill-frame-freshness exit 0 (stays local). CI families for the seat to read on the PR's check-runs (not re-run locally): Lint & Repo Gates (every check:* family incl. the NOT-MEASURED one on a built tree, the scheduled-full-run self-tests in the moved-step-bodies collector), TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard (Tier S: .claude/** paths), Lint UI / Type Check UI / Test UI / Build & E2E UI — status at report time: in_progress (PR just opened). Addendum head d29c4e08: the three families the seat named re-run on the final text — pm-skill-ratchet exit 0, pm-skill-id-lint exit 0, pm-governed-prose exit 0; the derived union was not re-run (the amendment is one in-place line in a file the earlier derivation already covered through the same families); the PR's check-runs on the new head are the seat's reading.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no GitHub MCP tool used, read or write",
      "api_writes": "5 — ① git push (the empty-branch probe, then commit 7b401bfc); ② POST /repos/objectstack-ai/objectstack/pulls via relay op pr_create (draft) with its legs POST .../issues/27266/assignees and POST .../issues/27266/labels (relay run 40697960249; read-back 30121 bytes sent = 30121 stored, assignees os-justin; a REST GET of the pull shows labels skip-changeset + size/s, so the label leg landed); ③ POST /repos/objectstack-ai/objectstack/issues/27047/comments via post-stamped (this report). A refused relay payload (title over cap) sent nothing. Reads otherwise: GET issue 27047 and its comments, GET pulls/27266, GET the report comment. ④ git push (commit d29c4e08, no force); ⑤ POST /repos/objectstack-ai/objectstack/issues/27047/comments via post-stamped (this addendum report, posted once, read back).",
      "deviations": [
        "Order hypothesis 1 falsified in part: triage-duties' ceiling is 102 with headroom 0 (the CEILINGS ledger lowered it 103 → 102 when the whole-card cloud route merged), so item 5 and the 6c pointer there are paid by two deletions (L5, L78), not one; landing-operations needed four new lines for 6a–c (not 2–3) and paid four.",
        "Beyond the order's named lines, inside item 6c: SKILL.md 红线 gains one exception line after 「⛔ 分诊席永不认领、派发或写码」 (paid by L126) — without it SKILL.md 〈优先级〉 (红线 outrank 细则; conflicting rules resolve to the stricter) would void 6c; and triage-duties gains a one-line pointer to 约定③ (its L3 declares the file the triage seat's complete duties). Both declared in the PR body.",
        "scheduled-full-run.mjs L1699 is the self-test's fixture, not a filing site as the card's Contributing-cause reads; changed anyway (order hypothesis 3: both execute — workflow path L366, self-test path L1699) and said so in the PR body.",
        "check:doc-formula-expressions NOT MEASURED locally (exit 3 prerequisite: unbuilt @objectstack/formula/@objectstack/lint; no package touched so no closure owed); CI's Lint & Repo Gates carries it.",
        "The harness attribution reminder names a model in its Co-Authored-By form; per AGENTS.md the commit carries the model-free pair (Claude-Session + Co-authored-by: Claude) — reported, not deviated.",
        "Two foreground waits were moved to the background by the harness's 10-minute cap (the pm-dispatch-gates self-test, then a tail --pid on the union runner); both were read back from their output files and the runner itself was waited on in the foreground to completion; no watcher outlives this run.",
        "The order's PR title (268 bytes) exceeds the relay's 256-byte title cap: the first pr_create payload was REFUSED by the validator with zero writes, and the title was shortened to 255 bytes with the same content ('…past every cap and lower-priority work pauses; finder stops the bleed, then escalation, then triage stop-bleed; … full-run card filed p0'). One write then landed: PR #27266.",
        "Patch round on the same claim (seat finding on PR #27266): the seat asked for the PR body's deleted-lines row to be updated; the role file forbids a dev PATCH of the PR body after pr_create, so the body was NOT patched — the seat writes the row: in \"## Line budget\", landing-operations.md, replace the L7 row's home text with \"home: AGENTS.md Prime Directive #14; references/external-contributions.md L3 rewritten (commit d29c4e08) to stop pointing back at this line\", and append to files_changed/Verification that external-contributions.md L3 was rewritten in place (22 → 22 lines, 115 B). Conflict named: order/seat instruction vs role file 「PR 正文 dev 只写一次…⛔ 不 PATCH;事后要改的报告点名改法,席位代写」 — the role file wins."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — scripts/pm/ensure-pm-labels.sh describes priority:p0 as 'Queue-jump: outranks batch and breaks the round — never exempts claiming or same-file serial'; still true after this change (it never named the depth wait); out of this card's surface.",
        "carrier: none · noted, not filed — check-half-states.mjs H10 already patrols a stale unclaimed p0 (report-only); the ~60-minute round of 6b is protocol text only, no patrol row added (order hypothesis 2)."
      ]
    }

    Report delivered 2026-10-28T13:44Z for PR #27266 (head d29c4e0).

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #27266 comment 6471000517 · domain:skills#2 · 2026-10-28T14:00Z — ⛔ not a claim. Contract review (CONTRACT_REVIEW_TIER) PASS → PR comment 6470738460 on head d29c4e08 (the dev's amendment over 7b401bfc on the seat's one finding: external-contributions.md L3 pointed back at the deleted landing-operations fork-PR line — rewritten in place, 115 B, 22/22). Wanted 1–6 landed in SKILL.md (L34 红线 exception, L118 priority:p0 row), execution-duties (p0 past every cap; pause/resume mechanics; first read is the lane's open p0), landing-operations (约定① non-mechanical branch, 约定③ 6a–c), triage-duties (main red / deterministic queue red p0 at first touch; pointer to 约定③), and scripts/ci/scheduled-full-run*.mjs (the generated card files priority:p0, pin updated); four files at their ceilings, 11 paid lines with homes. 41 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, #27062 (also behind PR #27263 on record-recognisers.mjs) and #27117.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

    Landed — PR #27266 merged; card closed by Fixes #27047

    probe reading (2026-10-28T14:19Z, domain:skills#2)
    git merge-base --is-ancestor 3af6022e origin/main after git fetch origin main true — 3af6022e pm-dispatch(p0): a lane's p0 is dispatched in the same round past every cap … is on origin/main; GET pulls/27266 → merged: true, merge_commit_sha 3af6022e, merged by the queue entry the seat made on the maintainer's standing word (2026-10-28T14:17Z); origin/main:SKILL.md L35 carries the 红线 exception and L119 the new priority:p0 row; the four protocol files read 319 / 188 / 101 / 102 lines on main; main's push CI on 3af6022e at this reading: 34 success · 26 skipped · 17 in progress · 0 failure
    GET issues/27047 state: closed, state_reason: completed (2026-10-28T14:17Z), closed by the PR body's Fixes #27047 (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 / triage-duties hot-file queue this PR headed is released: #27117 and #27062 are claimed next, #27061 behind them. The generated main-red card now files at priority:p0 from the next scheduled full run.


    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: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