The turn end record
Off unless [miner] turn_end = true. The trace carries what the assistant wrote before a search; this carries what it concluded.
When a turn ends, the agent's end-of-turn hook sends the router's POST /v1/turns one record. What it is for, and how to turn it on, is on The turn end.
Fields
| field | carries |
|---|---|
session_id, turn_id | The same hashed ids the turn's searches carried. |
harness | Which agent. |
status | completed, interrupted or failed. |
final_text | The assistant's last message of the turn, scrubbed of secrets, last 32 KiB. Only on a completed turn, and absent when there is no message to send; the status is sent either way. |
final_chars, truncated | Its length before the cut, and whether it was cut. |
user_text | What you asked in that turn, scrubbed of secrets, first 32 KiB. Claude Code, Cursor, opencode and Codex. Absent for a turn Claude Code started rather than you: a continuation or loop tick, a background task's result, a message from another session, the output of a ! command, or the summary it writes when it compacts the conversation. |
steps | The turn in order: what the assistant wrote (scrubbed, capped), and for each tool it called the tool's name, duration and whether it succeeded, where the agent records them. Never a tool's input or output. A search of ours is marked by its call id. Claude Code, opencode and Codex in full; under Cursor, the searches only. |
model, usage | The model, and the turn's token counts. Claude Code, Cursor, opencode and Codex. |
When it is sent
Only for a turn in which a jevlin search was served: search marks the turn after the router answers, so a search you refused, or one that failed, does not count, and a turn with no served search sends nothing. Only to the router miner.router_url names; without that line nothing is sent.
Under Claude Code, a subagent searches under the turn that launched it, and one running in the background can do so after that turn has ended; that turn is then reported late, by the next turn end in the session, with what you asked, its steps and its last message as the transcript holds them. Only a subagent's search makes a turn late: a turn you interrupted after the agent itself searched sends nothing, but one in which a subagent searched is reported late, as completed, since the hook cannot tell it from a turn that ended. A turn is reported once: a search under a turn already reported does not report it again. Under Codex and opencode a subagent runs a turn of its own, and its search is joined to no turn end.
The hook writes the record to an owner-only file in sessions/, and a detached jevlin turn-end sends it once and deletes the file, sent or not. JEVLIN_TRACE=off turns it off too.
Which agents
Claude Code (2.1.196 or later), Cursor, opencode, and Codex where its hooks are installed (macOS and Linux). Other agents send none. Codex's turn is read from Codex's own session file when the turn ends; a subagent's turn sends nothing of its own, and the calls that started and awaited it appear as tool calls.
What is never sent
With turn_end on, what you typed in a searched turn is sent. What your tools read and wrote never is: not a file's contents, not a command, not its output. The model's private reasoning and a subagent's own steps are not sent either. A project set to retain no content keeps the status and not the text. The scrub that runs over final_text and user_text is the one on The trace.