![]()
0.36.0 adopts AGENTS.md for project instructions and hardens the WebSocket API — request correlation, acknowledgments, strict input validation, and a fix for the most annoying integration bug we had. After 0.35.0's Condenser, this one is a sharpening release with two themes: speak the standard everyone else speaks, and make the wire protocol boring in the best sense of the word.
AGENTS.md: one file, every agent
Octomind used to have its own convention: an INSTRUCTIONS.md loaded at session start and a CONSTRAINTS.md appended to every request, each configurable through its own config.toml key. It worked, and it was ours alone — which is exactly the problem. Your repo shouldn't need one instructions file per tool.
The standard that won is AGENTS.md — a plain Markdown file in the project root that any compliant coding agent picks up. So 0.36.0 drops our convention and adopts the standard:
-
AGENTS.mdis auto-loaded from the project root whenever it exists. No configuration, no opt-in key. If the file's there, your session starts with it. - Template placeholders still work — the content goes through the same variable processing as before, so
AGENTS.mdcan reference the role and project context dynamically. - Internally it's still wrapped in
<instructions>tags as a system-managed message, so compression, task detection, and lesson extraction never mistake your project instructions for a genuine user request.
This is a breaking change. The custom_instructions_file_name and custom_constraints_file_name keys are removed from config.toml, and the per-request constraints mechanism is gone with them. Migration is one git mv:
git mv INSTRUCTIONS.md AGENTS.mdIf you relied on CONSTRAINTS.md, fold its content into AGENTS.md — in practice the two files always ended up saying the same things, and appending the same constraints block to every single request was a token tax we're glad to stop charging. One file, stated once, cached once.
The WebSocket API grows up
Octomind's WebSocket server is how anything that isn't a terminal talks to a session — editors, panels, bots, your own tooling. 0.36.0 gives it the properties you'd demand from an API you build on:
Request correlation and acknowledgments. Every client message — session open, user message, command — now takes an optional request_id. The server immediately answers with an ack frame echoing it, and if the request fails, the error frame carries the same request_id. Fire three requests down one socket and you can finally tell which response belongs to which request, and which one died. Before this, a multiplexing client was guessing.
The stuck-on-"working" hang is fixed. Command completions used to be reported with the same data-less status frame as the connection handshake, so a client that issued /done (or any plain command) had no way to know the turn was over — it just sat in the working state forever. Command results now carry a payload that distinguishes them from the handshake. If you've integrated against the WebSocket API and papered over this with a timeout, you can delete the timeout.
Input hardening. Messages are capped at 10MB, request_id at 256 bytes, command strings must be non-empty without a leading slash, and unsupported binary frames are rejected gracefully instead of ambiguously.
No session loss on errors. Sessions are saved before error responses go out, and the save calls that could previously panic mid-connection now report an error over the socket instead. A malformed request can cost you a request; it can no longer cost you the session.
This API is about to carry a lot more traffic than your local editor — more on that very soon.
Empty completions now fail loudly
Some providers occasionally return a perfectly successful HTTP response containing nothing: no text, no tool calls, no structured output, finish_reason: stop. Octomind used to treat that as a normal end of turn — render nothing, return to the prompt, leave you wondering whether it's thinking or dead.
0.36.0 classifies that as what it is — a provider fault — and raises an error naming the provider and model. The classification is deliberately narrow and unit-tested so a tool-only or structured-output response can never be misread as empty. No silent retry layer added on top; transport retries already live in the provider's own max_retries, exactly once.
Leaner internal model calls
The Supervisor makes auxiliary model calls that will never use a tool — conversation compression, lesson extraction. Until now those calls still shipped the full MCP tool definitions with every request, paying input tokens for schemas the model was never going to call. 0.36.0 adds a tools toggle to the completion path and switches both internal call sites to without_tools; token accounting skips the tool overhead accordingly. Invisible in behavior, visible on the bill.
Upgrade
# Homebrew (macOS / Linux)
brew install muvon/tap/octomind
# or from crates.io
cargo install octomindPrebuilt binaries for every platform are on the releases page. Remember the one migration step: rename INSTRUCTIONS.md to AGENTS.md, and fold CONSTRAINTS.md in if you had one.
0.33 argued the framework is the product, 0.35 made it cheaper, and 0.36 makes it a better citizen — of your repo, where it now reads the same file as every other agent, and of your stack, where the wire protocol finally behaves like infrastructure. Small release, fewer surprises. That's the point.



