Repository navigation
Commit a09725d
fix(pm): the half-state patrol's seat legs read the triage post and the newest page — H44 reaches a vacant or Routine seat, H32 / H38 take their marker from the last page (#18332)
Two defects in one file, `scripts/pm/check-half-states.mjs`, both of the
same shape: a seat
leg reading a seat post through the wrong population or the wrong window
while the file
already declares the right one. Each is fixed by pointing the leg at
that declaration.
## 1 — H44's seat leg could not reach the triage post it was written for
`h44NeedsSeatComments` was `pm:seat` + `seatIsHeld`, and `seatIsHeld`
excludes a
`🟢 Routine` holder by name and every non-🟢 status. The triage seat runs
as a Routine or
sits vacant most of the time — it read `[PM seat] triage
(objectstack-wide) — 🔴 空缺 …`
throughout this work — so H44, H56 and H64 read NOTHING on the one post
H44's own header
names as its worked example (「carrier of the round-open marker that is
this card's worked
example」), while H65 read it every run through `h65IsTriageSeatPost`,
which carries no
held gate.
The gate now admits the triage post through that same predicate,
**beside** the held leg
rather than instead of it, so the file keeps ONE reading of 「is this the
triage post」.
**Measured cost: zero additional requests.** H65 already buys exactly
that page every run
through the shared `seatPostRowsFor` memo, so the widening only moves
which row asks first.
**⛔ No vacant-seat posture is owed, and that is measured rather than
assumed.** All three
rows accuse a COMMENT and name its author; none names the post's current
holder, so
「nobody is on the clock」 changes nothing about whether an artefact on
the thread states a
reading with no time on it. On the vacant triage post's newest page (18
comments,
2026-09-10T23:26:55Z → 2026-09-15T15:54:40Z) H44 files one carrier row
naming 10 offending
comments, H56 files 0 and H64 files 0 — confirmed offline before the
change and reproduced
exactly by the live run after it.
### The design choice, on the four axes
Option A was to widen the gate to the triage post; option B was to keep
the held gate and
rewrite the header to say the seat leg reaches only HELD posts. **A, on
all four axes** —
the dispatching seat's reading is confirmed, not refuted.
- **实际业务需求** — measured, not inferred: the triage post carries 10
comments H44's own
grammar flags, 0 of them visible to the row today, on the busiest
artefact producer on
the board (818 comments, 18 of them in the last five days). B leaves a
report-only row
structurally unable to observe its own subject, which is dead letter.
- **项目长远合理性** — the file already declares both halves this needs
(`h65IsTriageSeatPost`
for the population, `seatPostRowsFor` for the window). A hands the leg
those declarations;
B is the workaround shape, correcting prose to match behaviour nobody
wants.
- **防 AI 写代码犯错** — these three rows are exactly the ones that catch
AI-written artefacts
stating a reading with no time on it or naming no session, and the
triage post is where AI
seats write most. Declaring a purpose in the header that the runtime
does not honour is the
anti-pattern this axis names. The held gate is an argument about
ACCUSING A NAMED HOLDER of
idleness — H32's subject, not this row's; inheriting it was the category
error.
- **创业阶段不扩散需求** — not a capability expansion: no new row, no new rule,
no new request,
one new finding on the live board. It makes an existing declared row
reach the population
its own header already claims, in the narrow spelling already in the
file. 声明而未兑现是
实现缺口,补实现或退役 — the implementation is supplied. Immediate, no staged
window.
## 2 — H32 and H38 read a seat post's OLDEST comment page
The `seatMarkers` gather captured `commentRowsFor`'s page-less FIRST
page, and GitHub serves
issue comments oldest-first, so `latestSeatMarker` returned the newest
row of page 1. That row
is H32's idle clock and carries H32's wait exemption, and it is H38's
`T_seat`.
Measured on the live board:
| seat post | comments | page-1 newest | real newest | stale by |
|---|---|---|---|---|
| #6023 | 225 | 2026-08-27T16:38:35Z | 2026-09-14T11:41:59Z | 18 days |
| #6367 | 137 | 2026-09-04T07:56:39Z | 2026-09-10T17:55:24Z | 6 days |
| #7623 | 63 | 2026-09-15T09:00:39Z | 2026-09-15T09:00:39Z | single
page, identical |
On #6023 the wait exemption was being judged on an August comment. The
gather now takes the
window through `seatPostRowsFor`. It buys nothing new — this population
is a **subset** of
H44's seat leg, the memo is shared, and asking here only makes the
gather loop the first
asker; the page-less fetch it replaces was itself wasted, because H44's
leg overwrote that
cache entry a pass below. `latestSeatMarker`'s contract is unchanged,
and a null page is left
out of `seatMarkers` exactly as the throw was.
**1 parent de9c319 commit a09725d
1 file changed
Lines changed: 224 additions & 33 deletions
0 commit comments