Skip to content

ci(release): check the endpoint old installs use, and let RELEASING.md say less - #495

Merged
PathGao merged 1 commit into
masterfrom
ci/guard-legacy-updater-endpoint
Aug 6, 2026
Merged

ci(release): check the endpoint old installs use, and let RELEASING.md say less#495
PathGao merged 1 commit into
masterfrom
ci/guard-legacy-updater-endpoint

Conversation

@PathGao

@PathGao PathGao commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Replaces #494, which I closed. That PR added another paragraph to RELEASING.md §5; this one adds the check that makes the paragraph unnecessary and shortens the section instead.

Why §5 kept growing

§4 works because it is adjacent to what it constrains — generating the keypair is step 1 of the runbook, and "the pubkey is permanent" is the warning attached to step 1. §5 constrains forking the repository, which is not a step in this runbook and never will be. It has been compensating with length for not being next to anything, and #494 was about to add more.

The check

create-release
  └─ The endpoint old installs still use must lead to this repository   ← new, before the draft
  └─ Create Release

It asserts the property, not a proxy for it. It does not ask whether a redirect exists — it fetches

https://github.com/alecdotdev/Markpad/releases/latest/download/latest.json

and checks that the feed's platforms[].url values still name $GITHUB_REPOSITORY.

That distinction is the whole point. A repository at the old location that serves a correct feed would keep old installs working, and it passes — correctly. That case is precisely what #494 was going to spend a paragraph warning about; the check handles it without anyone having to reason about it under pressure.

Placed before the draft is created, so a broken endpoint does not leave half a release behind.

Verified, and falsified

Run against the live endpoint from this machine:

version 2.7.0, platforms: darwin-aarch64 darwin-x86_64 linux-x86_64 windows-aarch64 windows-x86_64
all five URLs → sftwrdotdev/Markpad/releases/download/v2.7.0/...
✓ passes

Three falsifications:

broken how behaviour
expected repository name does not match the feed fails, naming all five foreign URLs
the URL answers with something that is not a feed (fork, 404) fails via the "not an updater feed" branch
the URL cannot be reached at all ::warning, exit 0 — a flake does not block a release

npm test 778/778. build.yml parses.

What I could not verify

  • The step has not run in CI. build.yml is workflow_dispatch-only, so this is proven by executing the script body locally against the real URL, not by a green run. The first real exercise is the next release.
  • I have not tested what GitHub actually does when a repository is created at a transferred location. The claim that the redirect is voided is from GitHub's documentation, quoted in §5, not from an experiment — which is part of why a check that observes the outcome is better than prose asserting the cause.

🤖 Generated with Claude Code

…d say less

Section 5 has been growing. #485 added it, and a follow-up wanted another
paragraph to close the loophole a careful reader finds — that a repository at
the old location could serve a correct feed and keep old installs working, so
the rule is not quite as absolute as it reads.

Prose was the wrong instrument. Section 4 earns its place by sitting directly
after the step it constrains: generating the keypair is step 1, and "the pubkey
is permanent" is the warning on step 1. Section 5 constrains an action that is
not a step in this runbook at all — nobody cutting a release is going to fork
the repository — so it has been compensating with length for not being adjacent
to anything.

The check asserts the property instead of a proxy for it. It does not ask
whether a redirect exists; it fetches that URL and checks that the feed's
download URLs still name this repository. A fork or a deletion fails it. Someone
occupying the old location while serving a correct feed passes it, which is the
right answer and is exactly the case the extra paragraph was going to spend
words on. A network failure is not evidence either way, so it warns and lets the
release proceed rather than blocking on a flake.

It runs before the draft is created, so a broken endpoint does not leave half a
release behind.

Verified against the live endpoint: the feed's five platform URLs all resolve to
this repository. Falsified three ways — a repository name that does not match
reports all five as foreign; a response that is not a feed takes the "not an
updater feed" branch; an unreachable URL takes the warning branch and exits 0.

Section 5 loses ten lines and keeps every instruction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@PathGao
PathGao merged commit 382ab8c into master Aug 6, 2026
4 checks passed
@PathGao PathGao mentioned this pull request Aug 6, 2026
@PathGao
PathGao deleted the ci/guard-legacy-updater-endpoint branch August 6, 2026 04:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant