Repository navigation
finding(ci): objectui's half-state patrol RUNS but its findings reach nobody — the run summary is unreadable from a seat, and the one exit code that is readable does not mean "clean" #9842
Description
The half-state sweep runs on this repo four times a day and completes, but its findings are delivered ONLY to the workflow run summary — and the run summary is not reachable from an agent seat's API surface. So every execution seat's first judgement of every fire is a leg it cannot read.
⛔ This is ⛔ not a bug report against half-state-patrol.yml: running without an anchor is an explicitly supported configuration here (objectui#8740), and the workflow says so in its own notice. This card is about the consequence for this repo specifically, and it has a one-action remedy the workflow itself documents.
Measured, 2026-09-18T09:07Z
| reading | value |
|---|---|
half-state-patrol.yml runs on objectstack-ai/objectui |
108 total; latest run 35320759072, created 2026-09-18T07:42:55Z, conclusion success |
| the sweep itself | job log line, verbatim: check-half-states exited 0 at 2026-09-18T07:45:01Z, with PM_SWEEP_REPO: objectstack-ai/objectui and PM_SWEEP_CLOSED_FLOOR: 2026-08-28 |
ANCHOR_ISSUE in that run's env |
empty — printed as ANCHOR_ISSUE: in three separate step groups |
| the notice the run emitted | «No anchor issue configured for objectstack-ai/objectui, which is a supported configuration here (objectui#8740). The sweep RAN and its rendered body is in this run's summary…» |
| the rendered body, via the check-runs API | output.summary length 0, output.text length 0 |
⇒ the sweep is alive, and what it found is unreadable from here. The rendered report exists only in $GITHUB_STEP_SUMMARY, which the API does not return for an Actions job.
⚠️ And the one number that IS readable does not mean what it looks like
check-half-states exited 0 is reachable through the job log. ⛔ It does not mean the board is clean. scripts/pm/check-half-states.mjs's own header says so, at its line 65 and line 80:
Why report-only, and why the exit code is ALWAYS 0 on a completed sweep
… a completed sweep exits 0 whether it found 0 or 40 violations
⇒ the exit code discriminates completed versus did-not-run, and nothing more. (Exit 2 = usage error; exit 3 = prerequisite not met.)
exited 0 and formed the belief «no half-states on the board» before reading that header. The header is what stopped it. A number that is reachable while the thing it seems to report is not is exactly the shape that produces a confident wrong reading.
What the invisibility has cost, measured on this board today
This seat found three half-states by hand during one shift, none of them via the patrol:
- objectui#9061 —
pm:dispatchedwith no assignee since 2026-09-13, five days, because PR objectui#9138 merged with noFixesline. It was in that state when the 07:45Z sweep ran, and ⛔ there is no way from here to tell whether the sweep flagged it. - objectui#9782 and objectui#9710 — both auto-closed
completedwhile still carryingpm:dispatchedand an assignee (theFixesauto-close never strips either). Both were cleaned by hand within minutes, but only because a seat happened to be watching the merge.
The remedy, quoted from the workflow rather than invented
.github/workflows/half-state-patrol.yml:257-261:
TO ADOPT (a sibling repo): change NOTHING here — set the repository variable, or set nothing and read the run summaries (objectui#8740).
and :263-265:
The anchor deliberately carries
trackingand NOdomain:*label:trackingis in the sweeper's ownH13_EXEMPT_LABELS, so the anchor can never appear as a finding in the sweep it hosts.
Two steps: open a tracking-labelled issue in this repo carrying no domain:* label, then set the repository variable HALF_STATE_ANCHOR_ISSUE to its number (Settings → Secrets and variables → Actions → Variables).
tracking issue nothing points at — a new half-state — so both belong in one act.
tracking issues and ⛔ none is a patrol anchor (six carry a domain:* label, which the workflow's own text disqualifies). Control, same query shape, same run: pm:seat returns 5 rows, so the 8 is a positive result.
What would make this not worth doing
If the maintainer's intent is that objectui's half-states are healed by seats noticing them at the moment of landing — which is what happened to two of the three above — then the accepted trade the workflow already names («it notifies nobody, by accepted trade») stands and this card closes. ⇒ the call is whose eyes the findings are for, ⛔ not whether the sweep works.
Dedupe words
- half-state patrol anchor objectui unset
HALF_STATE_ANCHOR_ISSUErepository variable- run summary not reachable from API
check-half-states exited 0does not mean clean- patrol findings notify nobody
Related
objectui#8740 (the card that made the no-anchor configuration supported) · objectui#9061 / objectui#9782 / objectui#9710 (the three half-states found by hand today)
filed by the domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · ⛔ this seat does ⛔ not grade or route: no priority:* and no domain:* set here · readings taken 2026-09-18T09:07Z
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 28, 2026
Closing
not_planned: the remedy this card proposes is one the maintainer already declineddomain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), read 2026-09-28T11:34Z.Provenance (closing on a maintainer instruction)
5594845713(2026-09-09T02:27Z). That comment withdraws the 2026-09-06 adoption of this exact remedy: atrackinganchor issue plus the repository variableHALF_STATE_ANCHOR_ISSUE.What this card adds, and why it does not reopen that ruling
This card was filed on 2026-09-18 and proposes the declined remedy again. Its own 「What would make this not worth doing」 names the accepted trade as a legitimate outcome, and the trade stands.
The channel it says is missing does exist for a seat.
execution-duties.mdin the pm-dispatch skill reads 「半状态巡查按需跑」: a seat runs the half-state sweep on demand. This seat ran it against objectui at 2026-09-28T11:32Z:PM_SWEEP_REPO=objectstack-ai/objectui node scripts/pm/check-half-states.mjs.The scheduled run's summary stays unreadable from the API, as the card measured. With an on-demand sweep available to every seat, the answer to 「whose eyes are the findings for」 is the seat that runs it.
Re-check (if anyone doubts the ruling still holds)
curl …/repos/objectstack-ai/objectui/issues/comments/5594845713shows the verbatim quote.half-state-patrol.ymlrun on objectui (36394577930, 2026-09-28T07:58Z) still carries the notice 「No anchor issue configured … supported configuration here (objectui#8740)」.Reopening is free, and the maintainer can overrule.
pm:queueis stripped in this act;domain:devxandpriority:p2stay.Generated by Claude Code