Skip to content

docs(pm): add pm:retriage — the awaiting-regrade label coexisting with the standing pm:* state - #10089

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-10081-pm-retriage
Aug 20, 2026
Merged

docs(pm): add pm:retriage — the awaiting-regrade label coexisting with the standing pm:* state#10089
os-zhuang merged 1 commit into
mainfrom
claude/issue-10081-pm-retriage

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Fixes#10081

What

Adds the pm:retriage awaiting-regrade state to the PM dispatch skill's state model (maintainer ruling 2026-08-19/20, quoted verbatim in the row: 「同意 并存」), as one table row carrying the ruled four parts, plus the matching selection carve-outs and the triage-seat duty sentence.

  • State-model row pm:retriage — the four parts, in the file's table idiom:
    1. Coexistence — carried alongside the standing pm:* label, never removes it; the standing grade stays authoritative until triage re-rules; coexistence is what makes "queued but contested" visible on a list.
    2. Producer — the objecting seat; the label write and the objection comment (evidence + proposed grade) are the same stroke; a bare label with no evidence comment is illegal.
    3. Reader + discharge — the triage Routine handles it as a high-priority item each fire and removes the label after re-ruling; producer and discharger are different parties on disjoint transitions (stated in the row as its safety property).
    4. Dispatch discipline — a pm:queue card also carrying pm:retriage is skipped by selection (contested grades are not dispatched).
  • Dispatchable-row carve-out: the 「open + 队列标签 + 无 assignee ⇒ 可派发」 row now excepts cards carrying pm:retriage.
  • Candidate definition in 候选与批次 gains the same exclusion (无 pm:retriage) — that line is the filter execution seats actually run.
  • 分诊座位职责: one sentence — pm:retriage re-ruling is high-priority each fire; the triage seat removes the label in the same stroke as the re-ruling.
  • Cross-repo clause (in the row): the label must exist in all four repos, created on first application (triage's cross-repo duty). The companion age predicate is another card and is deliberately NOT implemented here; the row points at the half-state patrol generically (no issue numbers — id-lint).

Line budget (ratchet)

Ceiling 682. Before: 681 (headroom 1). After: 681 (headroom 1) — net 0.

Payment audit: +2 lines (the new table row; the triage-duty sentence) paid by a genuine dedup of −2 lines: the standalone 「一次性建标签」 paragraph duplicated the 机械守卫索引 row for scripts/pm/ensure-pm-labels.sh. Each cut fact's surviving home: the script pointer and idempotence → the index row; "retired lanes deliberately absent, never re-add, rationale in the script header" → folded into that same index row. No re-wrap: no prose lines were merged to fund lines.

Gates (all run at head 4c41ff2, after the final commit; exit codes captured via redirect-then-$?, never through a pipe)

  • node scripts/pm/dispatch-gates.mjs (no args, real diff from merge base): 1 path, 7 local families derived; tier line "Model tier — MANDATORY: claude-fable-5" (clause ①, honored).
  • pnpm check:pm-skill-ratchet — exit 0 — "✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 681 lines (ceiling 682; headroom 1)."
  • pnpm check:pm-skill-id-lint — exit 0 — "✓ check-skill-id-lint: 15 file(s) clean (pattern /#[0-9]{3,}/g)."
  • pnpm check:pm-governed-prose — exit 0 — "✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others."
  • pnpm check:pm-governed-merges — exit 0 — "✓ check-governed-merges --self-test: 81 assertions …" (self-test + run).
  • pnpm check:skill-frame-sync — exit 0 — "✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files".
  • pnpm check:doc-authoring — exit 0 — "✓ doc authoring guard: 379 files clean — no bare metadata literals."
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions — exit 0 — "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 404 files / 1414 TS blocks judged clean by @objectstack/formula." (Required building the dependency closure first: pnpm --workspace-concurrency=2 --filter '@objectstack/lint^...' build.)
  • node scripts/check-nul-bytes.mjs — exit 0 — "check-nul-bytes: OK (scanned 6367 text file(s) … no raw ASCII control bytes)."
  • node scripts/check-skill-compatibility-version.mjs — exit 0 — "11 pinned major(s) all match the workspace" (named as-applicable; population unaffected by this diff).

Reverse verification (direction predicted in writing before running)

Predicted: appending 2 filler lines (681 → 683, over ceiling 682) turns check-skill-line-ratchet RED with a verdict line naming this file; restoring from the committed branch is byte-identical and turns it green. Observed exactly that: "✗ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 683 lines; the ratchet ceiling is 682. …" (exit 1); sha256 identical before mutation and after restore (82b74df4a42b5966…); green at 681 (exit 0). check:pm-skill-id-lint stayed green throughout. The gate reads the .md directly via readFileSync — no dist/export resolution is involved, so no rebuild leg applies to this ablation.

Housekeeping

Docs/protocol-only change to a .claude/ internal skill — nothing user-visible is published, so skip-changeset is applied (union label write with read-back). GOVERNED surface: draft PR, review requested from os-zhuang, left visibly hanging for a human merge — never flipped ready, never queued, never auto-merged.

Known CI flake note: Lint & Repo Gates intermittently dies parsing packages/spec/src/migrations/registry.ts on unrelated PRs today; local dispatch-gates families do not run eslint over spec and are unaffected. If that job reds here with the same signature, it is the known flake, not this diff.


Generated by Claude Code

…e standing pm:* state
Fixes#10081
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
@os-warrenos-warren added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 20, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 20, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 20, 2026 00:57
@os-zhuang
os-zhuang enabled auto-merge August 20, 2026 00:57
@os-zhuang
os-zhuang added this pull request to the merge queueAug 20, 2026
Merged via the queue into main with commit 9efe4d7Aug 20, 2026
24 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10081-pm-retriage branch August 20, 2026 01:10
os-warren added a commit that referenced this pull request Aug 20, 2026
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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skills: pm:retriage — the awaiting-regrade label, coexisting with the current pm:* state

3 participants

@os-warren@os-zhuang@claude