Client or integration
OpenCodex dashboard
Area
Dashboard
Summary
A saved 5-model subagent roster silently loses entries after an unrelated model-visibility change. The user sees "I configured 5 subagent models, and later there are fewer" — it looks like the proxy restart or ocx service dropped them, but the roster is actually truncated by the dashboard's own next Save.
GET /api/subagent-models returns two lists: chosen (the persisted config.subagentModels) and available (what may be picked). available excludes every model in config.disabledModels, and the Subagents page then filters chosen down to what available contains:
// gui/src/pages/Subagents.tsx
const availableSet = new Set(available);
const next = { available, chosen: (response.chosen ?? []).filter(model => availableSet.has(model)) };
So a chosen model that was disabled elsewhere (Models page, provider allowlist narrowing, a provider row being removed) disappears from the roster UI. Because Save PUTs exactly the rows the page is holding, the next Save writes the shortened list to config.json. The persisted roster is destroyed by a filter that was only meant to hide a row.
Expected: the models I explicitly saved into the 5 roster slots stay in the roster until I remove them. Disabling a model for the picker should not delete a separate, deliberate selection.
Reproduction
- Feature 5 models on the dashboard Subagents page and Save.
config.subagentModels holds all 5.
- Disable any one of those models elsewhere — the Models page toggle, or narrow a provider's
selectedModels allowlist so the model no longer resolves.
- Reload the Subagents page. The disabled model is gone from the featured roster and the count shows fewer than 5.
- Change anything on the page and press Save.
config.subagentModels on disk is now the truncated list; the removed entries are unrecoverable without a config backup.
Observed live against a running proxy (GET /api/subagent-models, 2.24.2), where two of five saved models were absent from available:
chosen: ["gpt-5.5","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.4-mini"]
available: [... 20 entries, containing neither "gpt-5.5" nor "gpt-5.4-mini" ...]
dropped by the GUI filter: ["gpt-5.5","gpt-5.4-mini"]
That instance was two Save presses away from a 3-model roster on disk.
Version
2.24.2
Operating system
macOS 15.5
Provider and model
Not provider-specific; reproduced with native gpt-5.5 / gpt-5.4-mini and routed rows alike.
Logs or error output
# GET /api/subagent-models against a live proxy
chosen: ['gpt-5.5', 'gpt-5.6-sol', 'gpt-5.6-terra', 'gpt-5.6-luna', 'gpt-5.4-mini']
AVAIL_N 20
DROPPED BY GUI FILTER: ['gpt-5.5', 'gpt-5.4-mini']
Screenshots and supporting files
Not applicable — the defect is visible in the API response above.
Redacted configuration
{
"subagentModels": ["gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.4-mini"],
"disabledModels": ["gpt-5.5", "gpt-5.4-mini", "..."]
}
Checks
Client or integration
OpenCodex dashboard
Area
Dashboard
Summary
A saved 5-model subagent roster silently loses entries after an unrelated model-visibility change. The user sees "I configured 5 subagent models, and later there are fewer" — it looks like the proxy restart or
ocx servicedropped them, but the roster is actually truncated by the dashboard's own next Save.GET /api/subagent-modelsreturns two lists:chosen(the persistedconfig.subagentModels) andavailable(what may be picked).availableexcludes every model inconfig.disabledModels, and the Subagents page then filterschosendown to whatavailablecontains:So a chosen model that was disabled elsewhere (Models page, provider allowlist narrowing, a provider row being removed) disappears from the roster UI. Because Save PUTs exactly the rows the page is holding, the next Save writes the shortened list to
config.json. The persisted roster is destroyed by a filter that was only meant to hide a row.Expected: the models I explicitly saved into the 5 roster slots stay in the roster until I remove them. Disabling a model for the picker should not delete a separate, deliberate selection.
Reproduction
config.subagentModelsholds all 5.selectedModelsallowlist so the model no longer resolves.config.subagentModelson disk is now the truncated list; the removed entries are unrecoverable without a config backup.Observed live against a running proxy (
GET /api/subagent-models, 2.24.2), where two of five saved models were absent fromavailable:That instance was two Save presses away from a 3-model roster on disk.
Version
2.24.2
Operating system
macOS 15.5
Provider and model
Not provider-specific; reproduced with native
gpt-5.5/gpt-5.4-miniand routed rows alike.Logs or error output
Screenshots and supporting files
Not applicable — the defect is visible in the API response above.
Redacted configuration
{ "subagentModels": ["gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.4-mini"], "disabledModels": ["gpt-5.5", "gpt-5.4-mini", "..."] }Checks