fix(effort): daemon resolves + sends valid effort levels; mu-solo renders (mu-uvuo)#429
fix(effort): daemon resolves + sends valid effort levels; mu-solo renders (mu-uvuo)#429sahuagin wants to merge 2 commits into
Conversation
…ders (mu-uvuo) The /effort dial offered levels the model rejects (sonnet offered xhigh -> anthropic 400) because mu-solo resolved valid_effort_levels in-process via route_catalog::effort_config_for, which lands on per-provider fallbacks that cannot be per-model-correct — and a remote frontend has no catalog at all. The daemon owns the model catalog, so it now resolves and SENDS the vocabulary; the frontend renders what it is handed. - protocol: CreateSessionResponse + SetRouteResponse carry optional valid_effort_levels + default_effort (additive; older daemons omit). - daemon: create_session and session.set_route resolve via route_catalog::effort_config_for and fill the response. - mu-solo: adopts daemon levels at create and on every route switch; snaps effort to daemon default -> operator default -> first level when narrowed; route_effort_config (the local effort_config_for call) is REMOVED. Operator effort_levels config override still wins. Missing daemon fields (older daemon) keep launch levels — no local recompute. - tests: 5 new mu-solo units (replace-and-keep, narrow-snap, operator override, older-daemon degrade, response parsing).
… finding) ci-aipr panel (gpt-5.5, round 2) caught a real conflation in the original diff: the daemon omitted valid_effort_levels both for older-daemon compat and for routes with no effort config (openrouter/vllm models without catalog entries hit the empty provider fallback), so a frontend switching to an effort-less route kept the previous route's dial and effort. The daemon now ALWAYS sends the field: an empty list is the authoritative 'no effort dial for this route'; only an absent field means older daemon. mu-solo resets to the generic set on authoritative-empty (the pre-change behavior for such routes) and keeps current levels only on absent. Wire-verified: vllm/some-model create_session -> valid_effort_levels:[]. New test: uvuo_authoritative_empty_levels_reset_to_generic.
|
ci-aipr panel outcome on the original diff: ESCALATE (no consensus after 4 rounds — deepseek approved 4/4; qwen unreachable-then-unparsed; gpt-5.5 one substantive needs-changes then unparsed output-format failures). gpt-5.5's round-2 finding was REAL and is fixed in 30b23ad: the daemon omitted valid_effort_levels both for older-daemon compat and for effort-less routes (openrouter/vllm models hit the empty provider fallback), so switching to an effort-less route carried the previous route's dial forward. The daemon now always sends the field (empty list = authoritative no-dial; absent = older daemon); mu-solo resets to the generic set on authoritative-empty. Wire-verified: vllm create_session -> valid_effort_levels:[]. New unit test covers the case. Panel re-run on the updated diff is queued; artifacts from round 1 in /tmp/ai-review-consensus.HvNc4I on aiteam. |
|
Panel re-run on the updated diff (with 30b23ad): CONSENSUS APPROVE, round 1. Gate now fully green: pre-pr-check + ci-aipr panel. |
Bug (mu-uvuo; roadmap item 4)
The /effort dial offered levels the model rejects (live case: sonnet offered xhigh → anthropic 400) because mu-solo resolved
valid_effort_levelsin-process viaroute_catalog::effort_config_for— per-provider fallbacks can't be per-model-correct, and a remote frontend has no catalog at all. The daemon owns the catalog; it must resolve and send.Change
CreateSessionResponse+SetRouteResponsegain optionalvalid_effort_levels+default_effort(additive, serde-defaulted — older daemons simply omit them).create_sessionandsession.set_routeresolve viaroute_catalog::effort_config_forand fill the response.route_effort_config(the local catalog call) is removed. Operatoreffort_levelsconfig override still wins; missing daemon fields (older daemon) keep launch levels rather than recomputing.Verification
scripts/pre-pr-check.shgreen (full workspace).{"valid_effort_levels":["off","on"],"default_effort":"on"}(model-correct thinking vocab){"valid_effort_levels":["low","medium","high","xhigh"],"default_effort":"medium"}— nominimal400-trap,xhighno longer hidden (the mu-53kt symptoms).Stacking
Based on #427 (
land-jul2-line) because app.rs churn overlaps; retarget to main after #427 merges.Bead: mu-uvuo
🤖 Generated with Claude Code
https://claude.ai/code/session_012P4F7VoJPSQCvLy6duFH43