Skip to content

WolfStack v25.9.4

Choose a tag to compare

@github-actions github-actions released this 01 Aug 10:58
· 394 commits to master since this release

v25.9.4: drive-health card moves to the Storage page with a lifespan graph; a node no longer adopts its own cluster from stale peer gossip

Two things Paul hit on wolfstack-1 (2026-08-01), both fixed.

DRIVE HEALTH card was on the cluster-wide Storage Array page, where it
only ever showed the local node's physical disks and nobody thought to
look. Moved to the per-node Storage page, next to the disk layout, where
per-disk health belongs. Removed from Storage Array. It now also carries
a 'Lifespan' graph: a bathtub-curve position bar per drive showing where
it sits on the 0–6yr failure curve, with the early-life / steady-state /
wear-out zones (boundaries at 1yr and 4yr, matching array::life_stage).
The three zones use the reserved status colours, each named in a legend
and mirrored by the row's text badge, so they are never colour-alone;
rendered and eyeballed in both light and dark themes before shipping.
The self-test buttons now refresh whichever surface is on screen.

CLUSTER IDENTITY FLAP recurred: wolfstack-1 kept showing under
Wolf-Grid-Regions instead of intelligentwolf. Root cause is NOT the old
weak-IP-match bug (that stays fixed). The region peers still hold
wolfstack-1's nodes.json record labelled 'Wolf-Grid-Regions' — mirror
residue from the 2026-07-28 mislabel — and because that record carries
wolfstack-1's real global id, the strong-match gate passed and
wolfstack-1 re-adopted the stale label via passive gossip within one
round of every correction. A gossiped record is a mirror with no intent
or timestamp, so this path cannot tell a fresh admin change from a stale
re-assertion. A node is authoritative about its own cluster membership,
so it no longer adopts its own cluster_name from gossip at all;
legitimate reassignments already travel via the delivery-confirmed
identity-intent queue + /api/agent/cluster-name push. self_cluster.json
is now the single source of truth for our own membership.

NOT covered by this commit, needs Paul's go (touches the live grid): the
CURRENT mislabel. Once this ships and the fleet upgrades, wolfstack-1's
self_cluster.json must be reset to its correct cluster ONCE — after
which this fix keeps it stuck instead of flapping back. Untested on a
real multi-node cluster; the change is a removal of a code path, backed
by build + full suite (1709) + clippy at baseline, not by live gossip
convergence. The protocol-level authoritative channel (cluster_name in
StatusReport) remains recommended follow-up and is deliberately not
rushed in blind.

Co-Authored-By: CodeWolf paul@wolf.uk.com
Co-Authored-By: Wolf Software Systems Ltd paul@wolf.uk.com


Verifying this release

Each binary is signed via cosign keyless OIDC (no key distribution — signing identity is the GitHub Actions workflow itself, anchored to the Sigstore Fulcio CA and the Rekor transparency log) and ships with a SLSA build provenance attestation.

Verify the cosign signature:

cosign verify-blob \
  --bundle wolfstack-x86_64.cosign.bundle \
  --certificate-identity-regexp 'https://github.com/wolfsoftwaresystemsltd/WolfStack/\.github/workflows/release\.yml@.*' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  wolfstack-x86_64

Verify the build provenance:

gh attestation verify wolfstack-x86_64 --repo wolfsoftwaresystemsltd/WolfStack

Verify the SHA-256 checksum:

sha256sum -c SHA256SUMS

Artifacts

  • wolfstack-x86_64 / wolfstack-aarch64 / wolfstack-armv7 — static musl binaries (Linux x86_64, ARM64 / Raspberry Pi 4+, and 32-bit ARM).
  • wolfstack-<arch>.cosign.bundle — cosign signature bundle (cert + signature + Rekor entry).
  • SHA256SUMS — checksums for both binaries.

For per-version history see CHANGELOG.md.