Skip to content
Tironian
Changelog

What changed, and why.

Including the bugs. Each entry links to the commits on GitHub.

See it in half a minute, and check it yourself

  • /tironian demo, and a Run the demo button on the Tironian page, runs the whole loop offline in about 30 seconds with no keys: a weak model refused by the gate, a retrained one passing, 20 shadow requests, a live answer and a silent fallback. Building it found two bugs: a family with only one kind of task disappeared from grouping, and savings read zero until a family had served.
  • A reply your own model helped write now ends with a small card in Hermes Desktop: which family, how many held-out steps it passed, its shadow record and the cloud tokens it saved.
  • hermes tironian passport issues a sealed record of a student: the model file's hash (checked again on disk), its training data, its training run and every test it took. --verify shows if anyone changed a number. No conversations are in it.
  • A training run on Modal failed with a dropped connection while the model was still training. Training now rides out network blips, and hermes tironian resume reattaches to a lost run without new GPU time. I used it to recover that run.
  • The page and /tironian now show cloud prompt tokens avoided per family. Count files: about 12,000 per request it answers.
  • Someone on X pointed out that holding out sessions still lets the same folders appear in training and in the test, so a model can learn my paths instead of the job. They were right: every folder in the count student's test was also in its training. New datasets now keep whole folder trees and drives out of training, every test scores never-seen folders on their own, and a student that does worse there stops serving. eval --new-places runs that check on an existing student. I ran it on the live count student with 15 new requests about C:\Windows, C:\Program Files and C:\ProgramData. It got 5 of 13 first steps right: it had learned that my files live under my home folder and wrote $HOME/Program Files. It went off duty by itself, and my usual model answers those requests again.
  • I trained v5 with whole folder trees held out ($0.19) and 22 more requests on folders outside my home. It now gets every path right. On four folder trees it never saw it wrote the right first command 44 of 51 times. That's a lower bound of 74%, under the 85% the gate asks for, so it doesn't serve yet. All seven misses were judgment calls, like counting subfolders when my usual model only looked at the top of the folder. I'm not lowering the bar to make it pass.
  • "Thanks" and "ok" are no longer treated as tasks, and asking the same thing about a different folder is no longer counted as a re-ask.

Live on my machine, and the rough edges a user would hit

The count-files student passed the gate on first steps (51 of 51, lower bound 93%), agreed with my model 18 of 20 times in shadow mode, and now answers live. Getting it there, and then using it the way a new user would, turned up these:

  • Shadow mode only collected samples once students were allowed to answer, so following the README never got past shadow. It now runs on its own.
  • Shadow mode compared answers word for word, without the judge the held-out test uses, so a different but right command counted against the student.
  • The judge ran out of its call budget mid-test, or timed out, and quietly stopped judging. It now retries, and says when steps went unjudged.
  • Ollama unloads an idle model after a few minutes, and the reload took longer than the routing deadline. Sessions now warm the student when they start.
  • The Tironian page showed the overall score of a family that passed on first steps, which read like a failure. It now shows each kind of step as the gate judged it.
  • The docs said training costs about $0.30. My runs cost $0.14, so they now say about $0.15.

Then someone asked on X how Tironian notices that a task has changed after training. It didn't, well enough, so now it does:

  • Spot checks: about 1 in 10 of a live family's requests still go to your usual model, while the student is judged against it in the background. Under 85% agreement over the last 20 sends the family back to shadow mode by itself.
  • One correction, re-ask or denied approval on a turn the student took part in is enough to send it back, instead of two bad marks.
  • Every status change starts a fresh window of evidence, so a demoted student earns its way back with new agreements.
  • /tironian forget forgets a session exactly: its data goes, and any student trained on it stops answering until it is retrained without it.
  • Students stay loaded in Ollama for an hour after each session starts, so the first request after a pause is served instead of falling back.

First real students, and a stricter, fairer test

Four count-files students were trained on Modal for about $0.15 each. The fourth writes the right command on 29 of 30 first steps it never saw. Getting there turned up a lot:

  • Students load into Ollama on their own after training. Hermes's own local runtime wasn't on my machine, and a model you have to load by hand is a model nobody tests.
  • The first step of a task and the steps after a tool result are now gated apart. The student is great at the first and weak at the second, so it serves the command and your model writes the answer.
  • When a student's command differs from yours, the blind judge decides whether both do the job. ls *.png | wc -l and find -iname are both right.
  • The training prompt and the serving prompt now match exactly, down to Qwen3's empty think block.
  • Grouping threw away "count" once count requests were most of my history, because it ignored any word in over half of all requests. Now a frequent word is ignored only if it is spread across kinds of request.
  • Sessions recorded after training join the test, so the proof grows as you work.
  • A training job whose process died mid-export no longer blocks every later run.

Fixes found on real data

Before spending anything on a real training run, the whole pipeline was run against real Hermes sessions. Three problems turned up and were fixed:

  • The trainer's environment was set up with Hermes's own Python paths visible, so it skipped installing Modal's dependencies and would have failed on its own. Every trainer call now gets a clean environment.
  • Sessions captured live were imported a second time from history, which could put the same conversation in both the training and the test data. They are now skipped, and earlier duplicates removed.
  • Grouping split one task into many small families because folder names and file types counted as differences. They are now placeholders, common synonyms are merged, and words shared by most requests are ignored.

Desktop page and status-bar chip

A Tironian page in Hermes Desktop: requests learned, answered locally, saved, each task family with its test result, live training progress, and buttons to train, shadow, promote or stop a model. Training always shows the example counts and cost first.

Tested on a real Hermes install

  • hermes plugins validate and doctor pass, including the security scan.
  • Live capture recorded every step of real streaming turns, with tool outcomes and schemas.
  • A small model answered a real Hermes turn through the middleware. When Hermes blocked its command, the usual model took over and finished the task.
  • From that test: any failed or blocked tool step now hands the rest of the turn back to your usual model.

0.1.0, first version

Capture with redaction, deterministic grading, task families, the Hermes function calling exporter, training on Modal or a local GPU, the held-out test with a Wilson lower bound gate, shadow and live routing with validation and silent fallback, the /tironian command and the hermes tironian CLI. 54 tests.