- The active provider in
C:\Users\sunda\.cc-switch\cc-switch.dbisZhipu GLM(4f9dea17-b9fd-4aa8-ab90-2222e77b8818). It is still the older Coding Plan Chat configuration: base URLhttps://open.bigmodel.cn/api/coding/paas/v4,apiFormat=openai_chat, andcodexProtocolMode=manual. - Its persisted
codexChatReasoningsayssupportsThinking=true,thinkingParam=thinking,effortParam=reasoning_effort, andoutputFormat=reasoning_content, but the provider meta has nocodexReasoningProjection. The model catalog rows forglm-5.3andglm-5.3-flashalso have no schema-v2reasoningobject. resolve_codex_chat_reasoning_projection()intentionally fail-closes manual protocol mode: it emitsRawReasoningTextonly for the exactcodexReasoningProjection=raw_reasoning_text; any missing/other value becomesReasoningProjection::None. The streaming converter then accumulates Chatreasoning_contentbut emits no Responses reasoning SSE when the projection isNone.- Runtime logs prove the route is
/responsesexternally but converts to/chat/completionsathttps://open.bigmodel.cn/api/coding/paas/v4/chat/completions. The protocol profile for GLM is independently verified as Chat, with readable reasoning fromchoices[].message/delta.reasoning_content; therefore the upstream did return reasoning and the loss is at CCSM's projection policy boundary. - Logs also warn that GLM catalog reasoning declarations are ignored because
disableAllowedis missing. This is a stale/incomplete persisted catalog issue and explains the warning, but it is not the direct visibility blocker while the explicit provider-level Chat reasoning config remains present. - The current source preset has already moved Zhipu GLM to native Responses (
https://open.bigmodel.cn/api/v1) and includes complete schema-v2 reasoning metadata. The active database provider has not been migrated to that preset, so source and runtime configuration are not the same.
resolve_codex_chat_reasoning_projection()now preserves the explicitcodexReasoningProjection=raw_reasoning_textbehavior and, when that field is absent, derivesRawReasoningTextonly from an explicitcodexChatReasoning.outputFormat=reasoning_contentdeclaration.- Manual providers without a reasoning-content declaration still fail closed;
reasoning_summaryis never synthesized from manual metadata and still requires verified Responses protocol evidence. - Regression coverage is green: the legacy GLM Chat shape now resolves to raw
reasoning, the anti-summary safety test passes, and all 136
codexprovider unit tests pass. - The fix was built and installed with the recovery-capable CCSM transaction.
The first attempt intentionally rolled back after detecting the NSIS-patched
executable hash; the second attempt used that observed installed hash and
succeeded. Final runtime proof: PID
58292, listener127.0.0.1:15721,/health=200,/status.running=true,listener_role=takeover, and zero failed requests at the verification snapshot.
Do not fix this by only adding disableAllowed to the catalog. For the currently active Chat route, either persist the exact raw projection (codexReasoningProjection=raw_reasoning_text) or move the provider out of manual protocol mode and let a verified, target-bound Chat profile select the projection. A separate migration is needed if the intent is to use the current native Responses preset.