reticle serve starts the daemon: the WebSocket bridge your app dials into, plus the tool engine behind it. It spawns a detached child and then waits for that child to answer /status before reporting success.
reticle mcp, which starts a daemon itself if one is not already up.
Flags
What it prints
One structured line. When a daemon already owns the port, it says so and does nothing:reticle_daemon_spawned with the port. A port held by something that is not a Reticle daemon is refused up front rather than spawned into:
Exit codes
serve reports the bind, not the spawn. It used to exit 0 the moment it forked, while the
child died on an EADDRINUSE nobody joined back up. It now waits for the daemon to answer.Worked example
What the daemon is
The bridge, the tool engine, and where
.reticle/ lives.