f7d90c9410
The #89503/#70058/#74295/#87279 bug class kept regenerating because every transport and provider profile hand-rolled its own effort translation map (9 sites, 4 distinct policies). New agent/reasoning_effort.py is the single source of truth: - EFFORT_LADDER: canonical low->high ordering (superset check against VALID_REASONING_EFFORTS pinned by test) - clamp_effort(): one policy — supported passes verbatim, otherwise nearest WEAKER supported level (never escalate, never invert the ladder), floor when nothing weaker, 'none' never a degradation target, declared vendor-documented overrides win, bespoke names pass through - declared wire vocabularies as data: OpenAI-compat, Codex Responses, xAI (4.6/legacy), Actual relays, Kimi K3/K2, TokenHub, GLM-5.2, DeepSeek V4, Ollama Cloud, Meta, Solar Converted sites (all behavior-preserving except noted): - chat_completions chokepoint, Kimi + TokenHub paths - codex transport (backend branches now pick a declared set) - auxiliary_client Responses path - hermes_cli.models clamp_reasoning_effort_to_supported -> thin wrapper - plugins: kimi-coding, zai, opencode-zen, deepseek, ollama-cloud, meta-ai, upstage, custom (copilot already routes via the wrapper) Behavior fixes the shared policy surfaces: - ollama-cloud/opencode-go 'minimal' now degrades to 'low' instead of being dropped (drop left the server default = MORE thinking than asked) New tests: ladder contract (every configurable level is clamped by every declared wire set; monotonicity across the full ladder for every set).