From 6b66a6bd052b5375937b6468ec2dac62c7c3cb16 Mon Sep 17 00:00:00 2001 From: TGPSKI Date: Tue, 4 Aug 2026 18:05:50 -0700 Subject: [PATCH] run the cross-platform matrix on every PR, not after merging Four consecutive red pushes to main, every one of them Full-scope (windows/amd64). That is not four unlucky bugs -- it is the only outcome the trigger allowed. full-scope ran on push-to-main, manual dispatch, or a 'full-test' label that did not fire on the labeled event, so a platform bug could not be caught before merging even in principle. The one trigger that worked was the one that runs too late. Now it runs on every pull request. needs: validate still keeps the three runners idle while the fast gate is red, so the cost is about a minute on a PR that was going to pass anyway. A permanently red main costs more than that: it trains everyone to stop reading CI, and then it is not a signal at all. --- .github/workflows/ci.yml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0900b78..53e4578 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,20 +142,24 @@ jobs: run: ruff check . # ───────────────────────────────────────────────────────────────────────── - # Cross-platform, full-scope checks. - # Triggers: - # - PR carrying the `full-test` label - # - manual `workflow_dispatch` - # - any push to `main` + # Cross-platform, full-scope checks. Runs on EVERY pull request. + # + # It used to be opt-in: a `full-test` label, a manual dispatch, or a push + # to main. Which meant a platform bug could only ever be discovered on + # main, after merging -- and that is exactly what happened, four pushes in + # a row, every one of them `windows/amd64`. The gate that was supposed to + # let you test portability before merging did not even fire on `labeled`, + # so in practice the only trigger was the one that runs too late. + # + # `needs: validate` still keeps these three runners idle when the fast + # gate is already red, so the cost is ~1 extra minute on a PR that was + # going to pass anyway. A permanently red main costs more than that: it + # trains everyone to stop reading CI, and then it stops being a signal at + # all. # ───────────────────────────────────────────────────────────────────────── full-scope: name: Full-scope (${{ matrix.label }}) needs: validate - if: >- - github.event_name == 'workflow_dispatch' || - (github.event_name == 'pull_request' && - contains(github.event.pull_request.labels.*.name, 'full-test')) || - (github.event_name == 'push' && github.ref == 'refs/heads/main') timeout-minutes: 20 strategy: