36b - review: publish entry matches publish.sh
CI / gate (push) Successful in 1m3s
CI / publish (push) Has been skipped

This commit is contained in:
2026-09-28 03:56:16 +02:00
parent e5771bc60b
commit 50f97513e8
2 changed files with 6 additions and 8 deletions
+6 -7
View File
@@ -210,8 +210,8 @@ switches on `code` with no `default`.
`unsupported-node-shape` — since a code no input reaches is one no consumer can switch on `unsupported-node-shape` — since a code no input reaches is one no consumer can switch on
(2026-09-20). (2026-09-20).
- A refusal no spelling recovers from is a gap in the flavour rather than a code: give the flavour - A refusal no spelling recovers from is a gap in the flavour rather than a code: give the flavour
the spelling and the code goes (`unspellable-link`, 2026-09-13). A cause the carry answers gets no code: a mark no spelling writes rides the carry the spelling and the code goes (`unspellable-link`, 2026-09-13). A cause the carry answers gets
with its node. no code: a mark no spelling writes rides the carry with its node.
## Which code a cause takes ## Which code a cause takes
@@ -265,12 +265,11 @@ input reads `message`.
2026-08-23, converging 2026-09-03, the maintainer. Goal 7. Valid while CI on `main` holds the npm 2026-08-23, converging 2026-09-03, the maintainer. Goal 7. Valid while CI on `main` holds the npm
token. token.
`package.json` version on `main` is the source of truth. CI on `main`: tests green and version `package.json` version on `main` is the source of truth. CI on `main`: tests green and the version
differs from npm → publish and tag `vX.Y.Z`. No bump, no deploy; the bump is each shipping PR's not yet on npm → publish and tag `vX.Y.Z`. No bump, no deploy. `publish.sh` is that job.
deliberate semver judgment. `publish.sh` is that job.
The publish and the tag each observe their own end state — the version on npm, the tag on the The publish and the tag each check their own end state — the version on npm, the tag on the
remote — and neither gates the other, so a run that dies between them converges on the next push remote — so a run that dies between them converges on the next push
to `main` rather than leaving npm ahead of the tags. An unanswered registry reads the same as an to `main` rather than leaving npm ahead of the tags. An unanswered registry reads the same as an
unpublished version, which npm's own duplicate rejection is what catches. The job rebuilds rather unpublished version, which npm's own duplicate rejection is what catches. The job rebuilds rather
than taking the gate's `dist`: the lockfile is committed, the image is patch-pinned and `tsc` is than taking the gate's `dist`: the lockfile is committed, the image is patch-pinned and `tsc` is
-1
View File
@@ -30,7 +30,6 @@ fi
published=$(leg "ask npmjs for $name@$version ($node_image)" published_version "$name" "$version") published=$(leg "ask npmjs for $name@$version ($node_image)" published_version "$name" "$version")
tagged=$(leg "ask origin for v$version" git ls-remote --tags origin "v$version") tagged=$(leg "ask origin for v$version" git ls-remote --tags origin "v$version")
# Both steps observe their own end state, so a partial run converges on the next push to main.
if [ -z "$published" ]; then if [ -z "$published" ]; then
: "${NPM_TOKEN:?the publish needs NPM_TOKEN}" : "${NPM_TOKEN:?the publish needs NPM_TOKEN}"
leg "install ($node_image)" in_image "$node_image" npm ci leg "install ($node_image)" in_image "$node_image" npm ci