Repository navigation
ci(release): release a breaking change at once instead of waiting for the cadence - #3408
Conversation
… the cadence A `breaking change` label raised the minor number but published nothing: the bump's tag went out over GITHUB_TOKEN as an interim tag, and the release waited for the 50-version cadence like any other change, so 0.2.0 had to be released by hand. The decide step now releases whenever a pull request labelled `breaking change` is anywhere in the unreleased range, like a security fix. The bump type still counts the label only since the newest bump, so a deferred breaking release ships on the next bump without bumping the number again, and a breaking change merged with a hand-set version still ships. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011vJuBD56koVwEaSaTM3nQ7
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 450ee11e92
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
[Medium impact] This PR appears safe to merge. SummaryBreaking changes now trigger a release without waiting for the 50-version cadence.
No actionable issues found. Tests were inspected but not run. Reviews (1) · Last reviewed commit: "ci(release): release a breaking change a..." · Reviewed by Greptile |
Xdebug >= 3.1 built with zlib defaults to xdebug.use_compression=1 and writes run.xt.gz instead of run.xt. The GitHub ubuntu runner image's Xdebug now does this, so the live Xdebug tests (which glob run.xt*) hand convert_xdebug_trace a gzip file; it read the bytes as text, found no "File format: 4" header and raised TraceFormatError, failing every PR's ubuntu unit shards and the base-install job. Real users with a zlib-enabled Xdebug hit the same error. convert_xdebug_trace now sniffs the gzip magic bytes and decompresses such traces; plain traces read as before, and a truncated or corrupt gzip stream is a TraceFormatError naming the file instead of a bare EOFError. `cgr trace convert` routed .xt.gz to the pprof converter by its gzip magic, so the Xdebug suffix check (.xt or .xt.gz) now runs before that sniff. The PHP tracing guide mentions the .xt.gz name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
A .xt.gz trace was read with gzip.open(...).read(), so a small, highly compressible file inflated whole into memory. Reuse the bounded chunked inflater that gzipped pprof profiles already go through (#2263), with Xdebug-worded errors; past the cap the error says to gunzip a genuine trace and convert the .xt file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
The ubuntu runner image's Xdebug now writes gzip-compressed run.xt.gz traces, so the two live tests in test_dynamic_trace_xdebug.py fail on every PR, and the ubuntu shards, base install and SonarCloud with them. #3409 reads such traces; its commits are taken whole so this merge is a no-op once main carries them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011vJuBD56koVwEaSaTM3nQ7
|
CI on
Generated by Claude Code |
|
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy
No conflicts. Brings in #3409 (via #3408) so the live Xdebug tests read gzip traces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MgsnsA3jM14E4ai22xnhy



Summary
breaking changelabel now publishes a release, like a security fix. Until now the label only raised the minor number. The bump's tag went out overGITHUB_TOKENas an interim tag, and the release waited for the 50-version cadence, so 0.2.0 had to be released by hand. Nowversion-bump.yml's decide step setsrelease=truewhenever a PR labelledbreaking changeis in the unreleased range.docs/contributing.md, the README version table,docs/getting-started/installation.md, and the label's description in.github/labels.yml.Demo
No user-visible change: this only changes when the version-bump workflow decides to publish a release.
Type of Change
Related Issues
Related to #3407: merging it today would tag 0.3.0 without releasing it.
Test Plan
make test-paralleloruv run pytest -n auto -m "not integration")make test-integration, requires Docker)Ran
test_version_bump_serialization.py,test_version_bump_rollover.py,test_release_ci_gate.pyandtest_release_news_derivation.py(153 passed), plustest_generated_docs_are_current.py,test_generate_readme.pyandtest_validate_labels.py(67 passed). I did not run the full suite: the change only touches the workflow, docs and these tests. The existing test that asserted "A breaking change waits for the cadence" now asserts a release. There are two new tests: a deferred breaking release ships on the next bump, and a breaking change behind a hand-set version still ships. All three fail against the old workflow and pass with this change.Checklist
make pre-commit): I ranruff check,ruff format --check,scripts/validate_labels.pyandscripts/hooks/generate_readme.py(no change) directly, not throughmake pre-commit.# type: ignore,cast(),Any, orobjecttype hintsGenerated by Claude Code
Summary by CodeRabbit
New Features
.xt.gzfiles.Release Process
Documentation
Tests