The real endpoint log (deepseek-v4-flash) shows the Responses protocol: the
thinking arrives as a 'reasoning' output item plus response.reasoning_text.delta
events, which we ignored — so the thinking never reached the transcript and
the replayed history omitted it ('reasoning_text must be passed back', 400).
- output_item.added with item.type 'reasoning' opens a thinking block;
response.reasoning_text.delta appends to it
- messages_to_responses now replays assistant thinking as a 'reasoning' item
with a reasoning_text part (before the text item)
- regression tests: reasoning capture and reasoning-item replay
- (the earlier chat-completions reasoning_content/text fixes remain for the
chat protocol)
The replay error ('reasoning_text in thinking mode must be passed back')
persisted because the endpoint emits reasoning under a name other than
reasoning_content — e.g. reasoning_text — which we never captured, so the
thinking never reached the transcript.
- capture reasoning from reasoning_content / reasoning_text / reasoning /
thinking (first non-empty wins)
- echo the captured reasoning back as BOTH reasoning_content and
reasoning_text on assistant messages
- FOCUS_DEBUG_FILE=<path> appends every raw network chunk to a file for
diagnosing provider-protocol mismatches (both providers)
- regression tests: reasoning_text capture, dual-field replay
DeepSeek's thinking mode rejects a replayed assistant message that omits its
reasoning ('the reasoning_text must be passed back to the API', HTTP 400).
The Chat Completions serializer now includes thinking blocks as
reasoning_content on assistant messages; OpenAI official never produces
thinking blocks, so the field is only sent when present — safe for both.
Regression test: a replayed assistant carries reasoning_content.
Per AGENTS.md §5.1 every test must live under crates/<name>/tests/, so the
inline #[cfg(test)] modules in harness/tools/providers/transport are gone:
- harness: session_tests / compaction_tests / prompt_tests (days_to_ymd made pub)
- tools: read / write / edit / shell tests (Tool trait imported explicitly)
- providers: config_tests; request-body and stop-reason coverage folded into
integration tests via mock-recorded requests and SSE events (private builders
no longer tested directly)
- transport: ChunkedDecoder made pub (with Default), decoder tests moved into
transport_tests.rs
The only #[cfg(test)] left in src/ is the test-only TLS infra in tls.rs.