Skip to content

pm-dispatch: pm:epic marks every card an epic reserves, not only the parent — a reserved card never carries pm:queue, and pm:queue means handed over (maintainer 2026-09-05) #15666

Description

@os-steve

Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) on maintainer rulings given in the live PM chat, 2026-09-05 02:0xZ–02:2xZ. Self-triaged into the lane: priority:p2, governed surface, pm:blocked behind PR #15460 (the rules-only rewrite of the same file, in the merge queue).
Blocked-by: #15412

The incident (cloud repo, reported by the maintainer)

An epic (专题) session opened a card with pm:queue, then implemented it itself; a patrol lane had lawfully claimed the same card 29 minutes earlier. One card, two implementations. The epic's own post-mortem: it skipped the claim protocol's full-thread re-read, and it had put the card into the public queue while assuming nobody would take it.

The rulings (verbatim, untranslated)

cloud 仓又出现了 epic 和 项目经理重复开发。这个是专题skills 的缺陷吧?是否建议开专题的时候就认领?或者加新的lable

开卡即认领,不会被分诊清扫吧?

用现成的子树保留,而不是提前认领,你不加新的 lable 我在列表页看不清

ok

⇒ Ruled: the reservation must be visible on every reserved card in the list page. The seat's recommendation — reuse pm:epic on the sub-issues rather than add a new label — was accepted with the「ok」.

What changes (rules only, house style)

.claude/skills/pm-dispatch/SKILL.md, section「Epic 子树车道」and the pm:epic row of the label table:

  1. An epic opens its cards under the parent's subtree and puts pm:epic on each of them; ⛔ never pm:queue. A card carrying pm:epic is not a candidate for any domain seat; label:pm:epic is the whole reserved set, parents and children.
  2. Work starts with the claim atomic pair as written — the label write first, then the Claim: comment, then the full-thread re-read; pm:epic stays on the card after the claim.
  3. Leaving the subtree (handing a card to a lane, or transferring it to the spec seat) removes pm:epic and adds pm:queue in the same label write.
  4. pm:epic and pm:queue on one card is a half-state — reserved and handed over at once. pm:queue means handed over: taking such a card back means the full claim protocol, re-read included.
  5. Single-lane repos (no domain:*): open-and-claim in one act is lawful there; in multi-lane repos the domain-label prerequisite stands and the subtree marker is the reservation.

references/core-rules.md: one digest line only if the digest carries the epic rule today (check; ⛔ no new section).

scripts/pm/ensure-pm-labels.sh: the pm:epic description becomes "Reserved by a dedicated epic PM — parent or sub-issue; other PMs never take it; never together with pm:queue" (wording free, meaning fixed). Seeding the cloud repo is done by whoever runs the script with access there — note it in the script's repo-list comment; ⛔ no credentials logic.

Why not a new label (recorded so it is not re-derived)

pm:epic is already in the patrol's visibility set (PM_STATE_LABELS in scripts/pm/check-half-states.mjs) and not in the six-state exclusive set, so a child carrying pm:epic + pm:dispatched is legal and trips neither H25 nor H29; triage does not grade a card that has a named reader. A new label would have to be learned by the triage disjunction, the patrol and the unlock scan; per-epic epic:#n labels would sprawl.

Serial and gates

Same file as PR #15460 (member 1b of #15379), in the merge queue: this card dispatches after it lands and edits the rewritten file — one rule per line, ≤120 bytes, no dates or quotations in the file (the quotations above stay on this card). The rewritten SKILL.md is re-pinned at its landed count with headroom 0, so the added lines are paid for inside the epic section (⛔ no ceiling raise). Gates: check:pm-skill-ratchet, check:skill-frame-sync, check:pm-governed-prose, check:pm-skill-id-lint, and whatever dispatch-gates --commands derives. Governed ⇒ draft PR, in-seat review, os-zhuang + hotlong, human merge.

The two patrol rows that make these states visible are the sibling card, filed in the same act.

Activity

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