v0.15.1 — a node that fails says why
A node that cannot start should say why, not go dark.
omnyserver node start --hub wss://hub:8081 --id web-01 --principal p --token t
Connecting to wss://hub:8081/node …
hub rejected the connection (forbidden): principal p may not register node web-01
(the node.register action needs the "node" role)Fixed — node start was silent when a connection failed
The signal was never missing. The node runtime already receives the Hub's rejection — the exact reason, principal … may not register node … — but its logger defaulted to a no-op that OmnyServer never replaced. So a node that authenticated and was then refused registration (a grant with the wrong role) retried forever without a word. Finding a one-line misconfiguration took a live packet trace.
The runtime now logs through the CLI:
- A failure and its cause are printed once — repeats within a short window are collapsed, so a node that keeps retrying a rejection it cannot fix says why once, not once per backoff. It stays up and recovers automatically when you fix the grant.
Connecting to <url> …prints before it blocks, and a terminal auth failure exits witherror: <reason>instead of an unhandled exception and a stack trace.--verbose(-v) shows the full lifecycle — every attempt, handshake and heartbeat.
Fixed — a wedged capability probe could freeze registration
Capability detection shells out to docker, nvidia-smi, clinfo and the like, and the scanner waits for every probe before a node can register — with no timeout on any of them. One stuck command (a hung GPU driver, a wedged Docker daemon) would freeze the whole node, silently. Each probe now has a deadline; a timed-out probe is killed and the capability treated as absent.
Changed
- The Hub logs a refused node registration on its own side too (
refused registration: … needs the "node" role), sojournalctlshows it, not only the audit trail. - Requires omnyhub ^1.7.0, which delivers a registration rejection to the node as a typed error the moment it arrives. Before it, a refused node waited out the register timeout (10s) on every attempt; now it fails — and logs why — at once.
Full notes: CHANGELOG.md