Story: Hotfix: Site build needs live GNU ELPA
Table of Contents
This page documents a story in Sprint 27. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
Site CI turns red whenever elpa.gnu.org does not answer. Two
dependencies of the site packages, queue and compat, exist only on
GNU ELPA, and both site workflows install the packages on every run
with no cache. The outage of 2026-10-06 kept the `Product website`
workflow red for hours. This hotfix caches the package tree in CI and
falls back to a mirror when the primary GNU archives do not answer, so
a GNU ELPA outage no longer fails the build.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 27 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-10-06 |
3. Acceptance
- A cold run with unreachable GNU archives installs every site package (
queue,compat,citeproc,org-roam,htmlize). - A warm
.packagestree makesores-site-ensure-packagesa no-op. - Both site workflows restore and save
./.packages. - The refresh retries a failed primary refresh, then reads from a mirror.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Scaffold story: Hotfix: Site build needs live GNU ELPA | DONE | 2026-10-06 | 2026-10-06 | Story scaffolding rides this task: documents, sprint wiring, and the scaffold PR. Close it before merging that PR. |
| Implement Hotfix: Site build needs live GNU ELPA | DONE | 2026-10-06 | 2026-10-06 | Cache the Emacs package tree in both site workflows, add a GNU ELPA mirror fallback, and make the archive-refresh retry detect a failed refresh. |
5. Decisions
- The fallback mirrors are
https://mirrors.bfsu.edu.cn/elpa/gnu/and itsnongnusibling. Emacs verifies the archive signatures against the GNU keyring, so the mirror cannot substitute content. - The retry detects a failed refresh by the absence of
queuein the archive contents.package-refresh-contentsonly warns on a failed archive and never signals, so the old retry loop never ran. - The CI cache key tracks the package-defining elisp file, so a change to the package list rebuilds the cache instead of reusing a stale one.
6. Out of scope
- Replacing GNU ELPA as the source of
queueandcompat.
7. Result
Shipped in PR #2693. A cold bootstrap with unreachable GNU archives installs every site package through the mirror, and a warm CI cache removes the network dependency.