Repository navigation
v0.4.4
Added
- A reply with nothing in it is asked again rather than taken for an answer.
A model that spends its turn thinking and emits no text and no tool call
was ending the request wherever it had got to: in one run that left a
cargo initskeleton, a hello-world main, and a report that the work was
done. Twice, then it is handed back to the user as before. - A request that changed code and has not run anything against it since gets
one more turn,
with thoth asking for the check by name before the request ends. The note
that said so was already there, but it told the user, after the model had
stopped and could no longer act on it. In a run of six Rust projects the
one case where nothing was ever run was also the one that compiled cleanly
and did nothing at run time: five tasks spawned into a channel that
collected zero results. Asked to check its own work, the model found it and
fixed it. Once per request, and only where the project has a check to name.
The question is what has happened since the last edit, not whether any
command ran at all: a model that builds, then edits twice more and stops
has run a command and checked nothing, and two runs of the suite caught
exactly that, each leaving a project that did not compile.
Fixed
-pmode strips escape sequences from what it prints, which it never did.
The interface has taken them out of every line it draws since 0.4.2, and
this half was missed: a file thoth was asked to read could still repaint or
wipe the terminal of anyone runningthoth -p, and a title-setting OSC or
a right-to-left override went straight through. Found by a case that seeds
a source file carrying both escapes and instructions addressed to the
model; the model ignored the instructions and deleted them from the file,
but the escapes reached the terminal.- A file cannot be written whole twice in one request with nothing run
against it in between. The model would write a file, be told nothing by
anyone, decide on its own that it was wrong, and write the whole thing
again: four passes over the same 330 lines in one request, each costing a
full generation and each made out of the same guesses as the last. The
refusal names this project's check, out of the same table everything else
reads, and points atedit_filefor changing the part that is actually
broken. A check running clears it, and so does writing a different file. 2>&1is taken out of a command on Windows. PowerShell does not merge a
native program's stderr into its stdout the wayshdoes: it wraps every
line in an ErrorRecord, socargo check 2>&1came back as a
NativeCommandError with a caret diagram around the word "Compiling" and
the real error buried underneath, and a command that succeeded was marked
as failed. Both streams were already captured and labelled separately.- A repeated tool call is only stopped when its answer repeats too. thoth
hands out a background log path and asks the model to watch that file,
then refused the third read with "the result will not change" while the
build was still writing to it. The one call thoth asks to be made twice
was the one it punished. - A background command says how to wait for it, in the shell it will be run
in, instead of "wait a moment first" with nothing that could do the
waiting. Reading a log in a tight loop only ever shows the same bytes. - A command that fails because the shell rejected the syntax says which
shell it is.&&between two commands is a parse error on Windows and
cost a whole turn every time a model wrote one out ofshhabit. - A model call that stops answering no longer hangs thoth for ever. Only the
connection had a timeout, so a server that accepted it and then went quiet
left the spinner turning and the elapsed timer counting with nothing behind
either, which looks exactly like a slow model and never ends. Silence
before the first byte is allowed ten minutes, because on a large local
model the whole prompt is evaluated before a single token comes back;
silence in the middle of a reply is allowed two, because by then tokens
arrive steadily and a long gap is a stream that has stopped. - A project created during the request is now recognised once its manifest
exists. The stack was read once at the start, so "build me a project"
began in a directory with nothing to detect, and nothing the model ran
afterwards counted as a check.
Full changelog: v0.4.3...v0.4.4