Skip to content

fix(effort): daemon resolves + sends valid effort levels; mu-solo renders (mu-uvuo)#429

Open
sahuagin wants to merge 2 commits into
land-jul2-linefrom
effort-daemon-authority
Open

fix(effort): daemon resolves + sends valid effort levels; mu-solo renders (mu-uvuo)#429
sahuagin wants to merge 2 commits into
land-jul2-linefrom
effort-daemon-authority

Conversation

@sahuagin

@sahuagin sahuagin commented Jul 7, 2026

Copy link
Copy Markdown
Owner

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_levels in-process via route_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

  • protocol: CreateSessionResponse + SetRouteResponse gain optional valid_effort_levels + default_effort (additive, serde-defaulted — older daemons simply omit them).
  • 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; when the set narrows, snaps effort to daemon default → operator default → first level; route_effort_config (the local catalog call) is removed. Operator effort_levels config override still wins; missing daemon fields (older daemon) keep launch levels rather than recomputing.

Verification

  • scripts/pre-pr-check.sh green (full workspace).
  • 5 new mu-solo unit tests (replace-and-keep, narrow-snap, operator-override, older-daemon degrade, response parsing).
  • Live wire probe against the built daemon:
    • ollama/qwen3.6:27b → {"valid_effort_levels":["off","on"],"default_effort":"on"} (model-correct thinking vocab)
    • openai_codex/gpt-5.5 → {"valid_effort_levels":["low","medium","high","xhigh"],"default_effort":"medium"} — no minimal 400-trap, xhigh no 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

…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.
@sahuagin

sahuagin commented Jul 7, 2026

Copy link
Copy Markdown
Owner Author

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.

@sahuagin

sahuagin commented Jul 7, 2026

Copy link
Copy Markdown
Owner Author

Panel re-run on the updated diff (with 30b23ad): CONSENSUS APPROVE, round 1. Gate now fully green: pre-pr-check + ci-aipr panel.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant