Skip to content

Guard release tail from expected nightly skips - #4218

Merged
rossirpaulo merged 1 commit into
canaryfrom
agent/fix-release-skip-propagation
Jul 27, 2026
Merged

rossirpaulo merged 1 commit into
canaryfrom
agent/fix-release-skip-propagation

Conversation

@rossirpaulo

@rossirpaulo rossirpaulo commented Jul 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • make every production job downstream of the skip-tolerant publisher fan-in opt out of GitHub's implicit success() propagation
  • require each release-tail job's direct safety dependencies to have succeeded before manifests, Go publishing, smoke tests, channel promotion, or nightly dispatch run
  • add a release contract regression test covering the intentionally skipped nightly Gradle publisher

Root cause

Nightly releases intentionally skip the Gradle Plugin Portal publisher. All pre-manifest publishers complete correctly accepts that state and succeeds, but GitHub still propagates the skipped transitive ancestor through the implicit success() added to downstream job conditions. This skipped Publish pkg.boundaryml.com manifests, which skipped Go publishing and made the final fan-in fail with GO: skipped.

The guarded conditions use !cancelled() to suppress the implicit status check while remaining fail-closed through explicit direct dependency-result checks.

Impact

Nightly and canary releases can proceed from the policy-aware publisher fan-in through exact-version manifests, Go publish/smoke, and mutable channel promotion without an expected skipped publisher poisoning the tail of the graph. Failed or cancelled direct prerequisites still block publication.

Validation

  • mise exec -- actionlint .github/workflows/release-baml-language.yml
  • python3 -m unittest scripts.tests.test_release_pipeline_contract
  • YAML parse with yaml.safe_load
  • git diff --check

Summary by CodeRabbit

  • Bug Fixes

    • Improved release pipeline safeguards so publishing and nightly release steps run only when all required prerequisite jobs succeed.
    • Prevented cancelled or incomplete release stages from allowing later release steps to proceed.
  • Tests

    • Added automated checks to verify release workflow dependencies and cancellation safeguards.
    • Added validation for skipped Gradle plugin portal requirements.

@vercel

vercel Bot commented Jul 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
beps Ready Ready Preview, Comment Jul 27, 2026 5:43pm
promptfiddle Ready Ready Preview, Comment Jul 27, 2026 5:43pm
promptfiddle2 Ready Ready Preview, Comment Jul 27, 2026 5:43pm

Request Review

@github-actions

Copy link
Copy Markdown

⏭️ Performance benchmarks were skipped

Perf benchmarks (CodSpeed) are opt-in on pull requests — they no longer run on every push. They always run automatically after merge to canary/main.

To run them on this PR, do any of the following, then push a commit (or re-run CI):

  • Add RUN_CODSPEED=1 to the PR description, or
  • Include run-perf or /perf in the PR title or any commit message.

@vercel
vercel Bot temporarily deployed to Preview – beps July 27, 2026 17:21 Inactive
@coderabbitai

coderabbitai Bot commented Jul 27, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The release workflow now requires successful prerequisite jobs and non-cancellation status for downstream canary release jobs. Contract tests verify these conditions across publishing, smoke-test, channel-publishing, and nightly-dispatch stages.

Changes

Release workflow gating

Layer / File(s) Summary
Guard release tail jobs
.github/workflows/release-baml-language.yml
Publishing, smoke-test, package-channel, and nightly-dispatch jobs now check !cancelled() and required upstream needs.*.result == 'success' conditions.
Validate release dependency guards
scripts/tests/test_release_pipeline_contract.py
Adds workflow graph assertions for tail-job prerequisites and the Gradle plugin portal require_skipped guard.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers: codeshaunted, 2kai2kai2

Poem

I’m a rabbit guarding the release lane,
Checking each hop through sun and rain.
No cancelled step may sneak ahead,
Success marks every path I tread.
Nightly dispatch now follows the trail.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the PR’s main change: protecting the release tail from intentionally skipped nightly jobs.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/fix-release-skip-propagation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/tests/test_release_pipeline_contract.py (1)

913-973: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert guards in each job’s actual if: expression.

These checks search the entire job block, so they can pass if a guard is moved into a comment or unrelated step. They also will not catch a future direct needs dependency added without a matching success check. Extract the if: expression and validate it against the declared needs list.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/tests/test_release_pipeline_contract.py` around lines 913 - 973,
Update test_expected_nightly_skips_do_not_poison_release_tail to extract each
job’s actual if expression and declared needs list, then assert every declared
dependency has a matching success result guard alongside !cancelled(). Remove
broad whole-block substring checks so guards in comments or unrelated steps
cannot satisfy the test.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@scripts/tests/test_release_pipeline_contract.py`:
- Around line 913-973: Update
test_expected_nightly_skips_do_not_poison_release_tail to extract each job’s
actual if expression and declared needs list, then assert every declared
dependency has a matching success result guard alongside !cancelled(). Remove
broad whole-block substring checks so guards in comments or unrelated steps
cannot satisfy the test.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 795ec231-7f67-4e1e-ba22-49b4e788886e

📥 Commits

Reviewing files that changed from the base of the PR and between 5963412 and b4c7097.

📒 Files selected for processing (2)
  • .github/workflows/release-baml-language.yml
  • scripts/tests/test_release_pipeline_contract.py

