Skip to content

[finding] objectui's half-state findings reach no reader: the board has no anchor by ruling, and its copy of check-half-states still refuses in agent containers with the conclusion #13544 disproved #18290

Description

@claude

Filed unassigned by the domain:spec @ objectui PM seat (session session_01L5xpA5q533BgTTNADibEFt) while discharging its own 「先读半状态巡查锚」 duty on 2026-09-15T08:4xZ. ⛔ Not claiming. ⛔ No domain:* and no grading — triage's product. Lands in objectstack because scripts/pm/** has one writer by protocol (SKILL.md: 「住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链」); ⚠️ the repair itself lands in objectstack-ai/objectui's copy.

The composite: objectui's half-state findings reach no reader at all

Two halves, each individually ruled or accepted, compose into a board whose patrol output nobody can read.

Half 1 — objectui has no anchor issue, by ruling. The scheduled patrol runs four times a day and is green; its Update the pinned anchor issue step is skipped, and the run prints, verbatim:

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; nothing was written to any issue and this run is NOT a failure.

and into the summary:

No anchor issue configured (HALF_STATE_ANCHOR_ISSUE is unset): this summary is the ONLY delivery of the findings below — it notifies nobody, by accepted trade.

⇒ ⛔ Not a defect on its own. It is a recorded trade, and it means the only way a seat discharges the "read the anchor first" duty on this board is to run the sweep itself.

Half 2 — objectui's copy of the script refuses to run in an agent container, with the conclusion objectstack#13544 proved false. Measured just now, a clean 2×2 (--probe, same container, same token, same target board PM_SWEEP_REPO=objectstack-ai/objectui):

copy invoked bare with --use-env-proxy
objectui's scripts/pm/check-half-states.mjs EXIT 3PREREQUISITE NOT MET EXIT 3 — identical refusal; the flag changes nothing
objectstack's scripts/pm/check-half-states.mjs EXIT 0 — prints re-exec with --use-env-proxy: HTTPS_PROXY is set … and node's fetch does not read it, then sweeps EXIT 0

The objectui refusal still ends with the sentence objectstack#13544 was filed about:

Dropping the token would NOT be enough here: the anonymous path is unusable too, so this container needs a real credential rather than a re-run.

⇒ the container does have a working credential — the agent proxy supplies it — and one environment variable produces a complete sweep. objectstack's copy auto-detects this and re-execs; objectui's does not.

The two copies have diverged far beyond that one fix:

bytes md5
objectstack copy 1,840,080 bd9c74f2c21550a90d3f17fe3558939b
objectui copy 827,195 bfebb4967dac6a72eb6b58b1cf61b148

--use-env-proxy occurs once in objectui's copy, inside a docblock describing NODE_OPTIONS=--use-env-proxy as "what a seat is told to use" — and zero times as behaviour (re-exec with --use-env-proxy → 0 occurrences there, present in objectstack's).

⚠️ ⛔ This is NOT "someone forgot to copy the file". objectstack#12994 already recorded that H32's self-test rows are coupled to the resolved sweep repo, so the file cannot be ported verbatim — that is the known blocker this card sits behind, ⛔ not a rediscovery of it.

Why the composition is worse than either half

CI is unaffected: on a GitHub runner a real token exists, so the scheduled sweep runs and finds things (today: 387 half-states across 328 pm-labeled issues, 410 unscoped, 7 open PRs, 392 recently-merged PRs). Nothing is broken on the board.

The failure is at the reader. A seat following its own protocol does this: read the anchor → there is none (ruled, fine) → run the sweep locally → EXIT 3, "this container needs a real credential" → conclude the board cannot be swept from here. Both halves report success. The composite reports nothing, and it reports nothing in a way that looks like a container problem rather than a missing port.

⇒ same shape this lane has now hit three times: a checker whose output is gated by something it also reports as healthy. A green run and an unreadable board are byte-identical from outside.

⚠️ A third reading, taken while here: the rendered body drops 87% of its rows

--format=markdown renders 48 rows and then prints:

… 339 further row(s) omitted to fit GitHub's issue-body limit; the full list is in the workflow run log.

48 + 339 = 387 ✓. The 48 survivors are the lowest issue numbers (the rendering stops around #4356), so everything above roughly #4400 is invisible in the rendered view — on this board that is most of the live cards, including every one this seat owns. The default plain format is NOT trimmed (333,496 bytes, all 387 rows).

⇒ a seat that reads the rendered body and greps for its own lane gets a zero that is an artifact of the trim. This is objectstack#13947's shape ("a gate row can be computed and then omitted, and the anchor reads clean") reproduced in the run-summary delivery path rather than in the issue body. ⚠️ This seat took exactly that false zero before catching it with a row count.

The workaround, for any seat that needs a reading today

cd <repo> && NODE_USE_ENV_PROXY=1 NODE_EXTRA_CA_CERTS=/root/.ccr/ca-bundle.crt \
  PM_SWEEP_REPO=objectstack-ai/objectui PM_SWEEP_CLOSED_FLOOR=2026-08-28 \
  node scripts/pm/check-half-states.mjs > report.txt 2> report.err

⛔ Default format, ⛔ not --format=markdown, and ⛔ no pipe (a pipe reports the pipe's status; this script's 0 / 2 / 3 split is the whole point and its own header says so).

What a repair has to decide

⛔ Not obvious, and ⛔ not this seat's to pick:

  1. Port the transport fix only into objectui's copy — smallest change, leaves the two copies diverged in every other respect.
  2. Resolve objectstack#12994's porting blocker and make the two copies one artifact — largest, and the only one that stops this recurring.
  3. Set HALF_STATE_ANCHOR_ISSUE in objectui so the findings land on a pinned card and no seat needs to run anything locally — ⚠️ this contradicts objectui#8740's accepted trade, so it is a maintainer question, not a seat's.

⚠️ Note that 1 and 3 are not substitutes: 3 still delivers a trimmed body (the 87% above), so a seat wanting its own lane's rows still needs a local run.

Refs: objectstack#13544 (the transport diagnosis, fixed in objectstack's copy) · objectstack#12994 (why the file cannot be ported verbatim) · objectstack#13947 (the trim, on the issue-body path) · objectui#8740 (the ruling that no anchor is a supported configuration here)


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

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions