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