<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tyler Collins</title>
    <link>https://www.tk11br.ca/</link>
    <description>Recent content on Tyler Collins</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>2022-2026 Tyler Collins. Content licensed under CC BY-NC 4.0.</copyright>
    <lastBuildDate>Thu, 15 Oct 2026 12:00:00 -0400</lastBuildDate>
    <atom:link href="https://www.tk11br.ca/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Your LLM Loop Is a Batch Job</title>
      <link>https://www.tk11br.ca/posts/your-llm-loop-is-a-batch-job/</link>
      <pubDate>Thu, 15 Oct 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/your-llm-loop-is-a-batch-job/</guid>
      <description>800,000 small requests in a day slows a shared LLM service down for everyone. If your workload looks like that, a batch job on a GPU node will finish sooner.</description>
      <content:encoded><![CDATA[<p>Today I had to rate limit a user on SHARCNET&rsquo;s internal LLM service for the first time. In the last 24 hours they had sent about 800,000 requests, and every single one was under 500 tokens.</p>
<p>To be clear, they didn&rsquo;t do anything wrong. The service is set up to let them do it. They had a pile of small work and a working endpoint, so they wrote some sort of loop. I probably would have done the same. But a loop that sends hundreds of thousands of tiny prompts is a batch job, and this was a really good reminder of why batch clusters are still super important.</p>
<h2 id="what-that-load-does-to-a-shared-service">What that load does to a shared service</h2>
<p>A shared LLM endpoint is set up for lots of people asking questions here and there, interactive use. One person sending 800,000 of them back to back is a pretty different workload. Spread over a day, that&rsquo;s roughly nine requests per second, all day and all night.</p>
<p>Every one of those requests costs something before the model even sees it. Each is a network round trip with its own connection overhead and its own spot in the queue. It also messes with caching. Inference servers lean on caches to keep things quick for the people already using them, and a steady flood of unrelated prompts pushes that useful state out. Time-to-first-response goes up for everyone, including the person asking a single question in a chat window who did nothing different.</p>
<h2 id="why-a-batch-job-is-faster">Why a batch job is faster</h2>
<p>On a GPU node in a batch job, you get the whole device to yourself. Nobody else&rsquo;s traffic is in the queue, and there&rsquo;s no network between your data and the model.</p>
<p>The bigger win is how the work gets handed over. Offline inference with a tool like <a href="https://docs.vllm.ai/">vLLM</a> takes the entire list of prompts at once and packs them onto the GPU as tightly as it can. Small prompts are where that pays off most, because one small prompt on its own leaves most of the GPU idle. Hand it 800,000 together and it keeps the device busy the whole time. You load the model once, point it at your dataset, and collect the results when the job ends.</p>
<h2 id="if-this-is-you">If this is you</h2>
<p>If your workflow loops over a dataset and calls an LLM once per row, please don&rsquo;t forget about classic HPC. Write it as a batch job, run it on a GPU node, and keep the shared service for the interactive stuff it&rsquo;s good at.</p>
<p>You&rsquo;ll get more done quicker, and everyone else gets their response times back!</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/serial-farms/">Serial Farms: Package Options and When to Switch to Farming</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Start your five-hour window early</title>
      <link>https://www.tk11br.ca/posts/start-your-five-hour-window-early/</link>
      <pubDate>Wed, 14 Oct 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/start-your-five-hour-window-early/</guid>
      <description>How Claude and Codex five-hour and weekly limits reset, and why an early-morning ping can get you a fresh window by lunch.</description>
      <content:encoded><![CDATA[<p>I hate when you sit down to work at 9:30 after clearing emails, send your first prompt, and by 1pm you&rsquo;re out of usage. The window doesn&rsquo;t come back until 2:30, so you lose an hour and a half of the afternoon waiting on a timer.</p>
<p>To be clear, there are actually two limits here, and they do pretty different jobs. The five-hour window controls when you can use your plan. The weekly cap controls how much you get in total. Most people worry about the five-hour one because it&rsquo;s the wall they keep hitting, but in my opinion the weekly cap is the real budget.</p>
<h2 id="how-the-windows-work">How the windows work</h2>
<p>On Claude Pro and Max, the five-hour session starts with your first message. It&rsquo;s a rolling window, not a fixed clock time, and it resets five hours after that first message. The weekly limit is separate. It resets at a fixed time for your account, and waiting out a session won&rsquo;t clear it. Chat, the desktop and mobile apps, and Claude Code all draw from the same pool.</p>
<p>Codex is split by plan. Plus and Standard Business have a five-hour window. Pro <a href="https://learn.chatgpt.com/docs/pricing">currently has none</a>. Weekly limits &ldquo;may also apply,&rdquo; and OpenAI&rsquo;s docs send you to your usage dashboard for the actual reset times rather than spelling them out.</p>
<p>Neither provider really counts messages. Model choice, context length, reasoning effort, and tool use all change how fast you burn through a window. A long agent session in a big repo with a top model eats through it way faster than a handful of chat questions for each of them though.</p>
<p>These rules change a lot, so check your own numbers instead of trusting a blog post, this one included. In Claude Code, <code>/usage</code> shows your session and weekly bars. In Codex, <code>/status</code> shows both percentages and when they reset.</p>
<h2 id="start-the-clock-before-you-sit-down">Start the clock before you sit down</h2>
<p>The five-hour clock starts on your first message, so you get to pick when it starts. If something sends a message at 7am, your first window closes at noon and you get a fresh one right after lunch. Now the morning is one window and the afternoon is another, instead of one window running right through the middle of your day.</p>
<p>The simplest version is pretty much just a ping. Most agent tools have a headless mode, so a cron job can send a throwaway prompt to a cheap model:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0 7 * * 1-5 claude -p &#34;Reply with OK&#34; --model haiku
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>codex exec &quot;Reply with OK&quot;</code> does the same for Codex. Cron runs with a bare environment, so you may need the full path to the binary. A local cron job also only fires if your machine is on at 7am.</p>
<p>The nicer version is to have that early job do something useful. Most of the modern tools can run scheduled tasks, so set up a custom news brief. Have it cover what changed in the repos you care about, release notes for your tools, or whatever you&rsquo;d otherwise skim over coffee. It starts the clock as a side effect, and you have something to read when you sit down.</p>
<h2 id="the-catch">The catch</h2>
<p>This doesn&rsquo;t ever raise your weekly cap. It gives you a second full window during your working hours, so you can burn through that cap faster. If you were already finishing most weeks with headroom, that&rsquo;s a good trade. If you regularly hit the weekly wall on Thursday, you&rsquo;ll hit it on Wednesday instead. Be careful.</p>
<h2 id="what-about-peak-hours">What about peak hours?</h2>
<p>For a while earlier this year, the time of day you used Claude mattered too. Weekday mornings from 5 to 11am Pacific drained five-hour sessions faster than the rest of the day. Anthropic <a href="https://www.anthropic.com/news/higher-limits-spacex">removed that reduction</a> for Claude Code on Pro and Max in May, and doubled Claude Code&rsquo;s five-hour limits at the same time. Weekly limits didn&rsquo;t double.</p>
<p>So off-peak usage isn&rsquo;t worth more on Claude Code right now. Providers have done it before, though, and could easily do it again, so check whether it applies to your plan before you plan your day around it.</p>
<h2 id="what-id-do">What I&rsquo;d do</h2>
<p>If the afternoon wall is what keeps getting you, try the early ping or a morning brief. Just keep an eye on that weekly bar!</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/why-i-still-use-sol-on-low/">Why I still use Sol on low</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Tectonic makes LaTeX easier to work on with an agent</title>
      <link>https://www.tk11br.ca/posts/tectonic-with-coding-agents/</link>
      <pubDate>Tue, 13 Oct 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/tectonic-with-coding-agents/</guid>
      <description>Using Tectonic and a coding agent to edit LaTeX, compile a résumé, and check the rendered PDF without browser automation.</description>
      <content:encoded><![CDATA[<p>I recently used <a href="https://tectonic-typesetting.github.io/">Tectonic</a> to rerender my résumé and make changes with a coding agent. This made the back-and-forth a lot easier. I could ask for a change, have the agent edit the underlying LaTeX, and get another PDF to check.</p>
<p>In my opinion, Tectonic and a coding agent are now a pretty practical alternative to Overleaf if you&rsquo;re working on a document by yourself. The agent can work directly on local files and run the compiler. This way you don&rsquo;t need it clicking around a browser through computer-use tools trying to diagnose how your tables are formatted.</p>
<h2 id="a-simpler-local-setup">A simpler local setup</h2>
<p>If you haven&rsquo;t used LaTeX, it&rsquo;s a way to write documents as source files and compile them into typeset output, usually a PDF. It&rsquo;s useful for résumés and papers, especially when you want precise formatting or have lots of equations. Your textbooks use it, for example.</p>
<p>Getting a local LaTeX setup working can be more effort than you wanted to spend on editing a document. Some of this technology is unfortunately pretty ancient. Tectonic makes that part simpler. It&rsquo;s a TeX/LaTeX engine distributed as a single executable, and it downloads the support files it needs instead of requiring you to install a full LaTeX distribution up front.</p>
<p>There are <a href="https://tectonic-typesetting.github.io/book/latest/installation/">installation options</a> for different systems. Once it&rsquo;s installed, compiling a document can be as simple as:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">tectonic resume.tex
</span></span></code></pre></td></tr></table>
</div>
</div><p>That produces <code>resume.pdf</code>. Tectonic also handles the repeated compilation passes that TeX and BibTeX can need. You&rsquo;ll need network access to download support files that aren&rsquo;t already cached, but you don&rsquo;t have to manage those downloads yourself.</p>
<h2 id="let-the-agent-keep-trying">Let the agent keep trying</h2>
<p>The useful part for me was making the changes interactively. LaTeX has plenty of classic formatting problems. Something doesn&rsquo;t fit, spacing looks wrong, or a change in one place moves something somewhere else. An agent doesn&rsquo;t really run out of things to try, which is pretty useful when you&rsquo;re working through that kind of problem.</p>
<p>Ask the agent to edit the source, compile it, and then render the PDF pages to images for visual inspection if it has the tools to do that. If the change didn&rsquo;t work, it can keep trying. Tectonic makes it easy for the agent to build/compile the PDF, and then other standard agent tooling can view the PDF for issues.</p>
<p>That last step is the big win. A successful compile tells you that you produced a PDF, not that the layout looks right. Ask the agent to review the rendered pages rather than stop as soon as the command succeeds. You should still look at the final document yourself every time of course.</p>
<p>This doesn&rsquo;t replace Overleaf&rsquo;s shared editing and collaboration features. But for a document I&rsquo;m working on myself, letting an agent edit and compile the files directly is a much simpler workflow than having it operate a web editor.</p>
<p>If you&rsquo;ve got an existing LaTeX document, try giving your agent the source and asking it to make a change with Tectonic. It worked pretty well for my résumé!</p>
]]></content:encoded>
    </item>
    <item>
      <title>When to reach for Opus</title>
      <link>https://www.tk11br.ca/posts/when-to-reach-for-opus/</link>
      <pubDate>Mon, 28 Sep 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/when-to-reach-for-opus/</guid>
      <description>Sonnet works well when I break down the work for it. For a whole feature ticket with decisions along the way, I&amp;#39;d try Opus.</description>
      <content:encoded><![CDATA[<p>After I updated my <a href="/posts/why-i-still-use-sol-on-low/">model recommendations</a>, I got some feedback from people still reaching for Sonnet or models like Luna. I get it. If I&rsquo;m breaking a job down and checking every step, Sonnet can get me pretty much the same result as Opus most of the time. But why am I doing all that planning for it? That defeats the purpose of a fully agentic approach. What I typically try to do with Opus is give it a wider task: give it the goal, let it work through the branches, and come back to review what it did.</p>
<p>Say I have a ticket to implement an entire feature branch. The agent has to read the existing code, decide what needs changing, deal with whatever it finds along the way, and test the result. With Sonnet, I&rsquo;d expect to need to help break that into smaller jobs. I&rsquo;d essentially be pair programming with Sonnet, with it controlling the keyboard. This is totally fine, but missing a lot of the strengths of the frontier models.</p>
<p>On the other hand, Opus is the one I&rsquo;d try giving the whole ticket to. No single step has to be especially hard. The agent is just doing more on its own without steering. Maybe it finds that the existing tests don&rsquo;t cover the change, or that the first implementation needs work once it runs them. With Sonnet I&rsquo;d expect to stop, look at that, and decide what to ask for next. With Opus I&rsquo;d give it room to investigate and keep going. That&rsquo;s the difference I care about when I say &ldquo;wide,&rdquo; not whether Opus writes a better line of code.</p>
<p>This isn&rsquo;t a claim that Sonnet can&rsquo;t implement the feature. If I&rsquo;m there to break down the work and steer it, I&rsquo;d expect it to do fine in the average case. Models like Sonnet and Luna have their place, but I wouldn&rsquo;t choose them for a job where I want to leave the agent alone to work through all those branches.</p>
<p>Of course, I still read the changes, run the tests, and check the result against the ticket. If the ticket involves decisions I need to own, I don&rsquo;t hand those over either. I just don&rsquo;t want to have to tell the agent what to do next every five minutes.</p>
<p>If you&rsquo;ve only been giving agents small jobs, try giving Opus a whole ticket and see how far it gets. Then check its work.</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/why-i-still-use-sol-on-low/">Why I still use Sol on low</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>What Should EEG Cleaning Improve?</title>
      <link>https://www.tk11br.ca/posts/what-should-eeg-cleaning-improve/</link>
      <pubDate>Wed, 23 Sep 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/what-should-eeg-cleaning-improve/</guid>
      <description>How to compare EEG preprocessing choices without mistaking cleaner-looking data for a better estimate.</description>
      <content:encoded><![CDATA[<p>When I <a href="/posts/cleanliness-metrics-eeg-pipelines/">tried to write tests for whether EEG got cleaner</a>, several of my metrics rewarded rejecting everything. This is an absolutely classic case of badly defined test metrics.</p>
<p>Consider an ERP study and two cleaning policies. One rejects nearly every blink, along with a lot of trials. The other leaves a little ocular activity but keeps more trials. If I only count blinks, the first one wins. If I only count retained trials, the second one wins. Neither one is really better than the other.</p>
<p>I&rsquo;d be wary of picking a method because it has a higher signal-to-noise ratio or fewer outliers despite how many publications in the field report this way. Those numbers depend on how you define signal and noise. My old metric counted the difference between raw and cleaned data as noise. By that definition, removing more data looked like progress. A flat recording could also score well on a variability metric and be useless for the study.</p>
<p>That doesn&rsquo;t make artifact measures pointless. I just want to know whether a blink correction reduced blink contamination. I also want to know what it cost.</p>
<h2 id="compare-what-you-get-and-what-you-lose">Compare what you get and what you lose</h2>
<p>For an actual study, I&rsquo;d put a few plausible preprocessing choices next to each other and ask:</p>
<ul>
<li>How much targeted artifact remains? Which type of artifact hurts us the most?</li>
<li>How many channels, time periods, and trials did each choice remove or reconstruct? Did that differ between conditions or participants?</li>
<li>What happened to the effect estimate and its uncertainty, such as its confidence interval?</li>
</ul>
<p>A narrow confidence interval isn&rsquo;t automatically good. If a pipeline systematically distorts the effect, it can give a precise answer to the wrong question. A smaller p-value isn&rsquo;t always the goal either. If two pipelines disagree, I&rsquo;d look at what each one removed before picking the result I like better.</p>
<p>Real recordings usually don&rsquo;t tell us the true effect, so comparing their results can&rsquo;t establish which pipeline is correct. If I can simulate data or inject a known effect into realistic recordings, I can ask a harder question: does the method recover the effect without systematic bias? Across repeated simulated datasets, do nominal 95% confidence intervals contain the known effect about 95% of the time? How wide are those intervals, and how much data did the method discard to get them? This is the sort of thing I want to see in pipeline style publications.</p>
<p>The answer might depend on the study. A method that throws away a lot of time could be acceptable for one analysis and disastrous for another. An aggressive trial-rejection rule might remove artifacts while leaving too few trials for a useful estimate, or reject one condition more often than the other. That&rsquo;s information a single cleanliness score won&rsquo;t give me.</p>
<p>I don&rsquo;t expect every EEG study to run a giant pipeline benchmark or accidentally turn into a methods paper. A useful first pass is to run a couple of defensible cleaning choices on the same data and put the artifact measurements, data-loss counts, and effect estimates side by side. If we can test against a known effect, we should check whether the method recovers it. That&rsquo;s more work than picking the cleanest-looking trace, but at least it tells us what we paid for the cleaning.</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/cleanliness-metrics-eeg-pipelines/">How Do You Test Whether EEG Got Cleaner?</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Why I still use Sol on low</title>
      <link>https://www.tk11br.ca/posts/why-i-still-use-sol-on-low/</link>
      <pubDate>Wed, 23 Sep 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/why-i-still-use-sol-on-low/</guid>
      <description>Astra surprised me, but GPT 6 Sol on low remains my daily driver. Here&amp;#39;s where Fable and Opus 5.5 fit, and why my plan matters.</description>
      <content:encoded><![CDATA[<p>Astra was the first model that made me stop and go &ldquo;wow.&rdquo; With other releases, I could usually predict what they&rsquo;d try next when a task got hard. Astra spun up multiple Playwright browsers to test and compare things, then recorded videos to show what it had done. I&rsquo;d seen people talk about doing that online. I hadn&rsquo;t asked Astra to do it.</p>
<p>It also overengineered some open-ended problems I gave it. And I can&rsquo;t use it every day without upgrading my plan. That matters more to my recommendation than how impressive it was.</p>
<h2 id="what-i-actually-use">What I actually use</h2>
<p>GPT 6 Sol on low is my default in Pi. So far it feels like a flat upgrade over 5.6 Sol for my work. The change I notice most is the prose it writes without any writing skills. Low is enough for most tasks. I only turn up the reasoning for really hard ones.</p>
<p>Fable is amazing for code I can trust enough to review and merge. I can give it a wildly broad task, and if it gets stuck, it comes back to me instead of burning tokens forever. I don&rsquo;t have it on my current plan, though. Sol on low does enough that I rarely need to reach for the big guns.</p>
<p>Opus 5.5 is what I&rsquo;ve started using for my longest-running tasks with lots of context. It feels fast, and the prose is way better. The &ldquo;Claude speak&rdquo; that bothered me before seems to be gone. Opus 5 was a flat no for me. 4.8 was alright, but Sol 5.6 beat it easily. I didn&rsquo;t expect to come back to Opus, but here I am.</p>
<h2 id="the-plan-changes-the-answer">The plan changes the answer</h2>
<p>My recommendations assume subsidized subscription plans, not pay-as-you-go API pricing. Running agents at API rates every day would be too expensive for me. Check what&rsquo;s included in your plan before copying anyone&rsquo;s model ranking. The expensive option needs to do something your cheaper default can&rsquo;t.</p>
<p>I&rsquo;ve updated my <a href="/recommended-ai-tools/">Recommended AI Tools</a> page with what I use now. If you&rsquo;re choosing a setup, start with a model you can afford to run often, then work out which tasks actually need something bigger.</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/when-to-reach-for-opus/">When to reach for Opus</a></li>
<li><a href="/posts/check-what-your-ai-plan-does-with-your-data/">Check what your AI plan does with your data</a></li>
<li><a href="/posts/prompt-context-is-a-resource/">Stop installing things your agent doesn&rsquo;t need</a></li>
<li><a href="/posts/start-your-five-hour-window-early/">Start your five-hour window early</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Recommended AI Tools</title>
      <link>https://www.tk11br.ca/recommended-ai-tools/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/recommended-ai-tools/</guid>
      <description>Opinionated buying guidance for AI tools and services.</description>
      <content:encoded><![CDATA[<p>This page is my current reference for AI tools. Check the date before relying on it. This space changes a lot in a short time.</p>
<h2 id="how-i-choose">How I choose</h2>
<p>Typically, I open up Pi and coordinate my tasks based on GitHub issues via the Matt Pocock skills. GPT 6 Sol on low is my daily driver. I only raise the reasoning level for really hard work. For long-running tasks with lots of context, I&rsquo;ve started reaching for Opus 5.5.</p>
<p>These recommendations assume you&rsquo;re using a subsidized subscription plan. Paying API rates for all your day-to-day agent work gets too expensive. Check what&rsquo;s actually included in your plan before making an expensive model your default.</p>
<h2 id="harnesses">Harnesses</h2>
<ol>
<li>
<p><a href="https://github.com/earendil-works/pi">Pi</a>: My daily driver. It ships as a bare skeleton without extensions. The cool part is that its own documentation and code are available in its context, so it can modify itself. Say you want a modern &ldquo;goal&rdquo; or &ldquo;btw&rdquo; feature like the ones in Codex or Claude Code. You ask Pi to build it, and it will. Pi is really meant for enthusiasts who want aggressive control over everything. These are the extensions I use:</p>
<ul>
<li>add dir: Symlinks other directories into your context.</li>
<li>web search: Self-explanatory.</li>
<li>power bar: Shows token use, context stats, and more in a toolbar below the prompt line.</li>
<li>ask user question: A rip-off of Claude&rsquo;s questions feature.</li>
<li>goal light: My own super-lightweight goal and loop framework.</li>
<li>prompt stats: My own summary of the current system prompt and tools.</li>
</ul>
</li>
<li>
<p><a href="https://t3.codes/">T3 Code</a>: More of an orchestration platform. It lets you combine all your subscriptions and get away from the terminal, making it easier to copy and paste screenshots, text blocks, and so on. It also has very cool remote access support. You can start a session from your phone and run it across a bunch of different machines. Claude and Codex have similar features, but T3 is better at working with a distributed fleet of machines.</p>
<ul>
<li>It is open source, so you can change things pretty easily.</li>
<li>As soon as they add Pi support, I would daily-drive this.</li>
</ul>
</li>
<li>
<p><a href="https://openai.com/codex/">Codex</a>: If you already have a ChatGPT subscription, start here. It has the best &ldquo;computer use&rdquo; skills on the market right now. You can have it control Chrome or other apps on your computer to find buried settings and handle similar tasks. I don&rsquo;t use it much anymore unless I need to fill out a ton of online forms or do something like that.</p>
</li>
<li>
<p><a href="https://cursor.com/">Cursor</a>: This was my entry point into the space. It started as a VS Code fork with advanced AI features, though it does lots of other things now. I appreciate that Cursor customizes its prompts and harness settings for every model you select. It is also a good starting point.</p>
</li>
<li>
<p><a href="https://claude.com/product/claude-code">Claude Code</a>: The Claude models are amazing, but both the desktop app and the TUI feel a bit dated by my standards. Many of the killer features they pioneered now exist in the tools above, along with more interesting additions.</p>
</li>
</ol>
<h2 id="models">Models</h2>
<p>I don&rsquo;t think a strict ranking captures how I use these. Here&rsquo;s what I reach for and why:</p>
<ul>
<li><strong>GPT 6 Sol:</strong> My daily driver in Pi on low. So far it feels like a straightforward upgrade over GPT 5.6 Sol, including better default prose without writing skills. Low is enough for most tasks. I only turn up the reasoning for really hard ones.</li>
<li><strong>Astra:</strong> The first model release that genuinely surprised me. Without being asked, it spun up multiple Playwright browsers to test and compare its work and recorded video to show it had finished. It can overengineer open-ended tasks, though, and it costs too much for me to use every day.</li>
<li><strong>Fable:</strong> Excellent at producing code I can trust and merge. If I give it a huge, nearly impossible task, it comes back to me when stuck instead of burning tokens forever. Plan access and cost keep it from being my default, especially when Sol on low is usually good enough.</li>
<li><strong>Opus 5.5:</strong> My choice for long-running tasks that need lots of context. It feels fast, and its prose is much better than earlier Opus releases. Opus 5 was a flat no for me, 4.8 was alright, but Sol 5.6 beat it easily.</li>
<li><strong>Cursor&rsquo;s models:</strong> A good way to try a variety of models without building my setup. Cursor tunes the experience for its models, and I&rsquo;d still suggest it as a starting point.</li>
</ul>
<p>I haven&rsquo;t used Luna 6 yet, so I can&rsquo;t recommend it either way. Local models have their place, but they&rsquo;re beyond the scope of this page.</p>
<h2 id="outside-coding">Outside coding</h2>
<p>I replaced a self-hosted Hermes setup for my curated daily news brief with Grok Bot. It did the job better for me, without requiring me to host something I considered potentially risky. That&rsquo;s a recommendation for that particular job, not a coding-model ranking.</p>
<h2 id="skill-packages">Skill packages</h2>
<p>I use only two major skill sets. I use one almost in full and took what I wanted from the other. I also create one-offs for certain projects when it makes sense, but those aren&rsquo;t really shareable.</p>
<ol>
<li>
<p><a href="https://github.com/mattpocock/skills">Matt Pocock&rsquo;s Skills</a></p>
<ul>
<li>A great way to hand the project management side over to agents.</li>
<li>Grilling and Wayfinder are amazing for exploring ideas and putting them into issue trackers.</li>
<li>The instructional content and docs are really good.</li>
<li>Try adopting as much of this as you can, minus the obviously goofy skills, and give Wayfinder a shot.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/cursor/plugins/tree/main/pstack">pstack, aka Poteto Mode</a></p>
<ul>
<li>The writing skills are awesome, especially Unslop.</li>
<li>It has more skills and workflows for working with parallel agents.</li>
</ul>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>What Does a GPU-Hour Actually Measure?</title>
      <link>https://www.tk11br.ca/posts/what-does-a-gpu-hour-actually-measure/</link>
      <pubDate>Tue, 22 Sep 2026 10:30:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/what-does-a-gpu-hour-actually-measure/</guid>
      <description>GPU-hours hide differences in GPU models, whole-device allocations, and MIG slices. Research reports need to say what was actually used and how the total was calculated.</description>
      <content:encoded><![CDATA[<p>You&rsquo;ve probably seen a line like this in a paper or grant report:</p>
<blockquote>
<p>We used 10,000 GPU-hours.</p></blockquote>
<p>It looks like a useful answer. There&rsquo;s a number and a unit. Very official.</p>
<p>But what does a GPU-hour actually measure? On its own, pretty much nothing. I can&rsquo;t compare that number with another project until I know what counted as a GPU, whether it was a whole device or a slice, and how the authors calculated the total.</p>
<h2 id="one-gpu-hour-is-not-like-another">One GPU-hour is not like another</h2>
<p>An hour on an NVIDIA A100, H100, or B200 counts as one GPU-hour under the usual calculation. That doesn&rsquo;t make those hours equivalent. These are different generations of hardware with different memory capacities, bandwidth, and compute capabilities. They have tons of different features too.</p>
<p>The workload matters too. A newer GPU might make a huge difference for one model and barely move another. <code>number of GPUs × elapsed time</code> throws all of that information away. It&rsquo;s pretty much the worst collapsing across dimensions you could do.</p>
<p>In the past, research papers have long reported CPU models and architectures because an hour on one processor doesn&rsquo;t automatically compare with an hour on another. Plenty of papers still include that detail, and they should. GPU reporting deserves at least as much care.</p>
<h2 id="device-slicing-makes-it-worse">Device slicing makes it worse</h2>
<p>Multi-Instance GPU, usually called MIG, is device slicing. An administrator can divide one physical NVIDIA GPU into isolated instances, each with a portion of the compute and memory resources. NVIDIA&rsquo;s <a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/introduction.html">MIG documentation</a> says supported GPUs can be divided into as many as seven instances.</p>
<p>This is a good thing. Several jobs can share an expensive GPU without fighting over the same resources. Schedulers can present each slice to a job much like a physical GPU. <a href="https://slurm.schedmd.com/gres.html">Slurm can schedule MIG instances as individual GPU resources</a>, for example.</p>
<p>Here&rsquo;s where the reporting gets weird. Say two jobs each run for one hour. One gets an entire H100. The other gets one MIG slice of an H100. If the accounting system calls each allocation one GPU, both jobs used one GPU-hour. Same number. Very different allocation.</p>
<p>Calling these &ldquo;MIG-hours&rdquo; or &ldquo;slice-hours&rdquo; doesn&rsquo;t fix much by itself. MIG profiles assign different amounts of compute and memory. Ten hours on a small slice and ten hours on a large slice still become ten slice-hours when the report leaves out the profile.</p>
<h2 id="show-your-math">Show your math</h2>
<p>Different people need different numbers. A cluster operator may care about how long allocations were occupied. A funding report may care about use of the physical hardware. A researcher needs enough detail to understand or reproduce an experiment. Those are different questions. They don&rsquo;t have to produce the same total.</p>
<p>One report might count every scheduled MIG instance as a GPU. Another might convert slices into fractions of a physical device. It could count allocated time even when the job wasn&rsquo;t keeping the device busy. All of those approaches can make sense for a particular job. Calling every result &ldquo;GPU-hours&rdquo; is the problem. Once the calculation disappears, the reader can&rsquo;t recover what happened.</p>
<p>A universal normalized GPU-hour sounds tempting, but I don&rsquo;t think it fixes this. Converting every device and slice into one equivalent unit requires assumptions about relative performance. Those assumptions change with the workload, software, numerical precision, and bottleneck. It&rsquo;s problematic either way.</p>
<h2 id="at-least-report-this-much">At least report this much</h2>
<p>If you publish GPU usage, include:</p>
<ul>
<li>the GPU manufacturer and model</li>
<li>whether jobs received whole devices or slices</li>
<li>the MIG profile or equivalent partition size when slicing was used</li>
<li>the number of allocations</li>
<li>the elapsed duration</li>
<li>the exact calculation behind any aggregate total</li>
</ul>
<p>A methods section or figure caption could say:</p>
<blockquote>
<p>We used eight allocations of an NVIDIA H100 <code>3g.40gb</code> MIG profile for five hours each, for 40 H100 <code>3g.40gb</code> slice-hours. We calculated slice-hours as the number of allocated instances multiplied by allocation duration.</p></blockquote>
<p>Yes, that&rsquo;s longer than &ldquo;40 GPU-hours.&rdquo; You can also tell what it means. The reader knows these were slices, which hardware they came from, and how the total was produced.</p>
<p>If the work used several device models or MIG profiles, report them separately. Don&rsquo;t add unlike allocations together and slap a precise-looking label on the result.</p>
<h2 id="a-caption-is-allowed-to-do-some-work">A caption is allowed to do some work</h2>
<p>A single GPU-hour total fits nicely on a dashboard. The useful version takes a caption, a definition, or a few lines in a methods section. That&rsquo;s fine. This is what those things are for.</p>
<p>GPU-hours can still work as internal shorthand for one stable pool of identical hardware. Everyone in that context knows what the unit means. The shorthand falls apart as soon as the number leaves that context.</p>
<p>Don&rsquo;t make readers guess. Name the hardware, describe the allocation, and show your math.</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/your-kpis-arent-telling-you-enough/">Your KPIs Aren&rsquo;t Telling You Enough</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Before You Rebuild Your RAG Pipeline, Try an Agent</title>
      <link>https://www.tk11br.ca/posts/rag-hard-part-knowledge-base/</link>
      <pubDate>Tue, 15 Sep 2026 10:40:34 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/rag-hard-part-knowledge-base/</guid>
      <description>If RAG is returning incomplete answers from dense technical documentation, try letting an agent search and read the source material directly.</description>
      <content:encoded><![CDATA[<p>If your RAG system keeps giving incomplete answers, try going fully agentic.</p>
<p>I&rsquo;m not saying retrieval-augmented generation is useless. It can make a large collection of documents cheap and fast enough to query. But if you have some tokens to burn and your corpus isn&rsquo;t massive, it may be better to let an agent search the original documents itself.</p>
<p>I ran into this with a public-facing technical wiki. The articles are dense. They have long tables, code samples, configuration details, and links to many related pages. A useful answer might depend on a warning above a table, one row in the table, and an example farther down the page.</p>
<p>Chunking pretty much destroys this on average as the length of documents grows.</p>
<h2 id="retrieval-commits-too-early">Retrieval commits too early</h2>
<p>A typical RAG pipeline splits documents into chunks, creates embeddings for them, and retrieves a small set that appears relevant to the question. The model answers using those chunks.</p>
<p>That works when each chunk still makes sense on its own. A paragraph from a straightforward policy document might survive the process just fine. Technical documentation is less cooperative.</p>
<p>A chunk can contain half a table without its heading. A code sample can lose the paragraph that explains when to use it. Two adjacent chunks can look unrelated to an embedding search even though a human reading the page would clearly use them together.</p>
<p>You can improve the pipeline. You can change the chunk size, preserve more document structure, add overlapping context, retrieve more candidates, or rerank the results. Those techniques are useful. They also keep the same basic constraint: the system decides which pieces matter before the model has understood the problem. Sometimes the model needs to investigate first.</p>
<h2 id="give-the-agent-the-source">Give the agent the source</h2>
<p>Instead of retrieving a handful of chunks, agents can use standard tools to explore the wiki. It can run searches via <code>grep</code>, open complete pages, follow links, inspect examples, and search again when the first result wasn&rsquo;t enough.</p>
<p>That changed the job. The agent wasn&rsquo;t forced to answer from whatever fragments happened to rank highest. It could start with a broad search, learn the terminology used by the documentation, and then narrow its search. If a page referred to another procedure or configuration option, it could go read that too.</p>
<p>In my experiments, this produced much better results. The agent could create complete GROMACS scripts customized for our clusters. The RAG approach was more likely to produce a generic guess because it didn&rsquo;t retrieve enough of the cluster-specific instructions together.</p>
<p>The difference wasn&rsquo;t that the agent knew more about GROMACS. It had a better way to find and assemble the relevant local information.</p>
<h2 id="this-isnt-free">This isn&rsquo;t free</h2>
<p>Direct exploration spends more tokens. It takes longer than looking up a few precomputed chunks, and it won&rsquo;t make sense for every collection of documents. It also requires a model strong enough to do proper tool calling.</p>
<p>If you have millions of pages, tight response-time requirements, or thousands of simultaneous users, you probably need retrieval to narrow the search. Access controls and source filtering may also require more deliberate infrastructure than handing an agent a directory and letting it roam around.</p>
<p>But many internal knowledge bases and technical documentation sites aren&rsquo;t that large. The agent doesn&rsquo;t need to read everything. Search tools let it reduce the corpus as it works, much like a person looking through unfamiliar documentation.</p>
<p>That makes corpus size and token cost practical limits, not reasons to assume RAG should always come first.</p>
<h2 id="run-the-comparison">Run the comparison</h2>
<p>If your current RAG system works, keep it. If it keeps missing context, returning generic answers, or falling apart around tables and code samples, don&rsquo;t immediately build a more complicated retrieval pipeline.</p>
<p>Give an agent access to the same source documents. Let it search them, read full pages, and follow links. Then ask both systems the questions your users actually care about and compare the answers.</p>
<p>Maybe the agent will be too slow or expensive. Maybe the corpus really is too large. That&rsquo;s useful to know. You now have a concrete reason to improve retrieval and a better result to compare it against.</p>
<p>But if the agent gives you a complete, locally correct answer while the RAG system keeps returning polished fragments, you may not need better chunking. You may need to stop deciding what context matters before the agent has had a chance to look around.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Read the incident report before declaring AGI</title>
      <link>https://www.tk11br.ca/posts/read-the-incident-report-before-declaring-agi/</link>
      <pubDate>Mon, 14 Sep 2026 10:20:35 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/read-the-incident-report-before-declaring-agi/</guid>
      <description>The OpenAI and Hugging Face incident is a good example of why dramatic claims about AI need to be checked against the full incident report.</description>
      <content:encoded><![CDATA[<p>I keep seeing people describe the OpenAI and Hugging Face security incident as evidence of AGI or how we are all doomed in the next year. The bots communicated with each other, escaped their sandboxes, and got loose on the internet. It sounds completely wild when you reduce it to a few headlines.</p>
<p>Then you read what happened.</p>
<p>Marius Horatau&rsquo;s article, <a href="https://uphack.io/blog/post/the-hugging-face-incident-is-not-an-ai-story/">The Hugging Face Incident Is Not an AI Story</a>, does a great job of reading the incident as a security engineer instead of treating &ldquo;AI&rdquo; as the explanation for everything. In my opinion, he&rsquo;s got it exactly right.</p>
<p>The agents did some impressive things. They found vulnerabilities, passed information through a shared service, and chained together access across systems. I&rsquo;m not trying to say that isn&rsquo;t impressive, but it&rsquo;s not strictly new. But the <a href="https://cdn.openai.com/pdf/67869394-cb91-4c12-888c-5cbd85c7814c/OpenAI-Hugging-Face%20Incident-Technical-Report.pdf">technical report from OpenAI</a> also describes a pile of bad security and operational decisions that tend to disappear when people retell the story.</p>
<p>OpenAI gave workloads the same Artifactory credentials. The workloads could all read and write to the same service, so the agents turned it into a message board without needing to exploit anything. That service could also reach the internet even though the agents supposedly couldn&rsquo;t. This is strictly against best practices.</p>
<p>The response was worse. On June 27, a monitoring tool caught port scanning. Responders traced it to an evaluation where agents were using Artifactory as a message board and a network pivot. The on-call response staff advised that the run didn&rsquo;t need to stop. Another mistake.</p>
<p>A week later, agent traffic knocked Artifactory offline. Responders then found an unauthorized administrator account, rogue repositories, command-capable plugins, and configuration changes. OpenAI rebuilt the service, removed the shared credential from new workloads, blocked the paths it knew about, and resumed evaluations on July 7. The agents established another message board the next day. You guessed it, another mistake.</p>
<p>You don&rsquo;t need to bring up AGI to know why this got out of hand. OpenAI ran agents trained to persist and find security vulnerabilities inside an environment with shared credentials, shared writable infrastructure, and an indirect route to the internet. Staff saw the agents abusing that infrastructure and kept the evaluation running. After finding an administrator-level compromise, they resumed evaluations without understanding the full scope of the incident.</p>
<p>This is mostly a media literacy point. Don&rsquo;t trust the flat version of a complicated technical event, especially when the flat version makes an extraordinary claim. Read the report. Check what access the system had. Look at which alerts fired, what the humans did with them, and which basic controls failed.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
