Skip to content

[Decision] One label, two inboxes: a PR waiting on the maintainer's review/merge (SKILL.md L189 ②) carries the same needs-user-decision label as a decision card — split them? #29745

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate ②: a rule change only the maintainer can make. The maintainer asked in the triage session, verbatim: 「带我审核的pr 也挂着待决裁的标签,是否容易产生歧义」. ⛔ Not a claim. Reader who acts: the maintainer rules here, then domain:skills.

维护者速读

  • 问题:needs-user-decision 现在有两种意思。
    • 决策卡:等您回一个字母。
    • PR:等您审核和合并。SKILL.md L189 ② 规定,Tier H 或超过 3000 行的 PR 等人批时,同笔挂这个标签。
      两种混在一个收件箱里,计数(例如本轮"待决裁 11")和总监呈批都分不开。现在开着的 11 项里,10 张是真决策卡,PR chore(pm): delete the one-time stale-finding sweep tool; H63 keeps reporting #29698 是等审合的。
  • 推荐 A:等审合的 PR 改挂一个专用标签 pm:awaiting-merge,needs-user-decision 只留给决策卡。轮次报告和总表分两行写:"决策卡 N"和"待您审合 PR M"。
  • 代价:新增一个标签(标签变更归您定),skills 改两处:SKILL.md L189 和状态表,相关检查改读法。不新增门禁。
  • 您要做的一个动作:回一个字母。

