claude-code 2.1.205 Fixes Workflow Edges

By Rogier Muller07.12.26
claude-code 2.1.205 Fixes Workflow Edges

claude-code v2.1.205 is an official GitHub release for Claude Code that runs in the terminal, IDE, and GitHub. Transcript tampering, invalid JSON schemas, lost messages at turn limits, Windows worktree cleanup, background agents, MCP imports, and plugin LSP startup. This release is less about a shiny feature and more about making a Claude Code workflow survive the boring edges developers hit in real repos. For anyone tracing the boris cherny Claude Code workflow conversation, v2.1.205 is a useful marker because it turns workflow taste into concrete failure cases you can test.

Start with the release’s real shape

v2.1.205 is a maintenance release with one notable hardening change and a long tail of fixes. The new rule blocks tampering with session transcript files while Claude Code is in auto mode.

Auto mode is the Claude Code path where routine actions can proceed without stopping for every confirmation; in v2.1.205, that freedom gets a sharper boundary around session history. That matters because transcript files are not just logs. They are the trail of what happened, what the agent saw, and what a human can inspect later.

The rest of the release reads like a tour through real developer annoyance. --json-schema no longer silently produces unstructured output when the schema is invalid. Schemas using the format keyword are no longer rejected. A message sent while Claude was working is no longer silently lost when the turn ends at the --max-turns limit.

There are also fixes for background agents, claude attach, session-to-PR linking, MCP server import from Claude Desktop, and plugin LSP startup. None of these is glamorous. All of them are the kind of thing that decides whether a developer trusts an agent during a normal Tuesday.

Notice the safety boundary, not just the bug list

The transcript rule is the release’s clearest signal. Claude Code can act inside a repo, but v2.1.205 says the record of the session should not be something the agent can casually rewrite while operating in auto mode.

A good concrete test is a repo where Claude Code runs routine refactors and leaves artifacts behind: diffs, test output, PR notes, and session history. Don't treat transcript safety as “just logs.” In an agentic workflow, the log is part of the review surface.

A small convention helps here. Keep your durable repo rules short, and keep your evidence expectations explicit. A concise CLAUDE.md note like “Do not modify generated session logs or review receipts; summarize them instead” is boring in the best possible way.

This is also where Team conventions fits: conventions are useful when they turn hidden assumptions into things a reviewer can check. They should not become a giant second prompt the agent has to drag through every task.

Treat structured output as a contract

The --json-schema fixes are easy to under-rank. They matter because structured output is where many Claude Code workflows stop being chat and start becoming automation.

Before v2.1.205, the release notes say invalid schemas could silently produce unstructured output. That is a nasty failure mode. A downstream script might expect JSON, receive prose, and fail late. Or worse, it could pass a loose check while carrying the wrong shape.

The fix for schemas using the format keyword is in the same family. If your workflow asks Claude Code for structured test results, migration notes, or a review summary, the schema is not decoration. It is the boundary between “helpful answer” and “machine-readable artifact.”

Try this with a tiny review schema before trusting a bigger path. Ask for fields like files_changed, tests_run, risk_level, and follow_up. Then intentionally break the schema once and confirm the failure is visible instead of quietly falling back to prose.

Watch background agents and worktrees carefully

Several fixes are about state staying truthful after time passes. Background agents no longer remain shown as “failed” or “completed” after being resumed with SendMessage. Jobs no longer flip from “needs input” back to “working” when the agent’s turn has no readable text. claude attach now waits when a background agent is mid-upgrade restart instead of erroring immediately.

That cluster tells a story. Long-running agent work is only useful if the status line means what it says. A stale “completed” label can make you review the wrong thing; a false “working” label can make you wait on nothing.

The Windows worktree fix is sharper. v2.1.205 fixes a case where worktree removal could delete files outside the worktree when an NTFS junction or directory symlink existed inside it. If your repo uses worktrees on Windows, this is the test case you should care about before anything else.

The MCP import fix is narrower but practical. claude mcp add-from-claude-desktop no longer gets stuck when a server name contains unsupported characters; invalid names are now reported, and the remaining servers still import. That is the right failure shape: reject the bad item, keep the good ones moving.

Try it on one small repo first

Use v2.1.205 as a small regression exercise, not a ceremony. Pick a repo with one real Claude Code habit: a background agent, a schema-backed command, an MCP server, or a Windows worktree.

This is the practical section for the boris cherny Claude Code workflow crowd: the useful move is not copying someone’s exact setup. It is finding the one brittle seam in your own loop and making it testable.

A simple command workflow is enough:

git checkout -b test/claude-code-2-1-205
claude --version
claude

Then run one normal task and one edge-case task. For example, ask Claude Code to summarize a small module into a JSON schema you control, then send a follow-up message while it is still working. If you use background agents, resume one and check that the agent list tells the truth after SendMessage.

Watch for testing only the happy path. v2.1.205 is mostly about failure behavior, so your test should include at least one invalid schema, one interrupted turn, or one awkward integration name.

Copy this v2.1.205 decision table

Use this as a lightweight upgrade note in a PR, issue, or release checklist. It is intentionally small.

Change in v2.1.205 Test in one repo Good sign Hold off if
Auto mode blocks transcript tampering Run a normal auto-mode task and inspect session artifacts Claude can summarize history but not rewrite transcript files Your workflow depends on editing transcript files directly
--json-schema handles invalid schemas more safely Run one valid schema and one intentionally invalid schema Invalid schema behavior is visible, not silent prose fallback Downstream scripts still accept unstructured output
format keyword schemas are accepted Add a field such as an email, URI, or date-style value where your schema uses format Claude Code does not reject the schema just because format appears Your validator and Claude Code disagree on required shape
Messages at --max-turns are preserved Send a message while Claude is working near a turn limit The message is not silently lost when the turn ends You cannot reproduce the boundary safely
Windows worktree removal is safer around junctions and symlinks Test only in a disposable repo with a junction or directory symlink Removing the worktree does not affect files outside it You cannot isolate the test data
MCP import continues after bad server names Import from Claude Desktop with one unsupported server name Invalid names are reported and valid servers still import One bad MCP entry blocks the whole import
Plugin LSP startup is more resilient Start with one failing plugin LSP and one valid LSP server The valid LSP still serves One plugin failure still prevents the rest from starting

This table is deliberately not a policy document. It is a way to make the release notes executable in a real repo.

For a nearby release that focuses more on repository friction than this version’s edge-case fixes, read claude-code 2.1.206 Smooths Repo Friction.

Further reading

Next step

Pick one row from the decision table and run it in a disposable branch today. If the result is boring and visible, v2.1.205 did its job.