Repository navigation
Commit 5e3caa1
Widen the half-state patrol to the states the board actually produces: H24/H25/H26, sibling-repo adoption, and re-derived windows (#11294)
* pm(patrol): H24 queue+assignee, the pm:awaiting-maintainer state, and the paired-write remedies (#11196)
The two-views contradiction gets a row of its own: an open card carrying
`pm:queue` with a non-empty assignee is dispatchable to the queue view and
taken to the claim rule at the same time, so nobody can legally move it. Pure
intersection of two fields — no threshold, no identity test — because the field
carries both dead agent claims and genuine human ownership and the maintainer's
ruling puts the rule first, with any ownership exemption as an explicit marker
later. The row names the login and states the asymmetric remedy instead.
H8's landing re-label and H19's unlock scan are the two rollback paths that
never named the assignee drop (only dead-claim reclamation did), so both remedy
sentences now say the paired write includes it. The half-delivered H8 branch
deliberately does not: there the label and the claim are correct.
`pm:awaiting-maintainer` is implemented as a first-class state per the ruling of
2026-08-23 — vocabulary entry in ensure-pm-labels.sh, H25's exclusivity against
every other state label, and membership in H11's parked inventory, H13's state
vocabulary and H22's residue set, so no reader is left with a four-row hole.
Its SKILL.md state-model row and its application to the specimen card are
deliberately deferred, not dropped.
Self-test 879 -> 931 cases, both directions pinned for every new predicate and
every vocabulary membership.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
* pm(patrol): parameterise the sweeper/workflow pair so a sibling repo adopts it verbatim (#11217)
The patrol was installed in objectstack alone, which left 37 of the fleet's 59
open `pm:blocked` cards outside any machine sweep — a hand-run of H19's
predicate over objectui found 7 blocks whose blocker had already closed, 58% of
that repo's machine-readable blocks, one of them stale for a week. The same
predicate catches objectstack's every hour.
Two hardcodings made "copy the pair verbatim" unsafe, and both are removed:
* the swept repo now resolves PM_SWEEP_REPO -> GITHUB_REPOSITORY -> default,
so a copy reads the board it lives in instead of this one. A malformed
value is refused at the CLI (exit 2) rather than silently replaced by the
default: substituting a different board is the failure being closed.
* the anchor issue comes from the repository variable
HALF_STATE_ANCHOR_ISSUE, with this repo's 9857 kept only as a fallback
GUARDED by the repository name. An install with no anchor configured fails
loudly after the sweep instead of rewriting whatever #9857 happens to be in
that repo.
The objectstack leg is unchanged by construction: its runner sets
GITHUB_REPOSITORY (and now PM_SWEEP_REPO) to the same string the hardcoded
default carried, and the guarded fallback resolves to the same 9857 — pinned in
the self-test in exactly the shape the runner provides. Per-repo installs with
each repo's own GITHUB_TOKEN, per the grading ruling; no cross-repo credential.
Self-test 931 -> 951 cases.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
* pm(patrol): H26 — name the block whose target can never close, and the transitive wait (#11219)
The unlock predicate is "the `Blocked-by:` target CLOSED", and `pm:on-hold` /
`needs-user-decision` are by definition states a card sits in WHILE OPEN. A
block naming such a target is structurally indefinite and nothing reported it:
the waiting card is perfectly well-formed — line present (H4), target resolves
and is open (H19), label correct — and H9 audits the HELD card, not the waiting
one. Six measured instances, every one found by a human reading, including one
repo whose entire blocked inventory (2 of 2) waits on its single unanswered
decision card.
A second leg on the same data flags a target that is itself `pm:blocked`: the
measured chain was real one hop up and false two hops up, and a single-level
predicate cannot see that. It names the hop rather than chasing it.
Quota-neutral: H19 already resolves every distinct target, from a listing in
hand or with one GET, and a resolved target's LABELS rode in on a payload
already paid for — the resolution rows simply stop discarding them. Report-only,
and explicitly not a claim that the block is wrong; sometimes waiting on a
deferred card is right. Deliberately not reported: a target labelled `pm:queue`
while titled `[Decision]` — a mislabelling, not a fact in the labels.
Self-test 951 -> 977 cases, both directions pinned for each leg, including the
disjointness from H19 (a closed target is H19's row, an unresolved one is H19's
sentence) and the case where both fire on one card.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
* pm(patrol): re-derive H8/H22/H23's window arithmetic against the measured merge rate (#11118)
H8's docblock justified a two-page window with "~18 merges/day", a figure the
repo had outrun more than sevenfold. The sentence claimed a reach "well past the
longest measured unexecuted-verdict latency" (~11 days at that rate); the window
it described had become 1.78 days. Nothing could notice, because the arithmetic
was prose.
Re-measured 2026-08-23T08:42:15Z, windows pinned as full ISO instants per the
card's approxidate warning:
rate 300 commits, 2026-08-21T04:00:19Z..2026-08-23T08:22:47Z = ~137.5/day
(300/300 carrying the squash marker; agrees with the card's ~132/day)
H8 2 pages = 1.78d (oldest merge 2026-08-21T14:00:28Z)
4 pages = 2.96d (oldest merge 2026-08-20T09:41:02Z) -> widened
H22 2 pages = 0.65d of update-recency (~15.6 HOURS, ~2.6 sweeps)
4 pages = 1.70d -> widened
H23 3 pages = 2.18d, ~8.7 sweeps -> unchanged
H8 is widened rather than restated because its damage model is asymmetric: the
residue it reports is the paired write nobody noticed, which correlates with
age, so the population most likely to age out is the population the row is for.
H22's surprise is the divisor — ordered by `updated`, its rows are consumed by
issue ACTIVITY, not closures, and the rate is bursty in exactly the direction
that ejects fresh residue while residue is being produced fastest. Four pages
restores what its anti-drowning argument was choosing (a couple of days) and
does not reopen the deep tail it refuses (500+ carriers spanning months). H23
kept its cap: it is the one window that DERIVED its number from a measured rate,
and the only one that survived a re-measure.
The derivation is now executable — `windowCoverageDays`, `sweepOverlap`,
`MEASURED_MERGES_PER_DAY`, `PATROL_CADENCE_HOURS` — so a cap and the sentence
justifying it cannot drift apart again. Cost: four extra requests per sweep,
four sweeps a day, against a 15,000/h quota.
Self-test 977 -> 997 cases, including the degenerate inputs that must answer
"cannot divide" rather than Infinity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 9e72090 commit 5e3caa1
3 files changed
Lines changed: 1058 additions & 35 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
53 | 82 | | |
54 | 83 | | |
55 | 84 | | |
| |||
94 | 123 | | |
95 | 124 | | |
96 | 125 | | |
97 | | - | |
| 126 | + | |
| 127 | + | |
98 | 128 | | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
103 | 141 | | |
104 | 142 | | |
105 | 143 | | |
106 | 144 | | |
107 | | - | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
108 | 154 | | |
109 | 155 | | |
110 | 156 | | |
| |||
127 | 173 | | |
128 | 174 | | |
129 | 175 | | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
130 | 183 | | |
131 | 184 | | |
132 | 185 | | |
| |||
146 | 199 | | |
147 | 200 | | |
148 | 201 | | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
149 | 225 | | |
150 | 226 | | |
151 | 227 | | |
| |||
0 commit comments