Skip to content

Fix canary build links with a rebuilt UI - #860

Merged
JingMatrix merged 2 commits into
masterfrom
canary-install-pin
Aug 3, 2026
Merged

Fix canary build links with a rebuilt UI#860
JingMatrix merged 2 commits into
masterfrom
canary-install-pin

Conversation

@JingMatrix

Copy link
Copy Markdown
Owner

On a release build, pressing install on a canary opened the newest release. The channel rule that keeps nightlies out of the update card also filtered the list an explicit request was resolved against, so the version code the canary list passed matched nothing and the selection fell back to the channel default. That rule now filters what is offered, not what can be asked for by name.

The canary page is rebuilt around the builds themselves. Each row is the build's head commit — subject wrapped, author credited, pull request in a fixed corner that opens the discussion — matched by SHA, falling back to the subject CI writes into the release notes. The header names the issues closed since the running build was cut, read from the issues endpoint filtered to completed: the Development panel closes issues without writing to any commit message, and the link itself exists only in GraphQL, which needs an account. The commit rail's marker shows where the running build sits, and a build wearing a canary's number without being it is told so.

Pressing install on a row of the canary list, from a device running a
stable release, opened the update page on the stable release that device
was already running.

The channel is derived from the running build, and a reader on a release
build is never offered a canary. That part is right, and it is what the
version text on the home screen asks for. It was implemented by dropping
the canaries out of the list the update page reads, which is not the same
thing. The canary list hands that page a build by version code; the page
looked the number up in a list the number had been filtered out of, found
nothing, and fell through to its default — the newest release. So the one
screen whose purpose is to point people at prereleases was the one screen
that could not reach one.

The state now keeps `catalog`, every published build from both channels,
and `history` becomes a view of it narrowed to the reader's channel.
Nothing about what is *offered* changes: `available` is still computed
release-only for a release reader, so the home card and the version text
behave exactly as before. Only an explicit request resolves against the
whole catalogue. Asking for a build by name is not the same as being
nudged towards one.

The version picker follows the page rather than the device for the same
reason. A page opened on a canary lists every build, so there is a way
back to the row the reader arrived from; before, it would have answered
with the stable list and no route to the prerelease they had just chosen.
The canary page was a worse copy of the build page. Each row carried the zip
names, their sizes and an install button — all of which the build page does
properly, since it states the sizes, remembers which variant was last taken,
checks the root implementation and shows the installer's own output. What the
row did not carry was any reason to install it: not the date, not what the build
was, not whether the reader was already running it.

So the page now chooses rather than installs. A row is the build's head commit —
its subject, wrapped rather than clipped, and who wrote it, in the accent colour
when that is somebody other than the maintainer, exactly as the commit rail
marks a contribution. Its pull request sits in a fixed corner of the card,
measured to hold five digits so that reserving it cannot re-wrap the subject
beside it, and tapping it opens the discussion rather than the build. The marker
from the commit rail shows where the reader sits among the builds, and the rest
of the card is one tap to the page that installs it.

The head commit is matched by SHA, not by version code: `globalIndex` is
assigned by counting down across a paged fetch and its own documentation warns
that a lost page leaves the numbers below the seam reading high, while a release
names its commit exactly. When the feed cannot reach that commit the subject
comes from the release notes instead, where CI writes it as the first bold line.

The headline is what has been fixed since the reader's build, named issue by
issue. That cannot come from the commits: an issue linked through GitHub's
Development panel is closed by the merge and writes nothing into any commit
message, and the link itself is only readable through
`PullRequest.closingIssuesReferences` in GraphQL, which answers 403 without an
account — this app has none by design, which is the same reason the canaries are
prereleases rather than Actions artifacts. The issues endpoint answers the
neighbouring question anonymously, so the screen asks that one and says exactly
what it got back: issues closed as `completed` since the running build was cut.
Not `not_planned`, not `duplicate` — a fifth of one page here — and never a
zero, because an empty answer means the request failed or the build could not be
dated, and printing it as "0 fixed" would turn that into a discouraging fact.

Three sentences about the reader's own position, because a version code is a
commit count and not an identity. A build wearing the newest canary's number
without being it is told so rather than congratulated, which is what the card
below it already said; a build past every canary is a local one only if the
reader is on the canary channel, and otherwise it is simply a release published
after the last nightly, which is the normal state for a day or two after every
release.

`CanaryBuild` is gone. It was a second shape over the release list the update
page already holds, so the page fetched what was in memory and could still say
nothing about a build — no notes, no commit, and so no way to mark the one that
is running. The canary list is now that catalogue filtered, which also means the
one request this screen adds is the issue list and nothing else.
@JingMatrix
JingMatrix merged commit 717095a into master Aug 3, 2026
1 check passed
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