Skip to content

CI: report one Shared Server fixtures result on every pull request - #727

Closed
rmcdaniel wants to merge 2 commits into
rust-325-merge-groupfrom
rust-325-fixtures-aggregate
Closed

rmcdaniel wants to merge 2 commits into
rust-325-merge-groupfrom
rust-325-fixtures-aggregate

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

Part of #325. Stacked on #725 (which is stacked on #723); retargets to main after both merge.

Why

A required check, and GitHub's merge queue, need a result that always reports. Shared Server fixtures had a pull_request path filter, so a pull request that touched no fixture input got no result at all. That made the workflow impossible to require, and it is one of the two merge-queue activation prerequisites in #725 (the other is Security's Sonar gate).

Change

  • Pull requests run without a path filter. A short changes job applies the push trigger's path list to the pull request's merge commit. One list governs both triggers. Renames count on both sides (--no-renames), so moving a fixture out of the corpus still runs the fixtures.

    • push, merge_group and manual runs run every fixture job.
    • So does a pull request whose merge commit cannot be classified (for example, HEAD is not that pull request's merge commit).
  • Fixture jobs are gated once. published-sdk-adapters runs only when changes says so. Every other fixture job needs it and has no job-level condition, so they skip with it.

  • One terminal result. Shared Server fixtures result runs with always(), so it reports after failures and cancellations too. It passes only when:

    • every fixture job passed, or
    • the classifier said no input changed, and every fixture job was skipped.

    It fails on any failed, cancelled or unexpectedly skipped job, a failed or missing classifier, an unknown decision, no fixture jobs, or an unreadable needs context.

No permissions, secrets, actions or artifact paths change. Making this result a required check, and enabling the merge queue, stay separate repository-setting steps for Security.

Evidence

  • The workflow steps call changes.sh and aggregate.sh, which run the Node scripts from the repository root. The repository's Docker workflow isolation policy accepts only literal .sh and .py helpers in steps. The first head called node directly and failed Public Boundary for that reason.
  • tests/Unit/ServerParityAggregateTest.mjs (Repository contracts runs it): 26 tests. They cover the workflow structure, every result decision, both wrappers, and the classifier against scratch pull-request merge commits. In those, a docs-only change skips, a Rust change runs, a fixture moved out of the corpus runs, a mismatched head runs, and push, merge_group, manual and unnamed events run. Local: 33/33 with MergeGroupTriggersTest.mjs, in node:22-bookworm as UID 1000.
  • Counterfactuals: changing the result job to success(), or dropping postgres-storage from its needs, fails the structure test.
  • Local, at f086ab720: the central action policy validator (.github main), the Docker workflow isolation policy and its 72 tests, the public boundary self-test, and the boundary scan of this branch's range all pass.
  • This pull request changes server-parity.yml, so its own run exercises the run=true path. The run=false path gets its first hosted run on the next docs-only pull request after merge.

Trust note

On pull_request, the workflow, classifier and result script come from the pull request, as every job in this workflow already does. A pull request could edit them to skip fixtures. That is unchanged from today, where it could edit the path filter or the jobs, and any change to these files still runs the full fixture matrix, because the workflow file and scripts/conformance/server-parity/** are in the path list.

Security class: R2 (required-check coverage and workflow event handling).

A required check and the merge queue both need a result that always
reports. The pull_request path filter meant a docs-only pull request got
no Shared Server fixtures result at all, so the workflow could not be
required.

- Pull requests now run the workflow without a path filter. A short
  `changes` job applies the push trigger's path list to the pull
  request's merge commit (renames count on both sides), so one list
  governs both triggers. Push, merge_group and manual runs run every
  fixture job, as does any pull request that cannot be classified.
- `published-sdk-adapters` runs only when the classifier says so; the
  other fixture jobs need it, so they skip with it.
- A terminal `Shared Server fixtures result` job runs with always(). It
  passes only when every fixture job passed, or when no input changed
  and every fixture job was skipped. A failed, cancelled or unexpectedly
  skipped job, a failed classifier, or an unreadable needs context fails
  it.
- ServerParityAggregateTest covers the workflow structure, the result
  decisions and the classifier against scratch pull request merge
  commits. Repository contracts runs it.

No permissions, secrets, actions or artifact paths change. Making the
result a required check, and enabling the merge queue, stay separate
repository-setting steps.
The Docker workflow isolation policy accepts only literal .sh and .py
repository helpers in workflow steps, so the new jobs' direct node
calls failed Public Boundary. changes.sh and aggregate.sh now run the
Node scripts from the repository root, as the workflow does, and the
classifier tests go through changes.sh.
@rmcdaniel

Copy link
Copy Markdown
Member Author

Superseded by #742, which rebuilds this PR's merge-queue commits on current main (after #729) without the old train history.

@rmcdaniel rmcdaniel closed this Oct 24, 2026
@rmcdaniel
rmcdaniel deleted the rust-325-fixtures-aggregate branch October 24, 2026 13:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant