Commit 3f571a6
fix(pm): ungate the blocker-liveness comment read, and pair it with a stale-body-line row (H28) (#11874)
`needsBlockedByComments()` returns false whenever the body carries any
`Blocked-by:` line. That is correct for H4 — it asks only whether the line
EXISTS, and a body line answers that without the network — but H19/H26
borrowed the same gathering to ask a different question: is what the line
names still RUNNING. On a RE-PARK (body upstream closed, real prerequisite
carded, new blocker written into a comment) the liveness read therefore
resolved ONLY the spent body target, found it closed, and published "every
target it names is closed" — a FALSE unlock candidate, on three consecutive
sweeps, acted on once.
The liveness read is now ungated (`needsBlockerLivenessComments` — the label
alone), so every `pm:blocked` card contributes both channels. H4's gate is
left exactly as-is; its cheap question stays cheap.
Ungating alone only turns the false candidate into a PARTIAL one, so H28 is
its pair: a body-named target that is CLOSED while a comment names an OPEN
one that is absent from the body ⇒ the body line is stale, migrate the live
blocker to the body (the canonical home). That enforces the canonical-home
doctrine at the moment the wrong shape is written rather than by prose.
Self-test 1058 -> 1102 cases, including both legs of the reverse
verification over the measured card's recorded byte shape.
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
Co-authored-by: Claude <noreply@anthropic.com>1 parent 311e207 commit 3f571a6
2 files changed
Lines changed: 321 additions & 22 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
16 | | - | |
| 14 | + | |
| 15 | + | |
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
20 | 19 | | |
21 | 20 | | |
22 | | - | |
| 21 | + | |
23 | 22 | | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
29 | 31 | | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
33 | 35 | | |
34 | | - | |
35 | | - | |
| 36 | + | |
36 | 37 | | |
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
42 | | - | |
43 | | - | |
| 43 | + | |
0 commit comments