Mercury CLI

Notes

Testing Nemotron 3.5 Bolt locally, GPU-aware local setup, and full IDE tools for crewmates

· by @dubsthedev

Local models have been taking some great steps lately, and I spent part of this cycle playing around with NVIDIA's new Nemotron 3.5 Bolt (nemotron-3.5-bolt:74b-a9b), a 74B hybrid Mamba-2 and MoE model with 9B active parameters per token. Getting it running on Apple silicon took a bit of digging first: llama.cpp's Metal backend compiled its MoE matrix kernel for 1, 2, 4, 5, 6, 8, 10, 16 and 22 active experts and skipped 9, so any prompt past about 32 tokens crashed the runner until we added the <9> kernel line and rebuilt Ollama 0.40.5. Once it was up on a 48 GB Mac, it ran multi-step Glob, Read, Edit and Bash loops inside Mercury at around 84 tokens per second for prompt processing and 11 to 12 tokens per second for generation. Alongside that testing, /localsetup now includes qwen3.6:35b-a3b-coding (35B total parameters, 3B active) on its pull list.

Running those longer local tasks also exposed a few places where local models were dropping out of their tool loops before finishing. Depending on the template and sampling step, models across the Qwen, GLM, Gemma 4 and Mistral families sometimes emit a tool call as raw text markup (<tool_call><function=…>, JSON inside <tool_call>, <arg_key> and <arg_value>, call:name{…} or [TOOL_CALLS]name[ARGS]{…}) instead of a structured tool-call field. Previously, Mercury printed that markup to the chat and ended the turn. In 1.0.0-beta.37, complete tool calls written in those text formats are parsed and executed while partial, malformed or quoted examples stay plain text.

We also fixed three causes of prompt-cache misses on local servers across multi-step tool loops. When ToolSearch admits a deferred tool mid-session, its schema now travels inside the ToolSearch result instead of mutating the system prompt prefix at the top of the conversation. Assistant turns that contain only reasoning blocks replay as (thinking) so strict chat templates accept them, and Edit stores the exact input object the model sent without injecting a default replace_all field. On Linux and Windows machines with a discrete graphics card, local model sizing now reads the card's own memory through nvidia-smi, rocm-smi or Ollama's Windows server.log instead of system RAM, so a machine with a 16 GB GPU and 64 GB of system RAM sizes models and context windows to the GPU.

On the delegation side, crewmates now receive the same coding and IDE toolset as the main chat, whether they run in the foreground or in the background: Eval, Test, Debug, Launch, Service, Monitor, Browser, Journey, Git, Transaction, Structure, AstSearch, AstEdit, ChangeSet, LspRead and the language-server refactor tools, Inspect, Checkpoint and Rewind. Only the surfaces that require you at the keyboard or reach outside the crewmate's own task (AskUserQuestion, ApolloReview, Computer, Journal, TaskStop, Workflow, the schedule tools and RecordConvention) stay with the main chat. We ran headless benchmarks to check that models pick up the IDE tools cleanly without trying to call main-chat-only surfaces, though wider day-to-day use across projects will test that further.

To keep parallel crewmates from leaving stray state behind, every process a crewmate starts (Bash background shells, Eval kernels, session-scoped services, debug sessions and its browser instance) is now terminated when the crewmate finishes, and its git worktree lock is released on exit so git worktree remove works right away.

Finally, /zen hides both the left and right rails when you want a full-width chat, /effort and /health open as popup windows like /model, and typing a message while a permission card is waiting no longer lets Enter accidentally approve the card. The full list of changes and fixes is in the 1.0.0-beta.37 release notes.