Releases: ROCm/spur
Releases · ROCm/spur
Release list
Spur nightly (20260809 · b81c26b7)
Automated nightly build from main at 2026-08-09 07:46 UTC.
Commit: b81c26b7
1 commit(s) since previous nightly.
Install
curl -fsSL https://raw.githubusercontent.com/ROCm/spur/main/install.sh | bash -s -- nightlyDocker
docker pull rocm/spur:nightlyv0.7.0
0.7.0 (2026-08-04)
refactor
Features
- mpi: add single-node PMIx MPI via dlopen plugin (#505) (3fbc62a)
- mpi: fix single-node PMIx modex and mpirun launch (#528) (83c8b4c)
- quota: Kubernetes quota-enforcement — M1 (tenancy + hard quotas + scoped kubeconfig) (#475) (aeb21cd)
- spur-cli: accept --ntasks-per-node in srun (#534) (b097540)
- spur-net: normalize node comm addresses for agent reachability (#557) (8c53f3e)
- spurctld: authorize k0s cluster ops and scope kubeconfigs per user (#560) (f9a28be)
- spurctld: multi-control-plane HA for native k0s clusters (#529) (0e5262d)
Bug Fixes
- accounting: preserve unset fields on sacctmgr modify (#527) (6275ea8)
- auth: enforce job ownership on exec, attach, and output streaming (#551) (367838e)
- build: sync Cargo.lock spur-mpi-pmix version to 0.6.0 (#523) (8d9522d)
- dispatch: back off between launch retries and drain unusable nodes (#538) (c267377)
- spur-cli: accept --qos and SALLOC_QOS in salloc (#540) (0221042)
- spur-cli: accept multi-node hostlists in scontrol update NodeName (#549) (3120d5c)
- spur-cli: apply sinfo --states filter to node query (#533) (a92bf5e)
- spur-cli: default sbatch --ntasks to one task per node (#522) (316888d)
- spur-cli: default srun and salloc --ntasks to one task per node (#532) (f478b20)
- spur-cli: honor format= in sacctmgr show account (#519) (ff85e9b)
- spur-cli: honor SPUR_* env-var twins in sbatch (#526) (bdc4367)
- spur-cli: scale default sbatch --ntasks by --ntasks-per-node (#531) (b0ea620)
- spur-cli: sort squeue output and honor -S/--sort (#524) (7a0b2c9)
- spur-cli: target the -w node when attaching an interactive PTY (#516) (dd5f6e3)
- spur-core: default JobSpec.pty so pre-0.6 Raft logs replay (#509) (d754118)
- spurctld: confirm batch dispatch on every node before Running (#550) (222d0f4)
- spurctld: delete sacctmgr users atomically (#451) (5c3ddce)
- spurctld: distinguish missing vs unavailable QOS in validation errors (#508) (6a2b9bc)
- spurctld: exclude k0s-reserved nodes from batch scheduling (#558) (d4767da)
- spurctld: serve read RPCs from local state when no Raft leader (#506) (93621c7)
- spurctld: unify pending job classification (#500) (96c37de)
- spurd: run sbatch batch script once per node, not once per task (#552) (a1be3b7)
v0.6.0
0.6.0 (2026-07-27)
Features
- cluster: SPUR-native k0s clusters via spur k8s up/down + mesh-native CNI (#432) (7c95efe)
- spur-cli: accept --qos for srun (#481) (765f319)
- spur-cli: interactive PTY sessions via srun --pty and sattach (#482) (a1b28fb)
- spur-cli: persist and display account-level grp_tres allocation (#477) (b1fa1ee)
- spur-cli: support exclusive srun allocations (#496) (c56b873)
- spur-cli: support nodefile-based nodelists (#467) (9947815)
- spur-core: explicit GPU request modeling with greedy distribution (#502) (996cb54)
- spur-sched: make nodelist selection additive (#472) (a4a29e6)
- spurctld: auto-derive raft node_id from controller.peers position (#459) (6967f29)
- spurctld: report node-resolved job output path in scontrol (#488) (bb7e9f8)
- spurctld: show valid accounts in association errors (#446) (db7bef1)
Bug Fixes
- accounting: filter users by name (#447) (b3e16a1)
- oci: key container images by canonical reference (#497) (5bc467c)
- spur-cli: display node features in sinfo (#493) (f3ee133)
- spur-cli: limit user cancellation to active jobs (#483) (42750ac)
- spur-cli: skip terminal jobs in filter-based scancel (#462) (c615aa5)
- spur-core: run hooks from /tmp when work_dir can't be entered to avoid draining nodes (#503) (ec97012)
- spur-sched: spread equal-weight jobs across idle nodes (#453) (c41f188)
- spurctld: drop stale completion reports from preempted-and-requeued runs (#474) (e4e3288)
- spurctld: enforce ownership on reservation delete and update (#463) (d7fc6cd)
- spurctld: prevent single scheduling pass from over-subscribing QOS/account aggregate limits (#478) (f656944)
- spurctld: reject job QOS not authorized for the submitting association (#490) (59b7180)
- spurctld: schedule jobs across partition OR-lists (#468) (90986b5)
- spurctld: update upsert_account test call for grp_tres arity (#485) (1ed491a)
- spurd: release GPU reservations stranded mid-launch (#489) (c5b52cd)
- spur: reclaim node resources when completion and eviction desync (#498) (9c2098c)
- srun: fan out tasks across nodes in standalone and step mode (#473) (c74abac)
v0.5.1
0.5.1 (2026-07-17)
Bug Fixes
- spur-cli: hide unregistered nodes from sinfo (#465) (3052801)
- spur-cli: wire format engine into sacctmgr show qos (#457) (a422f51)
- spur-core: derive version from cargo version plus git sha (#458) (055336f)
- spur-core: enforce node and memory limits in QOS per-user checks (#427) (7595e9e)
- spurctld: close QOS enforcement bypass for jobs submitted without a QOS (#452) (deafb10)
- spurctld: pass name filter to get_jobs in accounting reconcile (#464) (e970764)
- spurctld: reset stale node features/weight when NodeConfig stops matching (#455) (ab88dc4)
- spurctld: retry accounting writes and reconcile drift from job store (#428) (c7dad32)
- spurd: release GPU allocation on completion and post-record launch failure (#450) (86cd880)
v0.5.0
0.5.0 (2026-07-15)
Features
- spur-cli: add -V/--version support across all binaries and CLI entry points (#437) (fa358b8)
- spur-cli: honor SRUN_/SALLOC_/SLURM_ env-var defaults for srun … (#421) (ac53a26)
- spur-cli: support slurm-buildkite bridge (comment readback, parsable, script args, format literals, squeue --name) (#443) (bd4abbc)
Bug Fixes
- spur-spank: rename SPANK exports to Slurm-compatible symbols (#429) (3620047)
- spurctld: evict job to nodefail on partial multi-node dispatch failure (#426) (0a08108)
- spurctld: raise grpc message-size limits and cap job submission size (#442) (91ab393)
- spurctld: stop counting preemption requeues against the failure-requeue hold limit (#431) (35485a2)
- spurctld: wire QOS priority into scheduling and preemption (#430) (8923528)
- spurd: raise RLIMIT_MEMLOCK for job steps (default unlimited) (#449) (d49634d)
v0.4.1
v0.4.0
0.4.0 (2026-07-10)
Features
- accounting: default QOS on user/account associations (#409) (75bf755)
- admission: token-based dynamic node admission (#318) (91ade8a)
- config: enforce partition allow_accounts and deny_accounts at s… (#413) (ba19f78)
- e2e: migrate K8s E2E to pytest and bundle CI test assets (#247) (9dc99b9)
- e2e: migrate native-host E2E tests from Rust to Python/pytest (#238) (a9ef480)
- hooks: implement Slurm-compatible prolog/epilog hook framework (#219) (84b7e78)
- metrics: add controller RPC handler statistics (#350) (4f080f7)
- metrics: add node metrics collection and /metrics/nodes export (#237) (7b74464)
- metrics: export job OpenMetrics from spurctld on :6822 (#217) (6f939d7)
- node labels and dual-path partition matching (#276) (7448e0e)
- reservations: persist CRUD via raft WAL and enforce scheduling parity (#385) (285a098)
- scheduler: implement event-driven scheduler wake (#293) (1358222)
- spur-cli: add -o/--output, -e/--error, -i/--input to srun (#407) (531b949)
- spur-cli: add -w/--nodelist and -x/--exclude to srun and salloc (#380) (ac0e4c9)
- spur-cli: add sbatch --wrap for inline command submission (#381) (8d65736)
- spur-client: add client-side controller failover with endpoint rotation (#384) (2f3b9df)
- spur-cli: read SBATCH_* env vars as sbatch flag defaults (#374) (c74166d)
- spur-core: add ALL/COUNT and proto-backed JobState and NodeState conversion (03770de)
- spur-core: centralize env vars with SpurEnv, add SLURM_* twins (#311) (64ddf60)
- spur-devices: CDI-based vendor-agnostic GPU device management (#262) (d5c819e)
- spur-metrics: add job metrics collection in spurctld (40a3deb)
- spur-metrics: add partition, job and more metrics (#394) (cf126da)
- spur-metrics: add scheduler cycle and lifecycle statistics (#359) (a6e7cc0)
- spur: add burst-buffer staging subsystem with capacity pool and pending reasons (#327) (fca5df6)
- spur: add Completing (CG) job state with per-node completion (#234) (7c0457c)
- spur: add DEADLINE job state and DeadLine reason for --deadline parity (#263) (0c585bd)
- spur: add job suspend/resume functionality (#275) (87977b1)
- spur: add OUT_OF_MEMORY job state from cgroup OOM detection (#310) (9c1e146)
- spur: close exit-code reporting gap — exit:signal, DerivedExitCode, reasons (#274) (3d89351)
- spurctld: enforce real QoS limits via controller-side QosCache (#325) (672ad43)
- spurctld: serve REST API directly, remove standalone spurrestd (#319) (06215d2)
- spurdbd: persist exit_signal and derived_exit_code for sacct (#324) (8556358)
- spurdbd: wire fairshare integration between accounting and scheduler (8d1bcce)
- spur: emit PartitionConfig/PartitionInactive pending reasons (#326) (422925d)
- spur: expand pending-reason vocabulary and surface reservation/license/QoS reasons (#301) (d5ecb3f)
- spur: node deregistration, drain, and job eviction (#354) (8fab7a9)
- use controller computed metrics in sdiag (#332) (5eac544)
Bug Fixes
- ci: add node connectivity check and cross-node DNS injection (61e632e)
- ci: add node connectivity check and cross-node DNS injection (6e03055)
- ci: add pre-cleanup step to native-host E2E workflow (#330) (cb65fda)
- ci: add statuses permission and clean up E2E status reporting (8b96c89)
- ci: add statuses permission and clean up E2E status reporting (7467851)
- ci: construct image tag directly instead of relying on job outputs (1f34859)
- ci: construct image tag directly instead of relying on job outputs (5a7d032)
- ci: harden Trivy scan workflow configuration (#334) (f51299c)
- ci: kill orphaned spur processes on BM nodes during cleanup (e23f94f)
- ci: kill orphaned spur processes on BM nodes during cleanup (c74ebdf)
- ci: move E2E assets to /tmp to prevent stale file contamination (#264) (a9ec2ce)
- ci: remove stray
--from bare-metal test binary invocations (f879421) - ci: remove stray
--from bare-metal test binary invocations (7f8dc12) - ci: use recursive glob for Dockerfile pathspecs in license checks (#249) (5d5bdc6)
- ci: use ve...
v0.3.0
What's Changed
- CLAUDE.md: add don'ts for writing unit tests by @shiv-tyagi in #112
- Fix test t50_106: test real RawModeGuard, not simulation (#111) by @powderluv in #114
- GPU over-scheduling fix, cancel deallocation, K8s pending failure det… by @codetap-developer in #115
- Add secretEnv field to SpurJob CRD (#117) by @powderluv in #118
- Add auto-update: startup check + CLI self-update by @powderluv in #119
- fix(spurd): deadlock in exec_in_job due to double mutex acquisition by @shiv-tyagi in #120
- fix(spurctld): propagate Raft propose errors to RPC callers by @shiv-tyagi in #121
- fix(spurctld): refactor submit_array_job to avoid deadlock by @shiv-tyagi in #122
- chore: sync Cargo.lock after spur-update crate addition by @shiv-tyagi in #123
- fix(spurctld): return error from snapshot_state instead of swallowing serde failures by @shiv-tyagi in #124
- fix(spur-cli): group sinfo rows by node state within partition by @shiv-tyagi in #127
- Wire spurctld accounting notifications to spurdbd by @shiv-tyagi in #129
- fix(spurd): drop privilege inside unshare wrapper, not before exec by @powderluv in #130
- chore: bump workspace version to 0.3.0 by @powderluv in #131
New Contributors
- @codetap-developer made their first contribution in #115
Full Changelog: v0.2.2...v0.3.0
v0.2.2
Changes since v0.2.1
- #107/#108: Set supplementary groups (video, render) for non-root job processes — fixes GPU device access when running as non-root
- #109: Replace GetNode heartbeat hack with proper Heartbeat RPC — cleaner separation of read/write paths, real telemetry in heartbeats
- #110: Sync CLAUDE.md and README.md with current codebase