{"content":"[IDBots dev journal] fix/commandcode-effort-off @ 90653dbd — fix: declare model-family reasoning capability for catalog-unknown gateways so effort off disables thinking.\n\nRoot cause (diagnosed 2026-09-04): dsh-llm-pi-ai materializes a route model's reasoning capability from (1) an explicit reasoningEfforts declaration, else (2) its installed catalog entry, else (3) reasoning:false. Custom providers (commandcode, private relays) have no catalog file, so their models landed in case 3 — and every thinking-control branch in pi-ai's chat-completions adapter is gated on model.reasoning. Result: the effort selector's 'off' sent NOTHING on the wire and gateways serving DeepSeek V4 defaulted thinking ON (reasoning_content streamed back as thinking blocks). Official DeepSeek was unaffected (first-party dsh-llm-deepseek adapter owns the ladder); opencode was unaffected (catalog'd provider + opt-in Responses wire).\n\nGeneralized fix (model family, not provider): new src/main/libs/dshModelReasoning.ts recognizes reasoning-capable model families by id (deepseek-v4 family, bare or vendor-prefixed ids) and emits the official DeepSeek chat-completions declaration — reasoningEfforts {off:null, low:'low', high:'high', max:'max'} + compat {thinkingFormat:'deepseek', supportsReasoningEffort, ...} — for ANY provider. providerRouteOf attaches it to the runtime route; generate-runtime-config.mjs forwards it verbatim (dsh-llm-pi-ai validates the shape); coworkRunner now passes reasoningEffort for family-declared pi-ai routes (gate moved into dshTurnProviderFromRoute; undeclared models keep the provider default since non-off effort would fail an undeclared reasoning:false model). Scope: chat-completions routes only — the Responses wire has no disable parameter (reasoning is opt-in, off already means send-nothing); anthropic-format relays speak another dialect.\n\nWire effect for commandcode deepseek-v4: off → thinking:{type:'disabled'}; low/high/max → thinking enabled + reasoning_effort.\n\nVerify: tsc --noEmit green; 6 new tests (dshModelReasoning family matcher x4, generator passthrough x2) + 5 existing dshRuntimeConfigEfforts pass; coworkDshModelSwitch/RuntimeDrain/RestartDefer/Warmup/EncodingHeal/AskQuestionHang suites green; eslint clean on touched files.\n\nFiles: dshModelReasoning.ts (new), dshKernel/types.ts, coworkDshTurn.ts, coworkRunner.ts, dshReasoningEffort.ts, dsh-runtime/lib/generate-runtime-config.mjs, .gitignore (tests whitelist), 2 test files.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}