@vercel
vercel Bot temporarily deployed to Preview – promptfiddle2 July 27, 2026 17:29 Inactive
@github-actions

Copy link
Copy Markdown

Binary size checks passed

✅ 7 passed

Artifact Platform File Gzip Gated on Baseline Delta Status
✅ baml-cli Linux 🔒 27.3 MB 11.6 MB file 27.1 MB +190.2 KB (+0.7%) OK
✅ packed-program Linux 🔒 17.7 MB 7.3 MB file 17.6 MB +38.7 KB (+0.2%) OK
✅ baml-cli macOS 🔒 21.2 MB 10.1 MB file 21.0 MB +182.2 KB (+0.9%) OK
✅ packed-program macOS 🔒 13.8 MB 6.4 MB file 13.8 MB +49.7 KB (+0.4%) OK
✅ baml-cli Windows 🔒 22.8 MB 10.3 MB file 22.7 MB +162.3 KB (+0.7%) OK
✅ packed-program Windows 🔒 14.7 MB 6.5 MB file 14.7 MB +35.1 KB (+0.2%) OK
✅ bridge_wasm WASM 16.5 MB 🔒 4.5 MB gzip 4.5 MB +29.8 KB (+0.7%) OK

🔒 = the size this artifact is GATED on (ceiling + delta). Binaries gate on file size (installed binary); WASM gates on gzip (download size). The other size is shown for information only.


Generated by cargo size-gate · workflow run

@vercel
vercel Bot temporarily deployed to Preview – promptfiddle July 27, 2026 17:43 Inactive
@rossirpaulo
rossirpaulo added this pull request to the merge queue Jul 27, 2026
Merged via the queue into canary with commit 995000c Jul 27, 2026
73 checks passed
@rossirpaulo
rossirpaulo deleted the agent/fix-release-skip-propagation branch July 27, 2026 17:55
meefs pushed a commit to meefs/baml that referenced this pull request Nov 4, 2026
…ses (BoundaryML#5515)

Nightly `0.23.1-nightly.20261103.a` can't pass `Pack BAML wrapper
candidates`. BoundaryML#5422 made that job and `Wrapper tests` gate `all-builds`.

- [Run
41798478057](https://github.com/BoundaryML/baml/actions/runs/41798478057):
the BCS project and environment variables were unset. They are now set
as GitHub environment variables; B-2011 tracks moving them to secrets.
- [Run
41823460220](https://github.com/BoundaryML/baml/actions/runs/41823460220),
on canary after BoundaryML#5491: `Cannot embed telemetry: API-key verification
failed … requires the 200 JSON introspection response`. Production BCS
still answers `POST /v1/auth/verify {"fullResponse":true}` with `204`.
`bcs_api/README.md` notes that server support has to be deployed before
embedding can work.

The candidates aren't shipped yet, so this PR stops nightlies from
requiring them:

- `build2-baml-wrapper.reusable.yaml` and `wrapper-tests.reusable.yaml`
take a new `enabled` input, which defaults to `true`, so `ci.yaml` is
unchanged. `release-baml-language.yml` passes `enabled: channel !=
'nightly'`.
- The jobs still run on nightly, as no-ops; they are not skipped. A
skipped ancestor of `all-builds` would also skip every publisher that
uses the implicit `success()` (see BoundaryML#4218). The pack job's steps are all
guarded, and in wrapper tests only the `tests` matrix is skipped, while
`platforms` still runs.
- The release fingerprint gate requires every fingerprinted artifact
family, so `tools/release-fingerprints` `check` takes a new
`allow_missing` family name. `all-builds` passes `--allow_missing
baml-wrapper-candidates` on nightly. A candidates artifact that is
present is still checked.
- Canary releases still require all of it.

Revert once production BCS supports key introspection and nightly
packing passes.

Validation:
- `actionlint` passes on the three workflows.
- `baml-cli test --from tools/release-fingerprints` passes 2/2, using
this branch's toolchain.
- Ran `check` against a local artifacts directory: without the flag it
reports the missing candidates; with the flag that problem goes away; a
present but empty candidates artifact still fails.
- Nightly dry run
[41810686735](https://github.com/BoundaryML/baml/actions/runs/41810686735),
on the first commit: both wrapper jobs succeeded as no-ops and `All
builds gate` ran instead of being skipped. It then failed only on the
missing candidates artifact, which the second commit fixes.
- Nightly dry run
[41834585621](https://github.com/BoundaryML/baml/actions/runs/41834585621),
rebased on BoundaryML#5491: pending.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **Chores**
* Nightly release workflows now skip BAML wrapper candidate builds and
wrapper tests. These steps remain enabled for other release channels.
* Reusable build and test workflows now support an optional
enable/disable setting, enabled by default, so their corresponding steps
can be skipped while the workflow remains runnable.
* Nightly release checks allow the BAML wrapper candidate artifact to be
absent. Other release channels still require it, and commit verification
remains in place.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>

This branch was previously deployed

3 inactive deployments
Preview – promptfiddle — b4c70974 Deployed Jul 27, 2026 by vercel[bot]
Preview – promptfiddle2 — b4c70974 Deployed Jul 27, 2026 by vercel[bot]
Preview – beps — b4c70974 Deployed Jul 27, 2026 by vercel[bot]
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