Convert std::process::Command → tokio::process::Command so SSH
spawn/wait_with_output yield the tokio worker instead of blocking it.
Stdin write uses AsyncWriteExt::write_all. This, combined with the
earlier tokio::time::sleep fix, makes the entire mother registration
async — no thread is ever blocked during SSH retries.
Replace three std:🧵:sleep calls with tokio::time::sleep().await
in try_register_hw_with_mother. The function is now async so retry
delays yield the tokio worker instead of blocking it — the detached
task won't starve the daemon's other async work (scheduler, heartbeat,
socket handlers) during SSH retries.
Layer 1 — rc.d ordering:
- Add tailscaled to colibri_daemon REQUIRE so the daemon doesn't start
before the tailscale daemon is running.
Layer 2 — autospawn hook:
- After agent spawn, if clawdie-hw-probe was collected, read
external-mcp.json to detect a 'mother' server entry.
- If configured, SSH to mother and call node_register via colibri-mcp
with 3 retries / 5s backoff (tailscale auth can lag).
- Runs in a detached tokio task so SSH retries never block the daemon.
The probe data is already collected at autospawn time and passed to
the agent via CLAWDIE_HW_PROFILE; this addition closes the loop by
actually sending it to the mother node as a best-effort side effect.
Sam & Claude