Summary
The droid daemon process starts successfully but never creates a TCP LISTEN socket, causing all mission worker spawns to fail with:
Spawn error: factoryd is not reachable (failed to start). Ask the user to restart Droid to recover.
Reproduced on two different machines, two different OS platforms, two different droid versions. The daemon produces zero log output and no error messages.
Environment
Machine 1 (macOS)
- OS: macOS 26.3 (Darwin 25.3.0), arm64
- Droid version: 0.73.0
- Shell: zsh
- Auth: BYOK custom models via local proxy (
cliproxya on port 8317)
Machine 2 (Linux)
- OS: Linux 6.18.9-arch1-2, x86_64
- Droid version: 0.58.0
- Shell: zsh
- Auth: BYOK custom models
Reproduction
# Start daemon
droid daemon --host 127.0.0.1 --port 63000 &
sleep 8
# Verify process is running
ps aux | grep "droid daemon"
# → droid daemon --host 127.0.0.1 --port 63000 ← process exists
# Check for LISTEN socket
lsof -i :63000 # macOS
ss -tlnp | grep 63000 # Linux
# → EMPTY — no listener
# Verify port is bindable (not a firewall/port issue)
node -e "require('net').createServer().listen(63000, '127.0.0.1', () => { console.log('OK'); process.exit(0); })"
# → OK
# Verify firewall is off (macOS)
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
# → Firewall is disabled. (State = 0)
Also tried:
--host localhost --port 62917 (original auto-assigned config)
--host 127.0.0.1 --port 63000
--debug flag (produces zero additional output)
- Multiple restarts and fresh starts after
killall droid
Result is identical every time: process starts, makes outbound HTTPS connections to Factory servers (216.150.x.x), but never binds a local LISTEN socket.
lsof output for the daemon process (macOS)
# Only outbound connections, zero LISTEN sockets:
droid PID user 10u IPv6 ... TCP [2601:...]:64051->[2600:9000:...]:https (ESTABLISHED)
droid PID user 14u IPv4 ... TCP 10.0.0.158:64055->216.150.16.129:https (ESTABLISHED)
droid PID user 17u IPv4 ... TCP 10.0.0.158:64058->216.150.1.129:https (ESTABLISHED)
droid PID user 19u IPv4 ... TCP 10.0.0.158:64060->216.150.1.129:https (ESTABLISHED)
Impact on Missions
When running a mission, droid auto-starts the daemon to spawn worker sessions. Since the daemon never listens, every worker spawn fails. The mission retries repeatedly and eventually pauses.
Progress log from a real mission (progress_log.jsonl):
{"type":"mission_run_started","message":"Mission artifacts authored..."}
{"type":"worker_failed","spawnId":"worker_d68407dc","reason":"Spawn error: factoryd is not reachable (failed to start). Ask the user to restart Droid to recover."}
{"type":"mission_run_started","message":"Retrying mission run after factoryd connectivity failure..."}
{"type":"worker_failed","spawnId":"worker_2b0aad38","reason":"Spawn error: factoryd is not reachable (failed to start). Ask the user to restart Droid to recover."}
This repeated 12+ times across multiple pause/resume/restart cycles. Zero workers were ever successfully spawned. The mission completed 0 of 20 features.
Log analysis
~/.factory/logs/droid-log-single.log
Shows [LocalDaemonClient] close() called with hadConnection: false — the client-side confirms it never established a connection:
[LocalDaemonClient] close() called | Context: {"value":{"caller":"droid-cli","hadConnection":false}}
~/.factory/logs/console.log
Contains repeated WASM crashes from yoga-layout during mission worker spawn attempts:
ERROR: An unexpected critical error occurred {
error: RuntimeError: Out of bounds memory access (evaluating 'MA.apply(null,W9)')
at <anonymous> (../../node_modules/yoga-layout/dist/binaries/yoga-wasm-base64-esm.js:33:52)
at OWB (../../node_modules/ink/build/renderer.js:32:49)
at onRender (../../node_modules/ink/build/ink.js:177:56)
context: 'Uncaught exception'
}
Daemon stdout/stderr
Zero output, even with --debug flag.
Settings
{
"sessionDefaultSettings": {
"model": "custom:gpt-5.4",
"reasoningEffort": "high",
"autonomyMode": "auto-high"
},
"missionModelSettings": {
"workerModel": "custom:gpt-5.4(high)-0",
"workerReasoningEffort": "none",
"validationWorkerModel": "custom:gpt-5.4(high)-0",
"validationWorkerReasoningEffort": "none"
},
"customModels": [
{
"model": "gpt-5.4(high)",
"id": "custom:gpt-5.4(high)-0",
"baseUrl": "http://127.0.0.1:8317/v1",
"apiKey": "sk-dummy",
"provider": "openai"
}
]
}
Questions
- Does the daemon require a Factory-hosted subscription to function, or should it work with BYOK-only configurations?
- Is the daemon expected to work when started standalone (
droid daemon --port X), or must it be launched internally by an interactive session?
- Are missions supported for BYOK-only users?
Possibly related issues
Summary
The
droid daemonprocess starts successfully but never creates a TCP LISTEN socket, causing all mission worker spawns to fail with:Reproduced on two different machines, two different OS platforms, two different droid versions. The daemon produces zero log output and no error messages.
Environment
Machine 1 (macOS)
cliproxyaon port 8317)Machine 2 (Linux)
Reproduction
Also tried:
--host localhost --port 62917(original auto-assigned config)--host 127.0.0.1 --port 63000--debugflag (produces zero additional output)killall droidResult is identical every time: process starts, makes outbound HTTPS connections to Factory servers (216.150.x.x), but never binds a local LISTEN socket.
lsofoutput for the daemon process (macOS)Impact on Missions
When running a mission, droid auto-starts the daemon to spawn worker sessions. Since the daemon never listens, every worker spawn fails. The mission retries repeatedly and eventually pauses.
Progress log from a real mission (
progress_log.jsonl):This repeated 12+ times across multiple pause/resume/restart cycles. Zero workers were ever successfully spawned. The mission completed 0 of 20 features.
Log analysis
~/.factory/logs/droid-log-single.logShows
[LocalDaemonClient] close() calledwithhadConnection: false— the client-side confirms it never established a connection:~/.factory/logs/console.logContains repeated WASM crashes from yoga-layout during mission worker spawn attempts:
Daemon stdout/stderr
Zero output, even with
--debugflag.Settings
{ "sessionDefaultSettings": { "model": "custom:gpt-5.4", "reasoningEffort": "high", "autonomyMode": "auto-high" }, "missionModelSettings": { "workerModel": "custom:gpt-5.4(high)-0", "workerReasoningEffort": "none", "validationWorkerModel": "custom:gpt-5.4(high)-0", "validationWorkerReasoningEffort": "none" }, "customModels": [ { "model": "gpt-5.4(high)", "id": "custom:gpt-5.4(high)-0", "baseUrl": "http://127.0.0.1:8317/v1", "apiKey": "sk-dummy", "provider": "openai" } ] }Questions
droid daemon --port X), or must it be launched internally by an interactive session?Possibly related issues