Skip to content

fix(ci): a PR cannot trigger a full workspace run any more - #394

Merged
Sunrisepeak merged 1 commit into
mainfrom
fix/ci-no-auto-full-runs
Sep 11, 2026
Merged

fix(ci): a PR cannot trigger a full workspace run any more#394
Sunrisepeak merged 1 commit into
mainfrom
fix/ci-no-auto-full-runs

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

What changes

full (the escalation to MEMBERS=__ALL__) now answers only on schedule and workflow_dispatch. On a pull_request or a push, the same reasons call a new widen which records them, prints them, and writes them to the run summary.

reason before after (PR / push)
.github/workflows/validate.yml, tests/*.sh full run note + select nothing extra
mcpp.toml non-member change full run note + select nothing extra
unclassified path full run note + select nothing extra
push with no predecessor / missing predecessor full run note + empty range
descriptor / member change select members select members (unchanged)

Why

Touching this file was enough to trigger a full run, which is the case that keeps biting: a one-line CI edit cannot be reviewed against a fast signal. Measured three times today#390, #391 and #392 each ran a ~22-shard matrix to validate a change whose blast radius was one job. On top of that, the PR's own legs queue behind all of it, so the thing under review reports last.

One consequence handled

widen does not exit, so the push-with-no-predecessor path has to leave a usable range. HEAD alone would diff root-to-HEAD, name every file and select every member — a full run by another name, which is what this PR exists to stop. It leaves the range empty instead; the reason is already printed and the summary carries it to a human. Rare either way: merges here are squashes, so event.before is present on every normal push.

The weekly sweep is deliberately kept

Sunday 06:00 stays full. It is the only thing that would have caught the windows vulkan regression before a user did — main's leg was pinned to windows-2022 in #385 and the vulkan members were never re-tested there until a full run happened to fire today. Removing automatic full runs on PRs while keeping a periodic net is the same shape openxlings/xim-pkgindex#815 just added on the other side.

If you want the cron gone too, it is one line — say so and I will drop it.

Verified

Rendered shell fragment, run standalone:

# event = pull_request, diff = validate.yml + compat.vulkan.lua + weird/thing
note: ".github/workflows/validate.yml" would once have forced a full run; ...
note: "unclassified change: weird/thing" would once have forced a full run; ...
MEMBERS=[vulkan]  UNTRUSTED=[.github/workflows/validate.yml; unclassified change: weird/thing]

# same input, event = workflow_dispatch
FULL RUN: .github/workflows/validate.yml

ruby -ryaml parses the workflow.

This PR is its own first test: it edits validate.yml, so under the old behaviour it would have forced a full matrix. If it selects nothing instead and says why, the change works.

Every reason to distrust the diff used to escalate to the whole workspace.
On a PR that is the wrong trade twice over: it buries the change under ~22
shards of unrelated work, and it puts the PR's own legs behind an hour of
queue, so the thing under review is the last thing to report.

Touching this file was enough to trigger it, which is the case that keeps
biting: a one-line CI edit cannot be reviewed against a fast signal.
Measured three times today -- #390, #391 and #392 each ran a full matrix to
validate a change whose blast radius was one job.

`full` now answers only where "check everything" IS the request: the weekly
cron and a manual `workflow_dispatch`. On a PR or a push, the same reasons
call `widen` instead, which records them, prints them, and writes them to
the run summary so a reviewer sees WITHOUT opening a job that this run
deliberately tested less -- and that the sweep is one manual dispatch away.

Degraded, with their reasons kept:

    .github/workflows/validate.yml, tests/*.sh
    mcpp.toml non-member change
    unclassified path
    push with no predecessor / predecessor not in history

NOT weakened: descriptor and member changes select their members exactly as
before. The only thing that changed is what happens when the diff cannot be
classified.

One consequence handled. `widen` does not exit, so the push-with-no-
predecessor path has to leave a usable range behind. `HEAD` alone would diff
root-to-HEAD, name every file and select every member -- a full run by
another name, which is what this change exists to stop. It leaves the range
EMPTY instead: nothing selected, the reason already said, the summary
carrying it to a human. Rare either way, since merges here are squashes and
`event.before` is present on every normal push.

The weekly Sunday 06:00 sweep is deliberately kept. It is the only thing
that would have caught the windows vulkan regression before a user did --
main's leg was pinned to `windows-2022` in #385 and the vulkan members were
never re-tested there until a full run happened to fire today. Removing the
automatic full run on PRs and keeping the periodic net is the same shape
openxlings/xim-pkgindex#815 just added on the other side.

Verified: the rendered fragment on `pull_request` with a validate.yml edit
plus an unclassified path selects only the member its descriptor change
names, and the same input under `workflow_dispatch` still goes full.

Co-authored-by: sunrisepeak <x.d2learn.org@gmail.com>
@Sunrisepeak
Sunrisepeak merged commit a7e9711 into main Sep 11, 2026
7 checks passed
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