Repository navigation
The model is unchanged: no re-download.
Serial decode 11.8 → 12.6 tok/s on the shipped GGUF (+6.7%), drafted 48.1 → 49.6 (+3.0%), bit-identical. The IQ4_XS, Q4_K and Q5_K decoders in mlx_gguf.py read their quant bytes as aligned 32-bit words instead of one byte load per value: the same values in the same order, so every output is bit-identical to before, and the GEMV on the format that carries 38% of the file goes from ~154 to ~180 GB/s on an M4 Pro. Receipts and the per-format bandwidth map in benchmarks/gguf_decoders/.
A resumed session does not re-read its conversation. Only the messages used to survive a session, so chad -c prefilled the whole transcript again: at the ~100 tokens a second the shipped model reads, a 20k-token conversation was three minutes of silence before the first new token. Quitting the TUI or the REPL now also writes the engine's cache to ~/.cache/chad/kv and records where in the session file; chad -c, --resume and /resume restore it in well under a second (measured bit-identical to the live cache at 4k, 12k and 24k tokens) and read only what is new. The resumed session keeps the system prompt it ran under, since the cache was built on it. The files share the warm prefix's disk budget (CHAD_KV_CACHE_MAX_GB); a session that was not quit cleanly, or one from another model or window, resumes cold as before. CHAD_NO_KV_RESUME=1 turns it off.
A resumed session remembers what the harness knew. The facts chad gathers for the result channel — which files the session edited, the outcome of the test command before its first edit, which files it had already shown a symbol map for — were reset on every resume, so a resumed session could not say whether a failure predated it and decorated files the transcript already explained. They are now saved with the conversation and restored with it.
Compaction no longer throws the cache away. On the shipped hybrid model a compaction used to re-read every token after the first change — in one recorded session 73,000 tokens re-read to free 20,000, 43% of the wall clock. The engine now keeps the cached rows of everything that survived the edit, moves them to their new positions, and reads only the text compaction inserted. The recurrent layers continue from a state that has just read the same text the edited transcript has at that point. CHAD_NO_SCR=1 restores the old behaviour. (Suffix Cache Reuse, Shao et al. 2026, reimplemented for MLX.)
/accept works after the plan is revised. The handoff was remembered only when the model wrote the file; a revision is an edit, so the first steer ended in "no plan pending". Edits now count, /accept accepts any plan file, and /accept with nothing pending lists the newest plans. In plan mode a write can no longer replace a plan file the session did not write.
The docs describe the chad that ships. They said chad decodes greedily (it samples at temperature 1.0), that the turn governor is for one-shot runs only (it applies to every session), and that conversations are saved only on resume (every one is). Examples are written as chad … and run however chad was installed, the first-run disk requirement (~30 GB) is stated, and the messages chad prints link to pages that exist.
/mcp shows what you are being asked to trust. A gated project server was listed by name only. /mcp now shows the command it would run or the URL it would reach, and /mcp trust lists what it trusted, refuses a directory with no .mcp.json, and says so when the trust store cannot be saved. A stored login is tied to the URL it was made for: a project server that reuses the name of one of yours needs its own login.
A !command in the TUI shows its output. It went through the renderer for the model's tool calls: six lines of a success, and only the exit status of a failure. It now shows up to 200 lines, keeping the head and the tail of anything longer, and a failing command shows what it printed.
Quitting mid-turn no longer loses the turn. ctrl-d and /exit closed the app under the running turn, which was never saved. They now stop the turn, wait for it to save, and then close. ctrl-c on an empty prompt asks for a second press, text cleared with ctrl-c goes to the input history, and a /reset that has to be deferred keeps your queued messages.
Resuming shows what you are resuming. chad -c names the session by its title and prints the last things you asked, as /resume and --resume now do. The pickers list all 20 kept sessions instead of 10, and chad says when saving removes the oldest one.
Yolo says when its sandbox is not there. Inside another sandbox (CI, a container harness, another agent's shell) the yolo sandbox cannot be applied and commands run unconfined. That was only written to a log that is off by default. Entering yolo now prints it, as it does when CHAD_NO_SEATBELT is set.
The environment guard says what it withholds. An interactive session now lists the credential-shaped variables chad's commands will not see. They used to vanish without a word: git push failed on a missing ssh-agent and aws fell back to the default profile. A command you type yourself with ! is no longer filtered.
/undo can be undone. It restored over whatever was in the workspace, including your own edits since the last checkpoint, without saving it. It now snapshots that state first and names the checkpoint, says "nothing to undo" when nothing differs, and reminds you that the model has not been told about the revert.
MCP and skill problems are shown when they happen. The first turn of a session prints one line with how many MCP servers connected, failed or are waiting, and names the wait while it connects. /mcp and /skills list every warning, with skipped files ahead of duplicates; they used to show three. /mcp login and /mcp run off the UI thread, so the approval URL appears while the login is still waiting for it.
Failures at startup say what to do. A model that fails to load in the TUI now shows the cause and the fix and the status row stops saying "ready". A --model path that does not exist is reported as a missing path instead of a download problem, and a GGUF chad cannot read is a message, not a traceback. --plan --yolo, -c --resume, --repl with a task, and the remote flags without --backend llama are errors; each used to be resolved silently.
Ctrl-c outside the TUI was a traceback. In --repl and one-shot runs the first ctrl-c now ends the turn at its next step and the conversation is saved; a second one quits. Interrupting the first-run download says that re-running resumes it, and an interrupted chad prove still prints the rows it measured.
--repl --plan was not read-only. The plain REPL never received the start mode, so --plan and --repl together ran in normal mode. It now starts in the mode asked for. A slash command that does not exist (/hepl, /undo 2, or /undo in the REPL, which only the TUI implements) is reported with a suggestion instead of being sent to the model as a task.
A one-shot run reports how it ended. chad "task" exited 0 whether the task landed or every attempt ran out of budget. It now exits 1 when chad stopped the turn and 130 on an interrupt. With stdout piped or redirected, only the final answer is written to it and the trace goes to stderr without colour codes; NO_COLOR is honoured.
chad says which project instructions it read. A CLAUDE.md or AGENTS.md longer than 4,000 characters was cut without a word, an empty CLAUDE.md hid the AGENTS.md beside it, and /init wrote a CLAUDE.md that replaced an existing AGENTS.md. The session now names the file, says when it was cut or when a second file is ignored, skips empty files, and /init improves the file the project already has.
A keystroke meant for a sentence can no longer approve a command. y and n answer a pending approval only on an empty input box, and not in the first 0.4 s the panel is on screen. v prints the complete command or diff: the panel cut bash commands at 400 characters and showed edits as two clipped blobs.
A mistyped CHAD_* number no longer depends on which variable it was. The memory-sizing knobs are checked at startup and stop the run with the variable, the value and the fix. A garbled CHAD_CTX_SAFETY used to be swallowed and replaced the RAM governor with a fixed 120k window. The budget knobs say once on stderr when a value is ignored, and chad levers prints the registry when CHAD_DISABLE is wrong.
The TUI stopped saving after a reset. /reset, /clear, /accept, /resume and the continue-fresh handoff all replaced the agent with one that never wrote the session, so chad -c resumed the conversation from before the reset. Every agent the TUI builds now saves.
A stopped turn says why. The loop guard and the repetition guard ended a turn without printing anything: the explanation was returned to callers that discarded it. Both now print, the other four stops lost their jargon, and the TUI's handoff line says what typing will do instead of calling every stop a budget.