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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions