Thanks to visit codestin.com
Credit goes to github.com

Skip to content

updater: split apply() into prepare()+commit() for signed release-notes review#1075

Merged
thinmintdev merged 5 commits into
mainfrom
feat/updater-prepare-commit
Jul 5, 2026
Merged

updater: split apply() into prepare()+commit() for signed release-notes review#1075
thinmintdev merged 5 commits into
mainfrom
feat/updater-prepare-commit

Conversation

@thinmintdev

Copy link
Copy Markdown
Contributor

Stage-then-activate so hal0 update can show cosign-verified release notes and confirm before touching the running system.

  • updater.py: apply() split into prepare() (steps 1–6: download → verify → extract to staged dir; reads RELEASE_NOTES.md/release.json from the signed tree) and commit() (steps 7–9+: migrations → symlink swap → venv re-pip → unit re-render). apply() = prepare+commit (back-compat). Manifest cached between phases so commit can't drift to a newer release than the one verified.
  • API: POST /prepare (→ prepared state with notes + resolved_version), POST /commit (requires version → applied). /apply unchanged.
  • CLI: stage → render notes (breaking/migrations panel + highlights + markdown) → confirm only on a TTY without --yes (headless/cron proceeds unchanged) → commit. Adds --yes/-y.

Notes live inside the cosign-verified tarball (not a plain-TLS notes_url), so what an operator reviews is exactly what was signed. 101 tests pass across updater + routes + CLI.

🤖 Generated with Claude Code

…es review

Stage-then-activate so `hal0 update` can show cosign-verified release notes and
confirm before touching the running system:

- updater.py: Updater.apply() split into prepare() (§9 steps 1-6: fetch → download
  → sha256 → cosign verify → extract to the staged dir; caches the verified
  manifest + reads RELEASE_NOTES.md / release.json from the *signed* tree) and
  commit() (§9 steps 7-9+: migrations → symlink swap → venv re-pip → unit
  re-render). apply() = prepare()+commit() (back-compat). commit() requires a
  prior prepare or raises. Manifest is cached between phases so commit can't drift
  to a newer release than the one verified.
- API: POST /api/updates/prepare (→ 'prepared' state carrying notes +
  resolved_version) and POST /api/updates/commit (requires version → 'applied').
  /apply unchanged.
- CLI: `hal0 update` stages → renders notes (breaking/migrations panel +
  highlights + markdown) → confirms ONLY on an interactive TTY without --yes
  (headless/cron proceeds unchanged) → commits. Adds --yes/-y and a patchable
  _interactive() gate.

Release notes live INSIDE the cosign-verified tarball (not a plain-TLS
notes_url), so what an operator reviews is exactly what was signed.

Tests: prepare stages without swap; commit-without-prepare raises; prepare→commit
reaches the same end state as apply; notes read from the tarball; /prepare and
/commit routes; CLI prepare→commit flow, --yes, TTY-decline, notes render. 101
pass across tests/updater + tests/api/test_updater_routes + tests/cli.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@thinmintdev thinmintdev enabled auto-merge (squash) July 5, 2026 12:04
@thinmintdev thinmintdev merged commit 565710b into main Jul 5, 2026
3 checks passed
thinmintdev added a commit that referenced this pull request Jul 5, 2026
* release: prep v0.9.1 — bump version + CHANGELOG

- pyproject 0.9.0 → 0.9.1.
- CHANGELOG: promote [Unreleased] → [0.9.1] documenting the merges since v0.9.0
  (ROCmFPX runner quant-detect/#1068, seed profiles/#1069, quantize skill/#1071,
  bench tooling/#1072, updater prepare/commit + signed notes/#1075, seed cleanup
  + auto-fallback/#1076, release-notes producer/#1078, continuous batching).
  Uses ### Highlights / ### Migrations subsections so `hal0 update` renders the
  seed-cleanup auto-fallback as a callout (dogfooding #1078). Fresh empty
  [Unreleased] restored.

Not the tag itself — reviewed separately, then tag v0.9.1 triggers release.yml.

Co-Authored-By: Claude Opus 4.8 <[email protected]>

* profiles: normalise seed intent labels to structural tags

Drop served-model names and filler from seed 'intent' labels (e.g.
'VKFPX · ROCmFPX MoEQuality 35B-A3B · Vulkan0 + MTP' → 'VULKFPX · MOE · MTP';
'ROCm · basic GPU LLM' → 'ROCm'). Structural runner/arch/feature tags only.

Co-Authored-By: Claude Opus 4.8 <[email protected]>

* profiles: add vkfpx-dense seed (VULKFPX · DENSE · MTP, Vulkan0)

Completes the FPX lane×arch matrix — Vulkan0 lane for dense ROCmFP4, for
prefill-bound workloads (Vulkan wins ~+24% PP); complements the decode-optimal
ROCm0 rocmfpx-rocm. mtp=True (runner-capability gate; params stay on the model).

Co-Authored-By: Claude Opus 4.8 <[email protected]>

---------

Co-authored-by: Claude Opus 4.8 <[email protected]>
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