Repository navigation
Miwarang Senpi Delegate v0.3.0
Model choice now comes from each target harness's live catalogue: configured candidates are validated and skipped when unavailable, OMO-side model names are rejected instead of silently substituted, and foreground opencode runs recover to the next candidate when a provider endpoint fails.
Fixed
- OMO-pinned model names no longer reach a target or get silently substituted there.
commandcode --model cloviela/glm-5.3-flashused to succeed via the CLI's unknown-prefix short-name fallback (glm-5.3-flash->z-ai/glm-5.3-flash, a paid subscription model); amodeloverride now must exist in the target's live catalogue on both harnesses. - Provider failures surface their real error (
OpenCode session ... failed: provider.quota (402) Upstream request failed: Endpoint is unavailable.) instead of a generic "returned no assistant text". - Lanes like
category:quickno longer die when the first candidate's endpoint is down: a foreground opencode run retries the next validated candidate in the configured order (never with an explicitmodeloverride, never in background runs).
Included
- Command backends get a real availability check:
listModelsArgv(for commandcode:["--list-models"]) probes the CLI's model list, skips candidates that are not there, and marks:free/-freeids as zero-cost sofreeOnlyroutes stay enforceable on command backends too. A failed probe falls back to the configured candidates instead of blocking delegation. - Top-level
defaultModels: a shared candidate chain that every route without its ownmodelsinherits, so the model ordering lives in one place with per-route overrides. A route with neither its own list nor the shared chain fails validation. miwarang_delegateguidance and themodelparameter description now state the rule: never forward the OMO session's model (for example a model pinned inomo.jsonc); omitmodelto use the route's configured candidates.- Override rejections include the catalogue size; bare (provider-less) catalogue ids match configured candidates.
- README "Model selection and availability" documents the ordering, the paid guard, and the failover semantics;
config.example.jsoncarrieslistModelsArgvand stays byte-identical to the README example block.
Verification
bun test: 162 → 186 passing tests, 0 failures across 6 files (defaultModelsinheritance and failover covered by new suites).- Live proof (
.omo/evidence/2026-10-21-model-selection/proof-output.txt): a realcommandcode --list-modelsprobe parsed 97 models;cloviela/glm-5.3-flashwas rejected pre-run oncategory:writing(catalog: 97 models) andcategory:quick(catalog: 74 models); a valid catalogue override ran for real (reflection/beam:freeansweredCC_BEAM_OK); the failover trace attempted only catalogue-valid candidates. - End-to-end against the installed user config (
final-config-check.mjs):category:quickinherited thedefaultModelschain and answeredCHAIN_OKonopencode/minimax-m3.1-flash-freeon the first attempt. config.example.jsonvalidates againstvalidateConfig; the README example block is byte-identical to it (174 lines).