Skip to content

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

Closed

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.

Activity

  1. coderabbitai commented on Aug 19, 2026

    @coderabbitai
    Contributor
    🔗 Related PRs

    #2122 - feat(catalog): config-level retainModels allowlist for authoritative discovery (#1690) [open]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  2. added
    guiDashboard, tray, settings UI
    serviceService lifecycle (WinSW/launchd/scheduler)
    on Aug 19, 2026
  3. lidge-jun commented on Aug 19, 2026

    @lidge-jun
    OwnerAuthor

    리뷰 · 우선순위 58 / 80

    숨김이 삭제가 되는 버그임. GET /api/subagent-models가 available을 지금 고를 수 있는 모델만으로 만듦. src/server/management/agent-settings-routes.ts:611-619이 disabledModels에 있는 네이티브/라우티드를 뺌. GUI Subagents.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이 작성했습니다

  4. added 2 commits that reference this issue on Aug 20, 2026
    d8e98d4
    5df624b
  5. lidge-jun commented on Aug 20, 2026

    @lidge-jun
    OwnerAuthor

    Fixed on dev by #2134, merged as 930840c.

    Verified present on the branch rather than assumed: git log origin/dev shows the merge commit above. These PRs target dev rather than main, 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.

  6. added 2 commits that reference this issue on Sep 17, 2026
    f7297e6
    7c45736
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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