<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Llm on tsvinc</title>
		<link>https://tsvinc.dev/tags/llm/</link>
		<description>Recent content in Llm 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/llm/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Image input on a 27B coder costs 1.1 GiB, once</title>
				<link>https://tsvinc.dev/posts/qwen38-27b-image-input-costs-1-gib/</link>
				<pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/qwen38-27b-image-input-costs-1-gib/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve served a GGUF with llama.cpp. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I had the memory risk of image input in the wrong place. On a 24 GB RTX 3090 that already holds a 27B coding model with a 128k-token context, I expected the dangerous request to be the full one: an image plus a context filled to the brim. Adding image input to Qwen3.8-27B makes sense: the base model is a vision-language model, and a coding agent that can read a screenshot of a failing UI or a terminal is worth having. The question was whether it still fits on the card.&lt;/p&gt;</description>
			</item>
			<item>
				<title>One open PR made MoE prompts 12-30% faster on my 3090</title>
				<link>https://tsvinc.dev/posts/open-pr-moe-prompts-12-30-faster/</link>
				<pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/open-pr-moe-prompts-12-30-faster/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve served a GGUF with llama.cpp. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;115 upstream llama.cpp commits bought my RTX 3090 at most 2.8%. The next morning, one pull request from outside upstream bought up to 29.7% in prompt speed in &lt;code&gt;llama-bench&lt;/code&gt;, and about 13% through the server that actually feeds the agents, on synthetic prompts. &lt;a href=&#34;https://tsvinc.dev/posts/llamacpp-115-commits-barely-faster/&#34;&gt;Part 25&lt;/a&gt; moved my llama.cpp build forward by those commits and measured the result on the card: prompt reading moved -0.4% to +2.8%, generation 0.0% to +0.6%. I switched anyway, mostly for the parser fixes.&lt;/p&gt;</description>
			</item>
			<item>
				<title>115 llama.cpp commits later, my 3090 was barely faster</title>
				<link>https://tsvinc.dev/posts/llamacpp-115-commits-barely-faster/</link>
				<pubDate>Sun, 01 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/llamacpp-115-commits-barely-faster/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve served a GGUF with llama.cpp. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This series is about one 24 GB RTX 3090 and the local models I serve from it as coding agents, each run scored by tests the model never sees. The models are served by llama.cpp, built from source, and since 26 October the build was master at &lt;code&gt;caa8191&lt;/code&gt;. By 31 October upstream was 115 commits further on, and the question was the routine one: did any of them do anything for this card and these models?&lt;/p&gt;</description>
			</item>
			<item>
				<title>Faster prompts, slower agents: a second engine on the 680M</title>
				<link>https://tsvinc.dev/posts/igpu-faster-prompts-slower-agents/</link>
				<pubDate>Sun, 01 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/igpu-faster-prompts-slower-agents/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a local model behind a coding agent. &lt;a href=&#34;https://tsvinc.dev/posts/igpu-bandwidth-picked-the-model/&#34;&gt;Part 1&lt;/a&gt; has the laptop and why every model here is a mixture-of-experts; &lt;a href=&#34;https://tsvinc.dev/posts/igpu-agent-runs-none-merge-ready/&#34;&gt;part 2&lt;/a&gt; has how the agent runs were graded.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;tldr&#34;&gt;&#xA;  &lt;span class=&#34;tldr-label&#34;&gt;TL;DR&lt;/span&gt;&#xA;  On a laptop&#39;s integrated Radeon 680M, UnbiasedStrata, an inference engine built around mixture-of-experts models (each token runs through a few expert blocks, a small slice of the parameters), read a 2,048-token prompt 1.4 to 1.5 times as fast as llama.cpp&#39;s Vulkan backend once warm, but only on models whose experts all fit in GPU memory. It generated slower on every model it ran: 52 to 78% of llama.cpp&#39;s speed. Three coding-agent runs on the same model file got the same grades on both engines (2, 3 and 3 out of 5) from part 2&#39;s blind review, which grades the code under a random id. They took longer on Strata: one ran out the two-hour clock, one died on the context limit. Agents spend most of their time generating, so llama.cpp stays the engine for agents on this laptop.&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;The README of UnbiasedStrata closes its human-written note with &amp;quot;Use at your own risk. Works on my machine.&amp;quot; My machine is a 2022 laptop with a Ryzen 7 PRO 6850U and its integrated Radeon 680M GPU, which has no memory of its own and borrows about 16 GB of the laptop&#39;s 30 GB of RAM. It is not the machine the README means. The engine targets an NVIDIA card with CUDA, and the 680M&#39;s chip, gfx1035, appears nowhere in the build&#39;s list of AMD GPUs, not even among the ones marked &amp;quot;unvalidated&amp;quot;. I read the warning, agreed with it, and built the thing anyway.&lt;/p&gt;</description>
			</item>
			<item>
				<title>105 identical commands and other ways local agents fail</title>
				<link>https://tsvinc.dev/posts/how-local-agents-failed/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/how-local-agents-failed/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent through a client like OpenCode. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench; &lt;a href=&#34;https://tsvinc.dev/posts/ledgers-split-the-models/&#34;&gt;part 23&lt;/a&gt; has the results by task.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;GLM-4.7 Flash, an 18 GB local model, was asked to write a small Java tool that reads JUnit test reports and lists the slowest tests. Somewhere in the run it typed this shell command:&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf test-reports &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir test-reports &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; java SlowTests --json test-reports 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The command empties a directory and then asks the tool to summarise it. After a line from the JVM about its options, the tool answered with a JSON summary that began &lt;code&gt;{&amp;quot;total&amp;quot;:0&lt;/code&gt;. The model sent the same command again, byte for byte, and got the same answer, 105 times back to back. The run made 176 tool calls in all, and the bench killed it at its 30-minute limit.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Most models passed the scripts. The ledgers split them</title>
				<link>https://tsvinc.dev/posts/ledgers-split-the-models/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/ledgers-split-the-models/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent through a client like OpenCode. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench; &lt;a href=&#34;https://tsvinc.dev/posts/agent-speed-followed-active-parameters/&#34;&gt;part 22&lt;/a&gt; covered how fast the same models run.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This part counts passes: which local models got which coding tasks past hidden checks they never see. The models run on one RTX 3090 (24 GB of VRAM), mostly served by llama.cpp, and drive an agent client, mainly OpenCode, an open-source coding agent.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; Since 15 October, through OpenCode on one RTX 3090, 18 models ran six small command-line tools in their first intake arm (a model&#39;s first batch of intake runs under one set of settings): 288 of 309 runs passed every hidden check, and 11 models passed all of theirs. 20 models ran feature work in existing Java, Go and Spring Boot code, again counting each model&#39;s first arm: 80 of 180 runs passed, no model passed all 9, five passed none. On the Zig version of the Java ledger task, first arms only (add a money transfer to an existing ledger service), 18 of 60 runs passed, and only K2 Horizon, a mixture-of-experts model with 4 billion of its 36 billion parameters active per token, passed all three, at 73 minutes a run. The best on feature work were tuned variants of the dense Qwen3.8-27B model with MTP drafting, the model&#39;s own draft layer (ThinkingCap 8 of 9, Qwen3.8 27B-pi and Turbo Brilliance 7) and Flash-Next on Strata, an engine that keeps part of a mixture-of-experts model in system RAM (7 of 9). A gap of one or two passes out of nine is inside run-to-run noise.&lt;/p&gt;</description>
			</item>
			<item>
				<title>On a laptop iGPU, memory bandwidth picked the model</title>
				<link>https://tsvinc.dev/posts/igpu-bandwidth-picked-the-model/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/igpu-bandwidth-picked-the-model/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a local model behind a coding agent. The &lt;a href=&#34;https://tsvinc.dev/series/3090-agent-bench/&#34;&gt;3090 Agent Bench&lt;/a&gt; ran the same kind of models on a desktop GPU; this series moves them to a laptop.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I ran local models as coding agents on a laptop: a Ryzen 7 PRO 6850U from 2022, with the models running on its integrated Radeon 680M GPU through llama.cpp. The first request opencode, the coding-agent client I drove them with, sent in a session was 11,000 to 12,400 tokens long, and the model had to read all of it before it wrote a word. A dense 27-billion-parameter model, one that runs every weight for every token, took 299 seconds, about five minutes, to read it. Three mixture-of-experts models of 35 to 40 billion parameters, which route each token through a few expert blocks so that only 2.5 to 3 billion parameters are active, took 77 to 78 seconds. None of them had opened a file of the project yet. Five minutes, and the agent hadn&#39;t done a single thing I could blame it for. That part would have to wait as well.&lt;/p&gt;</description>
			</item>
			<item>
				<title>On one RTX 3090, agent speed followed active parameters</title>
				<link>https://tsvinc.dev/posts/agent-speed-followed-active-parameters/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/agent-speed-followed-active-parameters/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a local model behind a coding agent. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench; this part and the next one sum it up.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The smallest file on my bench is Ternary Bonsai 2, a 27-billion-parameter model packed into 7.2 GB. Driving a coding agent, it generated 37.9 tokens per second, the median over its three batches of runs. Ornith 1.5, a 35B model in a 19.3 GB file, generated 171.2. The file 2.7 times bigger ran 4.5 times faster.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Twenty-one agent runs on a laptop iGPU, none merge-ready</title>
				<link>https://tsvinc.dev/posts/igpu-agent-runs-none-merge-ready/</link>
				<pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/igpu-agent-runs-none-merge-ready/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent through a client like opencode. &lt;a href=&#34;https://tsvinc.dev/posts/igpu-bandwidth-picked-the-model/&#34;&gt;Part 1&lt;/a&gt; covers why every model here is a mixture-of-experts.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; Seven mixture-of-experts models (each token runs through only a few expert blocks, a small slice of the parameters) ran three coding tasks each through opencode, a coding-agent client run headless in a sandbox, on a laptop&#39;s integrated Radeon 680M GPU: a Node bookmarks API, a Java access-log report and a Go status page. 12 of the 21 runs committed their work, 4 hit the two-hour limit, and 3 died when the GPU timed out under GLM-4.7-Flash, one of the seven. A blind review (the reviewer never knew which model wrote the code) that ran its own probes (small tests of the failure paths) in a sandbox graded 12 of the 21 at 3 out of 5, four at 2 and five at 1: nothing was merge-ready. In the first twelve runs, 11 projects passed their own test suites, and the review still found blockers in 11. Tiel-Coder, a 35B model with about 3B active, came closest.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The third run mattered where it cost the most</title>
				<link>https://tsvinc.dev/posts/third-run-where-it-cost-most/</link>
				<pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/third-run-where-it-cost-most/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent through a client like OpenCode. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;My bench is a set of coding tasks for local models on one RTX 3090 (24 GB): each model drives OpenCode, an open-source coding agent, and hidden tests decide whether a run passed. Until this part, a new model went through an &lt;em&gt;intake&lt;/em&gt;: every task three times, in three tiers. The &lt;em&gt;basic&lt;/em&gt; tier is six small scripting tasks, the &lt;em&gt;hard&lt;/em&gt; tier three ledger services in Java, Go and Spring with hidden core tests, and the &lt;em&gt;Zig&lt;/em&gt; tier one Zig ledger task that may run for four hours. One model&#39;s full intake cost about a day and a half of the card&#39;s time, and most of that is Zig.&lt;/p&gt;</description>
			</item>
			<item>
				<title>llama.cpp&#39;s MoE cache wants gigabytes and long prompts</title>
				<link>https://tsvinc.dev/posts/moe-cache-wants-gigabytes/</link>
				<pubDate>Tue, 27 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/moe-cache-wants-gigabytes/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve served a MoE GGUF with llama.cpp and know what &lt;code&gt;--n-cpu-moe&lt;/code&gt; does. The card and the build bump behind these numbers are in &lt;a href=&#34;https://tsvinc.dev/posts/rtx-3090-unlock-what-it-buys/&#34;&gt;The 3090 unlock is real. Where it lands is the catch&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;My agent bench runs local models on one RTX 3090 with 24 GB of VRAM. A mixture-of-experts (MoE) model too big for that can keep part of its experts (blocks of weights, of which each token uses only a few) in system RAM. llama.cpp now has a flag for that case, &lt;code&gt;--moe-cache-mib&lt;/code&gt;: a slice of VRAM that keeps the popular experts on the GPU while the rest sit in RAM. This part measures what it buys on three MoE models: Flint 40B, Ornith 35B and Flash-Next, the last too big even for VRAM and RAM together.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Flint mistyped its path and blamed the tools</title>
				<link>https://tsvinc.dev/posts/flint-mistyped-its-path/</link>
				<pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/flint-mistyped-its-path/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve driven a coding agent through a client like OpenCode. &lt;a href=&#34;https://tsvinc.dev/posts/blamed-opencode-flash-next/&#34;&gt;Part 1&lt;/a&gt; introduced the bench&#39;s sandbox.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;On 22 October a Go run of Flint 40B made 115 tool calls, and OpenCode refused 81 of them. The model spent the session working around what its summary called a &amp;quot;persistent tool-output glitch&amp;quot;, then reported its code and tests written. The workspace diff was zero bytes.&lt;/p&gt;&#xA;&lt;p&gt;The glitch was a typo. Seven calls in, the model started mistyping its own workspace path, one token off.&lt;/p&gt;</description>
			</item>
			<item>
				<title>MTP acceptance is a side effect, not a target</title>
				<link>https://tsvinc.dev/posts/mtp-acceptance-not-a-target/</link>
				<pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/mtp-acceptance-not-a-target/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you know what speculative decoding is. &lt;a href=&#34;https://tsvinc.dev/posts/benchmark-ran-without-mtp/&#34;&gt;Part 6&lt;/a&gt; covers how the bench turned on MTP drafting for the Qwen3.8 27B tunes.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The hard-tier table for Swift-1.5, a Qwen3.8-27B tune, ends in a column that reads 0.83: the share of the MTP head&#39;s draft tokens that the model accepted, averaged over every request the server logged. The server drafts three tokens ahead, and the average request keeps 83 percent of them.&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>It fits in 16 GB. That was the easy question</title>
				<link>https://tsvinc.dev/posts/kv-cache-in-system-ram/</link>
				<pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/kv-cache-in-system-ram/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run llama.cpp and know what the KV cache is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;Will it fit?&amp;quot; is the question everyone asks about a model and a graphics card, because it has a clean yes-or-no answer. A friend asked it about a 16 GB card: can Qwen3.8-27B, or its Swift-1.5 tune, at IQ4_XS (13.3 and 14.4 GiB of weights) run fully on the GPU if the KV cache goes to system RAM? He sent the flags he&#39;d run it with, &lt;code&gt;-t 8 -ctk q8_0 -ctv q8_0&lt;/code&gt;, and the question was what adding &lt;code&gt;-nkvo&lt;/code&gt; does.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The model card said think harder. The audits got worse</title>
				<link>https://tsvinc.dev/posts/more-thinking-did-not-help/</link>
				<pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/more-thinking-did-not-help/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a local reasoning model as a coding agent and know what a reasoning-effort setting does.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The Qwen3.8-27B model card lists three reasoning efforts and marks one as the default:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;xhigh&lt;/code&gt; (default): for complex tasks demanding thorough analysis&lt;/p&gt;&#xA;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;A few lines further down it adds a tip aimed at people like me:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In multi-turn agentic tasks, lower reasoning effort does not always reduce overall task completion time. Although it may produce faster per-turn responses, it can also lead to insufficient analysis, more failures, and repeated retries, which may increase total latency and token consumption.&lt;/p&gt;&#xA;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>The hard tier sorted by a rollback, not by speed</title>
				<link>https://tsvinc.dev/posts/hard-tier-rollback-not-speed/</link>
				<pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/hard-tier-rollback-not-speed/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you know how this bench grades: a prompt, a repo, and a hidden suite the agent never sees, where one failing core test makes the run FAIL.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;On 19 October this post had a title, &amp;quot;Fast models failed the hard tier&amp;quot;, and three runs per model to back it. The two fastest decoders on the box had just gone 0 of 9. So had Muse Glimmer, whose label in my model notes read &amp;quot;slow; never failed on scripting or dev tools&amp;quot;, although the same row already recorded a failed Java ledger in all four earlier arms, each for one missing rollback. I parked the draft until the remaining queues finished, so it would not age into &amp;quot;still running&amp;quot;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The hidden test asked for more than the prompt</title>
				<link>https://tsvinc.dev/posts/hidden-test-asked-for-more/</link>
				<pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/hidden-test-asked-for-more/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve seen a hidden-test agent benchmark: the model gets a task prompt and a repo, a scorer runs tests the model never saw.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;When most models fail the same check, the check starts to look like the hard part of the task. It sits in the results as a wall: four tunes of one 27B model hit it, six other models hit it, run after run. The natural reading is that the models are missing something.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The harness decided how long the model thought</title>
				<link>https://tsvinc.dev/posts/harness-set-the-thinking/</link>
				<pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/harness-set-the-thinking/</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 prefill, decode and reasoning tokens are.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;On the first run of t11, a Bash script that files an inbox of messy files by what they contain, Qwen3.8-27B wrote 62,977 characters of reasoning. The run took 425 seconds and passed. On the first run of the same task in Pi, against the same server settings, it wrote 8,911 characters, took 90 seconds, and passed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.2x faster prefill, 1.04x faster agent</title>
				<link>https://tsvinc.dev/posts/fast-prefill-slow-agent/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/fast-prefill-slow-agent/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve pointed a coding agent at a local inference server and know what prefill, decode and a prefix cache are.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before the engine was even downloaded, the research note wrote down what would get it deleted: park it if the probe &amp;quot;shows &amp;lt; 90 tok/s at ~25k on non-copy text and &amp;lt; 1.2x llama.cpp on edit turns&amp;quot;. Both legs were meant for the probe. The second, edit turns, ended up being measured with a coding agent.&lt;/p&gt;</description>
			</item>
			<item>
				<title>29 of 34 passing agent runs had a blocker the hidden tests never saw</title>
				<link>https://tsvinc.dev/posts/blind-review-agent-code-probes/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/blind-review-agent-code-probes/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a coding agent on a real task and read the diff it left behind.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; A Go transfer function written by a local model passed 15 of 15 hidden core tests, 12 of 12 detail tests and 7 of 7 mutants. Cancel the request context between its two saves and 4.00 EUR disappears. To find that kind of bug in agent output at scale:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Review each run &lt;strong&gt;blind&lt;/strong&gt;: task, &lt;em&gt;original&lt;/em&gt; README, diff, final tree, mechanical score, and nothing that names the model or harness.&lt;/li&gt;&#xA;&lt;li&gt;Score &lt;strong&gt;overall as a merge decision&lt;/strong&gt;, never an average, with mechanical caps: a reproduced money loss is a blocker, and any blocker caps overall at 3.&lt;/li&gt;&#xA;&lt;li&gt;The reviewer &lt;strong&gt;writes and runs&lt;/strong&gt; a short probe test for every failure path the task names. Reasoning about a probe instead of running it gets the review rejected.&lt;/li&gt;&#xA;&lt;li&gt;Calibrate a cheap reviewer against an expensive one on the same packets. Here the rules moved the scores, not the model.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;As of the last review filed on 15 October, 69 of 75 reviews carried at least one blocker. 34 of the 75 runs had a PASS verdict, and 29 of those still carried one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>LFM2.5 is fast. Gemma 4 finishes the job</title>
				<link>https://tsvinc.dev/posts/lfm25-vs-gemma4-26b/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/lfm25-vs-gemma4-26b/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve pointed a coding agent at a local llama.cpp server and know what MoE and a Q4 GGUF are.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; For agent work, use Gemma 4 26B-A4B. LFM2.5-24B-A2B was faster on most short single-file tasks and passed most of them. On the Spring Boot task it wrote no tests in three runs; Gemma wrote eleven in each of its three, and passed all 14 hidden core tests twice. Three runs per cell, so read these as a direction, not a rate.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My benchmark read my CLAUDE.md</title>
				<link>https://tsvinc.dev/posts/benchmark-read-my-claude-md/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/benchmark-read-my-claude-md/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve pointed a coding agent like OpenCode at a local OpenAI-compatible server.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The payload audit on 14 October was built to answer one dull question: do the coding clients in my local agent benchmark send their own sampler settings and quietly override the server&#39;s? For the model ids it captured, they didn&#39;t. OpenCode 1.18.4 and pi both sent no temperature, no top_p, nothing, and I took that as the answer for the whole benchmark.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My benchmark served the model at half speed</title>
				<link>https://tsvinc.dev/posts/benchmark-ran-without-mtp/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/benchmark-ran-without-mtp/</guid>
				<description>&lt;p&gt;Nine short agent tasks, one model, an RTX 3090. llama.cpp finished them in 1,521 seconds. open-jet, a megakernel engine, finished them in 629. That is 2.4 times faster, the kind of ratio that gets a post written about a new engine.&lt;/p&gt;&#xA;&lt;p&gt;The engine, on a different quant and drafting one token deeper, accounts for 1.29x of it. The rest came from a flag one of my scripts had and the other didn&#39;t.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Tabby turned file contents into numbers</title>
				<link>https://tsvinc.dev/posts/tabby-turned-file-contents-into-numbers/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/tabby-turned-file-contents-into-numbers/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve pointed a coding agent at a local model server with OpenAI-style tool calls.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR —&lt;/strong&gt; TabbyAPI&#39;s tool-call parser for the &lt;code&gt;qwen3_coder&lt;/code&gt; format runs every argument through &lt;code&gt;strip()&lt;/code&gt; and &lt;code&gt;json.loads&lt;/code&gt; without looking at the tool&#39;s schema. A &lt;code&gt;string&lt;/code&gt; argument whose text is valid JSON comes back as a number, boolean, null, list or object, and every argument loses its leading and trailing whitespace. For a coding agent that means &lt;code&gt;write&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt; calls with corrupted content. Upstream &lt;code&gt;main&lt;/code&gt; still has the same code as of 2026-10-16. A three-file local patch that hands the request&#39;s tool schemas to the parser fixes it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The engine got credit for the quant</title>
				<link>https://tsvinc.dev/posts/engine-got-credit-for-the-quant/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/engine-got-credit-for-the-quant/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve served a GGUF through llama.cpp and know what a quant is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Two inference engines ran the same 17-gigabyte GGUF through the same nine Zig agent runs, and each finished with 7 PASS, 1 PARTIAL, 1 FAIL. A tie is a boring result. This one was the most useful number of the week, because the evening before, one of those engines had been beating the other 7 to 3.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The models deleted the benchmark&#39;s log</title>
				<link>https://tsvinc.dev/posts/models-deleted-the-log/</link>
				<pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/models-deleted-the-log/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you&#39;ve run a coding agent inside a benchmark harness, or written one.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tool call 225 of a two-hour Zig run was two words long.&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm run-1.log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That was the last thing &lt;code&gt;qwen38pi&lt;/code&gt;, a 27B local model driven through OpenCode, did on the benchmark&#39;s ledger task. The task never mentioned the file. &lt;code&gt;run-1.log&lt;/code&gt; was the harness&#39;s live log of that same session. It was also the only thing the harness read to count the session&#39;s tool calls. The result row says PARTIAL, 8,131 seconds, &lt;code&gt;toolcalls: 0&lt;/code&gt;. (It says PASS now: a 22 October rescore stopped counting the Mermaid-diagram check toward the verdict, the one detail that run had missed.) OpenCode&#39;s own database holds 225 tool parts for the session.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Zig needed context, not time</title>
				<link>https://tsvinc.dev/posts/zig-needed-context-not-time/</link>
				<pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/zig-needed-context-not-time/</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 context compaction is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;When an agent run dies at the wall clock, the obvious diagnosis is that it was slow, and the obvious fix is a longer wall. Four 27B models on a Zig task were hitting a one-hour limit in about half their runs at 64k context, so twelve runs of the test-first prompt got four hours instead.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The deadlock test can&#39;t see a half-held lock</title>
				<link>https://tsvinc.dev/posts/deadlock-test-half-held-lock/</link>
				<pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/deadlock-test-half-held-lock/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you have written a two-account transfer under per-account locks, and know what a mutation test is.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;At 128k context and a four-hour budget, four 27B local models ran a Zig ledger task 36 times through OpenCode. All 36 passed all 15 hidden core tests. All 36 had written their own concurrency test with real threads, because the prompt asked for one.&lt;/p&gt;&#xA;&lt;p&gt;Then the scorer removed the second account lock from each &lt;code&gt;transfer&lt;/code&gt; and ran everything again. The hidden suite failed on every mutant it could score. The models&#39; own suites failed in 4 of 11 scoreable spec runs, 0 of 9 clean review runs, and 6 of 9 test-first runs.&lt;/p&gt;</description>
			</item>
			<item>
				<title>I blamed OpenCode; a 2-bit model passed Zig in it</title>
				<link>https://tsvinc.dev/posts/blamed-opencode-flash-next/</link>
				<pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/blamed-opencode-flash-next/</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 MoE and a Q2 quant are.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;OpenCode has two features that look bad in a Zig agent run at 64k context.&lt;/p&gt;&#xA;&lt;p&gt;The first is auto-compaction. When the conversation fills the window, OpenCode summarizes it and carries on from the summary. OpenCode&#39;s config docs describe the default as compacting &amp;quot;when context is full&amp;quot;. On a Zig task, that window fills with compiler errors, test files and stress-test output, and a summary can only keep so much of it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Zig&#39;s defer ends at the closing brace</title>
				<link>https://tsvinc.dev/posts/zig-defer-ends-at-closing-brace/</link>
				<pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/zig-defer-ends-at-closing-brace/</guid>
				<description>&lt;p&gt;&lt;em&gt;Assumes you have guarded a critical section with a mutex and &lt;code&gt;defer unlock&lt;/code&gt; in Go.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Moving money between two accounts under per-account locks has one famous trap, and it is the order. Lock A then B in one thread, B then A in another, and the two transfers deadlock. The textbook answer is to sort the IDs and always lock the lower one first. It is in every concurrency chapter.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
