Skip to content

release: seed import uses the service data location; update journey starts from the release users run - #361

Merged
andersalm merged 4 commits into
developfrom
fix/update-from-current
Oct 14, 2026
Merged

andersalm merged 4 commits into
developfrom
fix/update-from-current

Conversation

@andersalm

@andersalm andersalm commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Two release-only gaps found while publishing alpha.15 (12 Oct), each now caught before any download:

  • Seed import: the printed seed script set ELASTOS_DATA_DIR, but publish-release reads $XDG_DATA_HOME/elastos (the service's data location), so the import read an empty publish state and refused after a 23-minute download. The script now exports XDG_DATA_HOME, requires RELEASE_SEED_DATA to end in /elastos, and checks the saved publish state continues the signed head (or holds this version, for a rerun) before downloading.
  • Update journey: CI's update test started from 0.8.0-alpha.8, so the updater users actually ran (alpha.14) never met the candidate, and alpha.14 on Mac/ARM refused alpha.15's new Browser image entry. The journey now starts from 0.8.0-alpha.15, and release-publish.sh prepare refuses when the pin is not the public head.
    Behaviour tests fail on the old code (74/74 pass). update-hop-linux passed from alpha.15 on a rented box. CI precheck PASS.

Part of #89.

…tale pin

alpha.14's `elastos update` refused alpha.15 on Apple Silicon and Linux ARM64
(component 'browser-vm-image' has a development or unsupported release
strategy), and CI never ran that hop: its update journey started from the
fixed pin 0.8.0-alpha.8.

The pin moves to the current public release, 0.8.0-alpha.15 (head
Qmeo1oq5QdGpHmB6qkeDURuXMYKpN2jDbSL832N6tV5z25, release
QmUC1XLvsGrrwNKK6QCbNzZmTAdQ3AzqmfS8Q2vjCABDL5, SHA-256 e754d182...6d28),
written by pin-previous-release from the signed head and release the origin
serves.

`release-publish.sh prepare` now reads update-hop-previous-release.json at the
approved source commit and the origin's release-head.json before any download,
and refuses unless the pin's head_cid is that head's CIDv0
(`release-provenance.py head-cid`, the signer's UnixFS CID): the candidate's
update journey must have started from the release users run now.
…of a pair

Review of #361:
- seed printed prev_head_cid inside single quotes, so a head carrying
  x'$(...)' ran code on the seed before any verification. seed now refuses a
  signed head whose signer_did is not a did:key or whose prev_head_cid is not
  a canonical CID, before printing anything, and prints every value (seed
  host, stage, data dir, Runtime, unit, version, DID, files) as one shell word.
- The seed's state check refused a first publication: no prev_head_cid and no
  publish-state.json made jq exit 2, though the Runtime reads absent state as
  empty. Absent state now passes only for a head without a predecessor.
- prepare refused N+1 of a pair once N was public, because N+1's source still
  pins the head before N. release-provenance.py update-pin (replacing
  head-cid) also admits a public head that is byte for byte the head this Mac
  signed for N, prepared as input N from the same package run and source, when
  that head's prev_head_cid is the pin. Every other head is refused.
@andersalm

Copy link
Copy Markdown
Contributor Author

Cross-family review: round 1 FAIL (P1 shell injection via prev_head_cid, P2 first publication, P2 paired N+1) on 67ba8bb; all fixed with fail-before tests in ae63090; round 2 PASS on ae63090 (scope: release-publish.sh, release-provenance.py, update-hop pin, tests). Merge after CI on ae63090.

@andersalm
andersalm merged commit 9e4c1c1 into develop Oct 14, 2026
14 checks 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