fix(release): restore v1.0.0 tag reachability + stop monorepo-builder from creating release commits - #38
Conversation
The chained `monorepo-builder release "<version>"` call races @semantic-release/git and pushes its own tag at a commit that never reaches main, orphaning every release commit and making v* tags unreachable from main's history. Drop that call; keep only bump-interdependency so @semantic-release/git owns commit + tag + push. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The bf6f62a 'prepare release' commit (target of v1.0.0) was produced by monorepo-builder's release worker on the 2026-04-27 first-release run and was never pushed to main — only the v1.0.0 and 1.0.0 tags were pushed, holding the commit alive as an orphan. semantic-release's 'last release' lookup is reachability-based, so it could not see v1.0.0 from main and defaulted to first-release 1.0.0 on every subsequent run, which monorepo-builder's ReleaseGuard then rejected (same-version error). Merging the orphan commit back into main puts v1.0.0 inside main's ancestry without moving or deleting the tag, so the next release run will correctly compute next-version = 1.0.1 off the PR #37 fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request migrates the release process to semantic-release and adjusts the monorepo-builder configuration to prevent race conditions during the prepare phase. It also updates inter-package dependency constraints to caret ranges and reformats several composer.json files. The reviewer identified a critical architectural issue where relative paths are used in the autoload section of the Data and Experience packages, which would break functionality when these packages are installed as standalone dependencies. Additionally, the reviewer recommended removing the redundant version field from all composer.json files to prevent metadata staleness now that the automated bumping tool has been removed from the release process.
The orphan v1.0.0 commit was created by CI (Yarn Classic 1.22) and ships a Classic v1 lockfile; merging it overwrote main's Berry-format lockfile. Restore main's yarn.lock — unrelated to the release-pipeline fix and would have caused noisy reformat diffs for local Berry users. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
The release pipeline has been broken since the 2026-04-27 first-release run. The PR #37 merge yesterday surfaced it (Release workflow failed with
Provided version "1.0.0" must be greater than the last one: "1.0.0"). This PR fixes both the immediate breakage and the underlying architectural defect that caused it.Root cause
Two release tools were racing:
@semantic-release/git(intended owner of commit + tag + push) computes the next version fromv*tags reachable from main.symplify/monorepo-builder release "<version>"(chained intorelease.config.mjs:37as part of thepreparestep) also creates its own commit + tag + push, and itsReleaseGuardchecks against all tags in the repo (git tag -l), regardless of reachability.On 2026-04-27, monorepo-builder won the race: it pushed the
1.0.0tag pointing at a "prepare release" commit (bf6f62a) that was never merged intomain.@semantic-release/gitthen added the matchingv1.0.0tag pointing at the same orphan commit. Result:v1.0.0exists on origin but is invisible to semantic-release because it is not in main's ancestry. Every subsequent release run defaults to first-release1.0.0and is rejected by monorepo-builder's guard.What this PR does
Change 1 —
release.config.mjs: drop the chainedmonorepo-builder release "<version>"call. Keep onlybump-interdependency.@semantic-release/gitbecomes the sole owner of commit + tag + push, and (unlike monorepo-builder) it pushes the commit tomain, not just the tag — so future release commits stay reachable.Change 2 — merge
v1.0.0into the branch: brings the orphanbf6f62ainto main's ancestry via a real merge commit. Thev1.0.0tag is not moved, not deleted — it keeps pointing atbf6f62a. After this PR lands,git merge-base --is-ancestor v1.0.0 mainsucceeds.Expected behavior after merge
The Release workflow fires once on this PR's merge to main. semantic-release sees
v1.0.0reachable, computes next version off thefix:commits since then (PR #37'sfix(context):+ this PR'sfix(release):), and@semantic-release/gitpublishesv1.0.1on a commit that lives onmain. Packagist gets notified, and release #3 onward will follow the same clean path.Must be merged with "Create a merge commit" (not Squash, not Rebase). Squash or rebase would replay the commits as new ones and the orphan
bf6f62awould never land in main's ancestry —v1.0.0would stay invisible and the same bug would persist.Test plan
git fetch origin && git merge-base --is-ancestor v1.0.0 origin/mainexits 0v1.0.1created on a commit that is an ancestor ofmainconvertcom/php-sdk1.0.1🤖 Generated with Claude Code