Repository navigation
pm(labels): ensure-pm-labels.sh creates pinned and work-in-progress — stale.yml exempts both and the per-seat mailbox carries pinned - #27211
Conversation
stale.yml exempts both labels and neither exists on objectstack-ai/objectstack (both 404), so the exemption was dead; the per-seat mailbox tool also sends pinned on every mailbox PR. Main repo only, sweep-exempt colour family. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Read at 2026-10-28T10:43Z by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS |
维护者速读 — 席位终稿 · PR #27211 · head
|
Fixes #27151
Clause-②: no
Metadata-protocol: none
维护者速读
scripts/pm/ensure-pm-labels.sh新增两行,创建pinned与work-in-progress两个标签(仅 objectstack 主仓)。stale.yml早就豁免这两个标签,但它们在仓里不存在(均 404),豁免形同虚设;每人信箱 PR(pm-dispatch(mailbox): one mailbox PR per seat with a closed doorbell vocabulary; seat-online/offline notices; alternate pick for multi-seat lanes #27143)要挂pinned才不被 stale 扫掉。scripts/pm/ensure-pm-labels.sh新增块(needs:contract-review 之后),重点看两行-d描述与颜色。pnpm check:pm-label-desc-cap,预期输出44 label descriptions … all ≤100 characters。What changes
scripts/pm/ensure-pm-labels.sh: two new rows,pinnedandwork-in-progress, onobjectstack-ai/objectstackonly, colourcfd3d7(the sweep-exempt familytrackingandstatus:parkedalready use;trackingsits in the samestale.ymlexemption list), each-dwithin the 100-character cap. The comment block names the readers:pinnedis read by.github/workflows/stale.ymlexempt-issue-labels+exempt-pr-labelsand sent byscripts/pm/mailbox-open.mjs(STALE_EXEMPT_LABELinPR_LABELS, PR pm-dispatch(mailbox): one mailbox PR per seat with a closed doorbell vocabulary; seat-online/offline notices; alternate pick for multi-seat lanes #27143);work-in-progressis read bystale.ymlexempt-pr-labelsonly, has no tool applying it, and exists so the exemption the workflow already declares is not dead.ensure-pm-labels.shshould create both」 — it overrides the card body's narrower "nowork-in-progress".needs:*block, the file's home for non-state, non-lane, main-repo-only labels whose reader is a workflow.--reconcilecovers both rows with no extra edit: the file'sghshim turns every create line into a create plus an edit, so there is no separate reconcile list to extend.bash scripts/pm/ensure-pm-labels.sh(create-if-missing). This PR creates nothing.Tests
bash -n scripts/pm/ensure-pm-labels.sh: exit 0.pnpm check:pm-label-desc-cap: exit 0. Its self-test runs the real script against a fakeghin both modes, and the gate printed44 label descriptions … all ≤100 characters (longest: 100, tooling). The checker sets a FLOOR on parsed descriptions, not an exact count, and lists no labels by name, so no fixture change is needed.ghrun of--reconcile(aghstub on PATH, no network): exit 0, and the stub log showslabel createpluslabel editfor bothpinnedandwork-in-progresswith colourcfd3d7and the descriptions above.Acceptance notes
pm:mailboxsits in the five-repo loop because a mailbox can be opened on any board.GET /labels/pinnedandcontents/.github/workflows/stale.ymlon objectui, cloud, objectos and hotcrm returned 403 from the measuring session, so whether those repos run a stale sweep is unknown. These rows stay main-repo only, where the reader is measured. Widening them is a vocabulary decision.pr_createlabels leg auto-creates a missing label is still unmeasured, as the card says. Once this lands and the script runs, that question no longer matters forpinned.Verification
Derived gate families (26), at a419e3c
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 26 families. Each one was run locally with its exit code captured before any pipe, and every one exited 0. They includepnpm check:pm-label-desc-cap,check:nul-bytes,check:bash32-floor,check:entry-guard,check:whole-set-label-write(plus self-test),check:self-test-wired,check:closing-keyword-parityandcheck:comment-mask-corpus.--ranreconciliation:26 derived famil(ies) accounted for — 26 run, 0 NOT-MEASURED (a DERIVED zero — all 26 recorded an exit code and none of them is 3). CI families: see this PR's check-runs.Generated by Claude Code