Skip to content

Commit c4ef17a

Browse files
ci(release): the Version PR lane reads the v3 .changeset/pre/ layout (changesets/action v2.1.2, pinned by commit) and rehearses that read before the cut (#23313)
Fixes #23282 Clause-②: no (release CI) One file, one job: `.github/workflows/release.yml`, the `version-pr` job (Version PR maintenance). No publish-lane line is touched. ## What broke, measured - The scheduled `Release` run 38395962884 failed in `Version PR maintenance` at the PR step with `ENOENT ... .changeset/pre/changes.md`. The job log shows `changesets/action@v1` resolved to `a45c4d594aa4e2c509dc14a9f2b3b67ba3780d0d`, which is the v1.9.0 tag. - The repository's own CLI is fine. `pnpm changeset status` exits 0 on `main`. In the same failing run, the "Render the post-version tree" step ran `pnpm run version` (changeset v3.0.3) to completion. - The failing reader is the action's own copy. v1.9.0 bundles `@changesets/read` 0.6.7. Its legacy v1 reader treats every directory under `.changeset/` as an old folder changeset and opens `DIR/changes.md` and `DIR/changes.json`. Since the 18.0.0-next.0 cut, `.changeset/pre/` is such a directory. - **Reproduced with the same code:** the v1.9.0 bundle, run on a scratch copy of `main` at `9c7cfbf0a9` (local mock API, no remote), fails at the same point (`setting GitHub credentials`) with the same error. The workflow-shaped replay of the base workflow fails the same way. ## What this changes 1. **PR step: `changesets/action` v2.1.2, pinned by commit** (`ae32849d5ba541f9ae29e40e22a623bc13562f51`). v2 is the major upstream pairs with `@changesets/cli` v3. It bundles `@changesets/read` 1.0.0, which reads `.changeset/pre/`. In `pre` mode, `readChangesetState` leaves `pre/` ids out of `hasChangesets`; in `exit` mode it keeps them. The inputs move to v2's names: `github-token`, `version-script`, `commit-message`, `pr-title`. v2 throws on each v1 name instead of ignoring it. `push-with-git-cli: true` keeps v1's git-CLI push. `create-github-releases: false` stays, and `push-git-tags: false` is added; both only matter if a publish script were ever added. The `GITHUB_TOKEN` env is dropped, because v2 takes the token only through `github-token`. - It is a commit and not `@v2` because upstream `v2` is a branch. A moving ref would change the bundled reader without any diff here. 2. **The card's pin: a read rehearsal on the post-version tree.** Three new steps go between "Validate the post-version tree" and "Restore the pre-version tree". They copy the rendered `.changeset/` (plus the root `package.json`, `pnpm-workspace.yaml` and a `node_modules` link) to a directory outside every git work tree. They run the **same pinned action** there with no credential, then require `has-changesets` == `false`. - The rendered tree is the tree the next cut lands on `main`. A reader that cannot read what the CLI writes now goes red while the Version Packages PR is still open, not on the first refresh after it merges. - **It cannot write.** The only path out of a "pending" read is `runVersion`, and its first act is `git checkout`. In a directory that is not a repository, that fails before any push or API call. 3. **Bounded in-place fix, same defect class:** the lane's pending count treated `.changeset/pre/*.md` as pending in every mode. In `pre` mode those changesets are consumed (the CLI's `getRelevantChangesets`), so they are now counted only on `pre exit`. - Measured on the post-version tree, which is the tree right after next.1 merges with nothing new: the old count reads `539` pending, the version pass moves `0` paths, and "Validate the post-version tree" goes red with `changesets were pending but the version step moved no path`. That would have been the first scheduled tick after next.1. - The same count fix is made in the Restore step. There the mode is read from the restored tree, because a `pre exit` version deletes `pre.json`. - All four in-place conditions hold: same class (a lane reader that does not know the v3 `pre/` layout), a mechanical fix whose shape the CLI pins, no other claim on the file, and no new verification surface. ## #6170: this lane still cannot publish The pinned v2.1.2 `src/index.ts` branches on `hasPublishScript = !!core.getInput("publish-script")`: - With no changesets and no publish script, it returns. - With changesets, it runs `runVersion`, the PR path only. - `runPublish` needs a `publish-script`, and neither invocation passes one. The rehearsal invocation also runs in a non-repository directory with no token. The publish job, the environment gate and the tag push are untouched. Measured: every replay below reports `published=false`. ## Evidence All runs were local, on scratch copies of `main` (an independent `git init` repo, its `origin` a scratch bare repo, the API a local mock). The real action bundles ran with the runner's `INPUT_*` and `GITHUB_*` contract. Nothing was dispatched and nothing reached GitHub. | run | workflow | result | |---|---|---| | S1 | this PR, `main` (32 new changesets + 507 consumed) | job green. Render `pending_before=32`; rehearsal `has-changesets=false`; restore `32 = 32`; PR step: `git push --force` of `chore: version packages (next)` by `github-actions[bot]`, then the GraphQL update of the existing PR (title `chore: version packages (next)`, body 4319 chars, the same length as #21988's). Rehearsal API requests: 0. | | S1 content | (the pushed commit) | 32 R100 renames `.changeset/X.md` to `.changeset/pre/X.md` (exactly the 32 new ones), 168 M (79 `package.json`, 79 `CHANGELOG.md`, 10 `SKILL.md`), `@objectstack/spec` `18.0.0-next.0` to `18.0.0-next.1`. **The 507 consumed changesets: 0 blob mismatches, 0 missing.** | | S2 | base (`main` at `9c7cfbf0a9`) | reverse control. PR step fails with ENOENT on `.changeset/pre/changes.json`. Which of the two parallel reads rejects first varies; CI showed `changes.md`. | | S4 | this PR, rehearsal ref swapped to `@v1` | pin's reverse control. The rehearsal fails with ENOENT on `.changeset/pre/changes.md`, the PR step is skipped, and the standing PR keeps its last validated content. This is with `setupGitUser: false`. With v1's default it fails one call earlier, on `git config` in the non-repository directory. Red either way, before the cut. | | S3 | this PR, zero-pending tree (post-version commit as `main`) | job green. `pending_before=0`, the rehearsal is skipped, and the PR step logs `No changesets present ... publish-script is not set.` | | S3 base | base, same tree | the latent red. `pending_before=539`, then `Validate` fails with `changesets were pending but the version step moved no path`. | | probe | v2.1.2 rehearsal on the PRE-version copy | `has-changesets=true`, then exit 1 at `git checkout` (`not a git repository`), 0 API requests. | | exit | v2.1.2 bundled reader vs the lane count, `pre exit` scratch tree | both count 541 (34 + 507). `pre` mode, post-version: both 0. `pre` mode, pre-version: both 32. | ## Options weighed (the four axes) - **(a) chosen: action v2.1.2 by commit, plus the read rehearsal.** - Real need: it opens next.1, and the rehearsal pins the exact failure. - Long-term: this is the upstream-sanctioned pairing for CLI v3, not a workaround. The second reader stays, but it is pinned and rehearsed on every refresh. - AI-proofing: a CLI or action bump that desyncs the readers goes red before the cut, and the pin makes the reader a reviewed diff. - Scope: one job, no new workflow, job or `check:*` script. - **(b) a repo-owned version-PR script on the repo's CLI** (`pnpm run version`, commit, force-push, `gh pr create|edit`, PR body). - It has one reader by construction and no third-party code holding a write token. - It also replaces a maintained upstream component with new in-house PR machinery that only the live tick can fully verify. That is more surface on a p1 release lane. - Worth revisiting if the action and the CLI drift again. - **(c) stay on v1 and keep `.changeset/pre/` away from it.** Ruled out by the card: no moving or deleting the consumed changesets, no `pre.json` edit, no skipped steps. ## The 2026-08-19 hold on v2 (#9208) The maintainer kept v1 then (「同意 9208」). The recommendation was that a safety pin must not be upgraded before the property it encodes is read in v2's source. Its stated reopen path was: *read v2's source for the publish property and for the bundled reader*. Both are read above at the pinned commit, and the bundle was run end to end on the next.0-shaped tree. The other premise, "no measured pull", no longer holds: v1 cannot read the layout the repo's CLI writes. This PR reverses that hold, so it needs the maintainer's word as well as the Tier H approval. ## Verification - Derived gates (`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`): 40 families, all run, **all exit 0**, at `838bc026b5` (the final commit). `--ran` reconciliation: 40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN. The four artifact-roster gates whose roster lives under `.github/` were also run: all exit 0. - **NOT MEASURED: the Validate step's content gates** (create-objectstack suite, release-notes gates and the rest). Reason: unchanged by this diff, so the emulation stubbed that step. The live tick runs them. - **NOT MEASURED: GitHub-side behaviour** of v2's git-CLI push auth header and the PR create/update. Reason: only a live run measures it, and this lane is not dispatched while the PD15 question on #23193 is open. The local replay exercised the same code against a bare remote and a mock API. - **NOT MEASURED: actionlint.** Reason: not installed here. The YAML parses, and `check:workflow-status-functions` and `check:workflow-step-name-quoting` scanned it green. - **Live check after merge:** the next 6-hourly scheduled `Release` tick. Expected log lines: `Rehearse the version-PR changeset read ...` gives `No changesets present ...`; the assertion step gives `has-changesets=false`; and a `chore: version packages (next)` PR opens. ## Acceptance notes (not filed) - #20562 landed nothing: it was closed `not_planned`, and the maintainer kept it closed on 2026-09-30. The scheduled rehearsal this pin extends is the `version-pr` job's own post-version render and validation. - objectui's `changeset-release.yml` runs `changesets/action@v1` with `@changesets/cli` ^3.0.0. It would meet the same reader the first time a pre-mode version pass writes `.changeset/pre/` there. objectui has no `pre.json` today, so this is dormant. Carrier: none. - The lane's README exclusion mirrors `@changesets/read` 0.x. Read 1.x also ignores `AGENTS.md`, `CLAUDE.md` and `GEMINI.md` under `.changeset/`. Dormant: no such file exists. ## Changeset None. This needs `skip-changeset`, and the label is left to the seat. The only changed path, `.github/workflows/release.yml`, belongs to no workspace package, so it is in no package's `files[]`. Positive control: `packages/spec/src/index.ts` resolves to `@objectstack/spec` (public), one of the 82 workspace packages (71 public). ## 维护者速读(草稿) ### 改了什么 只改了发版工作流里"维护 Version Packages PR"这一个定时任务: - 把它用的第三方 Action(changesets/action)从 v1 换成 v2.1.2,并按提交固定版本; - 新增一次只读预演:每次刷新时,先用同一个 Action 去读"版本提交之后"的目录,读不懂就当场变红; - 修正了"待发布 changeset"的计数:prerelease 模式下,`.changeset/pre/` 里已被消费的 changeset 不再算作待发布。 ### 为什么改 18.0.0-next.0 切版后,已消费的 507 个 changeset 被移进 `.changeset/pre/`。v1 自带的旧读取器把这个目录当成 v1 时代的旧格式去读,每 6 小时一次的刷新都报 ENOENT。结果是 next.1 的 Version Packages PR 开不出来,next.1 无法发版。已在本地用同一份 Action 代码复现,并验证 v2.1.2 能正确开出 PR:只消费 next.0 之后的 32 个新 changeset,507 个旧的一字未动。计数修正针对的是 next.1 合入后、尚无新 changeset 时必然出现的一次误报变红。 ### 风险与代价(含回滚) - "此车道不能发布"(#6170)不变:两处调用都不传 `publish-script`,v2 源码里没有发布脚本就走不到发布分支。预演在非仓库目录、无凭据下运行,写不出任何东西。 - v2 是大版本升级,推送方式与 PR 更新代码和 v1 不同。本地已用真实 Action 代码对着本地仓库和模拟 API 跑通,但 GitHub 侧行为要等合入后第一次定时运行才算实测。 - 这推翻了 2026-08-19「同意 9208」时保留 v1 的决定;当时写明的重开条件(读 v2 源码确认两条性质)已满足。 - 回滚:revert 本 PR 即可,不涉及任何仓库设置。 ### 席位意见 ### 你要做的 1. 审阅并批准本 PR:受管面 Tier H,且推翻了 #9208 当时的保留决定,需要你的明确同意。 2. 合入后无需任何操作:下一次 6 小时定时运行即是实测,应看到预演步骤输出 `has-changesets=false`,并开出 `chore: version packages (next)` PR。之后照常由你决定何时合并。 --- _Generated by [Claude Code](https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 3d830b7 commit c4ef17a

1 file changed

Lines changed: 152 additions & 23 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 152 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ name: Release
4343
# schedule (6-hourly) → `version-pr` keeps the "chore: version packages" PR
4444
# or a dispatch with (#4935) current. Carries NO publish
4545
# `refresh_version_pr` capability: the changesets step is
46-
# invoked WITHOUT a `publish:` script,
46+
# invoked WITHOUT a `publish-script:`,
4747
# so the action's publish branch is
4848
# unreachable by construction, not by
4949
# an `if:` someone can get wrong.
@@ -496,11 +496,31 @@ jobs:
496496
set -euo pipefail
497497
shopt -s nullglob
498498
499+
# Whether `.changeset/pre/*.md` is pending depends on the prerelease
500+
# mode. @changesets/cli v3 moves every changeset a prerelease version
501+
# pass consumes into `.changeset/pre/` (the layout the 18.0.0-next.0
502+
# cut created, #23282). In `pre` mode those are CONSUMED: the version
503+
# pass skips them. On `pre exit` the GA version consumes them all
504+
# again. That is the CLI's own rule (`getRelevantChangesets`,
505+
# @changesets/assemble-release-plan), and the PR step's reader applies
506+
# the same split. Counting `pre/` in `pre` mode made a tree with no
507+
# new changeset read as hundreds pending: the version pass then moved
508+
# nothing and the validation below went red on a lane with nothing
509+
# to do. Measured on the post-version tree: 539 counted, 0 moved.
510+
pre_mode=''
511+
if [ -f .changeset/pre.json ]; then
512+
pre_mode="$(node -e 'process.stdout.write(String(JSON.parse(require("node:fs").readFileSync(".changeset/pre.json", "utf8")).mode ?? ""))')"
513+
fi
514+
499515
# `/^README\.md$/i` is how `@changesets/read` spells its exclusion, so
500516
# the count is case-folded rather than matching one spelling.
501517
count_pending() {
502518
local n=0 file
503-
for file in .changeset/*.md .changeset/pre/*.md; do
519+
local globs=(.changeset/*.md)
520+
if [ "${pre_mode}" = 'exit' ]; then
521+
globs+=(.changeset/pre/*.md)
522+
fi
523+
for file in "${globs[@]}"; do
504524
if [ "$(printf '%s' "${file##*/}" | tr '[:upper:]' '[:lower:]')" = 'readme.md' ]; then
505525
continue
506526
fi
@@ -729,13 +749,89 @@ jobs:
729749
fi
730750
echo 'Post-version tree validated.'
731751
752+
# ══════════════════════════════════════════════════════════════════════
753+
# THE READ REHEARSAL — THE PR STEP'S OWN READER, ON THE TREE THE CUT LANDS
754+
# (#23282)
755+
# ══════════════════════════════════════════════════════════════════════
756+
# changesets/action does not use this repository's @changesets/cli to
757+
# decide whether anything is pending. It bundles its own @changesets/read,
758+
# so two readers of `.changeset/` meet on this lane, released on two
759+
# schedules. They disagreed for the first time at the 18.0.0-next.0 cut:
760+
# that version pass moved 507 consumed changesets into `.changeset/pre/`,
761+
# and the reader bundled in v1.9.0 (what `@v1` resolved to) takes any
762+
# directory under `.changeset/` for a legacy v1 folder changeset, so it
763+
# opened `.changeset/pre/changes.md` and failed with ENOENT on every
764+
# refresh after the cut. Nothing failed BEFORE the cut, because no tree
765+
# main had carried until then held `.changeset/pre/`.
766+
#
767+
# The tree rendered above IS the tree the next cut lands on main. So the
768+
# PR step's reader (same action, same pinned commit) reads it here, every
769+
# refresh, and must answer "nothing left to version". A reader that
770+
# cannot read what the CLI just wrote now fails while the Version
771+
# Packages PR is still open, instead of on the first refresh after it
772+
# merges. Measured against the next.0-shaped tree: v1.9.0 fails here with
773+
# the same ENOENT; v2.1.2 answers `has-changesets` false.
774+
#
775+
# ⛔ WHY IT CANNOT WRITE ANYTHING. The rehearsal runs on a COPY of the
776+
# changeset inputs outside every git work tree, and is handed no
777+
# credential. The only path out of a "pending" read is `runVersion`,
778+
# whose first act is `git checkout` (src/run.ts) and which fails there,
779+
# before any push or API call. Measured on the pre-version tree:
780+
# `has-changesets` true, then exit 1 at that checkout, zero API requests.
781+
# The copy carries the root `package.json` and `node_modules` so the
782+
# action's own Changesets CLI generation check runs against the
783+
# installed CLI too.
784+
- name: Stage the post-version changesets for the read rehearsal
785+
if: steps.post_version.outputs.pending_before != '0'
786+
run: |
787+
set -euo pipefail
788+
REHEARSAL="${RUNNER_TEMP}/changeset-read-rehearsal"
789+
rm -rf "${REHEARSAL}"
790+
mkdir -p "${REHEARSAL}"
791+
cp package.json pnpm-workspace.yaml "${REHEARSAL}/"
792+
cp -R .changeset "${REHEARSAL}/.changeset"
793+
ln -s "${GITHUB_WORKSPACE}/node_modules" "${REHEARSAL}/node_modules"
794+
if git -C "${REHEARSAL}" rev-parse --is-inside-work-tree > /dev/null 2>&1; then
795+
echo "::error::${REHEARSAL} is inside a git work tree, so the read rehearsal could reach a branch. Refusing to run it."
796+
exit 1
797+
fi
798+
echo "Staged $(find "${REHEARSAL}/.changeset" -name '*.md' | wc -l | tr -d ' ') changeset file(s) outside any git work tree: ${REHEARSAL}"
799+
800+
- name: Rehearse the version-PR changeset read on the post-version tree
801+
id: read_rehearsal
802+
if: steps.post_version.outputs.pending_before != '0'
803+
# ⛔ Keep this ref identical to the PR step's below. A rehearsal of a
804+
# different reader proves nothing about the one that runs.
805+
uses: changesets/action@ae32849d5ba541f9ae29e40e22a623bc13562f51 # v2.1.2
806+
with:
807+
cwd: ${{ runner.temp }}/changeset-read-rehearsal
808+
# Not a credential. The rehearsal only reads files.
809+
github-token: no-credential-the-read-rehearsal-only-reads
810+
811+
- name: Assert the read rehearsal found nothing left to version
812+
if: steps.post_version.outputs.pending_before != '0'
813+
env:
814+
HAS_CHANGESETS: ${{ steps.read_rehearsal.outputs.has-changesets }}
815+
run: |
816+
set -euo pipefail
817+
# `false` is the only passing answer. `true` on a zero exit is the
818+
# action's "all changesets are empty" branch: after the cut the PR
819+
# step would then refresh nothing, forever, with nothing red. Empty
820+
# means the output was renamed, so the pin no longer reads anything.
821+
if [ "${HAS_CHANGESETS}" != 'false' ]; then
822+
echo "::error::the version PR step's changeset reader, run on the post-version tree, answered has-changesets='${HAS_CHANGESETS}' where only 'false' is right: once this tree lands on main the PR step would misread it. Re-verify the pinned changesets/action against the changeset layout @changesets/cli writes before this version PR merges."
823+
exit 1
824+
fi
825+
echo "The PR step's reader reads the post-version tree as fully versioned: has-changesets=${HAS_CHANGESETS}."
826+
732827
# ⚠️ LOAD-BEARING — DO NOT DROP THIS STEP. The steps above render the
733828
# version into the runner's working tree, and changesets/action picks its
734829
# branch from that tree. With `.changeset/` already consumed it finds
735-
# `hasChangesets` false, and this lane deliberately passes no `publish:`
736-
# input, so `hasPublishScript` is false too — v1 then takes
737-
# `case !hasChangesets && !hasPublishScript` (src/index.ts), logs "No
738-
# changesets present or were removed by merging release PR" and RETURNS.
830+
# `hasChangesets` false, and this lane deliberately passes no
831+
# `publish-script:` input, so `hasPublishScript` is false too — the pinned
832+
# v2.1.2 then takes `case !hasChangesets && !hasPublishScript`
833+
# (src/index.ts), logs "No changesets present or were removed by merging
834+
# version PR" and RETURNS.
739835
# The refresh becomes a permanent no-op and #4935 fossilises with nothing
740836
# red anywhere: this file's own failure class, one lane over. So the tree
741837
# is put back, and the restoration is ASSERTED rather than assumed.
@@ -758,9 +854,20 @@ jobs:
758854
# branch should never be able to reach further than the thing it undoes.
759855
git clean -fdq -- .changeset packages examples content docker
760856
857+
# The render step's count, read the same way and only now: `pre exit`
858+
# versions delete `.changeset/pre.json`, so the mode is read from the
859+
# RESTORED tree.
860+
pre_mode=''
861+
if [ -f .changeset/pre.json ]; then
862+
pre_mode="$(node -e 'process.stdout.write(String(JSON.parse(require("node:fs").readFileSync(".changeset/pre.json", "utf8")).mode ?? ""))')"
863+
fi
761864
count_pending() {
762865
local n=0 file
763-
for file in .changeset/*.md .changeset/pre/*.md; do
866+
local globs=(.changeset/*.md)
867+
if [ "${pre_mode}" = 'exit' ]; then
868+
globs+=(.changeset/pre/*.md)
869+
fi
870+
for file in "${globs[@]}"; do
764871
if [ "$(printf '%s' "${file##*/}" | tr '[:upper:]' '[:lower:]')" = 'readme.md' ]; then
765872
continue
766873
fi
@@ -793,36 +900,58 @@ jobs:
793900
# nested mapping (caught by check:workflow-status-functions' self-test).
794901
- name: 'Create or update the "chore: version packages" PR'
795902
id: changesets
796-
uses: changesets/action@v1
903+
# PINNED BY COMMIT (#23282). v2 is the major upstream pairs with
904+
# @changesets/cli v3: its bundled reader reads `.changeset/pre/` and, in
905+
# `pre` mode, leaves those consumed changesets out of `hasChangesets`
906+
# (src/readChangesetState.ts), and its CLI generation check refuses a
907+
# CLI v2 project. v1 was held on 2026-08-19 (#9208) because its
908+
# replacement's publish property had not been read, and the hold named
909+
# how to reopen it: read v2's source for that property and for the
910+
# bundled reader. Both were read at this commit, and the bundle was run
911+
# end to end on the next.0-shaped tree. A commit, not `@v2`: `v2` is a
912+
# BRANCH upstream, so a moving ref would change the bundled reader with
913+
# no diff here, and the read rehearsal above runs this same commit.
914+
uses: changesets/action@ae32849d5ba541f9ae29e40e22a623bc13562f51 # v2.1.2
797915
with:
798-
# ⛔ THERE IS NO `publish:` INPUT HERE, AND THAT IS THE FIX. ⛔
916+
# ⛔ THERE IS NO `publish-script:` INPUT HERE, AND THAT IS THE FIX. ⛔
799917
#
800918
# Not an oversight and not a style choice — it is what makes this lane
801-
# structurally unable to publish, per #6170. changesets/action@v1
802-
# branches on `hasPublishScript = !!publishScript` (src/index.ts):
919+
# structurally unable to publish, per #6170. The pinned v2.1.2
920+
# branches on `hasPublishScript = !!publishScript` (src/index.ts),
921+
# where `publishScript = core.getInput("publish-script")`:
803922
#
804923
# case !hasChangesets && !hasPublishScript:
805924
# core.info("No changesets present or were removed by merging
806-
# release PR. Not publishing because no publish
807-
# script found.");
925+
# version PR. Not publishing because publish-script
926+
# is not set.");
808927
# return;
928+
# case !hasChangesets && hasPublishScript:
929+
# await runPublish({...}); // unreachable: no publish-script
809930
# case hasChangesets:
810931
# await runVersion({...}); // version PR only
811932
#
812933
# With no publish script, `runPublish` is not reachable from any input
813934
# state the action can observe. Adding one back here re-arms the exact
814-
# lane that minted rc.3 and rc.4 without a human.
815-
version: pnpm run version
816-
commit: 'chore: version packages'
817-
title: 'chore: version packages'
818-
# No-op without a publish script. Kept so that re-adding one can never
819-
# silently resurrect #4900: the action posts each package's raw
935+
# lane that minted rc.3 and rc.4 without a human. v1's input names
936+
# (`publish:`, `version:`, `commit:`, `title:`) are not accepted
937+
# silently by v2: it throws on each one by name.
938+
github-token: ${{ secrets.GITHUB_TOKEN }}
939+
version-script: pnpm run version
940+
commit-message: 'chore: version packages'
941+
pr-title: 'chore: version packages'
942+
# v1's `commitMode: git-cli` default, spelled the v2 way. v2 otherwise
943+
# pushes the version commit through the GitHub API, a different path
944+
# whose commit and size behaviour this lane has never been measured on.
945+
push-with-git-cli: true
946+
# Both no-ops without a publish script. Kept so that re-adding one can
947+
# never silently resurrect #4900: the action posts each package's raw
820948
# CHANGELOG section as the Release body, and @objectstack/spec's
821949
# section for a single v17 RC is ~343k characters against the API's
822-
# 125,000 limit. Releases are created by scripts/release-github-releases.mjs.
823-
createGithubReleases: false
824-
env:
825-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
950+
# 125,000 limit. Releases are created by scripts/release-github-releases.mjs,
951+
# and version tags are pushed only by the publish job below. v2 also
952+
# pushes tags on its own unless told not to, so that one is off too.
953+
create-github-releases: false
954+
push-git-tags: false
826955

827956
# ══════════════════════════════════════════════════════════════════════════
828957
# PUSH LANE 2 — release integrity audit. Never mints. Reads github.sha and the

0 commit comments

Comments
 (0)