Skip to content

Bug: CLI arguments ignored in stream-jsonrpc mode + settings.json overwrite risk #628

@notdp

Description

@notdp

Summary

Two issues affecting multi-agent CI/CD workflows using droid exec in stream-jsonrpc mode:

  1. CLI arguments ignored: -m/--model, --auto, -r/--reasoning-effort are ignored in stream-jsonrpc mode
  2. settings.json overwrite risk: Changing settings in a session overwrites settings.json, affecting subsequent sessions

Bug 1: CLI arguments ignored in stream-jsonrpc mode

Description

When using droid exec --input-format stream-jsonrpc --output-format stream-jsonrpc, CLI arguments (-m/--model, --auto, -r/--reasoning-effort) are ignored. The session always uses values from ~/.factory/settings.json.

Steps to Reproduce

# Check current settings.json
cat ~/.factory/settings.json | grep model
# Output: "model": "custom:GPT-5.2-Codex-(Local)-1"

# Start droid with different model via CLI
echo '{"jsonrpc":"2.0","type":"request","factoryApiVersion":"1.0.0","method":"droid.initialize_session","params":{"machineId":"test","cwd":"/tmp"},"id":"init"}' | \
droid exec -m "claude-sonnet-4-5-20250929" --auto low -r low \
  --input-format stream-jsonrpc --output-format stream-jsonrpc

Expected

Response settings.modelId = claude-sonnet-4-5-20250929 (CLI specified)

{
  "sessionId": "95e44d3b-cbd4-4ff7-b3a8-9ed3db74620e",
  "settings": {
    "modelId": "claude-sonnet-4-5-20250929",
    "reasoningEffort": "low",
    "autonomyLevel": "auto-low",
    "specModeReasoningEffort": "none"
  }
}

Actual

Response settings.modelId = custom:GPT-5.2-Codex-(Local)-1 (settings.json default)

{
  "sessionId": "95e44d3b-cbd4-4ff7-b3a8-9ed3db74620e",
  "settings": {
    "modelId": "custom:GPT-5.2-Codex-(Local)-1",
    "reasoningEffort": "high",
    "autonomyLevel": "auto-high",
    "specModeReasoningEffort": "none"
  }
}

CLI arguments -m/--model, --auto, -r/--reasoning-effort are all ignored.

Bug 2: settings.json overwrite risk

Description

When changing settings within a session (via /model command, Ctrl+N, or initialize_session params), the changes are persisted to ~/.factory/settings.json. This affects all subsequent sessions.

Steps to Reproduce

# Check current settings.json
cat ~/.factory/settings.json | grep model
# Output: "model": "custom:GPT-5.2-Codex-(Local)-1"

# Method 1: Use initialize_session with modelId param
echo '{"jsonrpc":"2.0","type":"request","factoryApiVersion":"1.0.0","method":"droid.initialize_session","params":{"machineId":"test","cwd":"/tmp","modelId":"custom:Claude-Opus-4.5-(Local)-0"},"id":"init"}' | \
droid exec --input-format stream-jsonrpc --output-format stream-jsonrpc &
sleep 5; kill $!

# Check settings.json again
cat ~/.factory/settings.json | grep model
# Output: "model": "custom:Claude-Opus-4.5-(Local)-0"  <-- CHANGED!

# Method 2: Use /model command in interactive mode
droid
/model custom:Claude-Opus-4.5-(Remote)-2
# Ctrl+C to exit

cat ~/.factory/settings.json | grep model
# Output: "model": "custom:Claude-Opus-4.5-(Remote)-2"  <-- CHANGED!

Expected

  • Session uses the specified model
  • settings.json remains unchanged

Actual

  • Session uses the specified model ✓
  • settings.json is overwritten ✗

Impact

In CI/CD environments running multiple agents with different models (e.g., Orchestrator with Claude, Codex agent with GPT):

  • Bug 1 prevents using CLI arguments to specify per-agent settings
  • Bug 2 causes race conditions where agents overwrite each other's settings

Current Workaround

Pass settings in initialize_session params:

{
  "method": "droid.initialize_session",
  "params": {
    "machineId": "...",
    "cwd": "...",
    "modelId": "custom:GPT-5.2-Codex-(Local)-1",
    "autonomyLevel": "auto-high",
    "reasoningEffort": "high"
  }
}

This works but has the side effect of overwriting settings.json (Bug 2).

Suggested Fix

  1. CLI arguments (-m/--model, --auto, -r/--reasoning-effort) should work in stream-jsonrpc mode
  2. Session-level settings should not persist to settings.json - only explicit user actions (like "Save as default") should modify it

Environment

  • droid version: 0.57.2
  • Platform: macOS darwin arm64

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