Skip to content

Saved subagent roster is truncated when a featured model is disabled elsewhere #2133

Description

@lidge-jun

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

  1. Feature 5 models on the dashboard Subagents page and Save. config.subagentModels holds all 5.
  2. Disable any one of those models elsewhere — the Models page toggle, or narrow a provider's selectedModels allowlist so the model no longer resolves.
  3. Reload the Subagents page. The disabled model is gone from the featured roster and the count shows fewer than 5.
  4. 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

  • I searched existing issues and documentation.
  • I removed secrets, tokens, account details, request credentials, and personal data.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingguiDashboard, tray, settings UIserviceService lifecycle (WinSW/launchd/scheduler)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions