<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Seth Wheeler</title><description>Systems write-ups: a from-scratch Kubernetes API that answers to real kubectl, a browser tab scheduler that holds a memory budget, a search engine with no Elasticsearch.</description><link>https://sethwheeler.dev/</link><language>en-us</language><item><title>Choosing Video Frames by Content Instead of by a Clock</title><link>https://sethwheeler.dev/blog/content-aware-frame-selection/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/content-aware-frame-selection/</guid><description>At an equal frame budget, uniform sampling missed 9 of 28 shots across five real videos and spent 12 of its 40 frames re-photographing things it had already seen. Content-aware selection missed none and wasted two; here is the measure where it still comes out level, and the one video where uniform sampling wins.</description><pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate><category>measurement</category><category>llm</category><category>computer-vision</category><category>python</category></item><item><title>Ranking Language Models by How Well They Spot Liars</title><link>https://sethwheeler.dev/blog/ranking-models-on-spotting-liars/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/ranking-models-on-spotting-liars/</guid><description>I built a benchmark to rank language models on spotting liars, then ran 522 games of Mafia through it. The same model scored -0.400 and +0.078 in one run, 52 games apart. Day 1 accusations came in at -0.005 against chance on n=2,103, and the whole thing reproduces in 11 seconds with no API keys.</description><pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>benchmarks</category><category>statistics</category></item><item><title>An AI Capture-the-Flag Tournament: What the Scoreboard Counted</title><link>https://sethwheeler.dev/blog/ai-capture-the-flag/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/ai-capture-the-flag/</guid><description>A preliminary report concluded that models under 3B parameters cannot chain exploits. A later tournament with much larger models put an 8B model last: the engine credited 2 of its 279 logged captures, because a per-turn marker had counted each of the 232 times it read bonus flags off its own machine.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>security</category><category>benchmarks</category></item><item><title>Checking a Cost Model Against a Stranger&apos;s Config File</title><link>https://sethwheeler.dev/blog/cancelling-errors/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/cancelling-errors/</guid><description>I bounded an ambiguity in a config file at 2.4% and called it immaterial. The model&apos;s own header settled it months later, and correcting the assumption pushed a gate from 1.1% off to 3.4% off, outside the tolerance it had been passing.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>mixture-of-experts</category></item><item><title>Why a Small Transformer Can&apos;t Copy a Word It Hasn&apos;t Seen</title><link>https://sethwheeler.dev/blog/copying-unseen-nouns/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/copying-unseen-nouns/</guid><description>An 11.9M-parameter transformer scores 83% strict on the domains it trained on and 0/8 on a single unseen noun. Three experiments to find out why, one of which corrected the diagnosis I had already written down, and a zero-parameter mechanism that does the copying 20 times out of 20.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>measurement</category><category>code-generation</category><category>llm</category><category>tokenization</category></item><item><title>How a Dedup Pass Deleted My Training Curriculum</title><link>https://sethwheeler.dev/blog/dedup-deleted-curriculum/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/dedup-deleted-curriculum/</guid><description>A fine-tuning pipeline that weighted its best examples 6x by duplicating them to 94,022 lines, followed by a dedup pass that handed the trainer 50,145, each exactly once. Two retrains were rolled back for regressing before I found that the graded curriculum had never reached the trainer at all.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>fine-tuning</category><category>security</category></item><item><title>Error Feedback, Gradient Compression, and Why Adam Breaks It</title><link>https://sethwheeler.dev/blog/error-feedback-adam/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/error-feedback-adam/</guid><description>Error feedback makes a biased gradient compressor unbiased over time, and under SGD it restored the full-precision trajectory to three digits. Under Adam it landed 1.9 times further from the optimum than no correction at all, and the fix I published helps just as much with no quantization in the run.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>quantization</category><category>training</category><category>optimizers</category></item><item><title>A Better FP4 Gradient Quantizer That Training Couldn&apos;t Notice</title><link>https://sethwheeler.dev/blog/fp4-gradient-quantizer/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/fp4-gradient-quantizer/</guid><description>A per-block scale that cuts FP4 gradient-quantization error on 45 of 45 tensors, 14% against the published state of the art, two rented-GPU training runs that landed within noise anyway, and the measurement that explains both: the gap only shows at million-token batches, 35 to 643 times larger than anything I ran.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>quantization</category><category>training</category></item><item><title>What a Code Completer&apos;s Eval Never Measures: Ghost Text</title><link>https://sethwheeler.dev/blog/ghost-text-eval-gap/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/ghost-text-eval-gap/</guid><description>A hybrid n-gram and 2.48M-parameter code completer that gets 54.6% of tokens right, tuned dial by dial against its own held-out eval. Then I scored the one feature that emits more than a single token and it came back at 0.070, because the eval hands the model a true prefix and the feature hands it its own output.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>code-completion</category><category>python</category></item><item><title>Comparing INT4 and NVFP4 Palettes on Real Gradient Tensors</title><link>https://sethwheeler.dev/blog/int4-vs-nvfp4/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/int4-vs-nvfp4/</guid><description>A palette study on synthetic blocks said evenly-spaced INT4 beats NVIDIA&apos;s FP4 grid once a Hadamard rotation gaussianizes the data, and loses by 2.3x without it. On real gradient tensors it wins either way, 41 of 45 without the rotation, because my stand-in for unrotated data put the outliers in the wrong place.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>quantization</category><category>training</category><category>measurement</category></item><item><title>An App Generator That Verifies Everything Except Its Parser</title><link>https://sethwheeler.dev/blog/appgen-verification-gap/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/appgen-verification-gap/</guid><description>A natural-language app generator whose verification sweep is exhaustive over everything except the part that reads English. The composer scores 100% on 810 cells built from feature sets; the parser that has to produce those feature sets scores 0.70, and nothing prints that number next to the other one.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>measurement</category><category>code-generation</category><category>verification</category><category>llm</category></item><item><title>Reimplementing Enough of Kubernetes to Fool kubectl</title><link>https://sethwheeler.dev/blog/fooling-kubectl/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/fooling-kubectl/</guid><description>Reimplementing enough of the Kubernetes API that the real kubectl can&apos;t tell the difference. The surprise wasn&apos;t the resource schemas; it was that kubectl delegates its own output formatting to the server, and that a Quantity sent as a plain string decodes as zero on the client rather than erroring.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>kubernetes</category><category>node</category><category>protocols</category><category>api-compatibility</category></item><item><title>What a Hibernated Browser Tab Actually Costs</title><link>https://sethwheeler.dev/blog/hibernated-tab-cost/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/hibernated-tab-cost/</guid><description>My simulated tab scheduler priced a hibernated tab at 32 KB; real WebKit charges 39 MB. It claimed 7.9–11.5x less memory than an unmanaged browser and delivered 1.4–2.6x. That one number, wrong by three orders of magnitude, explains the entire gap.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>memory</category><category>swift</category><category>webkit</category><category>measurement</category></item><item><title>Predicting the Speed of a 276B Model Streamed From an SSD</title><link>https://sethwheeler.dev/blog/ssd-streaming-prediction/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/ssd-streaming-prediction/</guid><description>A from-config cost model for streaming a mixture-of-experts model off an SSD, validated byte-for-byte against a runtime I didn&apos;t write. Then the SSD benchmark turned out to be measuring RAM, and the real run missed the speed prediction by 23×, for the one reason the model had declared it couldn&apos;t account for.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>llm</category><category>measurement</category><category>macos</category><category>ssd</category><category>mixture-of-experts</category></item><item><title>Rate Limiting a Crawler Across Node Cluster Workers</title><link>https://sethwheeler.dev/blog/crawler-rate-limiter/</link><guid isPermaLink="true">https://sethwheeler.dev/blog/crawler-rate-limiter/</guid><description>A per-process rate limiter under Node&apos;s cluster module enforced a perfect five-second delay while the host on the other end received a hundred requests at once. Fixing it took an atomic claim, and two more bugs on the way.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><category>concurrency</category><category>node</category><category>mongodb</category><category>crawlers</category></item></channel></rss>