Skip to content

v0.4.4

Choose a tag to compare

@github-actions github-actions released this 18 Aug 10:12
· 6 commits to main since this release

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 init skeleton, 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

  • -p mode 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 running thoth -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 at edit_file for changing the part that is actually
    broken. A check running clears it, and so does writing a different file.
  • 2>&1 is taken out of a command on Windows. PowerShell does not merge a
    native program's stderr into its stdout the way sh does: it wraps every
    line in an ErrorRecord, so cargo check 2>&1 came 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 of sh habit.
  • 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