What's true now. Imp.Predict.ReActV2's :last_request_note is documented as "one line of host text put in front of it as a user message" (lib/imp/predict/react_v2.ex ~115). It's stored as a history entry that has an input and no outputs (append_note/3), and the chat adapter renders every history entry as a complete exchange. So the note's entry becomes a user message followed by a made-up assistant message:
[[ ## next_thought ## ]]
Not supplied for this conversation history message.
[[ ## completed ## ]]
That's DSPy's filler for history entries missing an output (dspy/adapters/base.py:451, DSPy 3.2.1). It's right for DSPy's History, where every entry is a finished exchange. It's wrong for Imp's own note, which isn't an exchange. As a result, the last request of an interrupted turn ends on an invented assistant reply rather than on the note. Evidence: a Dwell capture with Dwell's output renderer removed (GroveResearch/dwell#148; scratchpad imp-renders/without-output-renderer/h-budget-request-4.txt).
Target. The note reaches the model as what the docs say it is: the last user message of that request, with no made-up assistant reply after it. The same holds anywhere ReActV2 stores an input-only entry of its own making. DSPy-shaped History inputs keep DSPy's behaviour.
Done when.
- A captured last request with a note ends on the note as a user message.
- The tests fail without the fix.
- The parity differentials are unchanged, or any change is recorded with its reason.
- It ships in 0.7.0: GroveResearch/dwell#148 carries a narrow renderer only until this lands.
What's true now.
Imp.Predict.ReActV2's:last_request_noteis documented as "one line of host text put in front of it as a user message" (lib/imp/predict/react_v2.ex~115). It's stored as a history entry that has an input and no outputs (append_note/3), and the chat adapter renders every history entry as a complete exchange. So the note's entry becomes a user message followed by a made-up assistant message:That's DSPy's filler for history entries missing an output (
dspy/adapters/base.py:451, DSPy 3.2.1). It's right for DSPy'sHistory, where every entry is a finished exchange. It's wrong for Imp's own note, which isn't an exchange. As a result, the last request of an interrupted turn ends on an invented assistant reply rather than on the note. Evidence: a Dwell capture with Dwell's output renderer removed (GroveResearch/dwell#148; scratchpadimp-renders/without-output-renderer/h-budget-request-4.txt).Target. The note reaches the model as what the docs say it is: the last user message of that request, with no made-up assistant reply after it. The same holds anywhere ReActV2 stores an input-only entry of its own making. DSPy-shaped
Historyinputs keep DSPy's behaviour.Done when.