WolfStack v25.9.5
v25.9.5: the sidebar can no longer freeze on 'Loading…' when /api/nodes stalls
wolfstack-1 (2026-08-03) sat on a half-drawn dashboard — sidebar stuck on
'Loading…', licence banner fallen back to the free/PRICING default — for
a few minutes and only recovered when it happened to answer. Root cause:
fetchNodes() did a bare 'await fetch(/api/nodes)' with NO timeout. A
server that accepts the connection but never replies (the node's cluster
aggregation stalling while state settled) makes that await neither
resolve nor reject, so the try/catch cannot fire. The 5s stuck-load
watchdog then stacked another hung request every tick, none completing,
and the sidebar stayed frozen until the endpoint unwedged itself.
Not a session-expiry case, so the v25.8.3 'expired session -> login'
redirect correctly did not fire — the session was valid, the node was
just slow.
Fix:
- A 12s AbortController timeout on the fetch, so a stalled endpoint
ABORTS and the catch runs instead of hanging forever. - An _fetchNodesInFlight guard so the three pollers (initial load, the
5s watchdog, the 15/60s poll) can never stack concurrent hung
requests behind one stall — one in-flight fetch at a time. - Before the first successful paint, a failed/aborted fetch swaps the
frozen 'Loading…' for a self-updating 'Reconnecting to node…' (or
'Node is slow to respond — reconnecting…' on a timeout) so the UI
reads as alive-and-retrying, not hung. buildServerTree() overwrites
it the moment a fetch succeeds; a rendered tree is never stomped on
a transient blip.
No JS test harness exists in this project (web assets are edited
directly, no build step), so this is verified by parse-check + review;
the reconnect path will be confirmed live on the next node stall.
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.