-
Notifications
You must be signed in to change notification settings - Fork 37
Description
Summary
Two issues affecting multi-agent CI/CD workflows using droid exec in stream-jsonrpc mode:
- CLI arguments ignored:
-m/--model,--auto,-r/--reasoning-effortare 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-jsonrpcExpected
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.jsonremains unchanged
Actual
- Session uses the specified model ✓
settings.jsonis 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