Repository navigation
feat(pm): pm:awaiting-merge — a PR awaiting the maintainer's review and merge no longer shares needs-user-decision with decision cards - #30445
Conversation
…awaiting review and merge A PR whose landing waits on the maintainer's own review and merge used to carry `needs-user-decision`, the same label as a decision card, so one inbox mixed "a letter owed" with "a review and a click owed" and no count could tell them apart. The maintainer ruled the two apart (verbatim: 「同意 pm:awaiting-merge」). - `scripts/pm/ensure-pm-labels.sh`: new `pm:awaiting-merge` (PRs only, never an issue; named readers in its comment); `needs-user-decision` description now says decision cards only, never on a PR. - SKILL.md 复核 ②: the PR carries `pm:awaiting-merge` in the same stroke; state table row: `needs-user-decision` = decision cards (issues) only. Net 0 lines. - references: director's batch, triage round records, the round-report health metrics and the state machine list the two inboxes apart — 决策卡 N · 待您审合 PR M. Each file pays within itself (one duplicated line deleted per added line). - `check-half-states.mjs`: H48 reads `GOVERNED_PR_AWAITING_MERGE_LABEL` on the PR; the card readers (H52/H62/H73, the ④ index) read `DECISION_INBOX_LABEL`. The old shape on a PR no longer satisfies the label half (pinned). - `check-handover.mjs` acceptedPullWait, `fleet-roster.mjs` (new "awaiting merge" column, inbox line counting both halves apart), and the 终局四件套 prose in dispatch-gates / governed-merges / queue-guard follow. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh
|
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh Contract reviewServed-tier: Inputs: the card body and all three comments, the PR body, its 13-file list, the net diff against ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentJudged against ruling comment 6594600712 (option A, items 1–4, 「No new gate」,
Must-fix: none. Should-fix (either a delta commit on this PR or a follow-up; neither blocks landing):
Implemented-by: VERDICT: PASS |
… it lives on PRs Contract-review should-fixes on the awaiting-merge split: - check-handover.mjs imports DECISION_INBOX_LABEL from check-half-states.mjs beside GOVERNED_PR_AWAITING_MERGE_LABEL instead of declaring its own copy (nothing imported it from here, so no re-export is kept). - check-half-states.mjs H54: its header comment and row text said `needs-user-decision` is live "on cards and PRs"; since the maintainer split the inboxes it lives on cards only, and the text now says so. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh
|
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh Contract reviewServed-tier: Delta read: ① Derived judgmentsCarried over unchanged from record 6657482586 (items 1–10). The delta adds exactly one derived change and it is RIGHT: ② Semver levelUnchanged: ③ Boundary flagsUnchanged from record 6657482586 (every deviation and out-of-scope note answered there; ④ Design judgmentThe five
No new finding. Must-fix: none. Should-fix: none — S1 and S2 of record 6657482586 are closed on this head. Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh 席位核对 — ACCEPT ·
|
Fixes #29745
Clause-②: no
Metadata-protocol: none
维护者速读
pm:awaiting-merge(等您审核并合并的 PR 挂它,永不挂 issue);needs-user-decision只留给决策卡(issue)。SKILL.md 复核 ② 与状态表改读法;总监呈批、分诊轮次记录、轮次报告健康指标、车队总表都把「决策卡 N」与「待您审合 PR M」分开计。巡查 H48 与交接检查acceptedPullWait改读新标签。pm:awaiting-merge」,席位换标即清。回滚 = revert 本 PR;GitHub 上的标签对象留着无害。scripts/pm/check-half-states.mjs:新常量GOVERNED_PR_AWAITING_MERGE_LABEL与DECISION_INBOX_LABEL,及 H48 读标签的 hunk(唯一改行为的 hunk);②.claude/skills/pm-dispatch/SKILL.md:复核 ② 行与状态表needs-user-decision行;③scripts/pm/ensure-pm-labels.sh:新标签行与改写的needs-user-decision描述。node scripts/pm/fleet-roster.mjs --self-test,预期末行✓ fleet-roster self-test: 115 cases in 9 batteries pass.;再pnpm check:pm-skill-ratchet,预期 SKILL.md 仍 319 行、五个 references 行数不变。bash scripts/pm/ensure-pm-labels.sh --reconcile建标签,并给仍挂旧标签的 PR 换标)。What changes
The maintainer's ruling on the card (verbatim: 「同意 pm:awaiting-merge」, option A). One label, two inboxes: a PR that waits on the maintainer's own review and merge used to carry
needs-user-decision, the same label as a decision card, so the decision count mixed "a letter owed" with "a review and a click owed".scripts/pm/ensure-pm-labels.shgainspm:awaiting-merge("PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue", in the per-repo loop, 100-char cap respected) with its named readers in the comment.needs-user-decision's description now says "decision cards only, never on a PR". Kept as is:pm:awaiting-maintainer(an issue, a human act outside GitHub). No new gate.pm:awaiting-merge」; the next clause says it is PR-only and outside the six states; the state-table row saysneeds-user-decision= decision cards (issues) only, never a PR; the preamble names the maintainer's three entry points.references/lanes/director.md(the director's batch and daily digest),references/triage-duties.md(triage round records;needs-user-decision= issues only),references/seat-lifecycle.md(the round report's health metric),references/state-machine.md(the six states are all issue states). Each reference that grew a line paid for it inside the same file by deleting a duplicated line (details under Acceptance notes); the others were rewritten in place.scripts/pm/check-half-states.mjs: H48 (a governed PR with an ACCEPT verdict must carry the label) now readsGOVERNED_PR_AWAITING_MERGE_LABEL=pm:awaiting-merge. The card readers that had been reusing the PR constant (H52, H62, H73, the ④ dependents index and its renderer) readDECISION_INBOX_LABEL=needs-user-decision. Pinned: the old shape (needs-user-decisionon a PR) no longer satisfies H48's label half; the new label is not one ofPM_EXCLUSIVE_STATE_LABELS.scripts/pm/check-handover.mjs:acceptedPullWaitreads the new label on the stay-behind pull; pinned that the old shape is no longer a wait.scripts/pm/fleet-roster.mjs: a new "awaiting merge" column (pulls carrying the label that close an in-flight card of the seat, attributed like "awaiting landing"; no new read — labels ride on the open-pulls listing) and an inbox line under the table: 「决策卡 N · 待您审合 PR M」, counted apart and never summed.--jsoncarries the sameinboxestotals. Fixture: pull 25427 carries the label.dispatch-gates.mjs,check-governed-merges.mjsandcheck-governed-queue-guard.mjsnames the new label on the PR.findingsweep tool; H63 keeps reporting #29698, which merged on 2026-11-03 (moot). The searchorg:objectstack-ai is:pr is:open label:needs-user-decisionat dispatch time returned four: objectstack#30263 (the ADR-0148 docs PR) and three outside the label loop (duly#157, duly#142, www.objectos.ai#327). Relabelling is a label write and belongs to the landing seat, not to this PR's write budget.Tests
Self-tests of every touched script, run on the final head (readings under Verification):
node scripts/pm/fleet-roster.mjs --self-test— 115 cases in 9 batteries pass (110 onorigin/main; 5 new: the column, the retired shape counts nowhere,inboxTotals, the inbox line, no inbox line without totals; the import pin now also asserts no second spelling of the label).node scripts/pm/check-handover.mjs --self-test— 67 cases pass (66 onorigin/main; 1 new: the retired shape is no longer a wait).pnpm check:pm-half-states(check-half-states.mjs --self-test) — 5224 cases pass (2 new: the old shape no longer satisfies H48's label half; the PR constant ispm:awaiting-mergeand not one of the six card states), with H48's existing cases re-pinned on the new label.pnpm check:pm-label-desc-cap— 45 descriptions ≤100 chars (longest 100, the pre-existingtooling).pnpm check:pm-skill-ratchet— SKILL.md 319/319, state-machine 41/41, triage-duties 100/100, seat-lifecycle 98/98, director 86/86; no edited line over 120 bytes.pnpm check:pm-skill-id-lint,pnpm check:skill-frame-sync— green.No ablation: the behaviour change is label-name plumbing pinned by the self-tests above; nothing under
packages/*moved.Acceptance notes
lanes/director.md: +1 line (待您审合箱 and the two-count rule) paid by deleting 「本席任何形态都纯召唤制,⛔ 无任何 routine;分诊席默认同项目召唤,职责见triage.md」 — its first half repeats line 7 (「授权面 = 人工召唤 … 直连 ⛔ 无 Routine/cron」), its second half repeatslanes/triage.mdline 4 (「由维护者一句召唤到任一项目,默认同总监席项目」).triage-duties.md: +1 line (round records split the two counts) paid by deleting 「Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡」, which line 19 (「首触定级与五析取 sweep 每 fire 跑到清空 …」) subsumes.seat-lifecycle.md,state-machine.md,SKILL.md: rewritten in place, net 0.bash scripts/pm/ensure-pm-labels.sh --reconcileon the loop's repos, which also rewritesneeds-user-decision's live description (the create-only default would leave the old text).pm:awaiting-mergeanswered 404 on this repo at dispatch time.needs-user-decision→pm:awaiting-merge); the three PRs indulyandwww.objectos.aisit in repos outsideensure-pm-labels.sh's loop, so their shape is a seat decision, noted and not filed.pm:awaiting-mergeon an ISSUE, andlabel-write.mjscannot tell an issue from a PR without a read; the rule lives in SKILL.md and the label's description.board-snapshot.mjs,references/landing-operations.md,references/contract-review.md(named as clues) do not read the label;fleet-roster.mjs's "awaiting ruling" already excluded pulls; the six-state mutex andPM_EXCLUSIVE_STATE_LABELSare unchanged..claude/**andscripts/pm/**publish nothing from any released package.Verification
Final head
0cf500af(every reading below was taken on this tree; basefdd06415onorigin/main). No package is touched, so no ① dependency-closure build and no ② package test is owed;test:repoand the farm-wide scans are CI's.Derived families.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 63 commands from the 13 changed files. Every one ran in the worktree with its exit code captured before any pipe (bash -c CMD >> log 2>&1; EXIT=$?). Reconciliation,dispatch-gates --ranover the recordedcommand :: exit codelines: 「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)」.pnpm --filter @objectstack/lint run check:doc-formula-expressions, first exited 3 — PREREQUISITE NOT MET (@objectstack/formulaand@objectstack/lintunbuilt; by the gate's own text「Nothing was measured … NOT a finding」). Afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunderos-verify-lock.sh(VERDICT command-exit 0 · held the lock 2s · waited 0s) it exits 0; the reconciliation above is the post-rerun one.check:dev-prereqs,check:skill-frame-freshness) are not named by the derivation: neitherpackages/specnor the four-axis frame files moved.Lint & Repo Gates; the report comment cites the PR's check-runs by name once they exist, not a local re-run.63 commands, all exit 0 at head 0cf500a (summary line of each, where the gate prints one)
Generated by Claude Code