tooling(pm): read pm:retriage as a question for triage, in H18 and the label description - #15795
Conversation
…the label
`pm:retriage` is a question put to the triage seat — a re-grade, a lane for a
cross-domain PR, a re-route, a split, a disposition fork a dev report left open
— stated by the objection comment, answered every fire and removed in the same
write (SKILL.md). Three surfaces still spoke the retired re-grade vocabulary:
H18's threshold citation (which quoted a SKILL.md line that no longer exists),
its finding sentence ("the objecting seat's grade is still undecided … resolve
the grade (keep or change)"), and the `pm:retriage` description created by
`ensure-pm-labels.sh`.
Prose and one description string. `h18RetriageAged`'s predicate, threshold,
`updated_at` proxy, coexisting-label sentence and report-only exit semantics are
unchanged; the ALONE-shape note (异议对象不明) stays as written. The new label
description measures 91 code points / 91 bytes against GitHub's 100-character
cap; the live label objects are NOT re-seeded by this commit.
Self-test: 2262 -> 2267 cases, five new H18 pins — three on the new sentence,
two asserting the retired vocabulary is gone from both row shapes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT — in-seat review of PR #15795, head Implemented-by: Verified in a detached compare worktree at the PR head, three-dot against The dev's evidence beyond the seat's runs: red first (5 of 2267 failed before the edit, exactly the five new cases), ablation on a throwaway copy with the mutation proven on disk and the restore proven by blob hash, 32 derived families all exit 0 and reconciled 32 of 32 after merging Open question ruled A: the landed 91-byte description stands — "standing" carries the maintainer-ruled half (the original grade stays authoritative until the question is answered), "no dispatch" is the file's own idiom for the fact, and only A leaves the cap real headroom. Landing regime: pure code ⇒ ready + auto-merge in this same act (the queue's SQUASH governs whatever method the tool reports); Generated by Claude Code |
Fixes #15744
pm:retriageis a question put to the triage seat — a re-grade, a lane for a cross-domain PR, a re-route, a split, a disposition fork a dev report left open — stated by the objection comment, answered every fire, and removed in the same write. That is the wording now onmainin.claude/skills/pm-dispatch/SKILL.md(the label row, and the triage-duty line 「pm:retriage每 fire 先答异议评论所求,答后同笔摘标;须维护者答的进收件箱,标照摘」) and inreferences/state-machine.md.Two files still read the label as a re-grade request. This PR aligns them. Prose plus one description string — no predicate, no threshold, no logic.
What changed
scripts/pm/check-half-states.mjs— H18, four prose sitespm:retriage重判每 fire 高优先处理」, a SKILL.md line that no longer exists; "re-judges every card"; "survived at least one re-judgement pass"pm:retriagecard each fire, high priority" ; "every triage re-judgement (grade kept or changed) bumpsupdated_at"pm:retriagecard's question each fire" ; "every triage answer (whatever it decides) bumpsupdated_at"PM_RESIDUE_LABELSdocblockpm:retriagea request for re-judgement"pm:retriagea question put to the triage seat"scripts/pm/ensure-pm-labels.sh— the label objectThe description, and the comment block above it that named "the triage round's high-priority re-judgement pass" as a consumer.
What deliberately did NOT change
h18RetriageAged's predicate,RETRIAGE_STALE_HOURS, theupdated_atproxy, the coexisting-label sentence and the row's report-only exit semantics — byte-for-byte. Same population, same threshold, same rows.pm:retriagewith no coexisting standingpm:*label — a shape the state model does not define — and that is still true and still unidentifiable.PM_RESIDUE_LABELS's census note (the label was measured absent from a live population) andPM_EXCLUSIVE_STATE_LABELS's "annotations ON a state".The label description is capped at 100 characters
gh label createreturns HTTP 422 above 100 characters and the script's|| trueswallows it, so an over-cap description means the label is silently never created on a repo that lacks it (pnpm check:pm-label-desc-capexists for exactly this).The card's candidate string, "Question for triage, answered each fire; coexists with the standing pm:* label; queued cards skip dispatch", measures 106 code points — over the cap. Landed instead, carrying the same three facts in the file's own house idiom (
pm:blocked"do not dispatch",pm:on-hold"no dispatch, no nag"):91 code points, 91 bytes (a code-point count and
LC_ALL=C wc -cagree; the string is ASCII). Nine characters of headroom. The dropped words are the population qualifier "queued cards" — the fact survives as "no dispatch", which is how the three sibling rows spell it.Live labels are NOT re-seeded by this PR
ensure-pm-labels.shneedsgh, which is absent from this container, and three of its five repos are outside this session's scope — the script was not run and no live label was touched. The livepm:retriagedescription on all five repos still reads "Awaiting triage re-judgement — …". Re-seeding is a separate act after merge (aPATCHon the label object, orensure-pm-labels.sh --reconcilefrom a shell that hasgh).Verification
Everything below ran on
76eab9dce6— this branch's head, withorigin/mainmerged in at6a3cc134c4.Self-test, red first. Five new H18 cases were written before the edit: three pin the new sentence (the question is unanswered; the remedy is answer + drop the label in the same write; an answer needing the maintainer still drops it), two assert the retired vocabulary is gone from both row shapes. All five failed against the old sentence, all five pass now.
Ablation. The new sentence was replaced by the retired one on a throwaway copy of the script — the tracked file was never mutated, the copy was deleted, and the tracked blob's hash was compared against its HEAD blob afterwards (identical). The mutation was confirmed on disk by occurrence count, not by the editor's exit code. Result: exactly the five new cases went red, the other 2262 stayed green.
Gates. Derived on the final two-path file list with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack— 32 commands, all run, all exit 0, reconciled with--ran(32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN). Whole-repopnpm lint(eslint . --no-inline-config) green through the shared verify lock.pnpm check:pm-half-states,pnpm check:pm-label-desc-cap(23 descriptions, all at or under 100 — it puts a fakeghon PATH and runs the real script, so the shell edit is exercised end to end),node scripts/pm/check-label-desc-cap.mjs --self-test, and the self-tests of the five otherscripts/pm/tools that name either edited file — all green.bash -non the shell script parses.node scripts/pm/check-governed-merges.mjs --teston both paths: 0 of 2 hit the register — not a governed surface, ordinary queue landing applies.skip-changesetbecause the diff publishes nothing from any released package.pnpm check:published-readme-exportsexits 3, NOT MEASURED — it needs 45 built packages and this tree is not built. It is a roster gate unrelated to these two paths; recorded here rather than read as a pass.The row, rendered
Generated by Claude Code