<?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>Wed, 28 Oct 2026 09:00:00 -0400</lastBuildDate>
    <atom:link href="https://www.tk11br.ca/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Send your agent a screenshot</title>
      <link>https://www.tk11br.ca/posts/send-your-agent-a-screenshot/</link>
      <pubDate>Wed, 28 Oct 2026 09:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/send-your-agent-a-screenshot/</guid>
      <description>Agents only know the dashboards they were trained on. When menus keep moving or a UI looks wrong, a screenshot gives the agent what&amp;#39;s actually on your screen.</description>
      <content:encoded><![CDATA[<p>I always find myself getting lost in the Cloudflare dashboard. Every time I need to set up a redirect rule, it seems to have moved. I ask an agent where to find it, and it confidently tells me to click through menus that don&rsquo;t exist anymore. Then I&rsquo;m the one clicking around again, and the agent can&rsquo;t help because it has no idea what I&rsquo;m looking at.</p>
<p>The fix was pretty simple. It&rsquo;s what you would do with a friend who&rsquo;s a patient expert. I took a screenshot and sent it over, and the agent saw the menu as it actually was that day and told me it had moved to a different submenu.</p>
<h2 id="the-agents-map-is-out-of-date">The agent&rsquo;s map is out of date</h2>
<p>An agent&rsquo;s knowledge of a dashboard comes from whatever existed when it was trained. Cloudflare, GitLab, cloud consoles, really anything that ships UI changes constantly, will have moved on since then. So the agent gives you directions from an old map, and it has no way of knowing the map is old. A screenshot is today&rsquo;s version of the page, with the actual labels and the actual layout, so it doesn&rsquo;t have to guess.</p>
<h2 id="describing-what-you-see-is-lossy">Describing what you see is lossy</h2>
<p>The same thing happens with your own work. When something looks off in a UI I&rsquo;m building, my first instinct used to be describing it. &ldquo;The table lines are basically invisible.&rdquo; &ldquo;The wrong toggle is highlighted.&rdquo; &ldquo;The diagram is broken somewhere in the middle.&rdquo;</p>
<p>Each of those takes effort to put into words, and then the agent has to guess back from my words to the pixels. Half the time it fixed something next to the actual problem. A screenshot skips both steps. The agent sees the same thing you do, and you don&rsquo;t have to be good at describing UI bugs.</p>
<p>That&rsquo;s pretty much the whole point. Agents do better work with more information, and a screenshot is about the cheapest information you can give them.</p>
<h2 id="tell-it-where-to-look">Tell it where to look</h2>
<p>Dragging images into the chat works, but it gets old fast. What made it stick for me was adding one line to my global <code>CLAUDE.md</code>:</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-text" data-lang="text"><span class="line"><span class="cl">If I mention screenshots, they can be found in &#34;~/Pictures/Screenshots&#34;.
</span></span></code></pre></td></tr></table>
</div>
</div><p>Now I take the screenshot like I normally would and type &ldquo;see my latest screenshot.&rdquo; The agent goes and finds it. Put the equivalent in your <code>AGENTS.md</code> or whatever your agent reads, pointing at wherever your screenshots actually land.</p>
<p>One caution though. Dashboards like Cloudflare&rsquo;s love to show API tokens and account IDs, so crop those out before you share.</p>
<p>Agents can take their own screenshots too, with tools like Playwright, but that&rsquo;s another post. Next time you&rsquo;re lost in a menu or squinting at a UI bug, skip the description and send a screenshot. Try it out yourself!</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/prompt-context-is-a-resource/">Stop installing things your agent doesn&rsquo;t need</a></li>
<li><a href="/posts/writing-an-agents-md-for-a-national-cluster/">Writing an AGENTS.md for a national cluster</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Get a second opinion from another model</title>
      <link>https://www.tk11br.ca/posts/get-a-second-opinion-from-another-model/</link>
      <pubDate>Mon, 26 Oct 2026 09:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/get-a-second-opinion-from-another-model/</guid>
      <description>Models are tuned to write code differently. If you have the tokens, having one review another&amp;#39;s work is basic hygiene, and personas take the idea further.</description>
      <content:encoded><![CDATA[<p>The best part of pair programming is pretty much just having someone else look at what you wrote. They notice the stuff you stopped seeing an hour ago. I wouldn&rsquo;t merge my own work without a review, so why would I let the model that wrote the code be the only one to review it? A model reviewing its own work has the same blind spots it had while writing it. It made its choices for reasons that still seem good to it, so asking it again kind of gets you the same thing back.</p>
<h2 id="models-have-taste">Models have taste</h2>
<p>Different models are tuned to write code in different ways. Give two of them (of relatively the same capability, of course) the same task and you&rsquo;ll get two different shapes back. One adds structure where the other would cut stuff. One treats a pattern as normal and the other flags it. Neither is always right. They just have different taste, the same way two senior devs on a team do. That&rsquo;s why a second opinion is worth having. A different model is more likely to question the stuff the first one took for granted.</p>
<h2 id="how-i-run-it">How I run it</h2>
<p>I personally keep the reviews independent. Each model reviews the same project in its own worktree, so neither one sees the other&rsquo;s take before writing its own. Then I have one agent merge and deduplicate the findings into a single write-up, or a parent issue with sub-issues if there&rsquo;s real work to do. What&rsquo;s great about this is that you don&rsquo;t necessarily need any sort of fancy agent setup. Just two different terminal windows to get you started.</p>
<p>This does cost tokens. It&rsquo;s two full reviews instead of one. Personally, I think it&rsquo;s just good hygiene if you have the tokens to burn. If you finish most weeks with headroom on your <a href="/posts/start-your-five-hour-window-early/">weekly cap</a>, this is a really good way to spend it. If you&rsquo;re paying API rates for every token, it&rsquo;s a harder sell. But then again, you&rsquo;re probably in enterprise with a code review product.</p>
<h2 id="change-the-reviewer-not-just-the-model">Change the reviewer, not just the model</h2>
<p>You don&rsquo;t always need a second model to get a second perspective. You can tell an agent to review the code as someone specific.</p>
<p><a href="https://github.com/dietrichgebert/ponytail">Ponytail</a> is a good example. It makes your agent think like the lazy senior dev who, in its README&rsquo;s words, &ldquo;has been at the company longer than the version control&rdquo; and replaces your fifty lines with one. Its <code>/ponytail-review</code> and <code>/ponytail-audit</code> commands review a change or a whole repo from that point of view.</p>
<p>The idea is really easy to extend. Have a security person read the code looking for what an attacker would try. Have a junior who just joined the team read it looking for what they can&rsquo;t follow. It&rsquo;s been very useful for me to get feedback on sections of code from perspectives I don&rsquo;t have by default. I don&rsquo;t naturally read my own code like an attacker, or like someone seeing it for the first time.</p>
<p>Next time you finish a change, hand it to a different model, or ask your agent to review it as someone who isn&rsquo;t you. Try it out yourself!</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/why-i-still-use-sol-on-low/">Why I still use Sol on low</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>Clean-Room Rewrites for Researchers</title>
      <link>https://www.tk11br.ca/posts/clean-room-rewrites-for-researchers/</link>
      <pubDate>Fri, 23 Oct 2026 12:00:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/clean-room-rewrites-for-researchers/</guid>
      <description>Tools like REA let a coding agent take closed software apart. Escaping research lock-in is one of the best uses for them, as long as you stay in your lane.</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/morluto/rea">REA</a>, short for Reverse Engineer Anything, went from nothing in April to about 370,000 GitHub stars this month. It&rsquo;s an MCP server that hands your coding agent the reverse-engineering tools people have used for years, like Ghidra, IDA, and Hopper, and lets it work out how a program behaves without the source. It should be noted that these tools typically are only used by experts and they take a lot of skill to use.</p>
<p>It arrived in the middle of a messy time for software licensing. The chardet library was rewritten with Claude Code and relicensed from LGPL to MIT, and its original author objected. PhotoCraft is building a &ldquo;clean-room&rdquo; Photoshop in Rust. Someone even launched Malus, a satire site selling &ldquo;Clean Room as a Service&rdquo;.</p>
<p>However, I think most of that unease is about commercial clones and relicensing other people&rsquo;s work, and security concerns. There&rsquo;s a much more boring use case that I think is really valuable though, getting your own research out of a tool you&rsquo;re stuck with.</p>
<h2 id="what-rea-actually-does">What REA actually does</h2>
<p>REA doesn&rsquo;t decompile anything itself. Your agent calls it over MCP, REA drives whichever analysis tool fits the target, and the findings come back with the evidence behind each one. The agent can then use those findings to explain the behaviour, or to write and test a new implementation.</p>
<p>The docs even describe how to keep it clean-room. The agent writing the new code runs somewhere that can&rsquo;t read REA or its analysis output, and only gets a spec. That&rsquo;s the classic two-team clean-room setup, just with LLM agents instead of people.</p>
<h2 id="the-paradigm-you-get-stuck-with">The paradigm you get stuck with</h2>
<p>Lots of labs have an experiment or piece of code like this. The paradigm was built years ago in E-Prime, Presentation, or a MATLAB toolbox that only ships compiled code or something too difficult to modify. It works, but the licence is expensive, it only runs on one old Windows machine in the corner, and nobody who built it is still around. You&rsquo;d like it in PsychoPy, but the details that matter are hidden. How the trials are randomised, which trigger codes go out when, and what goes in the output file.</p>
<p>That&rsquo;s pretty much exactly what REA is for. Point the agent at the old paradigm, let it recover those details, and have it write them down as a spec. A second agent builds the PsychoPy version from that spec alone. That used to be a big chunk of somebody&rsquo;s entire year as a Masters student when they didn&rsquo;t even have a Computer Science degree. Now it&rsquo;s a lot more doable.</p>
<h2 id="stay-in-your-lane">Stay in your lane</h2>
<p>Two things keep this on the right side of the grey area.</p>
<p><strong>Ask first.</strong> Email the vendor or the original author before you take anything apart. They might just send you the spec, or the source, and then you don&rsquo;t need REA at all. Or better yet, you and your lab are the owners anyway!</p>
<p><strong>Validate against the original.</strong> Run the old and new versions side by side and compare the trial order, the trigger timing, and the output files. The rewrite is only useful in a paper if you can show it behaves the same, so honestly that comparison matters more than the code.</p>
<p>Cloning a commercial product to sell, or rewriting someone&rsquo;s library to drop their licence, is a different thing. That&rsquo;s where the chardet fight came from, and personally I&rsquo;d stay far, far away from this.</p>
<h2 id="try-it">Try it</h2>
<p>If a closed tool is the only thing between you and a reproducible study, this is now a realistic project. Pick the paradigm that&rsquo;s been stuck on that old lab machine, and see how far an agent and REA get you.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Writing an AGENTS.md for a national cluster</title>
      <link>https://www.tk11br.ca/posts/writing-an-agents-md-for-a-national-cluster/</link>
      <pubDate>Tue, 20 Oct 2026 09:57:00 -0400</pubDate>
      <guid>https://www.tk11br.ca/posts/writing-an-agents-md-for-a-national-cluster/</guid>
      <description>What I learned putting an AGENTS.md into the Alliance software stack: skip what frontier models already know and spend the lines on site policy and when to stop and ask.</description>
      <content:encoded><![CDATA[<p>Agents have started causing problems on our clusters. Heavy work kicked off on shared login nodes, Slurm getting polled in tight loops, that sort of thing.</p>
<p>I&rsquo;d been using a small <code>CLAUDE.md</code> for myself on Nibi for a while, and I was asked to turn it into something for everyone. The Alliance clusters get their environment from <a href="https://github.com/ComputeCanada/software-stack-config">ComputeCanada/software-stack-config</a>, so I opened <a href="https://github.com/ComputeCanada/software-stack-config/pull/111">PR #111</a> to add an <code>agents/AGENTS.md</code> there on request. Claude Code reads <code>/etc/claude-code/CLAUDE.md</code> system wide, and most other harnesses look for an <code>AGENTS.md</code>, so one file and a symlink covers a lot of ground.</p>
<h2 id="only-say-what-the-model-cant-know">Only say what the model can&rsquo;t know</h2>
<p>My opinion after going through this is that an <code>AGENTS.md</code> should only hold what the model can&rsquo;t already know. Site policy, the stuff that&rsquo;s different about these clusters, and when to stop and ask the human. That&rsquo;s it.</p>
<p>Everything in the file is in the context of every session, so every line should carry a lot of value. Things like the module commands and Slurm commands are already known by the frontier LLMs. There&rsquo;s no need to give specific guidance on them. The lower tier LLM services won&rsquo;t even read these docs anyway.</p>
<h2 id="review-is-important">Review is important</h2>
<p>The next morning after sharing there were about 20 inline comments, and nearly all were things no model could know from training. Not every compute node has internet, so tarballs and wheels need to be staged from the login node. Bundle anything that runs under 15 minutes and checkpoint anything over 12 hours. Avoid <code>uv</code>. If a wheel or module is missing, tell the user to contact support instead of getting creative.</p>
<p>It also caught my own mistake. My Python section said to load the module, make a virtual environment, and install from the wheelhouse. It never activated the environment. A classic.</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><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</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">module load python/&lt;version&gt;
</span></span><span class="line"><span class="cl">virtualenv --no-download &lt;venv&gt;
</span></span><span class="line"><span class="cl"><span class="nb">source</span> &lt;venv&gt;/bin/activate
</span></span><span class="line"><span class="cl">pip install --no-index &lt;package&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>So the people who run the stack should absolutely be writing these with you. They know the local gotchas way better than any model does.</p>
<h2 id="where-i-pushed-back">Where I pushed back</h2>
<p>The thing that kept coming up in review was adding specific wiki links to each section, plus fuller examples of commands like <code>module spider</code>. My problem with this is it&rsquo;s just bloat. I think we can just tell the agents to check the documentation, or perhaps just say the page name.</p>
<h2 id="what-came-after">What came after</h2>
<p>A few more rules went in after that, similar to ones other sites have landed on, like <a href="https://chtc.cs.wisc.edu/uw-research-computing/agent-recommendations">CHTC at UW–Madison</a>. The file now says human users remain responsible for the actions of their agents. It also says to point out stale VS Code processes and offer to kill them, to wait at least 60 seconds between Slurm queries, and to never insert sleep commands into jobs. Those are the same kind of thing, site behaviour a model wouldn&rsquo;t guess.</p>
<p>The latest change points agents at a read only markdown copy of the Alliance wiki at <code>/cvmfs/soft.computecanada.ca/custom/docs/</code>, in English and French. Now the agent can go read the actual page when it needs the details, and none of it has to live in the file.</p>
<p>Since then, it has been deployed to the Nibi cluster. To see for yourself without SSHing to Nibi, visit <a href="https://github.com/ComputeCanada/software-stack-config/pull/111">the PR</a>.</p>
<h2 id="related-posts">Related posts</h2>
<ul>
<li><a href="/posts/prompt-context-is-a-resource/">Stop installing things your agent doesn&rsquo;t need</a></li>
<li><a href="/posts/send-your-agent-a-screenshot/">Send your agent a screenshot</a></li>
</ul>
]]></content:encoded>
    </item>
    <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>
<li><a href="/posts/get-a-second-opinion-from-another-model/">Get a second opinion from another model</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>
<li><a href="/posts/get-a-second-opinion-from-another-model/">Get a second opinion from another model</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>
<li><a href="/posts/get-a-second-opinion-from-another-model/">Get a second opinion from another model</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
