Skip to content

[ci] the half-state patrol has been red on all 50 scheduled runs since 2026-08-28 (no anchor configured), and ci-cd-pipeline.md documents a knob the workflow no longer sets #7852

Description

@claude

Filed unassigned and unlabeled by the os-dev seat working objectui#7010 (session session_01KDq78vMMSzCGWGmhUYBabh, branch claude/issue-7010-merge-queue-head-patrol). Found while reading half-state-patrol.yml as the nearest precedent for a scheduled patrol. ⛔ Out of scope for #7010 and deliberately not fixed there. ⛔ Routing, domain:*, type and grading are the triage seat's.

Two defects in one installation. They are filed together because they are the same workflow, the same install, and one sitting.

① The standing half-state patrol has been RED on every scheduled run for eight days

Measured 2026-09-06T00:0xZ against actions/workflows/half-state-patrol.yml/runs:

runs listed        56
failures           50
successes           6
newest success     2026-08-28T15:25:43Z

50 consecutive failures, every scheduled run since 2026-08-28.

The step-level reading on the newest run (33987749545) says exactly where:

4  Run the live sweep                    -> success
5  Resolve the anchor issue              -> FAILURE
6  Update the pinned anchor issue        -> skipped
7  Publish the rendered body to summary  -> success

The sweep itself runs and passes. Its findings then land nowhere. The workflow resolves its anchor as vars.HALF_STATE_ANCHOR_ISSUE || (github.repository == 'objectstack-ai/objectstack' && '9857') || '' — the literal fallback is guarded to the sibling repository, correctly, so in objectui the value is empty unless the repository variable is set. It is not set. The workflow then refuses to guess an issue number and fails, which is the behaviour its own header argues for and is the right call in isolation.

The consequences are two, and the second is the reason this is worth a card rather than a shrug:

  1. Thirteen predicates over this board's dispatch invariants have produced no delivered output for eight days. objectui#5791's own adoption note is the measurement of what that costs: a hand-run of one predicate over this repo's blocked inventory found 7 blocks whose blocker had already closed — 58% of the machine-readable blocks were false, one for a week — and the stated difference from the sibling repo was never discipline, it was that one repo had a caller. This repo now has a caller that cannot deliver.
  2. A workflow that is red four times a day for eight days is red as a matter of course, and this repository has already ruled on that shape (objectui#6596: a check red on the healthy case trains everyone to ignore red).

The remedy is maintainer-only and is written in the workflow's own header: open a tracking-labeled anchor issue in this repository and set the repository variable HALF_STATE_ANCHOR_ISSUE to its number (Settings, then Secrets and variables, then Actions, then Variables). No agent seat can set a repository variable. ⚠️ Triage may want the needs-user-decision label for that half; this seat applies no labels.

ci-cd-pipeline.md describes a configuration the workflow does not have

content/docs/guide/ci-cd-pipeline.md, in its Half-State Patrol section:

The behavioural one: the sweeper's closed-card reader (pm:* labels left on cards that already closed) is switched off here via PM_SWEEP_CLOSED_WINDOW_PAGES: '0'.

.github/workflows/half-state-patrol.yml does not set PM_SWEEP_CLOSED_WINDOW_PAGES at all. It sets:

PM_SWEEP_CLOSED_FLOOR: '2026-08-28'

and its own header says the reader is ON with a dated floor, that it read the zeroed window "until 2026-08-28", and that the page window is now "deliberately absent: it is back to the script's own upstream default of 4".

⇒ The page says a predicate is switched off. It is switched on, judging every card closed on or after the cutover. The page also still quotes the retired mechanism as the thing doing the switching, so a reader looking for the knob finds a variable nothing sets.

⚠️ Scope of the reading: the page's surrounding claims were not re-verified one by one, only the sentence quoted above. The rest of the workflow inventory tracks .github/workflows/ in both directions under scripts/__tests__/ci-cd-pipeline-doc.test.ts, but that pin reads headings and file names — it cannot see a false statement inside a section, which is why this one survived the divergence being changed.

Dedup, and its bound — stated rather than implied

Searched before filing, and the search channel available to this seat is narrow enough to state exactly:

  • GET /search/issues is 403 here ("sessions are bound to their configured repositories"), and the MCP search_issues fallback answered API rate limit already exceeded on this container.
  • What was read instead: the repo-scoped listing of open issues labeled ci/cd — 3 of them, with a control confirming the read was real ([ci] the merge queue has landed NOTHING since 07:58Z — five merge_group builds completed success and main has not moved in 90 minutes #7010 carries that label and is present). Neither of the other two is this.
  • ⚠️ NOT read: the finding-labeled listing came back as a full page of 100 with the same control absent, i.e. page 1 of a paged listing, so that read is void and was not extended into a full-board scan.

⇒ If a card for either half already exists under a label outside ci/cd, this is a duplicate — close it against the older one.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p1tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions