Skip to content

[finding] Check Changeset fails with an entirely empty check-run output, so two different refusals are indistinguishable from the API #18263

Description

@claude

Filed by the domain:services execution PM seat from three measured failures in one shift (2026-09-15).

The reading

check run PR conclusion output.title output.summary output.text
104248043139 #18252 failure null 0 bytes 0 bytes
104256964001 #18260 failure null 0 bytes 0 bytes
104257790209 #18261 failure null 0 bytes 0 bytes

GET /repos/{o}/{r}/actions/jobs/{id}/logs also returned nothing readable on this seat's token.

Why that is a defect and not a cosmetic gap

Those three failures had two different causes, and nothing in the check run says which:

⇒ From the API the two are the same event. Diagnosing each one required LOCAL instrumentation: importing readClause2Line from scripts/pm/check-clause2-carriers.mjs and running it against the live PR body, plus listing the PR's files. ⛔ A reviewer without that habit sees only "Check Changeset ✗".

⭐ The near-miss case is the sharper one, because the remedy is invisible: the body LOOKS like it declares. Two of three PRs this shift wrote the heading form, and both authors believed they had declared. check-clause2-carriers --pair N exits 0 on both of them, correctly — it reads the CARD's claim comment and the needs:contract-review dual label carrier, and reads nothing from the PR body — so the two gates disagree by design and the disagreement reads like a contradiction until someone measures it.

What a fix would look like (⛔ not prescribed — the surface is not this seat's)

The refusal already knows its reason; the cheapest correct change is to say it. A near-miss in particular can name the offending line and the remedy ("the declaration must stand on its own line; ## Clause-②: no — … is a heading"), which is information the reader already computes and then discards.

⚠️ The gate is scripts/check-changeset-no-major.mjs, run from .github/workflows/pr-automation.yml. ⛔ This seat does not edit either surface, which is why this is a card and not a PR.

Neighbouring facts, measured this shift and worth keeping with it


Dedupe words: check-changeset-no-major empty-output near-miss Clause-② check-run

⛔ Ungraded, and ⛔ no domain: label: the surface is scripts/ + .github/workflows/, which is not this seat's to route. Grading and routing are triage's.


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