Skip to content

pm-dispatch: a ruled decision card waits in the inbox until its lane happens to look — the ruling knock is skipped and the declared patrol flag one is unwired #29386

Closed

Description

@objectstack-fleet

director#1 · os-support-ai · session_01WGufzg12BtjFc5rHp7YD1J

Filing gate ③: a task the maintainer set in the director session. Summon #56 (seat post #12708, opening mark 6576665878). The director asked: 「请回一个字母,我立卡;或回「不改」」 with A recommended and B listed; the maintainer answered 「立卡」. The seat reads that as the recommended letter A and files A's scope only. ⛔ B (the director relabels on ruling) is not in scope; if the maintainer meant B, they say so on this card and the scope is rewritten before any claim.

维护者速读

  • 问题:总监录裁后不动标签,退箱靠车道席自己发现;录裁席应敲的 Notify: ruling 被漏掉时,已裁卡在决策箱里无限期挂着。
  • 实测:2026-11-02 01:14Z–10:06Z 录裁的 12 张卡,录裁当时逐卡敲门 0 条;11 小时后 12 张仍挂 needs-user-decision,由第 56 场补敲。
  • 改什么:录裁与敲门同一笔;把 dispatch-runbook 已声明但未接线的「旗一」接进半状态巡查。
  • 不改什么:标签转换仍归车道席(单写者),总监不跨车道写状态。

What happens

The director records a ruling as a Ruling: comment plus a Ruled: line on the body, and by charter changes no label (lanes/director.md: 「录裁同笔改正文 … ⛔ 不新增标签与状态」). The exit stroke out of the inbox (needs-user-decision → pm:queue / pm:blocked / close) is the lane seat's. The lane learns of the ruling through a Notify: ruling knock on its mailbox (project-forms.md: 「记裁决席→被改席 Notify: ruling」), or by reading its own inbox on patrol.

Measured on 2026-11-02 (REST, label needs-user-decision, state=open, read at 11:56Z and again at 12:08Z):

