Skip to content

label-write: refuse a state label (the six pm states incl. needs-user-decision) on a pull request, and pm:awaiting-merge on an issue #31148

Closed

Description

@objectstack-fleet

repo:cloud#1 · os-bob · session_012dn2AdARJtc4RgABPH7PHk

Filing gate: ③ a task on the maintainer's word. The account owner, in session_012dn2AdARJtc4RgABPH7PHk, answering this seat's proposal to file it: 「以上都同意」. Reader: triage routes it; the expected lane is domain:skills (scripts/pm/**, non-gate PM tooling).

维护者速读

规则早已写明:needs-user-decision 只挂决策卡、永不挂 PR,PR 等人批挂 pm:awaiting-merge(#29745 裁决 A,已落地)。但所有标签都经 scripts/pm/label-write.mjs 写入,它不拦「把决策标签挂到 PR 上」。11-06 就发生了一次:cloud PR #3680 被挂上 needs-user-decision,从「待你审合」清单里消失,混进了决策箱。这张卡让写入口直接拒绝这种写法。

Evidence

  • objectstack-ai/cloud PR Dataset order sorts a select/lookup dimension by its stored value, not the label the user reads #3680: the timeline shows labeled needs-user-decision by objectstack-fleet[bot] at 2026-11-06T16:48Z, right after a Tier H ACCEPT (6690246809) that recommends merging; no decision was pending. Corrected by this seat in 6708398312.
  • SKILL.md L107: "needs-user-decision … 只挂决策卡(issue)、⛔ 永不挂 PR"; L189/L194: pm:awaiting-merge 只挂 PR.
  • scripts/pm/label-write.mjs on main: refuseTwoStates refuses two states on one card, but nothing reads whether the target is a pull request.
  • check-half-states.mjs H48 finds a governed PR missing pm:awaiting-merge after the fact (report-only); it does not stop the write.

Expected

  • label-write.mjs reads the target once (it already reads the current label set in step ①; the issue object carries pull_request) and refuses, before any write and with the rule quoted: any of the six state labels (pm:queue, pm:dispatched, pm:blocked, pm:on-hold, pm:awaiting-maintainer, needs-user-decision) added to a pull request, and pm:awaiting-merge added to an issue.
  • Removing a label is never refused (that is how a wrong one is cleaned up).
  • A self-test case per direction.
  • No new gate, workflow or label: it is the existing rule enforced at the single write door ("declared ≠ enforced" → enforce).

Dedupe (objectstack, open and closed): label-write needs-user-decision pull request → 752 hits (broad; the nearest relevant is #29745, the ruling that split the two inboxes, closed), awaiting-merge only on pull requests → 72 hits (#29745 again; no card enforces it at the write door).

Activity

  1. added
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    on Nov 7, 2026
  2. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:skills · 2026-11-07T14:58Z

    ⛔ Not a claim.

    • scripts/pm/label-write.mjs lets a pm state label (including needs-user-decision) onto a pull request, and pm:awaiting-merge onto an issue. The rule forbids both (SKILL.md L107, L189/L194). On 2026-11-06 a cloud PR fell out of the "awaiting your merge" list into the decision box this way.
    • p2: it hides a PR from the maintainer's merge list. Lane domain:skills (non-gate scripts/pm/** tooling), pm:queue.
    • A refusal inside the write tool enforces an existing rule at its own door. It adds no CI gate.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    Claim: PM loop round 21 · 2026-11-07T19:30Z
    Session: session_01J8VVAj7CvjkGXvgXzd6RZ7
    Account: huangyiirene
    Branch: claude/project-thread-lrk2f0 (the card thread's designated branch; dev session session_01J8VVAmFDSZbE4U1G4PSfKs)
    Worktree: objectstack-issue-31148
    Domain: domain:skills
    Seat: domain:skills#3
    File surface: scripts/pm/label-write.mjs (the refusal on both paths that add labels, and its self-test cases); a shared pm vocabulary module only if the PR-vs-issue rule belongs there by that file's own header; .changeset/* only as check-empty-changeset asks (skip-changeset path, no package entry). check-half-states.mjs, docs and skills are outside: stop and report first.
    Container & model: M, mode:thread, project-default model, effort: high. dispatch-gates --tier is run by the thread and reported; any mandate above this thread's is waived by the maintainer's standing order in this project (2026-11-03) and said so in the PR body; this seat runs the contract review.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect in shipped code (a declared rule, SKILL.md ≈L107 and ≈L189/L194, not enforced at the single label write door)
    Thread-read: 6708587186
    Premise: holds on main d3f36861: refuseTwoStates reads only the target label set, and no path in label-write.mjs reads whether the target is a pull request.
    Serial constraints: none open. The seat runs serially (one card) by the maintainer's word of 2026-11-07.

    Fixes #31148. Tier read by check-governed-merges at the PR.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions