Two hundred and twenty commits since v0.1.62. The agent got smaller and more
honest, the transcript got readable, and updates now come from our own feed.
The tool surface: 118 became 16
A long tool list does not sit quietly in the model's context — it competes for
attention, and past about twenty definitions the model starts picking a
plausible wrong one or inventing a name. Thirty-four of ours were shell
wrappers, and a model drives a shell from training rather than from sixteen
descriptions it has to read first.
- The git, gh, npm, tsc, eslint, format, LSP, snapshot, memory and index tools
are gone.execute_commandreplaced all of them. search_codeworks with no key of anybody's: the embedder now follows the
keys that exist instead of defaulting to one nobody had.read_filereturns a window with a map — 500 lines plus the file's symbol
outline — instead of a 17,000-token dump.update_plancame back, because the harness could not see a plan written in
prose. The transcript row is the tool call.sessionslets a chat read and message the app's other chats.- A registry test fails above twenty tools, so adding one back is a decision
rather than a side effect.
The transcript reads like a record of work
- One line per step, folded into a run with a sentence that says what happened:
"Ran 3 commands (1 failed), read 2 files". - Repeated calls collapse into one row with a count, and a repeat that was
failing is marked — the loop is the finding. - Short thoughts ride as a chip on the step they led to; long reasoning keeps
its words. - A run past eight steps windows down, and Inspect opens the whole truth in
the rail. - The plan docks over the composer; the answer stands before the receipts.
Updates come from our own feed
- The updater reads
updates.vellumcode.comrather than a public GitHub repo,
which keeps real client IPs in the logs and lets the feed file carry
no-storewhile installers stay immutable. - Release notes travel inside the feed, so the update modal is never blank.
- CI dropped macOS — ten times the minutes for an installer Gatekeeper blocks —
and the Linux checks moved to a self-hosted runner.
The CLI is a real package
npm i -g vellum-code now works: the published package ships a bundle, because
Node refuses to strip types under node_modules. vellum task gained the
subagents it was missing, and background commands work without a terminal
emulator.
The model is told the truth more often
- One behaviour contract written three ways — terse for Claude, explicit for
OpenAI, spelled out for open-weights models. - The system prompt splits into a cacheable half and a per-turn half, so the
~4,100-token prefix stops being re-evaluated every turn. - A tool call the model typed in its chat template's syntax now runs as the
call it is. - A SEARCH that matches twice edits nothing and says so; a failed SEARCH says
where the file actually differs; CRLF checkouts match. - A model repeating itself is stopped instead of streamed for an hour.
- Edit-time diagnostics for every language with a server, not just TypeScript.
- Compaction prunes on an absolute token floor, not only a fill ratio, and
hands its casualties to the read-before-edit tracker.
Fixes worth naming
- A rebuilt agent came back with no memory of the conversation — a model switch
made it answer as if the chat had just begun. - Stopping a background session left its process running, so a dev server kept
its port after the tool said it was stopped. - A search engine's bot challenge was read as an empty web, and the agent gave
up and guessed a URL. - A project folder that is gone says so instead of throwing.
- Every project-less chat gets its own sandbox instead of sharing one folder.