An installation checks for updates without re-reading its whole archive

An installation does not take a new version of the platform just because one exists. It first asks a safety question: does that version ship everything this installation has installed? A portal that rolled onto a version missing one of its packages would come up with that package broken, so the check is deliberately cautious — and when it cannot answer, it holds. "I could not look" is never read as "go ahead".

Answering that question needs to know which packages are supposed to ship content at all, and the installation works that out from its own archive of published build artifacts: every version it has ever stored, not just the one it is being offered. That is on purpose. Asking only about the version on offer would mean a package whose build quietly stopped being produced would also quietly stop being asked about — the check would go green about precisely the thing that had broken.

But the archive only ever grows. A new set of build artifacts is published roughly every half hour, each under its own folder, and nothing removes the old ones. Re-reading all of them, on shared network storage, is slower every day — while the safety question still has to be answered within a minute, or the installation holds.

What that looked like

It stopped finishing. Every check timed out, every new version was held, and the hold said so:

the artifact catalogue for release 3.0.0-ci.8931 could not be read (the availability check did not answer within 60s)

Because that reads as a compatibility refusal rather than "the check ran out of time", it is easy to look at and conclude the new version is genuinely unsafe. It was not. The public portal memex.meshweaver.cloud stayed on a six-day-old build this way while fresh versions kept being published every half hour, and several of its Store pages failed to compile against that older build as a result.

What changed

The installation now remembers what each archived publication said, and re-opens only the ones that have actually changed since it last looked. Each check still lists the archive — so a newly published set is always noticed, a newly added publication is always noticed, and a removed one always drops out — but it no longer opens the contents of every publication it has already read. Over an archive of 800 sets that is 4,800 file reads removed from every check, which on shared network storage is where the minute was going.

Nothing became less careful. If anything cannot be read, the check still refuses to answer and the installation still holds; that refusal is never remembered, so one momentary storage glitch cannot freeze an installation until it restarts. A publication that is still being written is never remembered either. Nothing about the offered version is remembered — its own artifacts are re-read in full, every time. And the one way the remembered reading can be wrong is by keeping a package on the list a little longer than strictly necessary, which can only ever make the check hold, never let something through.

What it remembers is also bounded. When old sets are cleared out of the archive, what the installation remembered about them is dropped on the next successful check — so this does not accumulate for as long as the installation runs.

There is also now a setting, SelfUpdate__AvailabilityAnswerBudget, for how long the check may take — still one minute by default. It is there for an installation on genuinely slow storage. It is not the fix for this, and raising it would not have been: on an archive that only grows, a bigger budget buys a longer wait before the same hold.

What to do

Nothing. An installation that was holding on this timeout resumes checking normally on the next version it is offered after taking this release.

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.