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 .packages tree makes ores-site-ensure-packages a 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 its nongnu sibling. 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 queue in the archive contents. package-refresh-contents only 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 queue and compat.

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.

Emacs 29.3 (Org mode 9.6.15)