reasoning_content를 생성했을 때 assistant 연속 처리마다 전체 프롬프트를 재처리하는 문제를 수정했습니다. requiresReasoningContentForToolCalls / thinkingFormat: "zai"가 없는 compat 프로필에서 openai-completions 인코더가 재직렬화 시 보존된 thinking 블록을 삭제하여, chat 템플릿이 <think>…</think> 없이 assistant 턴을 다시 렌더링하고 렌더링된 토큰이 슬롯의 KV 캐시 상태와 달라지는 문제가 있었습니다. auto-learn capture-at-stop nudge 기능이 매 턴마다 이 문제를 재현하게 했습니다. 이제 인코더는 새로운 compat.replayReasoningContent 플래그가 설정되면 보존된 thinking을 reasoning_content로 재생합니다(스트림된 시그니처를 인식할 때 — reasoning_content / reasoning / reasoning_text — 그리고 opaque 시그니처에는 설정된 reasoningContentField로 폴백). cross-API transformMessages 술어(openAICompletionsReplaysUnsignedThinking)는 model.reasoning 게이트보다 먼저 같은 플래그를 인정합니다. 따라서 발견된 로컬 대상(spec에서 upstream /models 엔드포인트가 이 기능을 광고하지 않기 때문에 reasoning: false 포함)으로 전환해도 이전 턴의 thinking 블록을 conversation 텍스트로 강등하는 대신 시그니처를 제거한 reasoning으로 보존합니다. chat-템플릿-렌더링된 프리픽스는 턴 간에 바이트 안정성을 유지하고 llama.cpp의 프리픽스 KV 캐시가 생존합니다. (#3528)OpenAICompat.replayReasoningContent를 추가했습니다. 이 기능은 기본 제공 로컬 OpenAI 호환 제공자(llama.cpp, lm-studio, vllm, openai-completions 상의 ollama)와 loopback / RFC1918 / *.local baseUrl을 지정하는 모든 제공자에 대해 자동 활성화됩니다. spec.reasoning에서 게이트되지 않습니다. llama.cpp / lm-studio / openai-models-list의 runtime discovery 경로는 upstream /models 엔드포인트가 이 기능을 광고하지 않기 때문에 reasoning: false를 하드코딩하는 반면, 스트림 파서는 여전히 들어오는 reasoning_content 델타를 thinking 블록으로 기록합니다. spec 플래그에서 게이트하면 발견된 모든 로컬 Qwen / DeepSeek 모델이 #3528을(를) 재발동시킵니다. 인코더는 턴에 실제로 thinking 블록이 존재할 때만 reasoning_content를 씁니다. 따라서 이 플래그는 순수 텍스트 히스토리에서는 작동하지 않습니다. 기본 제공 프록시 제공자(현재 litellm)는 관련 없는 upstream으로 forward하여 KV 캐시 이점을 얻지 못하고 추가 필드에서 400 오류가 발생할 수 있으므로 두 검사에서 모두 제외됩니다. llama.cpp 스타일 백엔드 앞에서 커스텀 프록시를 실행하는 사용자는 sparse compat.replayReasoningContent: true 재정의를 통해 옵트인할 수 있습니다. 이 플래그는 보존된 thinking 블록이 모든 assistant 턴에서 reasoning_content로 재방출되어야 함을 openai-completions 인코더에 신호합니다. 따라서 필드에서 <think>…</think>를 재구성하는 chat 템플릿(Qwen3, DeepSeek-R1, GLM-5.x)은 이전 턴의 토큰을 바이트 안정적으로 유지하고 llama.cpp의 프리픽스 KV 캐시가 생존합니다. (#3528)cmd.exe 창이 표시되는 문제를 수정했습니다. MCP 서브프로세스는 이제 모든 Windows spawn 경로에서 windowsHide를 설정합니다. (#3535)https://mcp.plane.so/http/mcp 엔드포인트에 대해 Authorization failed: An unexpected error occurred 오류와 함께 실패하는 MCP OAuth 문제를 수정했습니다. 보호된 리소스 메타데이터는 경로 범위 issuer https://mcp.plane.so/http를 광고했지만, discoverOAuthEndpoints(packages/coding-agent/src/mcp/oauth-discovery.ts)는 먼저 _origin root_에서 /.well-known/oauth-authorization-server을(를) 탐사하고 여기서 제공하는 메타데이터를 수락했습니다. 이는 /authorize 엔드포인트가 모든 grant를 거부하는 다른 issuer(https://mcp.plane.so/)을(를) 설명합니다. Discovery는 이제 RFC 8414 §3.3을(를) 따르고 issuer 필드가 쿼리된 base URL과 일치하지 않는 authorization-server / OpenID Connect well-known 문서를 건너뜁니다(trailing-slash 무시). issuer을(를) 생략하는 서버는 오늘의 permissive 동작을 유지하므로 레거시 워크플로는 영향을 받지 않습니다. (#3537)전체 변경 로그: v16.1.21...v16.1.22