Skip to content

pm(labels): ensure-pm-labels.sh creates pinned and work-in-progress — stale.yml exempts both and the per-seat mailbox carries pinned - #27211

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-27151-ensure-pm-labels-pinned
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-27151-ensure-pm-labels-pinned

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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 扫掉。
  • 风险与回滚:极低,只是标签词表多两行;合并本身不创建任何标签,要等席位或维护者运行脚本才生效;回滚即 revert 本 PR。
  • 先看: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, pinned and work-in-progress, on objectstack-ai/objectstack only, colour cfd3d7 (the sweep-exempt family tracking and status:parked already use; tracking sits in the same stale.yml exemption list), each -d within the 100-character cap. The comment block names the readers: pinned is read by .github/workflows/stale.yml exempt-issue-labels + exempt-pr-labels and sent by scripts/pm/mailbox-open.mjs (STALE_EXEMPT_LABEL in PR_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-progress is read by stale.yml exempt-pr-labels only, has no tool applying it, and exists so the exemption the workflow already declares is not dead.
  • Scope follows triage's grade (comment 6464839941): 「ensure-pm-labels.sh should create both」 — it overrides the card body's narrower "no work-in-progress".
  • Placement: right after the needs:* block, the file's home for non-state, non-lane, main-repo-only labels whose reader is a workflow.
  • --reconcile covers both rows with no extra edit: the file's gh shim turns every create line into a create plus an edit, so there is no separate reconcile list to extend.
  • The labels are CREATED only when the seat or the maintainer runs 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 fake gh in both modes, and the gate printed 44 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.
  • Fake-gh run of --reconcile (a gh stub on PATH, no network): exit 0, and the stub log shows label create plus label edit for both pinned and work-in-progress with colour cfd3d7 and the descriptions above.
  • No ablation: no test pins this behaviour, and the diff is a vocabulary script.

Acceptance notes

  • Five-repo question not measured: pm:mailbox sits in the five-repo loop because a mailbox can be opened on any board. GET /labels/pinned and contents/.github/workflows/stale.yml on 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.
  • Whether the relay's pr_create labels 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 for pinned.

Verification

Derived gate families (26), at a419e3c

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 26 families. Each one was run locally with its exit code captured before any pipe, and every one exited 0. They include pnpm 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-parity and check:comment-mask-corpus. --ran reconciliation: 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

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>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 28, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: a419e3c27cc698ac0461402f2c77c9d396c64c96
Local-runs: probe — the seat ran, from a git archive copy of the head (no checkout, no edit, no network): bash -n scripts/pm/ensure-pm-labels.sh → exit 0 and node scripts/pm/check-label-desc-cap.mjs → ✓ 44 label descriptions … all ≤100 characters (longest: 100, tooling); the script itself was NOT run (a label create is a live write)
Scope: scripts/pm/ensure-pm-labels.sh (the two new rows and their comment block) + .github/workflows/stale.yml L53–54 (read), scripts/pm/mailbox-open.mjs PR_LABELS on PR #27143 (read), triage grade 6464839941

Read at 2026-10-28T10:43Z by the domain:skills#2 seat on the fetched head (merge-base 4265176c): one file, +31/−0. Not a governed path (check-governed-merges --pr 27211: no register hit, 31 lines ≤ 3000) — a pure scripts/pm/** PR, which the skills lane self-reviews with the checklist undiminished and lands. No face asked; this record is served at the contract-review tier.

① Derived judgments

  • The two rows are in the file's own form (gh label create <name> -R objectstack-ai/objectstack -c <colour> -d "<description>" 2>/dev/null || true), placed after the needs:* block — the file's home for labels that are not PM states, not lanes, not routing seams, read by a workflow rather than a query; pm:mailbox (the order's suggested neighbour) sits in the five-repo loop, and the reader here (stale.yml) is measured only in this repo — the dev's placement is the better reading. Descriptions 94 and 99 characters, under the 100-character cap the file's own ⚠️ and check-label-desc-cap.mjs enforce.
  • Readers named per the file's convention: pinned → stale.yml exempt-issue-labels + exempt-pr-labels (L53–54 on origin/main, read) and mailbox-open.mjs STALE_EXEMPT_LABEL in PR_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, read); work-in-progress → stale.yml exempt-pr-labels only, no tool applies it. The block says why it exists (the exemption the workflow declares was dead for a label that cannot be applied) and that the alternative — editing the name out of stale.yml — is Tier H and not this file's. Holds against SKILL.md's 「一个标签存在当且仅当有具名读者」.
  • Scope: both labels, per triage's grade 6464839941 (「ensure-pm-labels.sh should create both」), which overrides the card body's narrower 「⛔ Do not add work-in-progress」 and the claim's file-surface line that repeated it — the seat's order said so and this record amends the claim.
  • Colour cfd3d7, the sweep-exempt family tracking and status:parked already use; tracking is itself in the same exemption list. Consistent.
  • --reconcile needs no separate edit: the file's gh shim turns every create line into create + edit (the order's hypothesis of a reconcile list was falsified by the dev — verified by reading L140–L180 of the head: the shim, not a list). Dev's fake-gh run of --reconcile: create + edit for both rows, -c cfd3d7, descriptions as written.
  • Nothing is created by the merge: the labels appear when the seat or the maintainer runs bash scripts/pm/ensure-pm-labels.sh (create-if-missing). The dev did not run it (the order forbade a live write); the seat has no gh credential in this container, so that run is the maintainer's or a gh-holding seat's — named in the ACCEPT.

② Semver level

  • None owed: a PM script; no package touched. Clause-②: no, Metadata-protocol: none on the PR body match the claim; no Skills-docs: line owed; skip-changeset correct.

③ Boundary flags

  • Main repo only: the four sibling repos answered 403 to label and contents reads from the dev's session, so whether their stale sweeps name these labels is unmeasured — the dev left it in Acceptance notes rather than widening the rows; agreed (a vocabulary decision for the lane, not a maintenance edit).
  • The order's line count (619) was stale by three lines (622 at the merge base) — the seat's reading was from the shared checkout; no effect.
  • Author objectstack-fleet[bot] through the relay; mcp_calls: 0; draft, no flip by anyone.

④ Design judgment

  • Against the scenario (a mailbox PR, never merged and quiet for weeks, must outlive the stale sweep; a workflow already exempts a label nobody can apply): the smallest change that makes the declared exemption true, in the file that owns the vocabulary, with the readers written down so the next reader knows who depends on it. No gate added, no workflow touched. Holds. Residual: the first real ensure-pm-labels.sh run after merge is the measurement that the create lands (the relay's labels leg on the first mailbox open is the other).

Implemented-by: claude/issue-27151-ensure-pm-labels-pinned
Reviewed-by: session_01QSeKYmhU5KEj1nukYhp1Tg

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读 — 席位终稿 · PR #27211 · head a419e3c2 · domain:skills#2 · 2026-10-28T10:53Z

  • 改了什么:scripts/pm/ensure-pm-labels.sh 新增两行,创建 pinned 与 work-in-progress(仅 objectstack 主仓,颜色取 stale 豁免族 cfd3d7),注释块写明各自的具名读者(stale.yml 的两份豁免表;mailbox-open.mjs 给每张信箱 PR 挂 pinned)。
  • 为什么改:stale.yml 早就豁免这两个标签,但仓里不存在(均 404),豁免形同虚设;pm-dispatch(mailbox): one mailbox PR per seat with a closed doorbell vocabulary; seat-online/offline notices; alternate pick for multi-seat lanes #27143 落地后每张信箱 PR 都要挂 pinned,否则 30 天被 stale 扫掉。分诊(6464839941)定两个都建。
  • 风险与回滚:极低 —— 词表脚本多两行,合并本身不创建任何标签;回滚 = revert。
  • 先看:新增块(needs:contract-review 之后)的两行 -d 描述与读者注释。
  • 两分钟验证:pnpm check:pm-label-desc-cap 预期 44 label descriptions … all ≤100 characters。
  • 需要你做的:合并后跑一次 bash scripts/pm/ensure-pm-labels.sh(create-if-missing)—— 本席容器无 gh 凭据,建标签这笔写只能由你或持 gh 的席位做;另:落地笔若再被分类器拦,仍需你翻 ready。
  • 席位意见:ACCEPT。纯 scripts/pm/**,席位自审(记录 6466916379):形态、描述上限、读者、放置位置、颜色族逐项核过;dev 推翻了我「reconcile 有单独清单」的假设(是 gh shim),属实。

席位核对 — ACCEPT · domain:skills#2 · session_01QSeKYmhU5KEj1nukYhp1Tg · 2026-10-28T10:53Z

  1. 形态:draft → main,首行 Fixes #27151,Clause-②: no、Metadata-protocol: none 行首在;一个文件 +31/−0;assignee os-justin;skip-changeset 正确;单 commit。
  2. 前提实测:席位在取回的 head(merge-base 4265176c)上核 —— 两行形态同文件惯例、描述 94/99 字符;stale.yml L53–54 两份豁免表含两名;mailbox-open.mjs(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)PR_LABELS 含 pinned;归档副本上 bash -n exit 0、check-label-desc-cap 44/44;GET /labels/pinned、/labels/work-in-progress 在派发时 404。
  3. 门禁 check-runs(head a419e3c2,本笔读数 2026-10-28T10:53Z):45 check-runs,26 success · 19 skipped · 0 in progress · 0 failure(mergeable_state: clean, draft)。dev 本地派生 26/26 exit 0 钉 a419e3c2(报告 6466871417)。
  4. 接受的偏差:① 放在 needs:* 块后而非 pm:mailbox 旁(读者只在主仓实测,五仓循环不适用);② 范围按分诊取两个标签,覆盖卡正文与认领的 ⛔;③ 席位未跑脚本(live 写)。
  5. 范围外去向:none filed;Acceptance notes:四个兄弟仓的 stale 豁免未测(403),词表是否扩到它们是车道的词表决定。Skills-docs: 不欠(kind none)。
  6. 落地条款:非受管面、纯 scripts/pm/**;席位自审记录 6466916379;全绿即席位经中继 pr_ready + automerge_enable 落地(分类器若拒即停并报维护者,记卡);MERGED 后关卡摘 pm:dispatched,并请维护者跑一次脚本创建标签。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ensure-pm-labels.sh: create the pinned label that stale.yml exempts and the per-seat mailbox now requires (404 today; work-in-progress 404 too)

2 participants