Skip to content

fix(provider): keep carried pieces apart in Chat, so a switched-from thought never runs into its answer - #48

Merged
benjipeng merged 1 commit into
mainfrom
fix/chat-carried-text-separator
Sep 23, 2026
Merged

benjipeng merged 1 commit into
mainfrom
fix/chat-carried-text-separator

Conversation

@benjipeng

Copy link
Copy Markdown
Contributor

What

Stage 28 found in the terminal: after a model switch, Chat Completions glued a carried thought onto the answer with nothing between them (...in one sentence.Muse Spark answer 1: ...), the concatenation the stage's plan meant to prevent. Messages, Responses and Gemini already keep each carried piece as its own block; Chat's content is one string, so the pieces now sit a blank line apart. PRV-3's degradation paragraph says so, with the list-of-text-parts alternative rejected: some compatible gateways refuse it on an assistant message.

Verified

Local: prv_3_chat_keeps_carried_pieces_apart_with_a_blank_line, which fails with the glued string on the old encoder; all provider crate tests, clippy, fmt, citations, typos. Found by driving the real binary through /effort max, a reasoning reply and /model in a PTY against two loopback models. CI not yet observed.

…thought never runs into its answer

A model switch carries a finished thought over as text. Messages, Responses and Gemini give each
carried piece its own block, but Chat's assistant content is one string, and its degraded encoder
appended the pieces with nothing between them: the next model read "...in one sentence.Muse Spark
answer 1". Found driving stage 28 in a terminal against two loopback models. Carried pieces now
sit a blank line apart. The user chose that over a list of text parts, which some compatible
gateways refuse on an assistant message.
@benjipeng
benjipeng merged commit 7405bca into main Sep 23, 2026
3 checks passed
@benjipeng
benjipeng deleted the fix/chat-carried-text-separator branch September 23, 2026 17:52
benjipeng added a commit that referenced this pull request Sep 23, 2026
## What

Closes stages 16 and 28. The user tested both in their terminal on 2026-09-23 against two loopback models: `/effort max` applied at the idle boundary and reached the next request as `max`; switching to another model carried the first model's finished thought across as text, a blank line from its answer (#48), with the notice once; switching back replayed the original reasoning in its own field. Both plans are deleted; the phase file and roadmap say complete. The one decision only stage 28's plan held, rejecting a second press to arm a switch, now sits beside MDL-1. Live-provider acceptance of degraded shapes stays marked unproven in the phase file.

## Verified

Local: citations, frames, typos and the pre-commit gates. The request log from the user's run shows the efforts, wire ids and message shapes above. Documents only. CI not yet observed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant