<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Claude-Code on tsvinc</title>
		<link>https://tsvinc.dev/tags/claude-code/</link>
		<description>Recent content in Claude-Code on tsvinc</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 02 Nov 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://tsvinc.dev/tags/claude-code/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>My agent guardrails passed every test. Then I used them.</title>
				<link>https://tsvinc.dev/posts/guardrails-first-real-evening/</link>
				<pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/guardrails-first-real-evening/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve set up a terminal coding agent&#39;s permission rules, or wondered what a model sees when they say no.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;For weeks, the only user my test suites knew was a fake model. The suites cover my configuration templates for six terminal coding agents (OpenCode in two major versions, V1 and V2, plus pi, omp, Hermes Agent and Claude Code): each one runs local models and refuses destructive commands even with nobody approving. Every suite drove them with &lt;a href=&#34;https://tsvinc.dev/posts/model-that-only-says-run/&#34;&gt;a scripted fake model&lt;/a&gt; in a container with no network. It was an ideal user: it ran exactly the command the test told it to, it never improvised, and it never once wanted a screenshot of anything.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My agents got their own config. Two still read mine.</title>
				<link>https://tsvinc.dev/posts/installed-apart-still-read-home/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/installed-apart-still-read-home/</guid>
				<description>&lt;p&gt;&lt;em&gt;Builds on &lt;a href=&#34;https://tsvinc.dev/posts/benchmark-read-my-claude-md/&#34;&gt;My benchmark read my CLAUDE.md&lt;/a&gt; and &lt;a href=&#34;https://tsvinc.dev/posts/claude-code-home-as-project/&#34;&gt;Claude Code read my home folder as a project&lt;/a&gt;, which explain two of the leaks below in detail.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I keep a set of config templates for six terminal coding agents: OpenCode in two major versions, pi, omp, Hermes Agent and Claude Code. They&#39;re set up to run on local models and to block destructive commands even when nobody is approving them. Anyone installing them may already have a config of their own for at least one of those agents, so the installer has a mode for that. I call it installing apart: the template goes into its own directory, &lt;code&gt;~/.config/harnesses/&amp;lt;name&amp;gt;&lt;/code&gt;, a small launcher points the agent there, and your own config is never touched. That is the whole promise, one clause long, and I wrote it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My sandbox profile had never run as shipped</title>
				<link>https://tsvinc.dev/posts/sandbox-profile-never-ran/</link>
				<pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/sandbox-profile-never-ran/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve seen Claude Code&#39;s sandboxed Bash tool; &lt;a href=&#34;https://tsvinc.dev/posts/model-that-only-says-run/&#34;&gt;The model that only says RUN&lt;/a&gt; describes the fake model used to drive it here.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Claude Code&#39;s sandbox for its Bash tool is one of the better ideas in the coding-agent world, which is why it hurt a little to find that mine had never run. On Linux it runs each command under bubblewrap, takes away the network except through its own proxy, and fences off the filesystem with lists you control. My agent-config templates ship an opt-in profile for it, set up for Java and Go work. That profile had never been run as shipped. An audit of the templates pointed it out, and the first run found three ways it would break the builds it was set up for.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Claude Code sessions can message each other. Mine didn&#39;t</title>
				<link>https://tsvinc.dev/posts/sessions-could-message-each-other/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/sessions-could-message-each-other/</guid>
				<description>&lt;p&gt;Copy, paste and a question mark: that was the protocol between two of my Claude Code sessions on 25 October, and I was the transport. The session that works on my LLM proxy had reported that the A9, one of the two GPU boxes behind the proxy, was still running a benchmark, with 223 jobs queued. At 13:33 I pasted that line into the A9 session&#39;s window and asked what the 223 meant. The answer came 32 seconds later, and at 13:36 I pasted it back into the proxy&#39;s window.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The model that only says RUN</title>
				<link>https://tsvinc.dev/posts/model-that-only-says-run/</link>
				<pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/model-that-only-says-run/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve configured a coding agent&#39;s permission rules, or wondered whether they hold.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The most useful model I ran this month has a vocabulary of one sentence. It has no opinions about code, it never reads its context, and it does exactly what the prompt tells it, every time, which is more than I can say for most of the models I benchmark. Give it &lt;code&gt;RUN: rm -rf victim :END&lt;/code&gt; and it asks the harness to run &lt;code&gt;rm -rf victim&lt;/code&gt;. That is the whole personality.&lt;/p&gt;</description>
			</item>
			<item>
				<title>To a coding agent, 503 means try again</title>
				<link>https://tsvinc.dev/posts/503-means-try-again/</link>
				<pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/503-means-try-again/</guid>
				<description>&lt;p&gt;&lt;code&gt;opencode run&lt;/code&gt; printed its banner, &lt;code&gt;&amp;gt; build · mock-err503&lt;/code&gt;, and then nothing. No error, no exit code, no output, until the run was killed. The mock server behind it answered every request with a 503 in my LAN proxy&#39;s error format: the status the proxy sent at the time for any model it couldn&#39;t serve, whether the GPU box was down, the engine switch had failed or a benchmark owned the GPU for the next few hours. opencode was retrying, and it had no plans to stop.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Claude Code read my home folder as a project</title>
				<link>https://tsvinc.dev/posts/claude-code-home-as-project/</link>
				<pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/claude-code-home-as-project/</guid>
				<description>&lt;p&gt;&lt;em&gt;Builds on &lt;a href=&#34;https://tsvinc.dev/posts/benchmark-read-my-claude-md/&#34;&gt;My benchmark read my CLAUDE.md&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Part 5 of this series told the story of OpenCode carrying my global &lt;code&gt;~/.claude&lt;/code&gt; into every bench prompt. It held up Claude Code as the client the harness had isolated properly: &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; pointed at an empty bench-local directory, and &lt;code&gt;claudeMdExcludes&lt;/code&gt; kept the repository&#39;s &lt;code&gt;CLAUDE.md&lt;/code&gt; out.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&#xA;&lt;p class=&#34;callout-label&#34;&gt;&lt;span class=&#34;callout-kind&#34;&gt;Note&lt;/span&gt;&lt;span class=&#34;callout-title&#34;&gt;Correction to part 5&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;That isolation didn&#39;t hold. Claude Code walks up from its working directory into my home directory and loads my global &lt;code&gt;CLAUDE.md&lt;/code&gt; and &lt;code&gt;~/.claude/rules/&lt;/code&gt; from there, and every bench workspace sat under it. The details are below.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
			</item>
			<item>
				<title>The model said it saw no output. It was right.</title>
				<link>https://tsvinc.dev/posts/model-saw-no-output/</link>
				<pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/model-saw-no-output/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent against a local llama.cpp server and know what a tool call is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;North-Mini-Code made eight tool calls in a Java task under Claude Code and gave every one of them the same id, &lt;code&gt;1&lt;/code&gt;. Claude Code ran all eight and logged eight real results. The model was shown one of them, a read error. Within a minute it decided the project directory was empty. From where it sat, that was correct.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Empty diff, finished code: 124,000 characters of thinking</title>
				<link>https://tsvinc.dev/posts/empty-diff-finished-code/</link>
				<pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/empty-diff-finished-code/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a coding agent against a local llama.cpp server and know what reasoning tokens are.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;16 October, the A9, K2-Horizon Q8 on llama.cpp master Vulkan, Claude Code on a Java ledger ticket:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;19:48:50&lt;/strong&gt; the session starts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;19:51:45&lt;/strong&gt; the last of 14 file reads comes back. By then the model has read the README, eleven main classes and two test classes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;20:34:44&lt;/strong&gt; the next turn ends. It is one block of thinking, 140,241 characters long, and it stops mid-sentence.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;20:48:50&lt;/strong&gt; the 60-minute timeout kills the process.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Files changed: 0. Score: 29 points, the score the matrix gives an untouched repository. The obvious reading is a model that sat in a loop for an hour. The 43-minute turn in the middle says otherwise.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to tell when your coding agent lied, not just failed</title>
				<link>https://tsvinc.dev/posts/coding-agent-lied-not-just-failed/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/coding-agent-lied-not-just-failed/</guid>
				<description>&lt;p&gt;A rollback that discards its own failure is a bug.&#xA;A rollback the README promises, with no rollback code under it, is a lie.&lt;/p&gt;&#xA;&lt;p&gt;Both of these come from Zig runs of the same transfer task on my local agent bench. The first agent&#39;s commit message says &amp;quot;a store failure part-way through rolls back so neither balance changes&amp;quot;, and the code tries:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zig&#34; data-lang=&#34;zig&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Commit both balances. A failure on the second save rolls back the first, so either both&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// change or neither does.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;errdefer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_acc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The undo exists, and its &lt;code&gt;catch {}&lt;/code&gt; drops a failed undo on the floor. The second agent&#39;s README says &amp;quot;All or nothing: either both balances change or neither does, including when the AccountStore fails part-way through.&amp;quot; The code under it:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Seven FAILs, one setting: rerunning agents at 262144 tokens</title>
				<link>https://tsvinc.dev/posts/seven-fails-one-setting-262144/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/seven-fails-one-setting-262144/</guid>
				<description>&lt;p&gt;A FAIL in the agent matrix reads like a verdict on the code. The agent wrote something, the hidden tests caught it, next row.&lt;/p&gt;&#xA;&lt;p&gt;Three of the FAIL rows from the A9 score 100 points. Every hidden test passes in them, and every mutant is caught. The code is finished and correct. What failed was the session. Each one had grown to just under 131072 tokens of context when the next request crossed the line. The server refused it, and Claude Code exited with an error. The matrix grades that exit as well as the code.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Inventing the work vs promising what isn&#39;t there</title>
				<link>https://tsvinc.dev/posts/inventing-work-vs-promising-what-isnt-there/</link>
				<pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/inventing-work-vs-promising-what-isnt-there/</guid>
				<description>&lt;p&gt;After stage 1 the ask was simple: separate the models whose code is wrong from the models that say things that never happened. A rollback that exists and breaks is a bug. A test suite that exists only in the closing summary is something else.&lt;/p&gt;&#xA;&lt;p&gt;That sounds like one more column in the results table. It took three labels, a keyword rule, consistency passes that changed five labels, and a ruling on what counts as a lie before the last column could be filled in.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Read the transcript, not the gate</title>
				<link>https://tsvinc.dev/posts/read-the-transcript-not-the-gate/</link>
				<pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/read-the-transcript-not-the-gate/</guid>
				<description>&lt;p&gt;The prompt asks for one file, &lt;code&gt;hello.py&lt;/code&gt;, containing &lt;code&gt;print(&#39;hi&#39;)&lt;/code&gt;, and then asks the agent to stop. The model is Qwen3-Coder-Next at Q8, served by llama.cpp on the A9, driven by Claude Code. Its reply comes back in one turn. It reports the file made, line and all, and signs off.&lt;/p&gt;&#xA;&lt;p&gt;The session transcript holds one user message, one assistant message, and nothing between them. No Write. No Bash. No tool call of any kind. No file was written, because nothing ever tried to write one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The fastest model finished first by stopping first</title>
				<link>https://tsvinc.dev/posts/fastest-model-finished-first/</link>
				<pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/fastest-model-finished-first/</guid>
				<description>&lt;p&gt;&lt;code&gt;zig build test&lt;/code&gt; comes back with one line that matters:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;src/service.zig:30:9: error: declarations are not allowed between container fields&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The agent is gpt-oss-120b under opencode, about 480 seconds into a 5400-second budget, and this is its tenth failing &lt;code&gt;zig build test&lt;/code&gt; since second 204. It reads the file. Its reasoning works out the fix in detail: &amp;quot;We need to move TransferReceipt and TransferError out of struct. We&#39;ll delete lines 29-40 ... Let&#39;s edit to delete.&amp;quot;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
