Repository navigation
v1.2.0
RFC 0002 and
RFC 0003. Additive to contract "1", with one
default behavior change (max_steps / max_tool_calls, opt-out below); everything from
RFC 0003 is opt-in.
Changed
- A run never ends on
max_steps/max_tool_callswithout an answer (SPEC §10.1).
The last allowed step goes withtool_choice: noneand an ephemeral engine note (answer
with what you have); a refusedmax_tool_callsbatch, or a budget used up exactly, makes
the next step text-only. The model answers →completed / end_turnwith the new
limit_reached. No answer (empty, a tool call anyway, a provider failure, a budget) →
stopped_limitwith a fixed localized fallback as the last assistant message and
answer_source: "fallback".limits.final_answer: falserestores the old behavior
exactly. Harnesses that showedstopped_limitas an error should render its answer
(new obligation H22). - A model that calls a tool despite
tool_choice: noneis refused by the AI SDK; on the
final step that attempt is no longer retried.
Added
- Journal on disk (SPEC §12.4, §4.9).
LOG_DIRturns on daily JSONL files that survive
restarts;LOG_RETENTION_DAYS(7),LOG_DIR_MAX_BYTES(2 GB) and
LOG_DISK_CONTENT_MAX_CHARS(200 000) bound them.GET /logsreads memory first and
falls back to disk; the response gainssource: memory | disk | mixed, the query gains
daysandinline_prompts. Entries on disk carryboot_id. - Prompts by hash.
run_startstoressystem_sha256; the text is kept once in memory
and once per day file (prompt_blob), andGET /logsinlines it back by default. - One presentation per run (SPEC §6.9).
tools[].presents,output_checks[].presents
andlimits.max_presentations: presenting calls are admitted in order up to the budget;
once it is spent, presenting tools are hidden and refused (tool_calls[].status: presentation_limit) and presenting fences are cut (output_checks[].status: suppressed).result.presentationslists what reached the user. - Blocks belong to the final answer (SPEC §5.4).
output_checks[].interim: "drop"
removes blocks of the fence from the text of tool steps, from the stored message and the
next prompt; SSEoutput_checkdropped. - Configurable repeat tolerance (SPEC §6.7).
limits.max_repeated_calls(default 1,
ceiling 3);0disables tools on the first repeat. - Grounded values (SPEC §5.4).
output_checks[].grounded: [{ path, tools }]requires
values at a JSON Pointer (with*) to come fromokresults of the listed tools; an
invented value goes through the normal repair (outcome: ungroundedin the journal). - Journal events
presentation,presentation_limit,interim_block_dropped. - Journal events
final_answer,journal_retention,journal_pruned,
journal_disk_ephemeral;step_start.final_answer_stepwithcontent.engine_note;
run_done.limit_reached/answer_source.