From a407fefef557c63e168a0b39a3f672cf9570eb75 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Sat, 11 Apr 2026 14:55:37 -0400 Subject: [PATCH] ci: add final job to aggregate build-test results (#438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Add a `final` job to the build-test workflow that depends on all other jobs - Fails if any upstream job failed or was skipped - Provides a single required status check for branch protection ## Test plan - [ ] `final` job passes when all other jobs pass - [ ] `final` job fails when any upstream job fails 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- > [!NOTE] > **Low Risk** > Low risk: workflow-only change that adds a single aggregator job and doesn’t affect production code paths. Main risk is misconfiguring branch protection expectations if the `final` job logic/conditions are wrong. > > **Overview** > Adds a `final` GitHub Actions job to the `build-test` workflow that depends on all other jobs and runs with `if: always()`. > > The `final` job fails the workflow if any upstream job result is `failure`, `cancelled`, or `skipped`, enabling a single required status check for branch protection. > > Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 45ecee53a148c15316062effd6771541658ad9ae. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot). Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/test.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 312dff8..6fb49fa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -146,3 +146,19 @@ jobs: - run: mise x jq -- jq --version - run: which jq - run: jq --version + + final: + needs: + - build + - test + - specific_version + - checksum_failure + - custom_cache_key + - fetch_from_github + runs-on: ubuntu-latest + timeout-minutes: 1 + if: always() + steps: + - name: Check CI job results + if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') + run: exit 1