Skip to content

Daemon never binds to TCP port — missions fail with "factoryd is not reachable" #784

@z80dev

Description

@z80dev

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

  1. Does the daemon require a Factory-hosted subscription to function, or should it work with BYOK-only configurations?
  2. Is the daemon expected to work when started standalone (droid daemon --port X), or must it be launched internally by an interactive session?
  3. Are missions supported for BYOK-only users?

Possibly related issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions