Edge channel survives the stable-cut window (no binary/skills minor skew between a stable tag and the first prerelease)#482
Conversation
…g guard + always-cut-pre0 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: Claude Fable 5 <noreply@anthropic.com>
|
Merging per the path→lane policy's own terms: this diff (release.yml + internal/release + docs/releasing.md) touches nothing any live lane loads or drives — the required lanes are the deterministic ones (build/installs/offline, all green) plus the in-repo guards (green, adversarial twins red-under-violation) and the four real-tool dry-run spikes (recorded in the validation report). Live-lane reds this run are all documented family noise with zero diff coupling: sonnet filing/shallow-boot = sc boot-preamble class (instances 5-6 logged); codex = the 3v flap + the merge-guard dispatch-surface variant. opus + pi green. Deploy condition stands on record: the pre0 push PAT needs contents:write on this repo before the first cut relies on auto-realign. |
Closes the edge-channel stable-cut window: a stable tag can no longer ship skills demanding a binary minor that doesn't exist — and old-line patch releases can no longer regress or rewind the edge line.
What changed
>viaComparePreVersion) gating every edge-advance step, calendar bump includedX.(Y+1).0-pre0edge tag on the greened release commit at latest-line stable cutsGORELEASER_CURRENT_TAGas a defensive pin; document the flow in docs/releasing.mdEvidence
Review guidance
Deploy condition (not code): the pre0 push PAT needs contents:write on THIS repo — a tap-only fine-grained PAT 403s and the window stays open. Spike-4's re-trigger confirms end-to-end on the first real cut.
zr2