ADR 0295: Session thinking-parameter omission
- Status: Accepted
- Date: 2026-09-20
- Deciders: PI-Desktop runtime and UX maintainers
- Amends: ADR 0194, ADR 0144, ADR 0221
- Related: D456, E2E-203a
Context
Subagents already offer thinkingLevel: omit (ADR 0194): the agent bookkeeping state stays off, but the request uses the low-level provider stream so no thinking override is synthesized. Sessions only accepted the seven canonical levels. Explicit off is not equivalent to omitting the parameter; adapters often serialize off as reasoning_effort: "none" or thinking: disabled. Users need that third choice on the Composer model × reasoning menu.
Decision
- Persist
omitas a sessionthinkingLevelalongside the seven canonical levels. Model-bindingthinkingLevelsand catalog capability lists remain the seven canonical values;omitis a client selector, not a published capability. - The Composer reasoning menu prepends
omitwhenever the selected model exposes at least one enabled canonical level. The chip renders the canonical stringomit(ADR 0221). Non-reasoning models keep anoff-only menu. - Runtime clamping preserves
omiton a reasoning model and maps it tooffotherwise. Agent bookkeeping staysoff; the parent stream uses the same low-level omit path as subagents (thinkingLevelMap.off = null). - Schema v19 rebuilds
sessionsso the CHECK includesomit. Handshake protocol version is unchanged. - Settings
defaultThinkingLevelacceptsomitwhen the binding enables any canonical reasoning level, so new sessions can start without a thinking override. Capability chips stay canonical; an off-only binding still rejectsomit.
Consequences
- Composer can leave the provider adapter's default thinking behavior in control without disabling thinking.
- Existing sessions keep their stored canonical levels.
- Subagent inherit of a parent
omitcontinues to omit. - A reasoning model's Settings default can be
omit; new sessions inherit it.