Uh oh!
There was an error while loading. Please reload this page.
feat(pm): add H18 — pm:retriage aged past the triage cycle - #10184
Merged
Conversation
Report-only invariant in check-half-states.mjs: an open card carrying pm:retriage past a 2h threshold (RETRIAGE_STALE_HOURS, aligned to the triage Routine's hourly re-judgement cadence, same reasoning as DOMAIN_HALF_STATE_STALE_HOURS/H13) is triage debt — the objecting seat's grade is still undecided past a cycle the Routine should have re-judged it in. The row names the card and its coexisting standing pm:* label; pm:retriage present with no coexisting pm:* label gets its own note (disputed grading is unidentifiable, 异议对象不明). Age is read from updated_at, the same timeline-fetch-free proxy H13 uses. Wired into the existing unscoped pass (H13-H15) so it needs no new fetch. Ordinary report-only row in both renderers, not loud — same as H14-H16. 20 new self-test cases (positive/negative/threshold-edge/unreadable/ disputed-target/render shapes); self-test count 469 -> 489. Fixes#10082
qq9340100
marked this pull request as ready for review
August 20, 2026 13:05
qq9340100
enabled auto-merge
August 20, 2026 13:05
This was referenced Aug 20, 2026
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#10082
What
Adds H18 to
scripts/pm/check-half-states.mjs: a report-only row for anopen card carrying
pm:retriagepast a 2h threshold (RETRIAGE_STALE_HOURS,aligned to the triage Routine's hourly re-judgement cadence — same reasoning
as
DOMAIN_HALF_STATE_STALE_HOURS/H13). Maintainer ruling 2026-08-19/20,verbatim: 「同意 并存」—
pm:retriagecoexists with the card's standingpm:*label rather than replacing it, and the triage Routine is the sole remover.
Without an age check that label becomes the next half-state nobody watches.
pm:*label(s).pm:retriagepresent with no coexistingpm:*label gets its own noteinstead — the coexistence the state model requires is itself missing, so
the disputed grading is unidentifiable (异议对象不明).
updated_at(the same timeline-fetch-free proxy H13uses) — every triage re-judgement bumps it, so a stale reading means
nothing touched the card since any triage pass.
pm:retriagecancoexist with a label this sweep's label pages never fetch (e.g.
pm:blocking) or with none at all, so only the unscoped listing isguaranteed to see every carrier. No new fetch.
— same property H14-H16 hold.
Tests
pnpm check:pm-half-states(==node scripts/pm/check-half-states.mjs --self-test) ate47badf: 489 cases pass (469 baseline before this PR,re-measured on
origin/mainat dispatch time, matching the #10082 handoffcomment's 414→469 note; +20 new H18 cases here).
New cases cover: over-threshold hit (single and multiple coexisting
pm:*labels), under-threshold no-hit, exactly-at-threshold (clean), no
pm:retriagelabel (out of scope), the disputed-target variant(
pm:retriagealone — asserts the 异议对象不明 note and that no coexistinglabel is falsely claimed), a
domain:*label not counted as a coexistingpm:*label, unreadable/absentupdated_at(#4690: must not read asfresh), not-loud, and the plain/markdown ordinary-row rendering shapes
(mirroring the H14/H15/H16 pins).
Also green at the same head:
node scripts/check-cross-package-test-inputs.mjs—OK: 12 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.pnpm check:nul-bytes—OK (scanned 6066 text file(s) ... no raw ASCII control bytes)node scripts/check-partof-closing-keyword.mjsrequiresPR_BODY/PR_NUMBER(a PR-body linter with no local dry-run target) — validated locally against
this exact body via
PR_BODY="$(cat pr-body.md)" node scripts/check-partof-closing-keyword.mjs:✓ this PR carries no Part-of/ closing-keyword contradiction.It also runs in CI on.github/workflows/partof-closing-keyword-guard.yml.Scope
Non-governed surface (internal tooling):
skip-changeset.Generated by Claude Code