Summary
Two issues affecting multi-agent CI/CD workflows using droid exec in stream-jsonrpc mode:
- CLI arguments ignored:
-m/--model, --auto, -r/--reasoning-effort are ignored in stream-jsonrpc mode
- 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
- CLI arguments (
-m/--model, --auto, -r/--reasoning-effort) should work in stream-jsonrpc mode
- 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
Summary
Two issues affecting multi-agent CI/CD workflows using
droid execin stream-jsonrpc mode:-m/--model,--auto,-r/--reasoning-effortare ignored in stream-jsonrpc modesettings.json, affecting subsequent sessionsBug 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
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-effortare all ignored.Bug 2: settings.json overwrite risk
Description
When changing settings within a session (via
/modelcommand,Ctrl+N, orinitialize_sessionparams), the changes are persisted to~/.factory/settings.json. This affects all subsequent sessions.Steps to Reproduce
Expected
settings.jsonremains unchangedActual
settings.jsonis overwritten ✗Impact
In CI/CD environments running multiple agents with different models (e.g., Orchestrator with Claude, Codex agent with GPT):
Current Workaround
Pass settings in
initialize_sessionparams:{ "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
-m/--model,--auto,-r/--reasoning-effort) should work in stream-jsonrpc modesettings.json- only explicit user actions (like "Save as default") should modify itEnvironment