Uh oh!
There was an error while loading. Please reload this page.
feat(pm): two report-only patrol predicates for the pm:blocking machinery — cache coherence both directions, and oldest-unclaimed age - #9945
Merged
Conversation
…nery H14 — `pm:blocking` cache coherence, both directions, off the `Blocked-by:` reverse index the unscoped pass already has the bodies for. `pm:blocking` is a triage-sweep-derived cache, never hand-applied, and the lane selection order ranks it second only to `priority:p0`; a cache with a ranking consumer and no coherence check drifts two ways. A card carrying the label that nothing targets is boosted on the authority of a dependency that does not exist; a card that is targeted and lacks it is a real unblocker the order cannot see. H15 — one visibility row naming the oldest open, UNASSIGNED `pm:blocking` card and its age. No threshold: the row reports unconditionally, because a threshold would re-introduce the judgement call the row exists to hand to the reader. Both stay report-only, both render as ordinary rows in both media, and the remedy for either direction is always the triage sweep's derivation pass — this script never writes a label. Measured on the live board 2026-08-19 (234 open cards, 17 `Blocked-by:` body lines): 1 stale, 5 missing, 0 coherent pairings. Self-test 202 -> 273 cases, all green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
os-warren
marked this pull request as ready for review
August 19, 2026 09:32
os-warren
enabled auto-merge
August 19, 2026 09:32
This was referenced Aug 19, 2026
Contributor
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32238338331 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
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#9935
Two report-only predicates on
scripts/pm/check-half-states.mjs, surfaced as anchor rows through the patrol that already runs this script. No workflow change; nothing reddens; the script never writes a label.H14 —
pm:blockingcache coherence, both directionspm:blockingis not a state a seat sets. The state model makes it a cache the triage sweep derives from theBlocked-by:reverse index (⛔ 不手工挂), and the lane selection order ranks it second only topriority:p0. A cache with a ranking consumer and no coherence check drifts two different ways, and each lies differently:Blocked-by:body line targets it. Worse than an absent label: it boosts a card nothing depends on, with authority.Blocked-by:line and not carrying the label. A real unblocker the selection order cannot see.Report-only in the strong sense: the producer is the triage sweep's derivation pass, so the row's prescribed remedy is always a derivation that runs, never a label written from this script.
H15 — oldest unclaimed
pm:blocking, with its ageOne visibility row naming the oldest open, unassigned
pm:blockingcard. It carries no threshold constant, deliberately, and the rationale comment says why: every other aged item here answers "has this been abandoned?", where a threshold is what turns silence into an alarm. This row answers "is the lane taking blocking cards first?", and the honest answer is a number every run. A threshold would re-introduce the judgement call the row exists to hand over, and would go quiet on the days the board is worst behaved but still under it.The age reported is the card's (
created_at— the same quantity the selection order's own within-rank tie-break reads), and the row says so rather than leaving the reader to guess: the label's own age would need a per-card timeline fetch this sweep deliberately never makes.Measured on the live board, 2026-08-19
234 open cards, 17
Blocked-by:body lines, 16 index entries. The shipped functions, driven over the real census:Not one coherent pairing existed at that reading — the cache had no reader checking it and had drifted to 0% agreement with the index it is derived from. That is the finding the predicate was specified to make visible, and it was true the moment it could first be measured.
Reverse verification — direction predicted before running, all five held
Blocked-by: objectstack-ai/objectui#4356open ~220hBoth legs were run against the shipped exported functions over the real 234-card census, not only against fixtures, and independently cross-checked by a separate throwaway implementation that agreed on 1 stale / 5 missing. No rebuild leg applies: this script is executed directly from source and has no
dist/, so there is no stale artifact for an ablation to read.One case failed honestly on the first run and is worth recording, because the failure was in the fixture, not the predicate:
H15: absent created_atwas green against a 3-day-old card, because the fixture helper'screated = daysAgo(3)default fills anundefined. It is now built longhand so it tests the absent field, and the comment says why.Design notes worth a reviewer's eye
Blocked-by:line. H4 only asks "is there such a line" and extracts nothing; no other script in the repo parses these lines at all (the unlock scan is a seat procedure over a grep). So there was no second parser to converge on, and H4 keeps its cheaper question.objectstack-ai/objectui#4356is a real line on this board, and reading its number as local would invent a dependent for whatever this repo's fix(objectql,spec):filterfolds towhereon EVERY engine method;top/limitjoins the #3795 slot table (#4346) #4356 happens to be.Blocked-by:line.Gates
Derived with
node scripts/pm/dispatch-gates.mjs(no args, real diff), all run at2906b65b, each quoting the gate's own verdict line:pnpm check:pm-half-states—✓ check-half-states self-test: 273 cases pass.(202 onorigin/main, +71)pnpm check:partof-closing-keyword—✓ check-partof-closing-keyword self-test: 28 cases pass.(it importsh7PartOfWithClosingKeywordfrom this file, so it is also the import-compatibility witness)pnpm check:cross-package-test-inputs—OK: 12 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.pnpm check:nul-bytes—check-nul-bytes: OK (scanned 6312 text file(s) ... no raw ASCII control bytes).The sixth family the derivation names,
node scripts/pm/check-half-states.mjsfromhalf-state-patrol.yml, is the live sweep and could not be run in this container. Worth recording precisely, because the script's own probe says otherwise: the injected token is the agent proxy's 14-character placeholder, and the proxy answers/rate_limititself with 200 and a 14871 quota while every real endpoint returns 403 withGitHub access is not enabled for this session. So--probereports "transport prerequisite met — the token authenticates" and the first listing page then 403s. That is a container class the file's classifier does not cover, filed separately rather than addressed here.No changeset
scripts/pm/**is internal PM tooling and publishes nothing — consistent with every prior PR touching this file, most recently #9929. Theskip-changesetlabel is the PM's to set.Generated by Claude Code
Generated by Claude Code