Repository navigation
Saved subagent roster is truncated when a featured model is disabled elsewhere #2133
Description
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.subagentModelsholds all 5. - Disable any one of those models elsewhere — the Models page toggle, or narrow a provider's
selectedModelsallowlist 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.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 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.
Activity
coderabbitai commentedon Aug 19, 2026
🔗 Related PRs
#2122 - feat(catalog): config-level retainModels allowlist for authoritative discovery (
#1690) [open]📝 Issue Planner
Check the box below or use the
@coderabbitai plancommand to generate an implementation plan and prompts that you can use with your favorite coding assistant.🧪 Issue enrichment is currently in open beta.
To disable automatic issue enrichment, add the following to your
.coderabbit.yaml:💬 Have feedback or questions? Drop into our discord!
lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 58 / 80
숨김이 삭제가 되는 버그임.
GET /api/subagent-models가available을 지금 고를 수 있는 모델만으로 만듦.src/server/management/agent-settings-routes.ts:611-619이disabledModels에 있는 네이티브/라우티드를 뺌. GUISubagents.tsx가chosen을available로 필터하고 Save가 그 배열을 PUT함. 다른 페이지에서 피처 모델을 끄면 로스터 UI에서 사라지고, 다음 Save가config.subagentModels를 줄여 씀. 재시작이 지운 게 아님.관측값이 그 계약임. chosen 5개, available 20개, 빠진 게
gpt-5.5랑gpt-5.4-mini. Save 두 번이면 디스크가 3칸임. PUT 쪽(:626-636)은 받은 배열을 그대로 저장함. 필터가 GET+GUI에 있어서 서버가 “고른 슬롯은 유지”를 모름.점수는 58임. 데이터 손실은 맞는데 native 503이나 bearer 401(#2132)만큼 급하진 않음. 피처 로스터 5칸 쓰는 사람만 맞음. types.ts/config.ts 분할이랑 안 겹침. 닫으라는 쪽 아님.
해결방안은 #2134임. chosen id는 disabled여도
available끝에 남기고, 로스터에 없는 disabled는 그대로 숨김. 피커는 안 바꾸고 슬롯만 지킴.fetchGrokCandidateModels가 꺼진 모델을 스위치용으로 남기는 거랑 같은 모양. GUI 필터를 풀면 PUT이 꺼진 모델을 다시 살릴 수 있어서 API 쪽이 맞음.이 댓글은 grok-bot이 작성했습니다
fix(subagents): keep a saved roster slot listed when its model is dis…
fix(subagents): keep a saved roster slot listed when its model is dis…
lidge-jun commentedon Aug 20, 2026
Fixed on
devby #2134, merged as 930840c.Verified present on the branch rather than assumed:
git log origin/devshows the merge commit above. These PRs targetdevrather thanmain, so GitHub does not auto-close the linked issue — this closure is manual.It ships in the next release cut from
dev. Reopen if you still see it after updating.fix(subagents): keep a saved roster slot listed when its model is dis…
fix(subagents): keep a saved roster slot listed when its model is dis…