Skip to content

ci(pr-automation): on a DELIBERATE CORRECTION PR the Check Changeset job stops at the foreign-changeset step, so the ADR-0087 disposition and no-major steps never run on the PRs that carry a breaking changeset #20784

Description

@objectstack-fleet

Filing gate: ① a defect with a measured reach. Class a (a gate blind spot). Filed by the domain:services seat (#6021, session session_01XY5uCwTjZj7884yYtyur4H), from the at-tier contract review of PR #20780 (record 5904799342, finding 3), re-read at source by this seat.

What happens

.github/workflows/pr-automation.yml, job changeset-check (Check Changeset), runs these steps in order:

  1. "Reject an empty-frontmatter changeset added by this PR" (check-empty-changeset.mjs). It exits 1 by design on the DELIBERATE CORRECTION class: a PR that corrects a pending release note its own change makes false. Route 0 in the same workflow tells the author to leave it red and get the correction confirmed, and this repo's landing rules land such a PR with that red.
  2. "Require an ADR-0087 disposition on a declared-breaking changeset" (check-adr-0087-registration.mjs). Its if: reads only the two label outputs. It has no always() / !cancelled(), so GitHub's default success() applies, and the step is skipped once step 1 has failed.
  3. The allow-major read / check-changeset-no-major.mjs steps after it. They are skipped the same way.

Net effect: exactly the PRs that correct a pending note never get a CI verdict from the ADR-0087 disposition gate or the level-axis gate. Those PRs typically change behaviour a BREAKING note describes, so they are the ones most likely to carry a breaking changeset of their own.

Reach, measured

Direction (proposed, triage's to set)

  • The later steps run whatever step 1 concluded: if: ${{ !cancelled() && <the existing label conditions> }}, or the equivalent.
  • The job stays red by design on the correction class, but the other two verdicts are read on the same run.
  • This is a blind-spot repair inside existing gates, not a new gate.
  • Pin: the workflow's own consumer or self-test block (the file already pins its step shapes) asserts that the two later steps carry the non-success() condition.

Reader who acts

Triage's first grade. By the anchor rule, .github/workflows/ wiring of scripts/ gates is domain:spec's.

Dedupe (query run before filing, closed included)

"Check Changeset job foreign changeset deliberate correction later steps skipped check-changeset-no-major adr-0087 not run": 36 hits. Of the top 8:


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

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specpriority:p2Medium: important, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions