You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
release: close the edge-channel stable-cut window with a line-ordering guard + always-cut-pre0 (#482)
The release flow deterministically broke the edge channel from every latest-line
stable cut until the first later prerelease tag: edge-advance stamps next's
manifests + FO gate line PAST the release to X.(Y+1).0-pre1, but the edge binary
(spacedock@next cask) only publishes the tag's own X.Y.0 build, so the same-minor
boot gate aborted every edge boot in the window.
Two mechanisms:
- A job-level line-ordering decision gates the WHOLE edge-advance job. A new
edge-advance-decision subcommand computes the tag's target edge version and
emits advance only when it is STRICTLY greater than origin/next's manifest;
both reconcile steps, the calendar bump, and the auto-pre0 step gate on it.
An old-line/patch tag skips the whole job, so next's tip stays byte-identical
(no -X theirs clobber, no manifest/gate-line rewind, no calendar re-pull, no
colliding pre0 tag). Ordering uses a new prerelease-aware ComparePreVersion
(contract.semverCompare is dotted-int only and cannot order pre0 < pre1).
- Always-cut-pre0: a latest-line stable cut auto-creates an ANNOTATED
vX.(Y+1).0-pre0 tag on the greened RELEASE_COMMIT and pushes it via the
re-triggering PAT. That run reuses the greened commit's e2e-gate pass and
publishes the X.(Y+1)-minor edge binary + cask, closing the window in minutes.
GORELEASER_CURRENT_TAG is added as a defensive pin (goreleaser 2.16 already
picks the highest tag at HEAD; verified in a CI dry-run spike).
Guards land with adversarial twins: the decision table incl. three equality
skip-cases, ComparePreVersion ordering, the AC-1 pre0/required-minor algebra,
the AC-3 byte-identical-tip fixture, and release.yml structure guards
(decision-gating, annotated-body, greened-SHA, recursion, PAT). Existing
assertEdgeAdvanceWiring matchers now tolerate the decision-gate conjunct and the
bump step is no longer asserted unconditional.
Co-authored-by: Spike Test <spike@example.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
# Defensive pin of the version goreleaser stamps into the binary. On the
228
+
# auto-cut vX.(Y+1).0-pre0 run the commit carries BOTH that pre0 tag and
229
+
# the stable vX.Y.0 tag; goreleaser 2.16 already picks the highest-semver
230
+
# tag pointing at HEAD (the pre0 tag) with no override, so this only makes
231
+
# the choice explicit — harmless on a single-tag run, deterministic on the
232
+
# dual-tagged one. Not load-bearing (measured with AND without in the CI
233
+
# dry-run spike); belt-and-suspenders against a future resolution change.
234
+
GORELEASER_CURRENT_TAG: ${{ github.ref_name }}
227
235
228
236
# AC-4: stamp the plugin manifests' `version` to the release so the host
229
237
# plugin panel (`claude plugin list --json`) displays a version that tracks
@@ -301,11 +309,33 @@ jobs:
301
309
with:
302
310
go-version: "1.22"
303
311
312
+
# Decide whether this tag advances the edge line AT ALL, gating the whole
313
+
# job. edge-advance-decision computes the tag's target edge version
314
+
# (dev-preversion for a stable tag; the tag's own version for a -pre tag)
315
+
# and prints `advance` only when that is STRICTLY greater than origin/next's
316
+
# current manifest version. An old-line / patch tag prints `skip`, and EVERY
317
+
# downstream step gates on this output, so the whole job no-ops: no
318
+
# `-X theirs` clobber of next's newer content, no manifest/gate-line rewind,
319
+
# no marketplace calendar re-pull, and no colliding pre0 auto-tag.
320
+
- name: Decide whether this tag advances the edge line
321
+
id: decision
322
+
run: |
323
+
set -euo pipefail
324
+
git fetch origin next
325
+
NEXT_PLUGIN="$(mktemp)"
326
+
git show origin/next:.claude-plugin/plugin.json > "$NEXT_PLUGIN"
327
+
if [ "$(go run ./cmd/spacedock-release edge-advance-decision "$GITHUB_REF_NAME" "$NEXT_PLUGIN")" = "advance" ]; then
328
+
echo "advance=true" >> "$GITHUB_OUTPUT"
329
+
else
330
+
echo "advance=false" >> "$GITHUB_OUTPUT"
331
+
echo "::notice::edge-advance SKIPPED for $GITHUB_REF_NAME: its target edge version is not strictly greater than next's current manifest version (an old-line/patch tag); next's tip is left untouched"
332
+
fi
333
+
304
334
# Prerelease (`-pre`) tag: reconcile `next` to the tagged commit's content,
305
335
# favoring the release over whatever `next` drifted to. The manifests inherit
306
336
# the tag's version; the calendar bump below makes installers re-pull.
307
337
- name: Reconcile the edge line to the prerelease commit
PRE0_VERSION="$(go run ./cmd/spacedock-release edge-pre0-version "$RELEASE_VERSION")"
414
+
PRE0_TAG="v$PRE0_VERSION"
415
+
PRE0_BODY="Edge prerelease auto-cut with stable $GITHUB_REF_NAME: publishes the ${PRE0_VERSION%.*}-line edge binary so spacedock@next realigns with next's post-release skills. No standalone changes."
0 commit comments