Reading Value
Cards ruled 01:14Z–10:06Z (batches #450–#454), Ruled: on the body 12
Per-card Notify: ruling knocks on any mailbox for those 12, before 12:10Z 0
Of the 12, still carrying needs-user-decision at 12:08Z 12
Oldest ruling still in the box at 12:08Z 10 h 54 min (#28658, 01:15Z)

What would have made the knock count non-zero: a knock of the shape To: <seat> / Notify: ruling · #N · <letter> · record <id>. One exists for #29160 (coordinator, 08:57Z, mailbox PR #28900), so the reading can see the shape. The director's summon #56 then sent the 12 missing knocks (comments 6576849200 through 6576964462 on mailbox PRs #29128, #29129, #29125, #28646, #28741).

The patrol does not catch it either. dispatch-runbook.md declares 「旗一:open 卡标题带决策标记或线程含裁决记录,却仍挂 needs-user-decision」 and says 「接线是另一张卡的事」. No row in scripts/pm/check-half-states.mjs reads a Ruled: line against a needs-user-decision label: the nearest, H54, reports the reverse case (pm:queue under a [Decision] title), and H25's map names needs-user-decision only as a conflict with pm:awaiting-maintainer. This card is that "other card".

Governing text

  • .claude/skills/pm-dispatch/references/project-forms.md: 「移卡入队者→车道:… 记裁决席→被改席 Notify: ruling」.
  • .claude/skills/pm-dispatch/references/lanes/director.md: 「录裁同笔改正文:首行加 Ruled: …;⛔ 不新增标签与状态」 and 「漏此笔 ⇒ 接卡者先读正文退决策箱」.
  • .claude/skills/pm-dispatch/references/dispatch-runbook.md: 「机械两旗 report-only,归半状态巡查;接线是另一张卡的事」 and 「旗一 …」.
  • .claude/skills/pm-dispatch/references/instrument-discipline.md: 「新增门禁、巡查行或棘轮须在卡上引维护者原话」. The maintainer's words for this card are quoted in the first paragraph; the row wires a flag the runbook already declares, it does not invent one.

Change (letter A)

  1. Same stroke. In lanes/director.md, the recording line says the ruling, the Ruled: body line and the Notify: ruling knock to the card's lane seat land in one act; a ruling recorded without its knock is a half state the recorder owes. The knock shape stays the one project-forms.md and record-recognisers.mjs --mailbox-keys already spell. ⛔ No new label, no new state, and the director still writes no label on the card.
  2. Wire flag one. One report-only row in scripts/pm/check-half-states.mjs: an open issue whose body carries a line-leading Ruled: <comment id> while it still carries needs-user-decision, older than a threshold, reported with the card, the ruling id, the age and the domain:* seat that owes the exit. Report-only like every row there: it writes nothing. The daily summary (director duty four) lists the rows.
  3. ⛔ Out of scope: the reverse direction (a card moved out of the box with no retrievable ruling id), which the runbook already assigns to the dispatch-time 决策复读; option B.

Premises, each with its re-check

  • The box still holds ruled cards with no exit: gh api -X GET 'repos/objectstack-ai/objectstack/issues' -f state=open -f labels=needs-user-decision -f per_page=50 --jq '.[] | select(.body|test("(?m)^Ruled:")) | .number' (12 at 12:08Z; fewer is fine, the defect is the missing mechanism).
  • No patrol row reads Ruled: against the label: git grep -n -E 'Ruled:' origin/main -- scripts/pm/check-half-states.mjs (one hit at 12:20Z, a test fixture body, not a row).
  • The three governed files are at their ratchet ceilings: lanes/director.md 86, dispatch-runbook.md 245, project-forms.md 55 (wc -l against scripts/pm/check-skill-line-ratchet.mjs). Any added line is paid by a deletion in the same file; ⛔ no ceiling raise is authorised by this card.

Surface and tier

.claude/skills/pm-dispatch/references/lanes/director.md (Tier S, .claude/**) and scripts/pm/check-half-states.mjs with its self-test. Both sit in the skills lane. Triage sets domain:*, area:*, the level and the queue.

Done when

  • A ruling recorded by any director session lands its knock in the same act, stated in the charter.
  • The patrol prints one row per ruled card still in the box past the threshold, with a positive control in the self-test (a body with Ruled: plus the label reports; the same body without the label does not; a Ruled: inside a code fence does not).

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:skills · pm:queue · 2026-11-02T13:47Z

    ⛔ Not a claim.

    • Read fresh. Measured: 12 ruled decision cards sat in needs-user-decision for up to 10 h 54 min, because no Notify: ruling was knocked when they were recorded. This card ships two things:
      • the same-stroke rule in lanes/director.md;
      • one report-only row in scripts/pm/check-half-states.mjs, wiring the runbook's already-declared 「旗一」.
    • Both are pm-dispatch fleet tooling, so domain:skills. p2: it is not a defect in the product, but every ruled card stalls without it.
    • On the gate rule: the new row is report-only, writes nothing, refuses nothing, and wires a flag the runbook already declares. The maintainer's word for this card, 「立卡」, is quoted in the first paragraph, as instrument-discipline.md requires. Scope stays letter A, as filed. If the maintainer meant B, they say so on this card before any claim.

    Generated by Claude Code

  2. added
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

    Claim: PM loop round 8 · 2026-11-02T14:46Z
    Session: session_01J8VVAnMUWA9rufXzFaEh4J
    Account: huangyiirene
    Branch: claude/project-thread-zjdjqh
    Worktree: objectstack-issue-29386
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/lanes/director.md (the same-stroke recording line, paid in place, ceiling 86 unchanged), scripts/pm/check-half-states.mjs (one report-only row for flag one, with its self-test controls) (stop on breach)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; the seat's review runs at CONTRACT_REVIEW_TIER: governed rules text), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — wires the runbook's declared flag one; letter A as filed
    Thread-read: 6578786428
    Premise: holds. On origin/main, the only Ruled: in scripts/pm/check-half-states.mjs is a test fixture body, not a row. lanes/director.md is at 86 lines, its ceiling.
    Serial constraints cleared: no open PR touches either file.

    Tier S (.claude/**) plus pm tooling. Option B and the reverse direction are out of scope, as the card says.


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAm7suYn3TrFHkbu4N3
    os-dev-report

    {
      "issue": 29386,
      "status": "done",
      "branch": "claude/project-thread-zjdjqh",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29515",
      "session": "session_01J8VVAm7suYn3TrFHkbu4N3",
      "premise_still_valid": true,
      "summary": "Letter A only. lanes/director.md: a new line under the Ruled: recording line says the Notify: ruling knock to the card's lane seat lands in the same act, its shape is project-forms.md's, and a ruling without its knock is a half state the recorder owes; paid by merging the two 职责一 lines on following a PASS to merge (same terms), so the file stays at 86/86. check-half-states.mjs: new report-only row H73 (band stall) on the unscoped open listing beside H62, no new request: an open needs-user-decision issue whose body (fences stripped) has a line-leading Ruled: opening with a comment id, whose newest stamp is older than 6h (one patrol cycle), reported with the ruling id, the age and the owing domain:* lane seat; an unreadable stamp reports rather than reads fresh; a card naming the ruling on its Prior rulings on this card: line is a lawful re-entry and clean. Surface held to the two files.",
      "tests": "At 4bf6e86b: node scripts/pm/check-half-states.mjs --self-test exit 0, 5213 cases pass, battery 'H73 ruled card in the decision box' 28/25 (pin 25), positive and negative controls including a Ruled: inside a backtick fence and a tilde fence. Ablations on a copy of the committed file (deleted after, git status clean): fence stripping removed 3 red; label gate removed 2 red; id requirement removed 2 red; re-entry exception removed 2 red; threshold removed 3 red; the sweep push removed 21 red. Live sweep against the board, exit 0: two H73 rows (#28888 domain:spec ~13h, #29029 domain:server ~8h); #29425 ruled ~2h earlier stays silent under the threshold.",
      "gates": "dispatch-gates --commands (from the merge base) derived 54; all 54 exit 0, captured before any pipe (check:doc-formula-expressions first exit 3 for unbuilt formula/lint, then 0 on the same head after turbo build of the two). --ran: 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN. eslint --no-inline-config over check-half-states.mjs exit 0. CI check-runs on #29515: not yet concluded at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "10 — reads only: issue_read (get, get_comments x3) on #29386 and #29402, pull_request_read get x2 (#29505 as the body template, #29515 read-back); subscribe_pr_activity on #29515 (session tool, not a GitHub write)",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 41489894384, draft #29515 with skip-changeset, body read back identical 9347/9347 bytes); this comment via post-stamped. Plus git push of the branch.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: domain:skills#1 seat · noted, not filed · dispatch-runbook.md still says 「接线是另一张卡的事」 for the two mechanical flags; flag one's body-record half is now H73. The runbook is outside this card's surface and at its 245 ceiling.",
        "carrier: domain:skills#1 seat · noted, not filed · a scoped record spelling `Ruled (plugin-ai): ID · letter A · UTC` exists on one open card (not in the box); H73 reads only line-leading `Ruled:` as the card specifies.",
        "carrier: domain:skills#1 seat · noted, not filed · the PR carries no assignee or reviewer, per the os-dev rule; the hand-off request is the seat's after ACCEPT."
      ]
    }
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

    domain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions