Skip to content

Make reasoning_effort configurable per stage - #27

Merged
justinmclean merged 2 commits into
mainfrom
feat/reasoning-effort
Aug 29, 2026
Merged

Make reasoning_effort configurable per stage#27
justinmclean merged 2 commits into
mainfrom
feat/reasoning-effort

Conversation

@justinmclean

Copy link
Copy Markdown
Owner

What this changes

qwen3.8-27b defaults to xhigh and produces reasoning blocks that dwarf the answer -- a live run's transcript shows the model re-deriving the check's own constraints (section ordering, the 120-character minimums, which issue numbers are citable) at length before doing any work. There was no way to ask for less: the payload was model + messages + tools and nothing else.

reasoning_effort resolves through the same chain as the model -- [harness.profiles.NAME.] -> [harness.profiles.NAME] -> [harness.] -> [harness] -- because it is a per-stage decision for the same reason the model is. decompose and judge are single bounded calls where deliberation is cheap; execute runs a tool loop and pays the cost on every turn.

Sent only when configured, so an endpoint that rejects unknown keys sees no change by default. Validated at load against a known set, and for every profile rather than only the selected one: an unrecognised value would otherwise be forwarded verbatim, ignored by the server, and leave a run that looks configured and is not.

Checklist

  • One work item only — nothing unrelated bundled in
  • make check is green locally
  • Tests cover the change, including refusal paths (the negative cases
    are the product)
  • No test, acceptance criterion, or check was weakened to get green
  • No changes under specs/ (spec changes go through an issue first)
  • Docs updated where behaviour changed (README / USAGE.md)
  • Commit subjects are imperative; Generated-by: trailer present if an
    agent wrote the change

qwen3.8-27b defaults to xhigh and produces reasoning blocks that dwarf
the answer -- a live run's transcript shows the model re-deriving the
check's own constraints (section ordering, the 120-character minimums,
which issue numbers are citable) at length before doing any work. There
was no way to ask for less: the payload was model + messages + tools and
nothing else.

reasoning_effort resolves through the same chain as the model --
[harness.profiles.NAME.<stage>] -> [harness.profiles.NAME] ->
[harness.<stage>] -> [harness] -- because it is a per-stage decision for
the same reason the model is. decompose and judge are single bounded
calls where deliberation is cheap; execute runs a tool loop and pays the
cost on every turn.

Sent only when configured, so an endpoint that rejects unknown keys sees
no change by default. Validated at load against a known set, and for
every profile rather than only the selected one: an unrecognised value
would otherwise be forwarded verbatim, ignored by the server, and leave a
run that looks configured and is not.

Measurement caveat worth recording: probing an LM Studio endpoint with a
short prompt showed no difference between xhigh, medium and low (119/141/
129 reasoning tokens). That probe was too easy to make the model think at
any setting, so it is evidence about the probe, not about the parameter.
@justinmclean
justinmclean merged commit fb7e648 into main Aug 29, 2026
2 checks passed
@justinmclean
justinmclean deleted the feat/reasoning-effort branch August 29, 2026 02:41
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