Options

  • A (triage's lean): a dedicated PR label.
    • pm:awaiting-merge replaces needs-user-decision on PRs under L189 ②.
    • The six-state issue mutex (L124) is unchanged: issues only.
    • Reports and the fleet roster list the two inboxes apart.
  • B: keep one label, split the readers. No label change. Every report and the director's batch split needs-user-decision by is:pr and is:issue. Cheapest, but the GitHub label view stays mixed.
  • C: GitHub's own review request. A L189 ② PR requests the maintainer as reviewer and carries no label. The inbox becomes review-requested:@me. This needs a relay op for review requests and one named maintainer account per repo.

Until ruled

Nothing changes. Triage's round records list PR #29698 apart from the decision cards from now on.


Generated by Claude Code

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Ruling recorded · letter A · this card becomes the skills card · 2026-11-03T03:21Z

    The maintainer's word, verbatim (the triage session): 「同意 pm:awaiting-merge」. That is option A.

    Wanted (domain:skills, one PR):

    1. The label.
      • Create pm:awaiting-merge: "a PR whose landing waits on the maintainer's own review and merge (SKILL.md L189 ②)".
      • PRs only. ⛔ Never on an issue.
    2. SKILL.md L189 ②. A PR that waits for the maintainer's approval carries pm:awaiting-merge in the same stroke, not needs-user-decision. Change the state table row (L108) to match: needs-user-decision = decision cards only, issues only.
    3. Readers. The fleet roster, the director's daily batch, triage's round records and any check that counts needs-user-decision list the two inboxes apart: "决策卡 N" and "待您审合 PR M".
    4. The one open PR in the old shape. The landing PR re-labels PR chore(pm): delete the one-time stale-finding sweep tool; H63 keeps reporting #29698 (needs-user-decision → pm:awaiting-merge).

    Kept as is:

    • pm:awaiting-maintainer (L111) keeps its meaning: the decision is made, and only a human act outside GitHub remains, on an issue.
    • pm:awaiting-merge is the in-GitHub PR counterpart. The two are not merged.
    • No new gate.

    Grade: p2, and this card moves needs-user-decision → pm:queue.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

    Claim: PM loop round 1 · 2026-11-05T10:58Z
    Session: session_012MmDsR4AZoJZyzKQcBEESh
    Account: os-lizheng
    Branch: claude/issue-29745-pm-awaiting-merge
    Worktree: objectstack-issue-29745
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: .claude/skills/pm-dispatch/SKILL.md (the L189 ② line and the state-table row), .claude/skills/pm-dispatch/references/** where a reader counts needs-user-decision on PRs, scripts/pm/ensure-pm-labels.sh (the label vocabulary), and the scripts/pm/ readers that count the decision inbox (check-half-states.mjs, fleet-roster.mjs, board-snapshot.mjs, as measured) (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: claude-fable-5-1 (--tier: MANDATORY, clause ① — .claude/skills/pm-dispatch/SKILL.md is the lane's operating protocol), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Ruling-ref: 6594600712 (the maintainer's 「同意 pm:awaiting-merge」, letter A, recorded by triage; retrieved in this pass)
    Thread-read: 6594600712
    Premise: holds — 2026-11-05T10:58Z on origin/main 09720e2c: git grep awaiting-merge origin/main has 0 hits (control: needs-user-decision has 10 hits in SKILL.md), and the label pm:awaiting-merge answers 404. Ruling item 4 (re-label PR #29698) is moot: that PR merged on 2026-11-03.
    Serial constraints cleared: SKILL.md is shared with #30159 (this seat's next card, held behind this one) and with no open PR (open head:claude/ PRs read at 2026-11-05T10:58Z: none touches SKILL.md); no domain:skills#1 claim is live on it.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh
    os-dev-report

    {
      "issue": 29745,
      "status": "done",
      "branch": "claude/issue-29745-pm-awaiting-merge",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30445",
      "session": "session_012MmDsR4AZoJZyzKQcBEESh",
      "premise_still_valid": true,
      "summary": "Ruling A landed as one draft PR (#30445, head 0cf500af, 13 files). The label: `scripts/pm/ensure-pm-labels.sh` gains `pm:awaiting-merge` (PR only, never an issue, named readers in its comment, 98-char description) and `needs-user-decision`'s description now reads decision cards only. SKILL.md: 复核 ② says 同笔挂 `pm:awaiting-merge`, the next clause says PR-only and outside the six states, the state-table row says `needs-user-decision` = decision cards (issues) only; net 0 lines, every edited line ≤120 bytes. Readers: director.md (batch + digest), triage-duties.md (round records; issues only), seat-lifecycle.md (health metric), state-machine.md (six states are issue states) list 决策卡 N and 待您审合 PR M apart; check-half-states H48 reads the new constant GOVERNED_PR_AWAITING_MERGE_LABEL on the PR while the card readers (H52/H62/H73, the ④ index, its renderer) read DECISION_INBOX_LABEL; check-handover acceptedPullWait reads the new label; fleet-roster gains an awaiting-merge column and a 决策卡 N · 待您审合 PR M line (no new read); the 终局四件套 prose in dispatch-gates / governed-merges / queue-guard names the new label. Ruling item 4 is moot for PR #29698 (merged before dispatch) but NOT empty: objectstack#30263 is open in the old shape (plus duly#157, duly#142, www.objectos.ai#327 outside the label loop) — relabelling and creating the GitHub label object are the landing seat's writes, not spent here. No new gate.",
      "tests": "At head 0cf500af: `node scripts/pm/fleet-roster.mjs --self-test` → ✓ 115 cases in 9 batteries pass (110 on origin/main; +5: the column, the retired shape counts nowhere, inboxTotals, the inbox line, no line without totals). `node scripts/pm/check-handover.mjs --self-test` → ✓ 67 cases pass (66 on origin/main; +1: the old shape is no longer a wait). `pnpm check:pm-half-states` → ✓ check-half-states self-test: 5224 cases pass (+2: the old shape no longer satisfies H48's label half; the PR constant is `pm:awaiting-merge` and not in PM_EXCLUSIVE_STATE_LABELS). `pnpm check:pm-label-desc-cap` → ✓ 45 label descriptions, all ≤100 characters (longest: 100, tooling). `pnpm check:pm-skill-ratchet` → ✓ every ceiling held (SKILL.md 319/319, state-machine 41/41, triage-duties 100/100, seat-lifecycle 98/98, director 86/86). `pnpm check:pm-skill-id-lint` → ✓ 110 files clean. `pnpm check:skill-frame-sync` → ✓ the one declared frame copy is coherent. No package touched ⇒ no ① closure build, no ② package test, no ablation (label-name plumbing pinned by the self-tests above).",
      "gates": "LOCAL SUBSET — `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 63 commands from the diff; all 63 run in the worktree at 0cf500af with the exit captured before any pipe (`bash -c CMD >> log 2>&1; EXIT=$?`): 62 × exit 0 on the first pass, 1 × exit 3 (`pnpm --filter @objectstack/lint run check:doc-formula-expressions`: PREREQUISITE NOT MET, formula/lint unbuilt — not a finding) → built both under `os-verify-lock.sh -c 'pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2'` (VERDICT command-exit 0 · held the lock 2s · waited 0s) → reran → exit 0. `dispatch-gates --ran` over the `command :: exit code` record ⇒ ✓ 63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED (a DERIVED zero — all 63 recorded an exit code and none of them is 3). Local-only families (check:dev-prereqs, check:skill-frame-freshness) not named: no packages/spec or frame-file change. CI CHECK-RUNS on 0cf500af at report time (not re-run locally): Governed Surface Queue Guard · success; PR-body guards (claim · duplicate · Part-of · single-writer path) · success; Live required-set sweep · success; filter · success; Lint · PM dispatch-gates · in_progress; Lint · repo & tooling gates · in_progress; Lint · docs & code guards · in_progress; Lint · ESLint · in_progress; Lint · CI, release & engine gates · in_progress; Lint · scoped (×3) · in_progress; Type Check · workspace / source gates / consumer gates / debt ledger · in_progress; Live half-state sweep · in_progress; Platform checklist gate sweep · in_progress; Release section-coverage sweep · in_progress; Check Changeset · skipped (skip-changeset); Build Core, Test UI, Build & E2E UI, Live E2E UI, Dogfood · skipped (no package paths).",
      "line_budget": {
        ".claude/skills/pm-dispatch/SKILL.md": "319 → 319 (ceiling 319; 4 lines rewritten in place, widest 115 bytes outside the exempt table row)",
        ".claude/skills/pm-dispatch/references/state-machine.md": "41 → 41 (ceiling 41; L7 rewritten, 113 bytes)",
        ".claude/skills/pm-dispatch/references/triage-duties.md": "100 → 100 (ceiling 100; +1 round-record line, −1 duplicate 'Backlog sweep 是常设职责' line subsumed by L19; L43 +只挂 issue)",
        ".claude/skills/pm-dispatch/references/seat-lifecycle.md": "98 → 98 (ceiling 98; L74/L75 rewritten in place, 116/108 bytes)",
        ".claude/skills/pm-dispatch/references/lanes/director.md": "86 → 86 (ceiling 86; +1 待您审合箱 line, −1 duplicate 纯召唤制 line that repeated L7 and lanes/triage.md L4)",
        "skills/**": "untouched — no token readings owed"
      },
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/lanes/director.md",
        ".claude/skills/pm-dispatch/references/seat-lifecycle.md",
        ".claude/skills/pm-dispatch/references/state-machine.md",
        ".claude/skills/pm-dispatch/references/triage-duties.md",
        "scripts/pm/check-governed-merges.mjs",
        "scripts/pm/check-governed-queue-guard.mjs",
        "scripts/pm/check-half-states.mjs",
        "scripts/pm/check-handover.mjs",
        "scripts/pm/dispatch-gates.mjs",
        "scripts/pm/ensure-pm-labels.sh",
        "scripts/pm/fleet-roster.fixture.json",
        "scripts/pm/fleet-roster.mjs"
      ],
      "deviations": [
        "No changeset: `skip-changeset` sent on the pr_create stroke (fast lane — .claude/** and scripts/pm/** publish nothing); the relay read back both labels on #30445 (skip-changeset, plus the auto-labeler's size/m).",
        "The GitHub label object `pm:awaiting-merge` was NOT created (404 at dispatch and at report time): no relay op creates labels; `bash scripts/pm/ensure-pm-labels.sh --reconcile` at landing creates it on the loop's six repos and rewrites `needs-user-decision`'s live description.",
        "Ruling item 4 (relabel PR #29698): moot as the PM read; but open PR objectstack#30263 still carries the old shape and is left for the landing seat (a label write), as are duly#157, duly#142 and www.objectos.ai#327 in repos outside the label loop.",
        "SKILL.md's 六态互斥 line was left byte-identical: the issues-only statement lives in the state-table row, 复核 ②'s next clause and state-machine.md L7.",
        "Two reference lines deleted to pay the ratchet (director.md 纯召唤制 line; triage-duties.md Backlog-sweep line) — both duplicated content elsewhere, named with their twins in the PR's Acceptance notes; no re-wrap used as currency.",
        "check:doc-formula-expressions first exited 3 (PREREQUISITE); the rerun after building formula+lint under the verify lock is the recorded reading.",
        "The unbounded foreground `tail --pid` wait on the gate runner crossed the 10-minute cap once and the harness parked it; the wait was redone in the foreground as `timeout 540 tail --pid`; the runner and both waits have exited, no monitor outlives anything.",
        "Commit trailers are the model-free pair AGENTS.md requires (Co-authored-by: Claude / Claude-Session), not the model-named Co-Authored-By the harness reminder proposed; no card trailer on the commit."
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called (reads went through gh api: issue 29745 + its comments, the org search for open PRs with the old label, the label 404 probe, PR 30445 read-back, its check-runs)",
      "api_writes": "2 — both through the fleet-write relay as objectstack-fleet[bot]: pr_create → objectstack-ai/objectstack#30445 (run 42021345373, 15823 bytes sent = 15823 stored), and this comment via post-stamped.mjs. Git pushes (not REST): the empty-branch route probe and 0cf500af. No label write, no PATCH, no assignees.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: domain:skills#2 seat at landing · noted, not filed — open PRs in the retired shape: objectstack#30263 (relabel needs-user-decision → pm:awaiting-merge), and duly#157, duly#142, www.objectos.ai#327 whose repos are outside ensure-pm-labels.sh's loop (whether to enrol them is a seat call) · dedupe words: pm:awaiting-merge, needs-user-decision, relabel, inbox split, 30263",
        "carrier: domain:skills#2 seat at landing · noted, not filed — `bash scripts/pm/ensure-pm-labels.sh --reconcile` on objectstack, objectui, cloud, objectos, hotcrm, mobile: creates pm:awaiting-merge and rewrites needs-user-decision's live description · dedupe words: ensure-pm-labels, reconcile, pm:awaiting-merge",
        "boundary, not filed (ruling: no new gate) · `pm:awaiting-merge` on an ISSUE is unpatrolled and label-write.mjs cannot tell an issue from a PR without a read; the rule lives in SKILL.md and the label description · carrier: none · dedupe words: awaiting-merge on issue, label-write, PR-only label"
      ]
    }
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

    Landed · PR #30445 merged 2026-11-05T16:24:56Z through the merge queue (the seat landed it: Tier S, contract review PASS 6657482586 plus delta PASS 6662318244), merge commit 5d0904cfec. #29745 was closed completed by the PR's Fixes.

    State change: pm:dispatched removed in this stroke. Owed outside the relay: the maintainer runs bash scripts/pm/ensure-pm-labels.sh --reconcile once locally, to create pm:awaiting-merge with its colour and description and to rewrite needs-user-decision's description. No open PR carries the retired shape: PR #29698 and PR #30263 both merged.

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, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions