From 88abe7588f5a7cd2887ef8aff9b8b7506e29cad2 Mon Sep 17 00:00:00 2001 From: os-warren Date: Thu, 20 Aug 2026 01:48:43 +0000 Subject: [PATCH] fix(pm): add pm:retriage to the four-repo pm label vocabulary loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The script header claims "the label set IS the PM state machine": every label the state model names is created here across the four triaged repos. The pm:retriage row landed in SKILL.md (#10089) without a matching entry, so the identity claim drifted — a first application on a repo where the object does not exist yet depended on the applying seat remembering to create it, and a rerun of this script could never repair the gap. Description is 96 characters, inside the header's documented 100-character hard cap (over-cap descriptions 422 and the idempotency `|| true` swallows the failure silently). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd --- scripts/pm/ensure-pm-labels.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/pm/ensure-pm-labels.sh b/scripts/pm/ensure-pm-labels.sh index ec12c4cb61..7977bb6e5e 100644 --- a/scripts/pm/ensure-pm-labels.sh +++ b/scripts/pm/ensure-pm-labels.sh @@ -53,6 +53,17 @@ for R in objectstack-ai/objectstack objectstack-ai/objectui objectstack-ai/cloud # and list-page scans. A hand-set instance is mislabeling — the sweep # corrects it against the index. gh label create pm:blocking -R "$R" -c 8250df -d "Derived cache from the Blocked-by reverse index: open card with open dependents — never hand-set" 2>/dev/null || true + # pm:retriage COEXISTS with the standing pm:* label and ⛔ never replaces it + # (maintainer ruling 2026-08-19/20, 「同意 并存」): the objecting seat sets it in + # the same write as its evidence comment, and the triage Routine is the only + # remover — hanging and removing belong to two different parties, which is + # what makes the state safe. Named consumers: the dispatchable-candidate + # query (a pm:queue card carrying it is skipped — objection undecided, no + # dispatch) and the triage round's high-priority re-judgement pass. It is in + # this four-repo loop because the state-model row requires the label to exist + # in all four; where a first application already auto-created the object, + # creation here is a no-op that leaves its colour and description untouched. + gh label create pm:retriage -R "$R" -c d4c5f9 -d "Awaiting triage re-judgement — coexists with the standing pm:* label; queued cards skip dispatch" 2>/dev/null || true gh label create finding -R "$R" -c c2e0c6 -d "Recorded observation — held, not dispatchable until the findings triage round grades it" 2>/dev/null || true gh label create pm:epic -R "$R" -c 5319e7 -d "Parent delegated to a dedicated epic PM — other PMs never dispatch into its subtree" 2>/dev/null || true done