<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stephan Miller</title>
    <description>The latest articles on DEV Community by Stephan Miller (@eristoddle).</description>
    <link>https://dev.to/eristoddle</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F18795%2F5f6c41b8-6033-4887-937a-2ebdfe623d2e.jpeg</url>
      <title>DEV Community: Stephan Miller</title>
      <link>https://dev.to/eristoddle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eristoddle"/>
    <language>en</language>
    <item>
      <title>Apple Books Hides Your PDF Highlights. My Obsidian Plugin Now Digs Them Out.</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 29 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/apple-books-hides-your-pdf-highlights-my-obsidian-plugin-now-digs-them-out-lio</link>
      <guid>https://dev.to/eristoddle/apple-books-hides-your-pdf-highlights-my-obsidian-plugin-now-digs-them-out-lio</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5unzcqi7rgb76dnf5px.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5unzcqi7rgb76dnf5px.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of all &lt;a href="https://dev.to/eristoddle/the-obsidian-plugin-collection-i-built-one-free-kiro-credit-at-a-time-2b42"&gt;the little plugins I’ve vibe coded into existence&lt;/a&gt;, the &lt;a href="https://github.com/eristoddle/apple-books-annotation-import" rel="noopener noreferrer"&gt;Apple Books Annotation Import&lt;/a&gt; plugin is the one I actually use. Not “use” in the way you use a project once, screenshot it for a blog post, and never open again. I mean I run it every week. It’s my favorite thing I’ve built, and it’s been humming along for &lt;a href="https://dev.to/eristoddle/jules-ai-the-currently-free-coding-assistant-that-cant-follow-directions-but-gets-shit-done-33k3"&gt;over a year without me touching it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then a few weeks ago I went looking for a highlight I knew I’d made in a PDF. It wasn’t there. None of my PDF highlights were there. A year of trusting this thing, and it turns out it had quietly been ignoring an entire category of my books the whole time.&lt;/p&gt;

&lt;p&gt;So I went digging. And it turns out Apple Books handles PDFs in a completely different way. This is the story of getting those highlights out, and the 1.1.0 release that finally does it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Quick Refresher On What This Thing Does&lt;/li&gt;
&lt;li&gt;Where Apple Actually Hides PDF Highlights&lt;/li&gt;
&lt;li&gt;Reading Highlights Out Of A Raw PDF&lt;/li&gt;
&lt;li&gt;Hooking It Into The Machine That Already Worked&lt;/li&gt;
&lt;li&gt;The Tradeoff: It’s Slower, But It’s Everything Now&lt;/li&gt;
&lt;li&gt;How To Install It (It’s Not In Community Plugins Yet)&lt;/li&gt;
&lt;li&gt;The Takeaway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Quick Refresher On What This Thing Does
&lt;/h2&gt;

&lt;p&gt;If you’ve &lt;a href="https://dev.to/eristoddle/creating-an-obsidian-plugin-with-claude-ai-gaj"&gt;never seen the plugin before&lt;/a&gt;, here’s the pitch. It’s macOS desktop only, and I’m fine with that, because being desktop only is the entire reason it can do what it does. I read in an iPad and I pay for the cheapest rung of iCloud specificallly because of this plugin to get the books where the plugin runs.&lt;/p&gt;

&lt;p&gt;When you highlight something in Apple Books, that highlight has to live somewhere on disk. On a Mac it does. On an iPhone it’s locked in a sandbox you can’t reach. So the plugin sits on the desktop where all the good data is and pulls from every source it can find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Books SQLite databases.&lt;/strong&gt; This is where your EPUB highlights and notes actually live, buried in &lt;code&gt;~/Library/Containers/com.apple.iBooksX&lt;/code&gt;. The plugin &lt;a href="https://dev.to/eristoddle/exporting-mac-osx-book-highlights-into-an-obsidian-vault-or-markdown-files-40lg"&gt;reads them straight out of SQLite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The EPUB files themselves.&lt;/strong&gt; The database doesn’t have everything. So the plugin also cracks open the EPUB to grab the real metadata: ISBN, publisher, language, subjects, and the cover image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And now, as of 1.1.0, the PDFs themselves.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Out of all that it builds a clean markdown note per book: your highlights as blockquotes, color-coded to match the highlighter you used, optional notes, dates, citations, cover image, and an author page with a Dataview query that lists every book by that author. It has a smart overwrite mode that hashes the note so re-importing only rewrites files that actually changed. Pick “Import all books” or cherry-pick from a list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrfsvm2cqtxensrldr32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrfsvm2cqtxensrldr32.png" alt="Apple Books Annotation Import settings" width="800" height="958"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole point is completeness. I’m not scraping one source, I’m triangulating across three. Which is why the missing PDF highlights bugged me so much. There was a hole in the completeness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Apple Actually Hides PDF Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8u5coee3a25dpgmt1bd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8u5coee3a25dpgmt1bd.jpg" alt="A Quick Refresher On What This Thing Does" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s the part that took real detective work, and where my first assumption was flat wrong.&lt;/p&gt;

&lt;p&gt;My mental model was simple: highlights go in the SQLite database, PDFs are books, therefore PDF highlights go in the database. So I looked. And there they were. Sort of.&lt;/p&gt;

&lt;p&gt;The database had a row for every PDF I’d ever opened. But every single one looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;ZANNOTATIONSELECTEDTEXT&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;(empty)&lt;/span&gt;
&lt;span class="py"&gt;ZANNOTATIONSTYLE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;ZANNOTATIONTYPE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="py"&gt;ZPLUSERDATA&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;binary plist: BKPageLocation, pageOffset 21&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No text. No color. No note. Just a page number wrapped in a binary property list. That’s not a highlight. That’s a bookmark. Apple Books drops one of these in the database for every PDF so it can remember what page you were on, and my plugin had been correctly throwing them away for a year because they have no selected text.&lt;/p&gt;

&lt;p&gt;So the highlights weren’t in the database at all. That meant they had to be in the PDF files, which on a Mac live in your iCloud Books folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/Library/Mobile Documents/iCloud~com~apple~iBooks/Documents/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I grepped one of my highlighted PDFs for the PDF highlight marker, and there it was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;58 occurrences of /Subtype /Highlight
71 QuadPoints arrays

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the answer. Apple Books writes PDF highlights back into the PDF file as standard PDF annotations. Not into its own database like it does for EPUBs. Into the file. Which is actually the more portable choice, it’s just the opposite of everywhere else the app stores things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading Highlights Out Of A Raw PDF
&lt;/h2&gt;

&lt;p&gt;A PDF highlight annotation doesn’t store the text you highlighted. That would be too easy. It stores &lt;code&gt;QuadPoints&lt;/code&gt;, which are the rectangles the yellow marker was painted over, in PDF coordinate space. To get the actual words you have to line those rectangles up against the text on the page and read out whatever sits underneath.&lt;/p&gt;

&lt;p&gt;That’s a job for &lt;a href="https://github.com/mozilla/pdf.js" rel="noopener noreferrer"&gt;pdf.js&lt;/a&gt;, Mozilla’s PDF engine. It gives me the annotations on each page and, separately, every run of text with its position. For each highlight I:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turn its &lt;code&gt;QuadPoints&lt;/code&gt; into one box per highlighted line.&lt;/li&gt;
&lt;li&gt;Find the text on the page whose baseline falls inside each box.&lt;/li&gt;
&lt;li&gt;Clip the first and last lines, because a highlight usually starts and ends mid-sentence, snapping the cut to the nearest word boundary so I don’t slice a word in half.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjqt6ad0g0hl2a5qzsiup.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjqt6ad0g0hl2a5qzsiup.jpg" alt="Reading Highlights Out Of A Raw PDF" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tested it against a highlight I knew the exact wording of, and it came back verbatim, starting and ending in exactly the right place. Colors came out too. pdf.js hands them back as plain RGB values from 0 to 255, and Apple’s highlighter yellow is &lt;code&gt;(250, 205, 90)&lt;/code&gt;, so I map that to the same little yellow square the EPUB highlights already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooking It Into The Machine That Already Worked
&lt;/h2&gt;

&lt;p&gt;This is the part I’m actually happy about, and it’s the part that keeps this from being a bolt-on mess.&lt;/p&gt;

&lt;p&gt;The plugin already had a whole pipeline for EPUBs: an &lt;code&gt;Annotation&lt;/code&gt; object shape, a markdown renderer, the smart-overwrite dedup, author page creation, file naming. All of it keyed off two internal types. So instead of writing a parallel universe for PDFs, I made the PDF extractor produce those exact same types. A PDF highlight becomes an &lt;code&gt;Annotation&lt;/code&gt;. A PDF file becomes a &lt;code&gt;BookDetail&lt;/code&gt;, with its title and author pulled from the Books library database so the note gets a real title instead of a mangled filename.&lt;/p&gt;

&lt;p&gt;Once the shapes matched, the entire existing machine just ran. The renderer, the dedup, the author pages, the color emoji, none of it knew or cared that these highlights came out of a PDF instead of a database. PDF import is just a second phase inside the same “Import all books” command, plus one new toggle in settings so you can turn it off (because it is now the slow part of the plugin).&lt;/p&gt;

&lt;p&gt;The genuinely annoying part was bundling pdf.js into a single-file Obsidian plugin. pdf.js wants to run its parser in a Web Worker loaded from a separate file, and an Obsidian plugin ships as one &lt;code&gt;main.js&lt;/code&gt;. The trick is to run the worker on the main thread by handing pdf.js its own worker module through a global:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;pdfjsWorker&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdfjs-dist/legacy/build/pdf.worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalThis&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;pdfjsWorker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pdfjsWorker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That, plus telling the bundler to leave the optional &lt;code&gt;canvas&lt;/code&gt; dependency alone, and it works. It also took &lt;code&gt;main.js&lt;/code&gt; from about 250KB to 4.3MB, because I’m now shipping an entire PDF engine inside a note-taking plugin. Such is life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tradeoff: It’s Slower, But It’s Everything Now
&lt;/h2&gt;

&lt;p&gt;I’m not going to pretend this is free. The database approach for EPUBs is instant. The PDF approach is not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr53a86l2qrh85tcyovl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr53a86l2qrh85tcyovl.jpg" alt="The Tradeoff: It's Slower, But It's Everything Now" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apple doesn’t track which PDFs you’ve highlighted anywhere I can query, so the plugin has to go look. It scans your entire iCloud Books folder, does a cheap byte-level check for the highlight marker to skip the hundreds of PDFs you never marked up, and then parses the survivors with pdf.js on the main thread. In my library that’s 748 PDFs to glance at. So yes, “Import all books” takes noticeably longer than it used to, and a book with a lot of highlights can make the app pause for a second while it works.&lt;/p&gt;

&lt;p&gt;I decided I’ll take that trade every time. A slightly slower import that gets me everything beats an instant import with a hole in it.&lt;/p&gt;

&lt;p&gt;And I do mean everything. Between the SQLite databases, the EPUB files, and now the PDFs, I’m fairly confident there’s nothing left in Apple Books that I can’t pull out. EPUB highlights, PDF highlights, notes, metadata, covers. If Apple is storing it on my Mac, this plugin can reach it. I went looking for one more hidden source after the PDFs and came up empty, which for once is the good outcome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vh0i4p0shp2n3jhndre.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vh0i4p0shp2n3jhndre.png" alt="A PDF book note with imported highlights" width="800" height="1211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Install It (It’s Not In Community Plugins Yet)
&lt;/h2&gt;

&lt;p&gt;Fair warning: this plugin is not in the Obsidian community plugin browser. It’s mine, it’s niche, and it reads files out of your macOS system libraries, so it lives on GitHub for now. That means two ways in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The easy way, with BRAT.&lt;/strong&gt; BRAT is the Beta Reviewers Auto-update Tool, and it exists exactly for plugins like this one. Install BRAT from the community plugins, then add this repo as a beta plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eristoddle/apple-books-annotation-import

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BRAT installs it and keeps it updated whenever I push a new release. I wrote a whole walkthrough of this if you’ve never done it: &lt;a href="https://www.stephanmiller.com/how-to-install-obsidian-plugins/#:~:text=How%20to%20Install%20Beta%20Obsidian%20Plugins%20with%20BRAT" rel="noopener noreferrer"&gt;How to Install Obsidian Plugins&lt;/a&gt;, including the BRAT section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The manual way.&lt;/strong&gt; Grab &lt;code&gt;main.js&lt;/code&gt;, &lt;code&gt;manifest.json&lt;/code&gt;, and &lt;code&gt;styles.css&lt;/code&gt; from the &lt;a href="https://github.com/eristoddle/apple-books-annotation-import/releases" rel="noopener noreferrer"&gt;latest release&lt;/a&gt;, drop them in a folder under &lt;code&gt;.obsidian/plugins/apple-books-annotation-import/&lt;/code&gt; in your vault, and enable it in settings. No auto-updates, but it works.&lt;/p&gt;

&lt;p&gt;Either way, once it’s on, flip on “Import PDF highlights” in the settings, hit “Import all books,” and give it a minute to chew through your library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;The lesson here isn’t really about PDFs. It’s that “it works” and “it’s complete” are two different claims, and I’d been quietly making the first one while believing the second for over a year. The plugin worked. It just wasn’t done. It took actually going looking for a specific missing highlight to find the gap.&lt;/p&gt;

&lt;p&gt;If you build tools for yourself, this is the failure mode to watch for. The thing runs, you trust it, and you stop checking whether it’s still telling you the whole truth. Apple gave me a good excuse by hiding PDF highlights in a completely different place than everything else, but the hole was mine to notice.&lt;/p&gt;

&lt;p&gt;Anyway. It’s fixed. Every highlight I’ve got, in every format Apple Books supports, now lands in Obsidian. Which means I’m out of excuses and back to actually reading the books.&lt;/p&gt;

</description>
      <category>obsidian</category>
      <category>applebooks</category>
      <category>plugin</category>
      <category>pdf</category>
    </item>
    <item>
      <title>Claude Opus 5: The Flagship Got Cheaper (There's a Catch)</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/claude-opus-5-the-flagship-got-cheaper-theres-a-catch-171i</link>
      <guid>https://dev.to/eristoddle/claude-opus-5-the-flagship-got-cheaper-theres-a-catch-171i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fhlgljv83v774v3vudo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fhlgljv83v774v3vudo.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For about a year now, every model launch has followed the same script. A lab drops a new flagship, it’s a little smarter than the last one, and it costs more. You brace for it. New tier, new price, same shrug. So when Anthropic put out Claude Opus 5 on July 24, I opened the pricing page already wincing.&lt;/p&gt;

&lt;p&gt;Then I read it twice, because it was half the price.&lt;/p&gt;

&lt;p&gt;Not half the price of some bloated competitor. Half the price of Anthropic’s own current king, Fable 5. And on the Artificial Analysis Intelligence Index, Opus 5 edged out Fable 5 for the number one spot. Smarter and cheaper, in the same launch. That’s not how any of this has gone for a year.&lt;/p&gt;

&lt;p&gt;And then, three days later, the biggest open-weights model in human history dropped on Hugging Face, and I sat there doing the math on whether I could run it. Spoiler: I cannot. Nobody with fewer than eight datacenter GPUs can. Welcome to the week.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Flagship Got Cheaper (Wait, What?)&lt;/li&gt;
&lt;li&gt;The 2.8 Trillion Parameter Paperweight&lt;/li&gt;
&lt;li&gt;The Actually Useful Release Nobody Tweeted About&lt;/li&gt;
&lt;li&gt;Cheapskate Picks: What I’d Actually Pay For&lt;/li&gt;
&lt;li&gt;The Horror Show&lt;/li&gt;
&lt;li&gt;The Still-Waiting Room&lt;/li&gt;
&lt;li&gt;The Takeaway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Flagship Got Cheaper (Wait, What?)
&lt;/h2&gt;

&lt;p&gt;Here’s the part I keep re-reading. Claude Opus 5 costs $5 per million input tokens and $25 per million output. That’s the exact same price as Opus 4.8, the model it replaces. Meanwhile Fable 5, Anthropic’s big expensive brain, sits at $10 in and $50 out. So Opus 5 is literally half the sticker of the model it just beat on the intelligence leaderboard.&lt;/p&gt;

&lt;p&gt;On the Artificial Analysis Intelligence Index, Opus 5 (max) scores 61. Fable 5 lands at 60. GPT-5.6 Sol comes in at 59, and Moonshot’s Kimi K3 at 57. It’s a photo finish at the top, but the point is that the cheaper Anthropic model is the one holding the trophy this week.&lt;/p&gt;

&lt;p&gt;The number that actually matters, though, isn’t the Index rank. It’s cost per task. Sticker price per token lies to you, because different models burn different amounts of tokens to finish the same job. Artificial Analysis measured it: running their full Intelligence Index costs about $2.03 per task on Opus 5 versus $2.75 on Fable 5. That’s roughly 26 percent cheaper to do the same work, on top of the lower per-token rate. For anyone running agent loops where the bill compounds, that’s the real headline.&lt;/p&gt;

&lt;p&gt;The benchmarks back up the “it’s genuinely good” claim, not just the “it’s cheap” one. On Frontier-Bench v0.1 it hit 43.3 percent, against Fable 5’s 33.7 and GPT-5.6 Sol’s 34.4. On ARC-AGI-3 it scored 30.2 percent while Opus 4.8 managed a sad 1.5. It’s the new default on Claude Max and the strongest model available on Claude Pro.&lt;/p&gt;

&lt;p&gt;So what’s the catch, because there’s always a catch. The catch is buried in the launch chart. On the Frontier-Bench numbers, Anthropic notes that Opus 4.8 “stood in as a fallback” whenever a safety classifier refused an Opus 5 request. Fine. Except they never said how often that happened. So the flagship benchmark quietly folds in a weaker model’s answers by an amount nobody will tell you. If you remember the refuse-and-reroute mess that followed Fable 5 around, this is the same species of problem wearing a nicer suit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2.8 Trillion Parameter Paperweight
&lt;/h2&gt;

&lt;p&gt;While Anthropic was cutting prices, Moonshot was flexing. On July 27 they released the open weights for Kimi K3, and this thing is a monster: 2.8 trillion parameters, the largest open-weight model ever shipped. On the Artificial Analysis Index it scores 57, which makes it the highest-scoring open model on the board, ahead of everything else you can actually download.&lt;/p&gt;

&lt;p&gt;Here’s where the dream meets the parking lot. The download is about 1.4 terabytes of weights even at MXFP4 quantization. The architecture is a mixture of experts, 896 experts total with 16 active per token, so roughly 50 billion parameters are actually doing work on any given pass. To load it you need something like four to eight H100 80GB GPUs. Your 4090 can’t touch it. Your maxed-out Mac Studio can’t touch it. “Own your weights” is a beautiful slogan right up until you price the hardware to hold them.&lt;/p&gt;

&lt;p&gt;So in practice, for almost everyone, Kimi K3 is still just an API you rent at $3 per million in and $15 per million out. The weights being open is great for labs, cloud providers, and the three guys on Reddit with a GPU rack in the garage. For the rest of us it’s a philosophical victory, not a practical one.&lt;/p&gt;

&lt;p&gt;And it’s not a clean win even on quality. Accuracy went up about 13 points over the K2.6 generation, which sounds great, but the hallucination rate also climbed about 12 points. Moonshot frames that as the model being “more willing to answer.” Cute. For regulated, legal, medical, or financial work, “more willing to answer” is a polite way of saying “more confidently wrong more often,” and there’s no dial to trade it back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actually Useful Release Nobody Tweeted About
&lt;/h2&gt;

&lt;p&gt;Buried under the Opus 5 launch and the Kimi K3 spectacle, Google shipped the model I’d actually reach for on a Tuesday. Gemini 3.6 Flash landed July 21 at $1.50 in and $7.50 out. That output price is down from the $9 that Gemini 3.5 Flash charged, and Google says it uses about 17 percent fewer output tokens on top of that. Cheaper rate, fewer tokens, same 1 million token context, knowledge cutoff pushed to March 2026.&lt;/p&gt;

&lt;p&gt;The funny part: Artificial Analysis gives 3.6 Flash the same Intelligence Index score as 3.5 Flash, a 50. So the tech press mostly shrugged. No leap, no headline. But it gained on the benchmarks that matter for real work, SWE-Bench Pro up to 58.7 percent from 55.1, OSWorld computer use up to 83 from 78.4. And it sits inside the competitive band of five of the six Arena categories I track. Cheaper than the thing it replaces, and it beats the mid-tier of the pricier labs. That’s the whole pitch, and it’s a good one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheapskate Picks: What I’d Actually Pay For
&lt;/h2&gt;

&lt;p&gt;Here’s the trick I run every week, because I’m cheap and I have to be. The Arena leaderboards cluster tight at the top. The entire Overall top 20 this week fits inside 32 rating points, from Fable 5 at 1508 down to a pack at 1476. When the whole visible field is that compressed, paying the leader’s price buys you almost nothing over something a fraction of the cost. So the game is: find the cheapest model still inside spitting distance of the category leader.&lt;/p&gt;

&lt;p&gt;Here’s where that landed this week:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Leader&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Cheapskate pick&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Δ rating&lt;/th&gt;
&lt;th&gt;Cheaper by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Fable 5 (1508)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1465, #37)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−43&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Opus 4.7-thinking (1553)&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1519, #25)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−34&lt;/td&gt;
&lt;td&gt;~29x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative Writing&lt;/td&gt;
&lt;td&gt;Fable 5 (1507)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3-Flash (1458, #21)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;td&gt;−49&lt;/td&gt;
&lt;td&gt;~16.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Following&lt;/td&gt;
&lt;td&gt;Fable 5 (1515)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1469, #23)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−46&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Prompts&lt;/td&gt;
&lt;td&gt;Fable 5 (1535)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1494, #25)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−41&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;Fable 5 (1539)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Qwen3.7 Max (1490, #14)&lt;/td&gt;
&lt;td&gt;$4.42&lt;/td&gt;
&lt;td&gt;−49&lt;/td&gt;
&lt;td&gt;~11.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MiMo v2.5 Pro, Xiaomi’s open-weights model, is the actual story this week, not Gemini 3.6 Flash. It sweeps four of six categories, Overall, Coding, Instruction Following, and Hard Prompts, all at the same $0.87 output price, and it does it by sitting at rank 23 to 37 in every one of those boards. A top-20 read misses it every single time, which is exactly the mistake I made drafting this section the first time around: I caught it on Coding, went back and checked the rest, and found the same miss in three more categories. Nobody’s talking about it. It’s just sitting there, MIT-licensed, being the actual answer.&lt;/p&gt;

&lt;p&gt;Gemini 3.6 Flash, the model with a whole section above this one, doesn’t win a single category outright once you look past the top 20. It’s still inside the band in five of six categories, so it’s a perfectly good pick if you want something you don’t have to go hunting for or self-host, but the honest cheapest option in four of six categories is a phone company’s open-weights model most readers have never heard of.&lt;/p&gt;

&lt;p&gt;Creative Writing breaks the pattern in both directions. MiMo doesn’t even show up in this category’s band, because Arena’s Creative Writing top end closes off faster (around rank 22 here) than the other categories do. And the actual cheapest thing inside that narrower band isn’t Gemini 3.6 Flash either, it’s the older, cheaper Gemini 3-Flash at $3, forty-nine points back and sitting right at the edge of the cutoff.&lt;/p&gt;

&lt;p&gt;Math is the one category where nothing changed. Qwen3.7 Max is still the cheapest model in the band, and it’s still clinging to the very edge at 49 points back. Grok 4.5 and Gemini 3.6 Flash both sit closer to the leader for a bit more money if you’d rather not ride the edge.&lt;/p&gt;

&lt;p&gt;One caveat on Overall and Hard Prompts: I pulled 40 rows deep for each category and the band technically hadn’t closed yet at row 40 in those two (the cutoff-adjacent rows were still inside the window). MiMo’s $0.87 is close to the price floor this cycle, so it’s very unlikely anything cheaper is sitting a few rows further down, but “very unlikely” isn’t the same as “confirmed,” so treat those two picks as high-confidence rather than fully closed.&lt;/p&gt;

&lt;p&gt;If you’re keeping score: MiMo v2.5 Pro is the boring, correct answer this week, not Gemini 3.6 Flash. Four out of six categories, one price tag, and it took reading past rank 20 in every single one of them to find that out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Horror Show
&lt;/h2&gt;

&lt;p&gt;Every roundup needs a section where I tell you what broke. This week was generous.&lt;/p&gt;

&lt;p&gt;The big one was DeepSeek’s migration cliff. DeepSeek is the single most-used vendor on OpenRouter right now, about 17.6 percent of all routed tokens. On July 24 at 15:59 UTC they hard-retired the old model names &lt;code&gt;deepseek-chat&lt;/code&gt; and &lt;code&gt;deepseek-reasoner&lt;/code&gt;. Not deprecated with a grace period. Retired. Calls to those names now return errors with no fallback, so any service that didn’t repoint to &lt;code&gt;deepseek-v4-flash&lt;/code&gt; or &lt;code&gt;deepseek-v4-pro&lt;/code&gt; started throwing user-facing failures the moment the clock hit. Worse, reasoning moved from being a model name to being a request parameter, so lazy integrations silently lost their thinking mode before the hard cutoff even arrived. If your app went weird last Friday afternoon, there’s your answer.&lt;/p&gt;

&lt;p&gt;Then there’s the Opus 5 fallback I already whined about. A benchmark that quietly swaps in a different model when the safety filter trips, by an amount nobody discloses, is exactly the kind of asterisk that gets left out of the headline.&lt;/p&gt;

&lt;p&gt;And Kimi K3 has a confidence problem. The hallucination rate climbing 12 points while the marketing calls it “more willing to answer” is going to bite somebody who wired it into a pipeline that trusts its output. Retrieval checks and citation verification are not optional with this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Still-Waiting Room
&lt;/h2&gt;

&lt;p&gt;The upcoming section is short and it’s mostly one name. Gemini 3.5 Pro missed its target again, and I’ve lost count, but this is at least the fourth slip. It’s still stuck in Vertex AI enterprise preview. Instead of the Pro model everyone actually wanted, Google shipped a fistful of Flash variants on July 21, which is how we got 3.6 Flash. TechCrunch’s headline said it plainly: three new Gemini models, but no 3.5 Pro. Reporting says the model keeps failing to hit Google’s own internal performance bar. At some point “delayed” starts to read as “in trouble.”&lt;/p&gt;

&lt;p&gt;On the open side, expect the Kimi K3 community quants and finetunes to start rolling now that the weights are public, assuming you have the hardware to do anything with them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;For most of the past year, the story in these roundups was rent versus own. Big closed models you pay for by the token, versus open Chinese weights you could theoretically host yourself. This week broke that frame in both directions at once. Anthropic made the closed flagship cheaper than its predecessor, and Moonshot made the open flagship so enormous that owning it is meaningless unless you run a datacenter.&lt;/p&gt;

&lt;p&gt;So the real question quietly changed. It’s not rent versus own anymore. It’s how much intelligence can you actually afford to run. Opus 5 answers it one way, by dropping the price of the top shelf. Gemini 3.6 Flash answers it another, by being 85 percent cheaper and good enough. Kimi K3 answers it by being technically free and practically out of reach.&lt;/p&gt;

&lt;p&gt;For the record, the market keeps drifting east while all this happens. Chinese models hit a record 58 percent of tokens processed by US firms on OpenRouter this month, peaking around 63 percent earlier in July. DeepSeek alone is that 17.6 percent, Qwen another 13.9, and Anthropic is the last US lab standing in the top 10. Make of that what you will.&lt;/p&gt;

&lt;p&gt;Me, I’m going to keep running Gemini 3.6 Flash for the boring stuff and paying up for Opus 5 when the task actually needs a brain. And I’m going to keep not running Kimi K3, because I do not, in fact, own a rack of H100s. Maybe next week.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>openrouter</category>
    </item>
    <item>
      <title>Obsidian iCloud Sync in 2026, Including the Windows Problem</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/obsidian-icloud-sync-in-2026-including-the-windows-problem-4503</link>
      <guid>https://dev.to/eristoddle/obsidian-icloud-sync-in-2026-including-the-windows-problem-4503</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkeljomnda7xalrgtpf4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkeljomnda7xalrgtpf4.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I sync Obsidian to two MacBook Pros, a Windows desktop, an iPad, and an Android phone, and I pay nothing for it. iCloud is not how I do it. I wrote up every method I know of in &lt;a href="https://dev.to/eristoddle/how-to-sync-obsidian-across-all-your-devices-including-free-methods-1mi5"&gt;my full guide to syncing an Obsidian vault across devices&lt;/a&gt;, and iCloud got a short section in that post with a warning attached, because the moment an Android phone enters the picture iCloud is done.&lt;/p&gt;

&lt;p&gt;But that pillar post never had room to explain the part people actually get burned by. So this is the long version. How to set iCloud sync up properly, what the Apple-only happy path looks like, and the specific ways iCloud Drive on Windows starts leaving random markdown files around your vault.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who Obsidian iCloud Sync Is Actually For&lt;/li&gt;
&lt;li&gt;How to Create a New Obsidian Vault in iCloud&lt;/li&gt;
&lt;li&gt;How to Move an Existing Obsidian Vault to iCloud&lt;/li&gt;
&lt;li&gt;The Mac, iPhone, and iPad Happy Path&lt;/li&gt;
&lt;li&gt;The Setting That Quietly Destroys Your Vault&lt;/li&gt;
&lt;li&gt;
The Windows Problem

&lt;ul&gt;
&lt;li&gt;The Workaround That Actually Respects the Problem&lt;/li&gt;
&lt;li&gt;When To Just Not Do It&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Obsidian Sync vs iCloud&lt;/li&gt;
&lt;li&gt;Is Obsidian iCloud Sync Encrypted?&lt;/li&gt;
&lt;li&gt;Cleaning Up the Duplicates You Already Have&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions&lt;/li&gt;
&lt;li&gt;The Verdict&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who Obsidian iCloud Sync Is Actually For
&lt;/h2&gt;

&lt;p&gt;iCloud is the best free option in exactly one situation: every device you touch has an Apple logo on it.&lt;/p&gt;

&lt;p&gt;Mac plus iPhone plus iPad is close to zero configuration. Obsidian on iOS has a first-class iCloud option built into the vault creation screen, which is more than you can say for Dropbox or Google Drive on that platform.&lt;/p&gt;

&lt;p&gt;Everywhere else it gets worse. Windows is possible but unreliable, covered in detail below. Linux has no official iCloud Drive client at all. And Android is not possible in any way I would recommend to a human being, because there is no iCloud Drive client for Android that syncs a folder to local storage, and Obsidian on Android needs a real local folder. That is why my own vault lives in Dropbox with &lt;a href="https://github.com/remotely-save/remotely-save" rel="noopener noreferrer"&gt;Remotely Save&lt;/a&gt; handling Android. My phone is the constraint that decided the whole architecture.&lt;/p&gt;

&lt;p&gt;If your phone is an iPhone and your desktop is a Mac, stop reading comparison posts and just use iCloud. It is free, it is already on, and it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Create a New Obsidian Vault in iCloud
&lt;/h2&gt;

&lt;p&gt;Two completely different procedures get searched for here, and people mix them up constantly. Creating a fresh vault in iCloud is the easy one. Do this first if you are starting clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On iPhone or iPad:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Obsidian and tap &lt;strong&gt;Create new vault&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Give it a name. Make it something you will recognize in Files.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;Store in iCloud&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;On Mac:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Obsidian and choose &lt;strong&gt;Create new vault&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For the location, browse to &lt;code&gt;iCloud Drive&lt;/code&gt; and pick or make a folder there.&lt;/li&gt;
&lt;li&gt;Create the vault.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figi8q6x8xuk3evmrndsg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figi8q6x8xuk3evmrndsg.jpg" alt="How to Create a New Obsidian Vault in iCloud" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On disk, the Mac path is &lt;code&gt;~/Library/Mobile Documents/iCloud~md~obsidian/Documents/&lt;/code&gt;, which shows up in the Files app as &lt;strong&gt;iCloud Drive &amp;gt; Obsidian&lt;/strong&gt;. That is where the iOS app puts vaults, and it is worth knowing because it is the folder you will be pointing other tools at later. Obsidian’s own docs are direct about this: vaults should live inside the Obsidian folder in iCloud Drive. A vault you drop somewhere else in iCloud Drive will sync between Macs fine and then fail to show up in the iOS app’s vault list, which is a confusing hour of your life you can skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Move an Existing Obsidian Vault to iCloud
&lt;/h2&gt;

&lt;p&gt;This is the one that goes wrong. The instinct is to drag your vault folder into iCloud Drive and open it. Do not start there.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Back the vault up first.&lt;/strong&gt; Copy the entire folder somewhere outside any sync service. A zip on your desktop is fine, and it is the only thing standing between you and a bad afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close Obsidian on every device.&lt;/strong&gt; Not backgrounded on your phone. Closed. Two clients writing into a folder during an initial upload is how you generate conflicts on day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a new empty vault in iCloud&lt;/strong&gt; using the steps above, with the same name as your existing vault.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move the contents&lt;/strong&gt; of your old vault into that new iCloud folder. Include the hidden &lt;code&gt;.obsidian&lt;/code&gt; folder if you want your settings, themes, hotkeys, and plugins to come along. On Mac, &lt;code&gt;Cmd + Shift + .&lt;/code&gt; toggles hidden files in Finder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait for the upload to finish completely&lt;/strong&gt; before opening Obsidian anywhere. Watch the iCloud status in Finder’s sidebar. Rushing this is the whole problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open it on your Mac first&lt;/strong&gt; , let plugins load, then open it on iOS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On a big vault, leave the attachments out of the first pass. Sync the markdown, confirm it works, then move the images. Markdown files are tiny. Attachments are what blow up the initial sync window and give conflicts room to happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mac, iPhone, and iPad Happy Path
&lt;/h2&gt;

&lt;p&gt;Once the vault is in place, the Apple-only setup genuinely is the low-maintenance option. Edits show up on the other device in a few seconds when both are awake and online. Obsidian’s own settings sync along with the vault because &lt;code&gt;.obsidian&lt;/code&gt; is just another folder, so if you have gone deep on &lt;a href="https://dev.to/eristoddle/how-to-install-activate-and-update-obsidian-plugins-4d2p"&gt;installing Obsidian plugins&lt;/a&gt; you do not have to set them up again per device.&lt;/p&gt;

&lt;p&gt;Two habits keep it that way. Let one device finish syncing before you start editing on another, because sync services do not have opinions about which version of a paragraph you meant. And never run a second sync system on the same vault. Not Obsidian Sync on top of iCloud, not Dropbox pointed at the same folder, not a Git plugin committing every two minutes. Two sync engines fighting over one folder is the most reliable way to lose notes, and it is self-inflicted every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setting That Quietly Destroys Your Vault
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fee3l7m23o773e0ip1u7y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fee3l7m23o773e0ip1u7y.jpg" alt="The Setting That Quietly Eats Your Vault" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turn off &lt;strong&gt;Optimize Mac Storage&lt;/strong&gt; for iCloud Drive, or at least understand what it does before you leave it on.&lt;/p&gt;

&lt;p&gt;When macOS decides you are low on space, it evicts the local copies of files it thinks you are not using and leaves a placeholder with a little cloud icon. For photos, fine. For an Obsidian vault, not fine. Search, graph view, and backlinks all depend on files actually being present on disk. An evicted note is not a note. Searches come back short, links look broken, and nothing warns you that half your vault is currently a stub.&lt;/p&gt;

&lt;p&gt;The setting is in &lt;strong&gt;System Settings &amp;gt; [your name] &amp;gt; iCloud &amp;gt; iCloud Drive&lt;/strong&gt;. If you need it on for storage reasons, open iCloud Drive in Finder, control-click the vault folder, and choose &lt;strong&gt;Keep Downloaded&lt;/strong&gt; to exempt it. Windows has the same concept with a different name, and it is worse there, which is a good segue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Windows Problem
&lt;/h2&gt;

&lt;p&gt;Obsidian’s own documentation says flatly that iCloud Drive on Windows may lead to file duplication or corruption. When the people who make the app warn you off a sync method, that is worth more than any blog post, including this one.&lt;/p&gt;

&lt;p&gt;iCloud for Windows exists. You install it from the Microsoft Store, sign in, and get an iCloud Drive folder in File Explorer. You can point Obsidian at a vault inside it. It will appear to work. Then, over days and weeks, these things start happening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Placeholder files instead of real files.&lt;/strong&gt; iCloud for Windows does on-demand downloads the same way OneDrive does. A file with a cloud icon next to it is not on your disk. Obsidian tries to read it, and depending on timing you get an empty note, a failed read, or a plugin that throws. Vault-wide operations like search and Dataview queries are the worst hit because they touch everything at once. You can fight this by right-clicking the vault folder and choosing &lt;strong&gt;Always keep on this device&lt;/strong&gt; , which pins it locally. Do that before anything else if you are going to attempt this at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate files with numbers appended.&lt;/strong&gt; This is the classic symptom and the reason people search for this problem. You end up with &lt;code&gt;Meeting Notes.md&lt;/code&gt; and &lt;code&gt;Meeting Notes 2.md&lt;/code&gt;, sometimes several generations deep. It happens when the Windows client and another device both write a file before either has seen the other’s version. iCloud does not merge and it does not prompt. It keeps both and renames one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhokopjicb8w02uc45o0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhokopjicb8w02uc45o0.jpg" alt="The Windows Problem" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;.obsidian&lt;/code&gt; folder taking damage.&lt;/strong&gt; Your config folder is a pile of small JSON files that get rewritten constantly as you use the app. That write pattern is exactly what a lazy sync client handles worst. Corrupted &lt;code&gt;workspace.json&lt;/code&gt;, plugin settings reverting, hotkeys resetting, community plugins disabling themselves. If your Windows machine keeps forgetting your setup, this is why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sync that just stops.&lt;/strong&gt; The client parks in a pending state and stays there. No error, no notification, just a folder that stopped updating while you kept typing into it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing that encourages all of the above.&lt;/strong&gt; iCloud on Windows is slower to propagate changes than it is between Apple devices. A longer window between “I saved” and “the other machine knows” is a bigger window for conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workaround That Actually Respects the Problem
&lt;/h3&gt;

&lt;p&gt;The fix that works is to stop letting Obsidian and iCloud touch the same folder.&lt;/p&gt;

&lt;p&gt;Keep your working vault in a plain local folder on the Windows machine, somewhere iCloud cannot see. Then run a separate process that syncs that local folder to the iCloud copy, with real conflict handling. Obsidian only ever talks to fast local disk, and the sync layer deals with iCloud’s nonsense on its own schedule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gursimar/obsidian-icloud-windows-sync" rel="noopener noreferrer"&gt;gursimar/obsidian-icloud-windows-sync&lt;/a&gt; does exactly this. It is a Python three-way sync engine that tracks the local vault, the iCloud copy, and a history snapshot so it can tell the difference between “this file changed here” and “this file changed on the other side.” When both changed, it keeps the newer one by modification time and saves the loser as a &lt;code&gt;_CONFLICT_&amp;lt;timestamp&amp;gt;&lt;/code&gt; file rather than silently picking a winner. It uses atomic writes and a stabilization delay so it is not reacting to Obsidian’s autosave mid-keystroke. The README is explicit that it must run natively on Windows and not under WSL, because iCloud placeholder files behave incorrectly when accessed through WSL.&lt;/p&gt;

&lt;p&gt;That is a real answer, but be honest with yourself about what it is. It is a Python script you have to configure with a YAML file, keep running, and troubleshoot when it stops. If that sounds like a project rather than a solution, it probably is one for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  When To Just Not Do It
&lt;/h3&gt;

&lt;p&gt;If your setup is Windows plus iPhone, iCloud is the wrong tool. You are picking the option that is worst on your primary computer for the sake of convenience on your phone.&lt;/p&gt;

&lt;p&gt;Dropbox with Remotely Save covers Windows and iOS without any of this. So does Syncthing if you want nothing in the cloud at all. Obsidian Sync costs money and handles it. Any of those is a better use of your evening than fighting a sync client that is not designed for the write pattern of a notes app.&lt;/p&gt;

&lt;p&gt;I keep a Windows desktop in my rotation. I have never once been tempted to put my vault in iCloud on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Obsidian Sync vs iCloud
&lt;/h2&gt;

&lt;p&gt;The honest comparison, since “obsidian sync vs icloud” is what a lot of people are really asking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1lvbzwuk9uafd6clt1m1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1lvbzwuk9uafd6clt1m1.jpg" alt="Obsidian Sync vs iCloud" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;iCloud&lt;/th&gt;
&lt;th&gt;Obsidian Sync&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free with your existing iCloud storage&lt;/td&gt;
&lt;td&gt;Standard $5/mo, or $4/mo billed annually. Plus $10/mo, or $8/mo annually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Shares your iCloud quota&lt;/td&gt;
&lt;td&gt;Standard 1 GB. Plus 10 GB, upgradable to 100 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File size cap&lt;/td&gt;
&lt;td&gt;iCloud Drive limits&lt;/td&gt;
&lt;td&gt;Standard 5 MB. Plus 200 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version history&lt;/td&gt;
&lt;td&gt;Whatever iCloud keeps, not note-aware&lt;/td&gt;
&lt;td&gt;Standard 1 month. Plus 12 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Unreliable, see above&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;In transit and at rest, Apple holds the keys unless Advanced Data Protection is on&lt;/td&gt;
&lt;td&gt;End-to-end by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conflict handling&lt;/td&gt;
&lt;td&gt;Duplicate files&lt;/td&gt;
&lt;td&gt;Merges, with per-file history to recover from&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four dollars a month is the price of not reading this article. If you use Obsidian daily and your devices are not all Apple, that is a rounding error against the time any free method will cost you. I do not pay it, but I also enjoy this kind of problem, which is not a normal thing to enjoy.&lt;/p&gt;

&lt;p&gt;The version history row is the one people undervalue. iCloud can restore some files some of the time. Obsidian Sync keeps per-note history that understands what a vault is. The first time you need it, that gap is enormous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Obsidian iCloud Sync Encrypted?
&lt;/h2&gt;

&lt;p&gt;Yes, but probably not in the way you are assuming.&lt;/p&gt;

&lt;p&gt;iCloud Drive is encrypted in transit and encrypted on Apple’s servers by default, and Apple holds the keys. That means Apple can access the contents and can be compelled to hand them over. Standard data protection is the default on every account.&lt;/p&gt;

&lt;p&gt;Turning on &lt;strong&gt;Advanced Data Protection&lt;/strong&gt; moves iCloud Drive to end-to-end encryption, so only your devices hold the keys. It is in &lt;strong&gt;System Settings &amp;gt; [your name] &amp;gt; iCloud &amp;gt; Advanced Data Protection&lt;/strong&gt; on a Mac, and the same path under Settings on iOS. The tradeoff is real. Apple makes you set up at least one alternative recovery method first, either a recovery contact or a recovery key, because once it is on Apple does not have the keys to help you. Lose your recovery methods and the data is gone. That is the entire point of it.&lt;/p&gt;

&lt;p&gt;Obsidian Sync is end-to-end encrypted by default with no configuration. If your vault holds anything you would call sensitive, that difference matters more than the price difference does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning Up the Duplicates You Already Have
&lt;/h2&gt;

&lt;p&gt;If you got here after the fact, the vault is already littered with numbered copies. Work in this order.&lt;/p&gt;

&lt;p&gt;Close Obsidian everywhere, let iCloud finish syncing, and copy the whole vault out to somewhere iCloud does not control. Then find the offenders. On Mac, from the vault root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"* 2.md"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"* 3.md"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*conflicted copy*"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gkgzjc9m07dn8teyaca.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gkgzjc9m07dn8teyaca.jpg" alt="Cleaning Up the Duplicates You Already Have" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Windows, in PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"* 2.md"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diff before you delete. Most numbered copies are identical to the original and safe to remove. Some contain the only copy of a paragraph you wrote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gh"&gt;diff "Meeting Notes.md" "Meeting Notes 2.md"
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Merge what matters, delete the rest, fix any internal links that pointed at the duplicate, then fix the cause or you will do this again next month. Fixing the cause means taking the Windows machine out of the iCloud path, or moving the vault to a method that handles conflicts properly.&lt;/p&gt;

&lt;p&gt;You can also automate the finding part. Obsidian Cleaner, one of &lt;a href="https://dev.to/eristoddle/the-obsidian-plugin-collection-i-built-one-free-kiro-credit-at-a-time-2b42"&gt;the plugins I had Kiro build for me on free monthly credits&lt;/a&gt;, surfaces conflicted copies, numbered duplicates, and zero-byte markdown files as a checklist you can review before deleting. I built it because I kept hitting this, which tells you how common the problem is across every sync method, not just iCloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I sync Obsidian with iCloud?&lt;/strong&gt; On iOS, enable &lt;strong&gt;Store in iCloud&lt;/strong&gt; when you create the vault. On Mac, put the vault in &lt;code&gt;~/Library/Mobile Documents/iCloud~md~obsidian/Documents/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I connect Obsidian to iCloud on a vault I already have?&lt;/strong&gt; Close Obsidian everywhere, create an empty iCloud vault with the same name, and move your files plus the hidden &lt;code&gt;.obsidian&lt;/code&gt; folder into it. The order matters more than the steps do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I move my Obsidian vault to iCloud without losing anything?&lt;/strong&gt; Back up first, and wait for the initial upload to finish before you open the vault on a second device. On a large vault, sync the markdown first and the attachments second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Obsidian iCloud sync work on Windows?&lt;/strong&gt; It runs, but it is unreliable. If you must do it, keep the working vault in a plain local folder and mirror it to iCloud with a tool like &lt;code&gt;gursimar/obsidian-icloud-windows-sync&lt;/code&gt; rather than letting Obsidian edit inside the iCloud folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Obsidian iCloud sync encrypted?&lt;/strong&gt; Encrypted in transit and at rest, but Apple holds the keys unless Advanced Data Protection is on. Obsidian Sync is end-to-end encrypted by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I sync Obsidian to Android with iCloud?&lt;/strong&gt; No. Use Dropbox with Remotely Save, Syncthing, or Obsidian Sync instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;iCloud sync for Obsidian is genuinely good and genuinely free, right up to the edge of Apple’s ecosystem, where it falls off a cliff with no railing.&lt;/p&gt;

&lt;p&gt;All Apple, all the time: use it, it is the right answer and you can stop researching. Windows in the mix: it is a maintenance project, and you should either run a real sync layer on top of it or pick a different method entirely. Android anywhere in your life: it is not a choice you have.&lt;/p&gt;

&lt;p&gt;I landed on Dropbox and Remotely Save because of an Android phone, and I have no regrets about it, though I did spend a weekend getting there. The methods are not ranked by quality. They are ranked by which devices you happen to own, and the honest advice is to pick based on your worst device rather than your best one.&lt;/p&gt;

</description>
      <category>obsidian</category>
      <category>icloud</category>
      <category>sync</category>
      <category>windows</category>
    </item>
    <item>
      <title>The Bottleneck Was Me: How I Stopped Racing My AI Builder and Started Pacing It</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 22 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/the-bottleneck-was-me-how-i-stopped-racing-my-ai-builder-and-started-pacing-it-3e1n</link>
      <guid>https://dev.to/eristoddle/the-bottleneck-was-me-how-i-stopped-racing-my-ai-builder-and-started-pacing-it-3e1n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpx2xeklxabbgxlzjmq5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpx2xeklxabbgxlzjmq5.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last post ended on a clean little problem. I’d gotten my &lt;code&gt;PLAN.md&lt;/code&gt; lean: the decisions up top, the history filed away, a skill that keeps it that way so I don’t have to. The plan was finally generating work faster than I could build it. And that exposed a new bottleneck on the build side: my setup hands one task at a time to a background Sonnet agent and waits. The builder finishes, then sits there idle while I plan the next one. So I asked the next question: how do you keep the builder &lt;em&gt;always busy?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The goal turned out to be a decent description of the symptom and a terrible description of what I actually wanted. This is the post where I figured out the difference, by doing it backwards first.&lt;/p&gt;

&lt;p&gt;This is part three of a series about working with AI coding agents using a single living &lt;code&gt;PLAN.md&lt;/code&gt; instead of vibe coding or spec-kit ceremony. &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;Post one&lt;/a&gt; is the thesis. The doc is the deliverable, the code is the byproduct. &lt;a href="https://dev.to/eristoddle/the-living-plan-got-fat-compacting-a-doc-that-wont-stop-growing-3nk0"&gt;The last post&lt;/a&gt; was about keeping that doc from turning into a 28,000-word novella.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Batch That Hooked Me&lt;/li&gt;
&lt;li&gt;The Experiment: A Pre-Specified Queue&lt;/li&gt;
&lt;li&gt;I Optimized the Wrong Thing&lt;/li&gt;
&lt;li&gt;The Gap Was the Point&lt;/li&gt;
&lt;li&gt;The Model: A Serial Queue&lt;/li&gt;
&lt;li&gt;Two Ways to Stack&lt;/li&gt;
&lt;li&gt;The Real Bottleneck Was Never the Task Slot&lt;/li&gt;
&lt;li&gt;The Name&lt;/li&gt;
&lt;li&gt;The Honest Scope Note&lt;/li&gt;
&lt;li&gt;What’s Next&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Batch That Hooked Me
&lt;/h2&gt;

&lt;p&gt;The seed of this whole idea was a session a few weeks back where I did something different. Instead of speccing one hardening task, launching it, and waiting, I lined up a &lt;em&gt;batch&lt;/em&gt; of small mechanical jobs and drove them back-to-back as one verified sequence. Each one: Sonnet builds it, I re-read the diff and the tests, then I launch the next. The test count climbed 140 → 234 across the run.&lt;/p&gt;

&lt;p&gt;Driving them as a batch freed up enough of my attention that I was &lt;em&gt;working a second project at the same time&lt;/em&gt;, jumping back and forth between this content pipeline and my other repo. The fact that the builder grinding away in the background bought me time to go be useful somewhere else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fty91vdnx1mifarngqcof.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fty91vdnx1mifarngqcof.jpg" alt="The Batch That Hooked Me" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I filed that away as a direction and went back to feeding the plan. But it nagged at me, because I’d named it wrong in my own head. I called it “keeping the builder busy,” and I built the next experiment around that name.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experiment: A Pre-Specified Queue
&lt;/h2&gt;

&lt;p&gt;Here’s how I decided to actually test it. I had a real feature coming up: making the content pipeline able to &lt;em&gt;require&lt;/em&gt; embedded artifacts in an article. A brief could say “this post needs at least two of: a code block, a comparison table, a diagram,” and the pipeline would produce them, preserve them through the humanizer, and verify they’re actually there at the end. Four moving parts, real dependencies between them.&lt;/p&gt;

&lt;p&gt;So instead of speccing it one task at a time the way I always had, I pre-specified the &lt;em&gt;entire arc&lt;/em&gt; up front as an ordered queue. Four tasks. Task A, the schema that declares the requirement, had to land first, because the other three all depend on it. Then B (the writer produces the artifacts), C (the humanizer preserves them), and D (the checker verifies them) could each go independently. I wrote all four specs, mapped the dependency, and flagged the genuine design forks, the questions only I could answer, to settle before anything ran.&lt;/p&gt;

&lt;p&gt;The point of pre-specifying the whole thing wasn’t speed. It was to find out &lt;em&gt;where pre-specifying breaks down.&lt;/em&gt; Which specs would look airtight on paper and fall apart the moment a builder touched real code.&lt;/p&gt;

&lt;p&gt;Then I ran it. And immediately optimized the wrong variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Optimized the Wrong Thing
&lt;/h2&gt;

&lt;p&gt;Task A landed first. It had to; everything blocked on it. But B, C, and D were independent. So Claude decided to run them concurrently.&lt;/p&gt;

&lt;p&gt;Three Sonnet agents, in parallel, each on its own task, each on a disjoint set of files. And it &lt;strong&gt;worked&lt;/strong&gt;. All three landed clean. The test suite went from 234 to 328. If you’d asked me to measure throughput, I’d just tripled it. By every number I’d have put on a dashboard, this was the win.&lt;/p&gt;

&lt;p&gt;It felt awful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qivqvg4ixadw4r5xb55.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qivqvg4ixadw4r5xb55.jpg" alt="I Optimized the Wrong Thing" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because the second those three agents came back, they came back &lt;em&gt;together&lt;/em&gt;. The background hum that let me work on the other project and do slow human thinking. Gone. I’d taken a process whose entire value was &lt;em&gt;spreading work out over time&lt;/em&gt; and I’d compressed it back into a single spike of “everything needs you, now.”&lt;/p&gt;

&lt;p&gt;I’d been accidentally optimizing for &lt;strong&gt;throughput&lt;/strong&gt; : get the most build done per unit time. But throughput was never what bought me the second project. What bought me the second project was the &lt;em&gt;gap.&lt;/em&gt; Parallelism doesn’t widen that gap. It removes it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gap Was the Point
&lt;/h2&gt;

&lt;p&gt;The builder’s grind is not a cost to be minimized. &lt;strong&gt;It’s a resource.&lt;/strong&gt; A long-enough synchronous build is a &lt;em&gt;gap&lt;/em&gt; I spend doing the slow human work: investigating, answering my own open questions, and making the design calls that only I can make. Often on a completely different project. The ideal loop isn’t “builder always busy.” It’s two slow things overlapping in time: the machine grinding through mechanical work while I grind through judgment work. Pacing, not racing.&lt;/p&gt;

&lt;p&gt;Once I saw it that way, the design fell out immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synchronous, one-task-at-a-time, is the default&lt;/strong&gt; , because that’s what manufactures the gap. One builder, working a queue in order, then stopping to report. The stop is a feature. It’s the handoff point where I come back, review, and re-aim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel is a rare opt-in burst,&lt;/strong&gt; for the specific case where I’m actively babysitting &lt;em&gt;this&lt;/em&gt; project and want raw speed more than I want freed attention. But it’s not a default. The session that taught me this lesson proved parallel works. It just also proved it’s the wrong thing to reach for ninety percent of the time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vc9hklbxs13cbz0ud9b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vc9hklbxs13cbz0ud9b.jpg" alt="The Gap Was the Point" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model: A Serial Queue
&lt;/h2&gt;

&lt;p&gt;So the task handoff file got reshaped. It used to be &lt;code&gt;TASK.md&lt;/code&gt;: singular, one task, overwrite it for the next one. Now it’s &lt;code&gt;TASKS.md&lt;/code&gt;, and the active task is a &lt;strong&gt;serial queue of numbered pieces.&lt;/strong&gt; The builder works them top to bottom, in one pass, then stops and reports. Finished work doesn’t get overwritten and lost. It collapses into a &lt;code&gt;✅ Done&lt;/code&gt; archive with a stable tag, so the file carries its own history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways to Stack
&lt;/h2&gt;

&lt;p&gt;Because once the active task is a queue you can stack as deep as you want, two genuinely different working modes fall out of the exact same mechanism:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pacing.&lt;/strong&gt; Stack a couple of pieces. The builder grinds them while I plan the next batch a step ahead. By the time it stops, I’ve got the next chunk ready to go. This is the everyday rhythm, the overlap of machine-grind and human-thinking I’ve been describing the whole post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unattended.&lt;/strong&gt; Stack a &lt;em&gt;lot&lt;/em&gt; of pieces (an hour’s worth) and walk away entirely. Go do something else, something not-this-project, and come back to a pile of finished, tested work and one report. Same serial builder, same queue. The only difference is how deep I stack it and whether I’m in the room.&lt;/p&gt;

&lt;p&gt;They’re mechanically identical, but the unattended mode forced two rules that the pacing mode never exposed, because pacing rarely runs more than a piece or two before I’m back:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A blocked piece must not halt the queue.&lt;/strong&gt; If the builder hits piece 3 of 8 and it turns out underspecified (some fork I didn’t see), the old rule was “stop and report.” Fine when I’m sitting right there. Catastrophic when I’m gone for an hour, because pieces 4 through 8 never run even if they don’t depend on the broken one. So the rule is now: mark the blocked piece, &lt;em&gt;skip it,&lt;/em&gt; and keep going with anything that doesn’t depend on it. Halt only when nothing left can proceed. An hour away should come back with six of eight done, not two.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp3p4nyl64u2jdcrw3fu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp3p4nyl64u2jdcrw3fu.jpg" alt="Two Ways to Stack" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State gets logged on every stop.&lt;/strong&gt; This is the one that matters most for walking away. Whenever the builder stops, finished or blocked, it writes its state directly into &lt;code&gt;TASKS.md&lt;/code&gt;: which pieces are done, which are blocked and why, what’s left, where to resume. It flips a status box on each piece as it goes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Design — pieces&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] 1. Schema: declare required_artifacts on the brief
&lt;span class="p"&gt;-&lt;/span&gt; [x] 2. Writer produces the artifacts
&lt;span class="p"&gt;-&lt;/span&gt; [!] 3. Humanizer preserves them — BLOCKED: heading-protection
       order is ambiguous, needs a call
&lt;span class="p"&gt;-&lt;/span&gt; [x] 4. Checker verifies presence (depends on #1)

&lt;span class="gu"&gt;### ▶ Run state&lt;/span&gt;
3 of 4 done. #3 blocked on a design fork (see above). Resume there.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why in the task file and not somewhere clever? Because that file is already what the builder is working in, it survives the session getting killed, and if I come back tomorrow having completely forgotten where I left off, the file tells me. No memory required, mine or the agent’s. The thing that makes unattended runs safe to walk away from is that every piece keeps the test suite green, so “done” actually means done, and the state log means “interrupted” never means “lost.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Bottleneck Was Never the Task Slot
&lt;/h2&gt;

&lt;p&gt;I’d assumed the constraint on keeping a builder fed was the single-task slot: one &lt;code&gt;TASK.md&lt;/code&gt;, one job at a time, obviously that’s the chokepoint. It isn’t. &lt;strong&gt;The real bottleneck is spec throughput.&lt;/strong&gt; The builder only stays fed if there’s a backlog of &lt;em&gt;fully-specified, mechanical&lt;/em&gt; tasks waiting for it. The moment a task hits a real design fork, a genuine “should it do A or B” that only I can answer, the queue stalls, no matter how clever the queue is.&lt;/p&gt;

&lt;p&gt;And pre-specifying that whole embedded-artifacts arc up front is what made this visible, because it told me exactly &lt;em&gt;where&lt;/em&gt; my specs leak. The verdict: pre-specifying nails &lt;strong&gt;structure&lt;/strong&gt; and leaks on &lt;strong&gt;judgment.&lt;/strong&gt; The file decomposition was right. The dependency order (A blocks the rest, B/C/D are independent) was right. What broke was subtler:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lvtyfhnsmjpeg825ods.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lvtyfhnsmjpeg825ods.jpg" alt="The Real Bottleneck Was Never the Task Slot" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One task rested on a &lt;strong&gt;wrong premise.&lt;/strong&gt; I’d specified the “diagram” artifact as something the pipeline could satisfy with an ASCII drawing. But my actual diagram practice is to render real images, with ASCII only as a fallback. That’s not a fork the builder could catch or resolve. It’s a wrong assumption baked into the spec, and only I could see it, because it lived in my head and not in the code.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;judgment call hid inside a “mechanical” task.&lt;/strong&gt; The artifact checker had to count distinct artifacts, and my supposedly airtight spec quietly let one image get counted twice toward the requirement. The builder implemented exactly what I wrote. What I wrote had a bug. I only caught it because I read the diff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which is the callback to post one’s whole “trust but verify” spine, and it’s &lt;em&gt;more&lt;/em&gt; load-bearing in a pipeline, not less. The batch doesn’t skip verification. It removes the &lt;em&gt;round-trip with me between tasks,&lt;/em&gt; not the rigor. I still read every diff the builder actually wrote. Both of those bugs, the double-count and a separate one where a config value silently broke its file format, got caught at my review, not by the agents. The lesson for the queue is precise: a task is only “ready” when its &lt;em&gt;premises&lt;/em&gt; and its &lt;em&gt;judgment semantics&lt;/em&gt; are pinned, not just its files. Pinning the files is the easy 80%. The leak is always in the other 20%, and the other 20% is mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Name
&lt;/h2&gt;

&lt;p&gt;The seed of this post had a whole brainstorm in it about &lt;em&gt;finally&lt;/em&gt; renaming the skill. Its name describes one of the three things it does and I can never remember it. I had candidates: &lt;em&gt;planwright,&lt;/em&gt; for the one who authors plans, and &lt;em&gt;foreman,&lt;/em&gt; for the one who keeps the line moving and the builder fed. And given that this entire post is about keeping the line moving, &lt;em&gt;foreman&lt;/em&gt; was right there, practically gift-wrapped.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73ehr4atl4buty2gt7y6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73ehr4atl4buty2gt7y6.jpg" alt="The Name" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did not rename it. I codified the whole convention, ported it into the skill, patched both projects, and left the dumb name exactly where it was. The rename is real work. It’s wired into three repos now, and I wasn’t going to fake-land it just to give this post a tidy bow. So the name is still wrong, &lt;em&gt;foreman&lt;/em&gt; is still leading, and it’ll get fixed when it gets fixed. Consider this the third post in a row where I’ve promised to rename the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Scope Note
&lt;/h2&gt;

&lt;p&gt;Every post gets one. Here’s this one’s: &lt;strong&gt;this is the frontier of the method, not a settled result.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The pacing-over-throughput call is fresh. I made it by running the throughput version, hating it, and reasoning backward, which is a strong signal but a sample size of basically one. The unattended mode, with its skip-and-continue and its state logging, is &lt;em&gt;built&lt;/em&gt; but barely road-tested; I haven’t actually walked away for a real hour and come back to judge what I found, and I’d bet the skip-and-continue logic has edge cases I haven’t hit. The “promote a recurring judgment into an automatic rule” idea from the last post is still unproven. And the deepest claim here, that spec throughput, not the task slot, is the true bottleneck, is a hypothesis I’ve confirmed exactly once.&lt;/p&gt;

&lt;p&gt;What I’m confident about is the shape of the mistake, because I made it cleanly: optimizing throughput when I wanted pacing is a real and seductive wrong turn, and “keep the builder busy” is exactly the kind of goal that leads you into it. The metric that’s easy to put on a dashboard, work per unit time, is not always the one you actually care about. Sometimes the gap is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;I don’t know yet, and I’m not going to force a cliffhanger. The plan stays lean, the builder runs on a paced queue, and I can stack it shallow to work alongside it or deep to walk away from it. The pieces are in place. What I don’t have is a real verdict on the unattended mode under fire, or a clue whether the “spec throughput is the bottleneck” insight holds up across more than one feature arc. Those are the next things to actually live with rather than theorize about.&lt;/p&gt;

&lt;p&gt;There may be a post four. There may not. The method’s still moving, and I’d rather tell you what actually happened than what would make a clean ending. So far that’s served the series fine. We’ll see what the gap fills with.&lt;/p&gt;

</description>
      <category>aicodingagents</category>
      <category>sonnetagent</category>
      <category>planmdmethodology</category>
      <category>aidevelopmentworkflo</category>
    </item>
    <item>
      <title>Kimi K3 and Inkling: The Week the Open Models Won</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Tue, 21 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/kimi-k3-and-inkling-the-week-the-open-models-won-m90</link>
      <guid>https://dev.to/eristoddle/kimi-k3-and-inkling-the-week-the-open-models-won-m90</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxqv2xe4h6okxdj6sezp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxqv2xe4h6okxdj6sezp.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week I signed off by saying I’d see you when Gemini 3.5 Pro and DeepSeek V4 had presumably set something on fire. Well. Gemini 3.5 Pro missed its launch date again, for the third time. DeepSeek V4 is quietly shipping with a deadline attached that’s going to ruin somebody’s Friday. And while the three biggest AI labs on the planet were busy being late, two models you can just download showed up out of nowhere. One of them is now the fourth-smartest model on Earth, ahead of Claude Opus 4.8, and it came from Moonshot, a lab most people couldn’t have picked out of a lineup a year ago.&lt;/p&gt;

&lt;p&gt;That’s the whole week. The frontier moved, and it didn’t move at OpenAI, Google, or Anthropic. It moved open.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Open Frontier Crashed the Party&lt;/li&gt;
&lt;li&gt;Kimi K3 Is Genuinely Smart and It Never Stops Thinking&lt;/li&gt;
&lt;li&gt;Inkling: Mira Murati Gives It Away&lt;/li&gt;
&lt;li&gt;Meanwhile, the West Was Late Again&lt;/li&gt;
&lt;li&gt;The Cheapskate Picks&lt;/li&gt;
&lt;li&gt;Horror Stories From the Wild&lt;/li&gt;
&lt;li&gt;What’s Coming&lt;/li&gt;
&lt;li&gt;The Takeaway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Open Frontier Crashed the Party
&lt;/h2&gt;

&lt;p&gt;Here’s the setup you need. For most of this year, the “open weights are catching up” story has been a Chinese story. DeepSeek, Qwen, GLM, MiMo. Good models you could download, consistently a few points behind the closed Western flagships, consistently way cheaper. The pattern was reliable enough to be boring.&lt;/p&gt;

&lt;p&gt;This week two things happened in a 48-hour window that broke the pattern.&lt;/p&gt;

&lt;p&gt;On July 15th, Thinking Machines Lab shipped Inkling, a 975-billion-parameter open-weights model, under an Apache 2.0 license, on Hugging Face, right now, today. On July 16th, Moonshot AI shipped Kimi K3, a 2.8-trillion-parameter monster that lands at number four on the Artificial Analysis Intelligence Index. Two frontier-class open (or opening) models from two labs that are not the big three, dropped back to back.&lt;/p&gt;

&lt;p&gt;On the Intelligence Index, Kimi K3 lands at 57.1, behind only Claude Fable 5 at 59.9 and GPT-5.6 Sol at 58.9, and ahead of Claude Opus 4.8 at 55.7. Read that again. An open-weight model from a Chinese lab is beating Anthropic’s own Opus 4.8 on raw intelligence. That is not “catching up.” That’s arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kimi K3 Is Genuinely Smart and It Never Stops Thinking
&lt;/h2&gt;

&lt;p&gt;Let me tell you what makes Kimi K3 the headline and then tell you the part that’ll cost you money.&lt;/p&gt;

&lt;p&gt;The good part first. K3 is a 2.8-trillion-parameter mixture-of-experts model, which is the largest open-weight model anybody has announced. It only activates 16 of its 896 experts per token, so it’s big but not insane to run. It’s got a 1-million-token context window and it’s multimodal. The full weights are coming to Hugging Face by July 27th under a modified MIT license that lets you use it commercially.&lt;/p&gt;

&lt;p&gt;But the number that matters is Arena. Normally when a model launches, the Arena leaderboard takes a week or two to catch up, because Arena is vote-based and nobody’s voted on the new thing yet. New models are supposed to be invisible on Arena for a bit. Kimi K3 did not get that memo. Three days after launch it’s already in the top 10 of every category I track: Overall #8, Coding #9, Creative Writing #9, Instruction Following #10, Hard Prompts #10. On Arena data dated July 19th. Three days. That doesn’t happen unless a lot of people tried it and a lot of people liked what they saw.&lt;/p&gt;

&lt;p&gt;On cost-per-task, Artificial Analysis clocked it at about $0.94 to run one Intelligence Index task. That’s roughly half of Opus 4.8’s $1.80 for a model that scores higher on intelligence. On paper, that’s a steal.&lt;/p&gt;

&lt;p&gt;Now the part that’ll cost you money.&lt;/p&gt;

&lt;p&gt;K3 always thinks. There is no non-thinking variant. The &lt;code&gt;reasoning_effort&lt;/code&gt; is locked to maximum, and every one of those reasoning tokens bills as output at $15 per million. Simon Willison ran his usual “generate an SVG of a pelican on a bicycle” test on launch day and the model burned 13,241 reasoning tokens before it produced a 3,417-token answer. His verdict on the pricing was blunt: “This is expensive. The pelican cost 25 cents.” One pelican. A quarter.&lt;/p&gt;

&lt;p&gt;So the cost-per-task number is real, but it’s an average, and the tail on that average is fat. The visible answer you get back is a fraction of what you actually pay for, because you’re renting the model’s internal monologue at output rates whether you want it or not. If you were burned by the whole cost-per-task lesson last week (Grok 4.5 winning on tokens-per-job while sitting fourth on intelligence), K3 is the same lesson wearing different clothes. The sticker says $3/$15. Your invoice will say something with more zeroes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inkling: Mira Murati Gives It Away
&lt;/h2&gt;

&lt;p&gt;The other open drop is the one that made me sit up, and not because of the benchmarks.&lt;/p&gt;

&lt;p&gt;Inkling comes from Thinking Machines Lab, which is Mira Murati’s outfit. If the name doesn’t ring a bell, she was OpenAI’s CTO. So this is a former top executive of the most closed, most commercial AI lab in the world shipping a 975-billion-parameter model on Hugging Face under Apache 2.0, framed explicitly around low cost and, in their words, “resistance to censorship.” You can legally fine-tune it, ship it in a product, and never pay Thinking Machines a cent.&lt;/p&gt;

&lt;p&gt;The specs are interesting. 975B total parameters, only 41B active per token, multimodal across text, images, and audio. It’s got a thinking-effort dial you can turn from 0.2 to 0.99, which is exactly the knob Kimi K3 refuses to give you. Want cheap and fast? Turn it down. Want it to grind? Turn it up. That’s the right design, and Moonshot should take notes.&lt;/p&gt;

&lt;p&gt;On the composite Intelligence Index, Inkling only scores 41, which is well down the board, so don’t expect it to beat Fable 5 in a general chat. But dig into the specific benchmarks and it’s a different story: 77.6% on SWE-bench Verified, 97.1% on AIME 2026 math, 87.2% on GPQA Diamond, and 74.1% on MCP Atlas for agentic workflows. Sebastian Raschka called it the best open multimodal generalist out there right now, and the category-level scores back that up. It’s not a great chatbot. It might be a great tool.&lt;/p&gt;

&lt;p&gt;Here’s why these two drops matter together. The “own your weights” argument used to be a China thing, and if you had opinions about running Chinese models in production, you could opt out of the whole conversation. You can’t anymore. When Mira Murati is handing out Apache-2.0 weights and Moonshot is shipping the biggest open model ever built, the choice in front of you isn’t “American closed model or Chinese open model.” It’s “rent from three labs, or own from everybody else.” That’s a genuinely different question than it was a month ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meanwhile, the West Was Late Again
&lt;/h2&gt;

&lt;p&gt;While all that was happening, the closed Western frontier did its now-familiar thing: it announced a date and then missed it.&lt;/p&gt;

&lt;p&gt;Gemini 3.5 Pro was targeting July 17th. That was already a slip from June, which was itself a slip from Google I/O in May. Google reportedly scrapped the base model entirely and rebuilt it after engineers found structural failures in recursive tool-calling and SVG generation. Ambitious. Also, the 17th came and went and it’s still limited to a handful of enterprise preview customers. No public API, no confirmed pricing, no confirmed 2-million-token context window, none of the rumored Deep Think reasoning layer you can actually touch. Third promised date, third miss. At this point I’m not writing another word about Gemini 3.5 Pro until there’s an endpoint I can hit with a real API key. It’s vapor until it isn’t.&lt;/p&gt;

&lt;p&gt;DeepSeek V4, on the other hand, is very real, and it comes with homework. The V4 family is graduating from preview to stable, and if you use DeepSeek’s hosted API, you have a hard deadline: July 24th at 15:59 UTC. After that, the old model names &lt;code&gt;deepseek-chat&lt;/code&gt; and &lt;code&gt;deepseek-reasoner&lt;/code&gt; stop working. They start returning HTTP 404 and 400 errors. More on that in the horror section, because it’s nastier than it looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheapskate Picks
&lt;/h2&gt;

&lt;p&gt;Okay. The part you can actually use.&lt;/p&gt;

&lt;p&gt;Same method as always. For each Arena category, I take the leader’s rating and find the cheapest model within 50 rating points of it. Arena’s top is compressed, so “cheapest in the band” is a real choice between models that are genuinely close, not settling for junk.&lt;/p&gt;

&lt;p&gt;And this week I have to own something, because I got it wrong the first time I ran these numbers. “Within 50 points” is a band defined by &lt;em&gt;points&lt;/em&gt;, not by rank, and I’d been reading down the first screen of the leaderboard and calling that the band. It is not the band. In Coding, the leader is Opus 4.7-thinking at 1553, which puts the cutoff at 1503 — and the leaderboard doesn’t drop below 1503 until &lt;strong&gt;rank 46&lt;/strong&gt;. Forty-six models are inside that window. I was sorting the first twenty and declaring a winner, which is exactly the mistake this section exists to stop &lt;em&gt;you&lt;/em&gt; from making. The bands run 44 deep in Overall, 39 in Hard Prompts, 27 in Instruction Following. Only Creative (14) and Math (6) actually fit on one screen.&lt;/p&gt;

&lt;p&gt;Fix the band, and the answer changes in four of six categories. Arena data below is dated July 19th. Fable 5 leaders run about $50 per million output tokens; Opus-thinking leaders about $25.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Leader&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Cheapskate pick&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Δ rating&lt;/th&gt;
&lt;th&gt;Cheaper by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Fable 5 (1507)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1466, #33)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−41&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Opus 4.7-thinking (1553)&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1519, #23)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−34&lt;/td&gt;
&lt;td&gt;~29x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative&lt;/td&gt;
&lt;td&gt;Fable 5 (1513)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash (1467, #11)&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−46&lt;/td&gt;
&lt;td&gt;~5.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Following&lt;/td&gt;
&lt;td&gt;Fable 5 (1513)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1470, #19)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−43&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Prompts&lt;/td&gt;
&lt;td&gt;Fable 5 (1533)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;MiMo v2.5 Pro (1494, #22)&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;−39&lt;/td&gt;
&lt;td&gt;~57x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;Fable 5 (1550)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Grok 4.5 (1504, #5)&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;td&gt;−46&lt;/td&gt;
&lt;td&gt;~8.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the value story of the week is Xiaomi’s MiMo v2.5 Pro at $0.43 in / $0.87 out, sweeping four of six categories. Not narrowly, either. On Coding it sits 34 points off the best coding model in the world at &lt;strong&gt;a twenty-ninth of the output price&lt;/strong&gt; , and it’s been sitting there with 11,355 votes behind that rating — this is not a preliminary number on a model that dropped Tuesday. It shipped in April. It’s MIT-licensed open weights. In a week whose headline is “the open models won,” the cheapest competitive model on four separate leaderboards turning out to be a phone company’s MIT-licensed side project isn’t a coincidence. It’s the same story from a different angle.&lt;/p&gt;

&lt;p&gt;Two honest caveats, because a 57x price gap deserves scrutiny.&lt;/p&gt;

&lt;p&gt;First, Artificial Analysis does &lt;em&gt;not&lt;/em&gt; rank MiMo v2.5 Pro near the top — it scores 42 on the Intelligence Index, against Kimi K3’s 57.1. That’s the classic Arena-loves-it/AA-doesn’t split, and it means what it usually means: people &lt;em&gt;prefer&lt;/em&gt; MiMo’s answers head-to-head, but it isn’t doing frontier-grade reasoning on the hard stuff. For everyday coding, instruction-following, and general work, preference is the metric that matches how you’ll actually use it. For genuinely hard problems, pay up.&lt;/p&gt;

&lt;p&gt;Second, it’s slow. 58.2 output tokens per second, below median for its class. If you’re running an agent loop where latency compounds across hundreds of calls, that 57x price advantage buys you a wall-clock penalty you should measure before you commit.&lt;/p&gt;

&lt;p&gt;Two runners-up worth knowing. If your workload is input-heavy or long-context, Qwen3.7 Plus is cheaper on the input side at $0.32 in / $1.28 out and sits inside the Coding band at #36. And last week’s champion, Meta’s Muse Spark 1.1 at $1.25 / $4.25, is still competitive on rating — but it’s now about 5x more expensive than MiMo &lt;em&gt;and&lt;/em&gt; it’s geo-locked to US developers on OpenRouter, so it falls out of the recommendation twice over. More on that below.&lt;/p&gt;

&lt;p&gt;Kimi K3 is right there in the Coding band too at #9, but at $15 output with that always-on thinking tax, it is not the cheapskate answer. It’s the “I want the best open model and I’ll pay for it” answer.&lt;/p&gt;

&lt;p&gt;Math is the fun one this week, and it’s the one category where the band really is tiny — six models, top to bottom. The pure cheapskate pick is Grok 4.5 at $6 output, sitting at #5, cheapest thing in the band. But look one row up: Gemini 3.5 Flash is at #3 on Math, 1518, only 32 points behind Fable 5, for $9. For the third or fourth week running, Gemini 3.5 Flash is quietly the smart-money answer for math and creative work. If you’re paying Fable 5’s $50 to do math and Flash is sitting 32 points back at a fifth of the price, you’re not buying quality, you’re buying a rating difference smaller than the noise in the measurement.&lt;/p&gt;

&lt;p&gt;Also worth flagging: several of these Fable 5 category-leader ratings are sitting on thin vote counts (Math #1 has under 500 votes). Don’t over-trust a fresh #1 with that little data behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Horror Stories From the Wild
&lt;/h2&gt;

&lt;p&gt;Every roundup needs the part where I tell you what’s going to ruin your day. This week there are three, and one of them has a countdown clock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DeepSeek migration cliff.&lt;/strong&gt; July 24th, 15:59 UTC. If you’ve got &lt;code&gt;deepseek-chat&lt;/code&gt; or &lt;code&gt;deepseek-reasoner&lt;/code&gt; hard-coded anywhere in your codebase, those names get retired and start returning 404 and 400 errors. Here’s the sneaky part: both of those names &lt;em&gt;already&lt;/em&gt; route to DeepSeek-V4-Flash under the hood, and have since April. So nothing looks broken today. Your code works fine right up until next Friday afternoon, when it doesn’t. And the fix isn’t a clean find-and-replace, because thinking mode moved from being its own model name to being a request parameter. If you naively swap &lt;code&gt;deepseek-reasoner&lt;/code&gt; for &lt;code&gt;deepseek-v4-flash&lt;/code&gt; and call it done, you’ll silently drop reasoning on all that traffic and wonder why your outputs got dumber. Go patch this now, not on the 24th.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kimi K3’s metered brain.&lt;/strong&gt; I already covered this up top, but it belongs in the horror section on principle. There is no way to turn K3’s thinking off. Every request pays for a full reasoning trace at $15 per million output tokens, whether the question needed it or not. Simon Willison’s pelican cost 25 cents. Scale that across an agent loop making thousands of calls and the “half the cost of Opus” headline evaporates fast. Contrast it with Inkling shipping a thinking-effort dial the same week, and K3’s design choice looks less like a feature and more like a billing strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The value pick you’re locked out of.&lt;/strong&gt; Meta shipped the cheapest competitive brand-name model of the week and then restricted it to US developers on OpenRouter. Muse Spark 1.1 was last week’s cheapskate champion in three categories, and for most of the planet it’s just a leaderboard entry you get to look at. Cool. Very open. Very connected world we live in. It got dethroned on price this week anyway, which is its own kind of answer: the model you &lt;em&gt;can&lt;/em&gt; buy from anywhere is 5x cheaper and ships its weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Coming
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kimi K3 open weights&lt;/strong&gt; land on Hugging Face by July 27th, modified MIT license. This is the one to actually wait for if you want to own it instead of renting the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.5 Pro&lt;/strong&gt; , allegedly, eventually. Missed July 17th. I’ll believe it when I can curl it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek V4&lt;/strong&gt; graduates preview to stable, with that mandatory API migration deadline on July 24th. Set a reminder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inkling derivatives.&lt;/strong&gt; Apache 2.0 weights are already out, so expect fine-tunes and specialized variants to start showing up fast. That’s the whole point of shipping it open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the background hum, unchanged and getting louder: Chinese-origin models are now about 46% of all OpenRouter tokens, and as of July 20th they hit a record 58% share among US firms specifically. US labs have fallen from roughly 70% of token volume to 30% year over year. Anthropic’s Claude slid from 29% to 13%. DeepSeek alone is 17.6%, the single largest vendor on the platform, with Qwen right behind. Two more open flagships this week did not slow that trend. They poured gas on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;The intelligence race at the very top is still basically a tie: Fable 5, GPT-5.6 Sol, Kimi K3, Opus 4.8, all inside four points. But the interesting thing this week wasn’t who’s smartest. It was who’s &lt;em&gt;ownable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For the first time, the answer to “I want a near-frontier model I can actually hold in my hands” isn’t a compromise. Kimi K3 is fourth on the whole intelligence board and its weights ship in a week. Inkling is out right now under a license that lets you do whatever you want with it. The former CTO of OpenAI is handing out model weights. Meanwhile the three labs whose whole pitch is “trust us, it’s on our servers” spent the week being late, geo-locking their cheap model, and metering your reasoning tokens.&lt;/p&gt;

&lt;p&gt;So here’s what I’m actually doing. I’m patching my DeepSeek model names before Friday, because I’m not getting caught by a 404 on a Friday. I’m keeping Gemini 3.5 Flash on math and creative, because paying 5x more for a rating rounding error is still stupid this week. I’m moving my bulk coding and instruction-following traffic to MiMo v2.5 Pro and eating the latency, because 29x is not a margin you argue with. I’m waiting the seven days for Kimi K3’s weights before I decide whether it’s worth the thinking tax, because owning it changes the math. And I’m downloading Inkling this weekend just to see what a 975-billion-parameter model does on my own hardware, because I can, and a month ago I couldn’t.&lt;/p&gt;

&lt;p&gt;Rent everything, own nothing was the mood in June. In July the challengers handed out the keys. Read your bills, and maybe download a frontier model while it’s free. See you next week, when Gemini 3.5 Pro has presumably missed a fourth date.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>openrouter</category>
    </item>
    <item>
      <title>Planning Is Cheaper Than Coding, and My Own Logs Proved Me Wrong About Why</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 15 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/planning-is-cheaper-than-coding-and-my-own-logs-proved-me-wrong-about-why-51bh</link>
      <guid>https://dev.to/eristoddle/planning-is-cheaper-than-coding-and-my-own-logs-proved-me-wrong-about-why-51bh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvr32ih4w273lcfyg81vm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvr32ih4w273lcfyg81vm.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went into this post sure of one thing: coding with an agent burns tokens like a house fire, and planning is the cheap part where you just talk. I’ve &lt;em&gt;felt&lt;/em&gt; it. You watch the agent grep twenty files, read half of them, figure out what it already built, then start writing, and the usage bar just keeps moving forward. Planning, by comparison, is me and Opus talking for three hours and barely denting the budget. Obvious, right?&lt;/p&gt;

&lt;p&gt;So I did the thing I should always do before I put a claim in writing. I looked at a month of my own Claude Code session logs across two projects.&lt;/p&gt;

&lt;p&gt;The meter came back flat. Coding and planning cost about the same to run. I was wrong about &lt;em&gt;why&lt;/em&gt; coding is expensive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Slogan, and the Hole in It&lt;/li&gt;
&lt;li&gt;What the Meter Actually Says&lt;/li&gt;
&lt;li&gt;The Expensive Kind of Cheap&lt;/li&gt;
&lt;li&gt;And Planning Is Dense&lt;/li&gt;
&lt;li&gt;Even the Prototype Gets a Plan&lt;/li&gt;
&lt;li&gt;My Freeform Rhythm&lt;/li&gt;
&lt;li&gt;Planning Is Also How I Learn the Thing&lt;/li&gt;
&lt;li&gt;So, Cheap Compared to What&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Slogan, and the Hole in It
&lt;/h2&gt;

&lt;p&gt;The line I started with is “planning is cheap, coding is not.” I still believe it. But there’s a hole in it and I’d rather stab it myself than let a commenter do it.&lt;/p&gt;

&lt;p&gt;Here’s the hole: &lt;strong&gt;agents made code fast.&lt;/strong&gt; The whole selling point is that you describe a thing and the machine types it out in a minute. If typing is free now, in what sense is coding “not cheap”? A skeptic reads the title and closes the tab, because on its face the tool that generates 2,000 lines while you get coffee is the &lt;em&gt;cheapest&lt;/em&gt; thing in the whole stack.&lt;/p&gt;

&lt;p&gt;I couldn’t answer that cleanly, which usually means I don’t understand my own point yet. So instead of arguing from vibes, I went and measured.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Meter Actually Says
&lt;/h2&gt;

&lt;p&gt;Two projects. Both ones I had genuinely &lt;em&gt;no idea how to build&lt;/em&gt; when I started. Which is the whole reason they’re useful here. One is a &lt;a href="https://dev.to/eristoddle/the-living-plan-got-fat-compacting-a-doc-that-wont-stop-growing-3nk0"&gt;content pipeline&lt;/a&gt;. The other is a knowledge-graph site I’ve written about &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;before&lt;/a&gt;. Different domains, different stacks, both explored more or less blind.&lt;/p&gt;

&lt;p&gt;I parsed every session’s log and split each of the agent’s turns into two buckets: &lt;strong&gt;conversation turns&lt;/strong&gt; (the agent replied with text and touched nothing) and &lt;strong&gt;tool-action turns&lt;/strong&gt; (it ran a command, read, edited, or wrote a file). It’s not a clean planning-vs-coding line (the agent talks during a build and reads files during planning), but across a month it’s a fair read on where the time and tokens go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cqjn3nldstkcw724673.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cqjn3nldstkcw724673.jpg" alt="What the Meter Actually Says" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Content pipeline&lt;/th&gt;
&lt;th&gt;Knowledge-graph site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessions (about one month)&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversation vs tool-action turns&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;59% / 41%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;59% / 41%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens (talk vs build)&lt;/td&gt;
&lt;td&gt;65% / 35%&lt;/td&gt;
&lt;td&gt;61% / 39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokens &lt;em&gt;per turn&lt;/em&gt; (talk vs build)&lt;/td&gt;
&lt;td&gt;~100K vs ~98K&lt;/td&gt;
&lt;td&gt;~119K vs ~122K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things fell out of this, and one of them is the whole post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: both projects landed on the exact same split.&lt;/strong&gt; Fifty-nine percent conversation, forty-one percent building. Two unrelated codebases, two different domains, both started from “I don’t know what the fuck I’m doing,” and I independently spent about sixty percent of my turns just &lt;em&gt;deciding&lt;/em&gt;. I didn’t plan that symmetry. It’s just what working in unknown territory costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, and this is where I lied to myself: the per-turn token cost is basically flat.&lt;/strong&gt; On the content pipeline, a conversation turn and a tool-action turn cost within about three percent of each other. Same story on the other project. Coding doesn’t burn more tokens than talking. It just &lt;em&gt;feels&lt;/em&gt; like it does, because you sit there watching it work.&lt;/p&gt;

&lt;p&gt;The reason is boring and it’s caching. I plan on a million-token context window, and every single turn, whether the agent is writing a paragraph of reasoning or grepping the repo, re-reads roughly the same enormous cached context. The dominant cost per turn is &lt;em&gt;the size of the context&lt;/em&gt;, not the activity inside the turn. Reading a cached window is cheap per token, but there’s a mountain of it, and it gets re-read on every message. Planning quietly pays that toll on every back-and-forth and hides it, because nothing visible is happening. Coding pays the same toll and shows you a progress bar, so you blame the progress bar.&lt;/p&gt;

&lt;p&gt;So “coding burns more tokens” is just false, at least for how I work. Good. Now I have to figure out what I actually meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Expensive Kind of Cheap
&lt;/h2&gt;

&lt;p&gt;Here’s what I meant, once the data forced me to say it properly:&lt;/p&gt;

&lt;p&gt;Planning and coding cost about the same to &lt;em&gt;run&lt;/em&gt;. What’s wildly different is the cost of being &lt;strong&gt;wrong&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A wrong decision while planning costs one edited sentence. I write “we’ll use X,” I talk it through, I realize X is dumb, I change the sentence to “we’ll use Y.” Done. The blast radius is a paragraph.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;same&lt;/em&gt; wrong decision, once it’s code, costs a refactor. Or a dead end. Or a start-over. Because the agent didn’t just write the line that encodes the decision. It wrote the four modules downstream that assume it, the tests that lock it in, the data shapes that depend on it. Agents didn’t make coding cheap. They made &lt;em&gt;typing&lt;/em&gt; cheap, which is a different thing, and worse in a specific way: they make your wrong assumptions reality faster and in greater volume than you ever could by hand. By the time you notice the assumption was wrong, it’s load-bearing in a thousand lines.&lt;/p&gt;

&lt;p&gt;That’s the real asymmetry. Not tokens. &lt;strong&gt;Reversibility.&lt;/strong&gt; Prose is cheap to be wrong in because it’s cheap to change. Code is expensive to be wrong in because everything else is stacked on top of it. Planning is cheap because you can throw it away for free. Coding is expensive because you mostly can’t.&lt;/p&gt;

&lt;p&gt;And I have the scar tissue to prove it. Of the &lt;a href="https://dev.to/eristoddle/the-great-vibe-coding-experiment-how-i-built-15-projects-with-ai-in-my-spare-time-275o"&gt;first fifteen-or-so projects I built with AI&lt;/a&gt;, something like half either got completely refactored or thrown out and restarted from scratch. I &lt;a href="https://dev.to/eristoddle/i-burned-out-on-vibe-coding-came-back-and-rewrote-everything-l6i"&gt;burned out on the whole approach once&lt;/a&gt; and the lesson that came out the other side was, essentially: I had to plan more. Every one of those rewrites was a wrong decision I’d committed to code instead of catching in a sentence.&lt;/p&gt;

&lt;p&gt;The cleanest example is a choice I &lt;em&gt;didn’t&lt;/em&gt; pay full price for. On the content pipeline, this was my first real jump into agentic development: building workflows, not just pointing a coding agent at a repo. I’d done my own reading for a while and my instinct was the LangGraph / LangChain family. It’s what everyone reaches for. But before I committed, I spent planning sessions researching it with the agent and testing a couple of open-source projects built on it. In my testing the tokens just &lt;em&gt;evaporated&lt;/em&gt;. Gone, nothing to show. Pair that with a pile of horror stories from people running those frameworks in anger, and I bailed. Landed on &lt;a href="https://pydantic.dev/docs/ai/graph/graph/" rel="noopener noreferrer"&gt;Pydantic Graph&lt;/a&gt; instead and it’s working well. And I can look at the code and know how it works.&lt;/p&gt;

&lt;p&gt;Notice where that decision happened. In research and planning. Cost: a few conversations and a couple of throwaway test runs. If I’d made that call the vibe way (pick LangChain because it’s the default, build three weeks on it, &lt;em&gt;then&lt;/em&gt; discover the token hole), that’s not a conversation. That’s a rewrite. Same wrong turn, two completely different bills, and the only variable was whether I found out in prose or in code.&lt;/p&gt;

&lt;h2&gt;
  
  
  And Planning Is Dense
&lt;/h2&gt;

&lt;p&gt;There’s a second thing the meter doesn’t catch, and it cuts the same direction. My split, 59% talking and 41% building, counts &lt;em&gt;effort&lt;/em&gt;. It says nothing about &lt;em&gt;yield&lt;/em&gt;, and the yield is lopsided as hell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g8w7h633n0oxo0iuyiq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g8w7h633n0oxo0iuyiq.jpg" alt="And Planning Is Dense" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fifteen minutes of planning doesn’t buy fifteen minutes of building. It can buy an &lt;em&gt;hour&lt;/em&gt;. A clear decision, a couple of constraints, a handoff to the agent, and it goes and runs with all of it while I do something else. Planning is dense. A little of it aims a lot of building.&lt;/p&gt;

&lt;p&gt;Which is the reversibility point again, from the other end. That same dense fifteen minutes, if the decision underneath it is wrong, doesn’t cost you fifteen minutes back. It fans out into the whole hour that got stacked on top of it. Leverage runs both ways. A good plan multiplies what you build; a bad one multiplies what you rewrite. The denser the planning, the more each decision is worth getting right while it’s still just a sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Even the Prototype Gets a Plan
&lt;/h2&gt;

&lt;p&gt;The obvious objection: “Fine, but prototypes are &lt;em&gt;throwaway&lt;/em&gt;. The whole point is to build junk fast and learn from it. Planning a prototype is like drawing blueprints for a sandcastle.”&lt;/p&gt;

&lt;p&gt;I used to believe that. I don’t anymore, and it’s the same reversibility argument.&lt;/p&gt;

&lt;p&gt;A prototype with no plan doesn’t actually test anything. It just generates code that &lt;em&gt;looks&lt;/em&gt; like it works, which is the single most expensive output there is, because it lies to you convincingly. If you can’t say what question the prototype is supposed to answer, you haven’t built an experiment. You’ve built a thing that runs.&lt;/p&gt;

&lt;p&gt;Planning a prototype doesn’t mean a spec. It means one honest sentence: &lt;em&gt;what am I actually trying to find out here?&lt;/em&gt; Does this framework survive my token budget? Does this data shape hold up when the input gets weird? Can this feature even do the thing before I build the other five around it? That’s the plan. It’s cheap (cheaper than the prototype), and it’s the difference between a prototype that de-risks the project and one that just adds a codebase you’ll abandon.&lt;/p&gt;

&lt;p&gt;The stakes go &lt;em&gt;up&lt;/em&gt; in unknown territory, not down. When you already know the domain, you can afford to skip ahead, because your gut is a decent planner. When you don’t know the domain (which is where I live now, on purpose), the plan is the only thing standing between you and confidently building the wrong thing very fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Freeform Rhythm
&lt;/h2&gt;

&lt;p&gt;None of this means I plan the whole thing up front and then march. I never have. My process, long before AI, was tracer bullets with the safety off.&lt;/p&gt;

&lt;p&gt;Back when I built scrapers (and I built a &lt;em&gt;lot&lt;/em&gt; of scrapers), I’d start with a command-line app that did the one core thing. Does it actually pull the data? Yes? Okay. Then maybe a little Electron UI to wrap it. I had a vague idea of the architecture I wanted, but I’d build it up, change it, and refactor mid-stream constantly, because I wanted to &lt;em&gt;see the result&lt;/em&gt;. That’s the honest core of it: I’m a creator and a builder more than a technologist. Code, AI, tools: those are how I make things, not the thing I love. I jump toward the result.&lt;/p&gt;

&lt;p&gt;The AI version of this is the same shape. I get one feature working &lt;em&gt;really&lt;/em&gt; well (not “it runs,” but “it does what I actually want as the end user”), and then I jump. Right now the article-writing pipeline is about 75% of the features I want, and I’ve hit the part I’ll admit out loud is boring. Nothing new is going to surprise me in the last 25%. There’s no “whoa, that’s cool” left in it, just grind. And I can grind, but there’s a timer on how long before I need something interesting again.&lt;/p&gt;

&lt;p&gt;So I’m jumping to the novel-writing feature, because &lt;em&gt;that’s&lt;/em&gt; going to be interesting for a while. The rest of the article pipeline goes on the back burner until I’m in grind mode again. One rule I don’t break, though: I’d rather leave a feature &lt;strong&gt;incomplete&lt;/strong&gt; than ship one that isn’t what I want. I test each one as the actual end user (not “does it run,” but “would I be annoyed using this”) because I’ve learned the hard way that assuming a feature is right and backtracking later is exactly the expensive-code problem that is the point of this post. Incomplete is free. Wrong is a refactor.&lt;/p&gt;

&lt;p&gt;Yeah, this probably means a pileup at the end, where everything I put off comes due at once and it’s grind mode for days. I’m aware. But that’s for the Stephan of tomorrow. He is much more patient than the Stephan of today…I tell myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning Is Also How I Learn the Thing
&lt;/h2&gt;

&lt;p&gt;There’s one more reason planning earns its 59%, and it’s not on any token report.&lt;/p&gt;

&lt;p&gt;I’m learning these domains &lt;em&gt;while&lt;/em&gt; I plan them. I don’t know Pydantic Graph cold. I’m learning it as I go. I’m learning how graphify’s guts work slowly, session by session, on the other project. A big chunk of what looks like “planning” is really the agent teaching me the terrain before I commit to a route through it. Every back-and-forth where it explains why a graph approach beats a chunked one, or what a framework’s failure mode is, is a decision I now get to make with my eyes open instead of discovering the map by driving off the cliff.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1s57hzziz85u1j429y1s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1s57hzziz85u1j429y1s.jpg" alt="Planning Is Also How I Learn the Thing" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that learning compounds into things I couldn’t have specced on day one. Enough sessions poking at graphify taught me its node-and-edge model. Well enough that when I wanted my whole Obsidian vault in a graph, the agent didn’t just charge ahead and it didn’t flat refuse either. It made a reasoned call: pointing graphify at all ~2,400 notes in one shot wasn’t worth the grind, here’s why. So on a different project I had it &lt;a href="https://dev.to/eristoddle/i-got-tired-of-ai-memory-hype-so-i-built-a-context-lake-55fi"&gt;build a custom connector&lt;/a&gt; instead, one that pulls every note’s folder, tags, and wikilinks out as structured facts, the exact raw material a graph turns into edges. I couldn’t have asked for that connector, or understood why the agent was right to talk me out of the brute-force version, before graphify taught me what a graph actually wants. The planning didn’t just produce decisions; it produced a version of me who knew enough to ask for the right thing.&lt;/p&gt;

&lt;p&gt;Which is exactly why I never use plan mode. The official one, the structured feature: I don’t touch it, not for anything open-ended. It collapses the conversation into multiple choice. Pick A, B, or C. And when a decision is still half-formed, the options are never quite the thing in my head. I end up arguing with the menu instead of thinking. I want the back-and-forth: ask a question, get an answer, push on it, change my mind three exchanges in, &lt;em&gt;then&lt;/em&gt; decide. That messy conversation is what has to happen. It’s where the learning lives, and it’s where the cheap decisions get made before they turn into expensive code. I wrote up the actual machinery I use instead (one living plan doc, numbered decisions, the whole system) in the &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;living-plan post&lt;/a&gt;, so I won’t rerun it here.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, Cheap Compared to What
&lt;/h2&gt;

&lt;p&gt;I’m not here to tell you you’re doing it wrong. I genuinely don’t care if the vibe-coder down the street thinks planning is for cowards. Live and let live. Or live and mortgage your house to cover your coding bill, your call. Some of the best things I’ve built started as pure “just build it and see.” Prototyping to figure out how something even works is real and I do it constantly.&lt;/p&gt;

&lt;p&gt;But I pulled my own numbers hoping to prove coding was the expensive part, and the meter told me the truth instead: it costs about the same as talking. The expense was never in the tokens. It’s in the concrete. A wrong sentence is free to fix. A wrong foundation is a rewrite, and the agent will happily pour you a bigger one, faster, than you could ever pour yourself.&lt;/p&gt;

&lt;p&gt;So plan the thing. Plan the prototype, even. Especially the prototype. Not because planning is virtuous. Because it’s the only place left where being wrong is still cheap. Unless you’re a millionaire, of course, but for us working stiffs, coding still costs real money.&lt;/p&gt;

</description>
      <category>llmcostanalysis</category>
      <category>claudecodeusage</category>
      <category>agenttokencosts</category>
      <category>planningvscodingcost</category>
    </item>
    <item>
      <title>GPT-5.6 Finally Shipped, Then Grok and Meta Ate Its Lunch</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Tue, 14 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/gpt-56-finally-shipped-then-grok-and-meta-ate-its-lunch-3nch</link>
      <guid>https://dev.to/eristoddle/gpt-56-finally-shipped-then-grok-and-meta-ate-its-lunch-3nch</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl64aw3gcc7pv50905wdo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl64aw3gcc7pv50905wdo.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Between Tuesday and Wednesday, July 8th and 9th, three different labs dropped flagship models. xAI shipped Grok 4.5. OpenAI finally let GPT-5.6 out of the building. Meta launched Muse Spark 1.1. Three frontier releases in about 48 hours, which is the kind of thing that used to happen once a quarter.&lt;/p&gt;

&lt;p&gt;Nobody won. Not on intelligence, anyway. The smartest model in the world is still Claude Fable 5, same as last month. What every one of these launches was really fighting over was the bill. Not the sticker price on the API page. The actual amount of money that leaves your account when the agent finishes the job. That’s the whole story this week.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 48-Hour Flagship Pileup&lt;/li&gt;
&lt;li&gt;GPT-5.6 Shipped From House Arrest&lt;/li&gt;
&lt;li&gt;Grok 4.5 and the Number Nobody’s Talking About&lt;/li&gt;
&lt;li&gt;Meta Closed the Door on the Way Out&lt;/li&gt;
&lt;li&gt;The Cheapskate Picks&lt;/li&gt;
&lt;li&gt;Horror Stories From the Wild&lt;/li&gt;
&lt;li&gt;What’s Coming: July 17 Is Going to Be a Bloodbath&lt;/li&gt;
&lt;li&gt;The Takeaway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 48-Hour Flagship Pileup
&lt;/h2&gt;

&lt;p&gt;For the last two weeks I’ve been writing about GPT-5.6 as vaporware. OpenAI previewed it in late June and then locked it to about twenty government-vetted partners under a frontier-AI review process. You couldn’t use it. I couldn’t use it. It was a press release with a benchmark chart attached.&lt;/p&gt;

&lt;p&gt;Then on July 9th it went fully generally available on ChatGPT, the API, Codex, and GitHub Copilot, all at once. Great. Except the day &lt;em&gt;before&lt;/em&gt; that, xAI dropped Grok 4.5, a model priced so aggressively it makes GPT-5.6 Sol look like a luxury purchase. And the &lt;em&gt;same day&lt;/em&gt; GPT-5.6 shipped, Meta launched Muse Spark 1.1 at roughly a quarter of what Anthropic and OpenAI charge for their flagships.&lt;/p&gt;

&lt;p&gt;So OpenAI’s big moment, the flagship it had been dangling for a month, got sandwiched between two competitors on the same 48-hour window, both of them attacking the exact axis OpenAI is weakest on. If you’re keeping score at home on the Artificial Analysis Intelligence Index, the top now reads something like Fable 5 at 60, GPT-5.6 Sol at 59, Opus 4.8 at 56, Grok 4.5 at 54. That’s a dogpile inside six points. When the top four models are that close on capability, “which one is smartest” stops being an interesting question. “Which one is cheapest to actually run” becomes the only question.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT-5.6 Shipped From House Arrest
&lt;/h2&gt;

&lt;p&gt;Let’s give OpenAI its due first. GPT-5.6 comes in three sizes and, unlike some past launches, the naming actually maps to something useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sol&lt;/strong&gt; , the flagship: $5 in / $30 out per million tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terra&lt;/strong&gt; , the everyday model: $2.50 / $15, which OpenAI pitches as “GPT-5.5 performance at half the price”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Luna&lt;/strong&gt; , the cheap one: $1 / $6&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three carry a 1M context window and 128k max output. Sol lands at #2 on the AA Intelligence Index at 59, and it set a new high on Agents’ Last Exam at 53.6, beating Fable 5 by a full 13 points. If you’d stopped reading OpenAI’s launch post there, you’d think they’d taken the crown.&lt;/p&gt;

&lt;p&gt;Then you flip to SWE-Bench Pro, the coding benchmark, and Fable 5 scores 80% while Sol manages 64.6%. OpenAI’s response to that gap was, roughly, to question whether the benchmark is any good. Which is a bold move when it’s the same benchmark everyone was citing last month. Here’s the thing I keep coming back to: the headline eval and the embarrassing eval are on the &lt;em&gt;same page&lt;/em&gt; of the same launch. That’s not a knock on the model, it’s a reminder that you pick the benchmark that matches your actual work, not the one the vendor put in bold.&lt;/p&gt;

&lt;p&gt;Simon Willison had early access to Sol and his take was the most honest one I read: “definitely very competent,” but not more impressive than Fable for complex coding. He also noticed Sol likes to over-investigate before it acts, which is a polite way of saying it burns tokens thinking in circles before it does the thing. More on that theme in a second, because it’s the theme of the entire week.&lt;/p&gt;

&lt;p&gt;One genuinely cool bit: OpenAI is putting Sol on Cerebras hardware at up to 750 tokens per second. Fast is a real feature for agent loops. Just not fast enough to be the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grok 4.5 and the Number Nobody’s Talking About
&lt;/h2&gt;

&lt;p&gt;Here’s where I have to admit I underestimated xAI.&lt;/p&gt;

&lt;p&gt;Grok 4.5 launched July 8th at &lt;strong&gt;$2 in / $6 out&lt;/strong&gt; per million tokens. That’s over 60% cheaper than Opus 4.8 or GPT-5.5. It lands at #4 on the AA Intelligence Index, above every open-weight model and above every Gemini model on the board too. It was trained on real Cursor session data, which is the kind of thing that either makes a coding model great or gets you into a benchmark scandal, and this week it did both. We’ll get there.&lt;/p&gt;

&lt;p&gt;But the number nobody’s putting in their headline is cost-per-task. Artificial Analysis measured GPT-5.6 Sol at $1.04 to run one Intelligence Index task. Grok 4.5? &lt;strong&gt;$0.31.&lt;/strong&gt; Roughly a third of the cost for a model that’s four spots down and change on raw intelligence.&lt;/p&gt;

&lt;p&gt;How? Token efficiency. Grok 4.5 uses about 15,954 output tokens on a SWE-Bench Pro task. Opus 4.8 uses 67,020 for the same work. That’s a 4.2x difference in how much the model &lt;em&gt;talks to itself&lt;/em&gt; to arrive at an answer, and since you pay per token, that ratio lands directly on your invoice. On coding-agent tasks specifically, AA clocked Grok at $2.49 per task versus $5.07 for GPT-5.5 and $11.80 for Fable 5.&lt;/p&gt;

&lt;p&gt;Read that last sentence again. Fable 5 costs almost 5x what Grok costs to finish the same coding task. Not because its per-token price is 5x higher (it’s not), but because it thinks longer and harder and you pay for every one of those tokens. This is the trap I keep watching people fall into: they compare the $/million numbers on the pricing page, pick the “cheaper” model, and then get a bigger bill because it’s chattier. The sticker price is not the price.&lt;/p&gt;

&lt;p&gt;Now the asterisks, because there are real ones:&lt;/p&gt;

&lt;p&gt;Grok 4.5’s launch scores were vendor-reported with no model card shipped. Cursor had to &lt;em&gt;withdraw&lt;/em&gt; one internal benchmark after it came out that Grok had trained on their codebase — which, given it was literally trained on Cursor session data, is exactly the conflict you’d worry about. And the capability tradeoff is ugly: on the AA-Omniscience test, Grok’s accuracy climbed from 35% to 52%, which sounds great, except its hallucination rate &lt;em&gt;also&lt;/em&gt; jumped from 25% to 54%. It knows more, and it’s more confident when it’s wrong. That’s arguably the worse failure mode. A model that admits it doesn’t know is annoying; a model that fabricates with conviction is the one that ships a fake function name into your codebase at 2 AM.&lt;/p&gt;

&lt;p&gt;Oh, and it dropped from a 1M context window down to 500k, and it’s not available in the EU yet. But at $0.31 a task, a lot of people are going to forgive all of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta Closed the Door on the Way Out
&lt;/h2&gt;

&lt;p&gt;Muse Spark 1.1 is the quiet winner of the week and also the most ironic.&lt;/p&gt;

&lt;p&gt;Meta priced it at &lt;strong&gt;$1.25 in / $4.25 out&lt;/strong&gt; , about a quarter of flagship rates, threw in $20 of free credits per account, and it immediately started landing inside the competitive band across the Arena leaderboard. Overall #6 at 1490. Coding #8. Instruction Following #8. Hard Prompts #7. It’s not topping anything, but it’s &lt;em&gt;competitive everywhere&lt;/em&gt; at a price that undercuts almost everyone. That’s the definition of a value pick.&lt;/p&gt;

&lt;p&gt;Here’s the irony. This is Meta, the company whose entire AI identity was giving models away. Llama got downloaded over a billion times because you could run it yourself, fine-tune it, own it. Muse Spark 1.1 ships &lt;strong&gt;closed-weight&lt;/strong&gt;. No download, no local deploy, no fine-tuning. If your reason for loving Meta’s models was that you could actually possess them, that reason is gone. The cheapest brand-name model on the board this week is also the one that just walked away from open source. Make of that what you will. I have some feelings about it, and none of them are inspirational.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheapskate Picks
&lt;/h2&gt;

&lt;p&gt;Okay, the part you can actually use. Same method as always: for each Arena category, I take the leader’s rating and find the cheapest model within about 50 rating points of it. Because Arena’s top end is compressed (the whole competitive pack usually fits inside a 50-point window), “cheapest in the band” is a real choice between models that are genuinely close, not settling for garbage.&lt;/p&gt;

&lt;p&gt;One caveat this week: Grok 4.5 and GPT-5.6’s Terra and Luna tiers are so new that Arena hasn’t accumulated enough votes to rank them in most categories yet. So they don’t show up in the band even though they’re obvious value plays. I’ve noted where that matters. Opus-tier leaders are priced around $25/million output; Fable 5 leaders at $50.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Leader&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Cheapskate pick&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Δ rating&lt;/th&gt;
&lt;th&gt;Cheaper by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Fable 5 (1505)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Muse Spark 1.1 (1490)&lt;/td&gt;
&lt;td&gt;$4.25&lt;/td&gt;
&lt;td&gt;−15&lt;/td&gt;
&lt;td&gt;~11.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Opus 4.7-thinking (1553)&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;td&gt;Qwen3.7 Max (1526)&lt;/td&gt;
&lt;td&gt;$3.75&lt;/td&gt;
&lt;td&gt;−27&lt;/td&gt;
&lt;td&gt;~6.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative&lt;/td&gt;
&lt;td&gt;Fable 5 (1507)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash (1471)&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−36&lt;/td&gt;
&lt;td&gt;~5.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Following&lt;/td&gt;
&lt;td&gt;Opus 4.6-thinking (1513)&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;td&gt;Muse Spark 1.1 (1487)&lt;/td&gt;
&lt;td&gt;$4.25&lt;/td&gt;
&lt;td&gt;−26&lt;/td&gt;
&lt;td&gt;~5.9x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Prompts&lt;/td&gt;
&lt;td&gt;Opus 4.6-thinking (1532)&lt;/td&gt;
&lt;td&gt;~$25&lt;/td&gt;
&lt;td&gt;Muse Spark 1.1 (1513)&lt;/td&gt;
&lt;td&gt;$4.25&lt;/td&gt;
&lt;td&gt;−19&lt;/td&gt;
&lt;td&gt;~5.9x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;Fable 5 (1548)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash (1517)&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−31&lt;/td&gt;
&lt;td&gt;~5.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few notes. Muse Spark 1.1 is the story here. It wins three categories outright as the cheapskate pick, mostly because it’s brand-name cheap and Arena caught up to it fast. For coding, Qwen3.7 Max is the by-the-numbers pick, but the real coding value if you don’t care about the Arena ranking is Grok 4.5 at $2.49 a task. It’s just not Arena-rated yet, so I can’t put it in the table honestly.&lt;/p&gt;

&lt;p&gt;And Gemini 3.5 Flash keeps quietly winning Math and Creative for the third or fourth week running. At $9 output it beats every Claude Opus-thinking variant on Math except one. If you’re doing math-heavy or creative work and you’re paying Fable 5’s $50, you are lighting money on fire for a rating difference smaller than the noise in the measurement.&lt;/p&gt;

&lt;p&gt;Also worth flagging: Fable 5’s Math #1 rating of 1548 is sitting on only 360 votes. That’s thin. Don’t over-trust a fresh #1 with that little data behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Horror Stories From the Wild
&lt;/h2&gt;

&lt;p&gt;Every roundup needs the part where I tell you what’s going to ruin your day. This week it comes courtesy of Cursor, and it’s a good one.&lt;/p&gt;

&lt;p&gt;Multiple users on the Cursor forums reported that when they selected &lt;strong&gt;Grok 4.5&lt;/strong&gt; in the CLI, their usage logs showed they were actually being billed for &lt;strong&gt;GPT-5.6-sol-medium&lt;/strong&gt;. Separately, Grok 4.5 was routing its subagent calls to &lt;strong&gt;GPT-5.6-terra-medium&lt;/strong&gt; instead of the model people thought they’d picked. So you select the cheap, token-efficient model, and you get silently billed for a different, pricier one. This is the exact nightmare scenario for a week where the whole selling point is cost-per-task. The tooling can’t reliably tell you &lt;em&gt;which model you’re even running&lt;/em&gt;, let alone what it costs. There were also plain “Grok 4.5 errors out and won’t come back” reports. New model, new plumbing, same old chaos.&lt;/p&gt;

&lt;p&gt;The second horror story is the Grok hallucination number I already mentioned: a 54% hallucination rate on AA-Omniscience, up from 25%. I’m repeating it here because it deserves to live in the horror section too. A model that’s wrong more than half the time on knowledge questions &lt;em&gt;and&lt;/em&gt; more confident about it is not a model you point at anything that touches production without a human reading every line.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Coming: July 17 Is Going to Be a Bloodbath
&lt;/h2&gt;

&lt;p&gt;Mark the 17th. Two big things land the same day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini 3.5 Pro&lt;/strong&gt; is finally targeting July 17, after Google scrapped its base model and rebuilt the whole thing from the ground up. Reportedly engineers found structural failures in recursive tool-calling and SVG generation and decided a rebuild beat a patch. Context window, pricing, specs: still unconfirmed. Google has reportedly shed something like $225B in market cap over the delays and a DeepMind talent exodus, so there’s a lot riding on this one not being a dud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DeepSeek V4&lt;/strong&gt; graduates from preview to official stable release the &lt;em&gt;same day&lt;/em&gt;. V4-Pro at 1.6 trillion params, V4-Flash at 284 billion, both with 1M context. And if you’re already using DeepSeek, note the deadline: the API migration is mandatory by July 24th. After that, &lt;code&gt;deepseek-chat&lt;/code&gt; and &lt;code&gt;deepseek-reasoner&lt;/code&gt; start returning errors. Don’t get caught by that on a Friday.&lt;/p&gt;

&lt;p&gt;Also on deck: Grok 4.5 EU availability is promised for later this month, and Anthropic extended Fable 5 access on all paid plans plus kept Claude Code’s weekly limits 50% higher through July 19th.&lt;/p&gt;

&lt;p&gt;Background hum, unchanged: DeepSeek is still around 17.6% of all OpenRouter tokens, Chinese-origin labs are collectively pushing 46%, and US labs’ share has fallen from roughly 70% to 30% year over year. Three Western flagship launches in one week did not move that needle. They moved the price sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;If there’s one thing to carry out of this week, it’s this: stop reading the pricing page and start reading your invoice.&lt;/p&gt;

&lt;p&gt;The intelligence race is basically a tie at the top. Four models within six points. In a tie, the tiebreaker is cost, and cost is not the number on the API docs. It’s tokens-per-task times price-per-token, and the two frontier models with the flashiest benchmarks (Fable 5, GPT-5.6 Sol) are also the ones that think the longest and bill the most per finished job. Grok 4.5 winning on cost-per-task while sitting fourth on intelligence is the entire lesson in one data point.&lt;/p&gt;

&lt;p&gt;So here’s what I’m actually doing. I’m running Grok 4.5 for coding tasks where I can eyeball the output, precisely because it’s cheap per task, and watching it like a hawk because of that hallucination number. I’m keeping Gemini 3.5 Flash on math and creative work because paying 5x more for a rating rounding error is stupid. I’m letting the GPT-5.6 hype cool for a couple weeks until there’s lived-experience data instead of launch-day benchmarks. And I’m double-checking which model my tools are &lt;em&gt;actually&lt;/em&gt; calling, because apparently that’s not a settled question anymore.&lt;/p&gt;

&lt;p&gt;Rent everything, own nothing, read your bills. That’s where the model world sits in July 2026. See you next week, when Gemini 3.5 Pro and DeepSeek V4 have presumably set something on fire.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>openrouter</category>
      <category>modelroundup</category>
      <category>largelanguagemodels</category>
    </item>
    <item>
      <title>I Got Tired of AI Memory Hype, So I Built a Context Lake</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 08 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/i-got-tired-of-ai-memory-hype-so-i-built-a-context-lake-55fi</link>
      <guid>https://dev.to/eristoddle/i-got-tired-of-ai-memory-hype-so-i-built-a-context-lake-55fi</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyj7xsggz3nbg9rxrj1e4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyj7xsggz3nbg9rxrj1e4.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are problems with creating a report that brings you all the AI news it can find every morning. The first time you hear about some new technique or technology, you’re on it. You’re testing it out. Two days later, you uninstall it to try the next one. Right about the 13th to 25th time you hear the same thing, you actually hear a carnival barker instead and move on.&lt;/p&gt;

&lt;p&gt;Well, I got tired of hearing about AI memory. Every tool, every framework, every other thread has its own flavor of it: short-term, long-term, episodic, semantic, a memory MCP, some SDK that bolts a “memory layer” onto your agent. None of them agree with each other. I started skipping those articles.&lt;/p&gt;

&lt;p&gt;Part of that is timing. I adopted AI coding early, back when the tools were genuinely crappy, and honestly a lot of them still are. So I’ve already been through a hype cycle or two. &lt;em&gt;Install the getting-shit-done skill bundle, it’ll do miracles. Install the superpower skills, guess what, even better, shinier miracles.&lt;/em&gt; So I did. What I got was &lt;a href="https://dev.to/eristoddle/the-agent-skills-guide-i-wish-id-had-17i1"&gt;a bloated pile of skills scattered everywhere&lt;/a&gt;, half of them firing at random on the wrong things, most of them quietly depending on three &lt;em&gt;other&lt;/em&gt; skills just to work. &lt;a href="https://dev.to/eristoddle/i-burned-out-on-vibe-coding-came-back-and-rewrote-everything-l6i"&gt;It burned me out&lt;/a&gt;. I’ve started to think early adoption is its own little curse: you go in idealistic and you come out the other side disillusioned. So by the time “memory” showed up as the next miracle, I was already numb to it.&lt;/p&gt;

&lt;p&gt;Then, on a completely unrelated project, I accidentally built a piece of the answer without realizing that’s what I was doing. I’d wired up &lt;a href="https://github.com/safishamsi/graphify" rel="noopener noreferrer"&gt;graphify&lt;/a&gt; (a tool that turns a codebase into a knowledge graph) and a vector database to index the &lt;em&gt;research&lt;/em&gt; behind a project. Not the code. The notes, the plans, the stuff I’d been reading to figure out what to build get synced to a folder daily (I still read some of the news) and processed. I just wanted &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;one place to plan from&lt;/a&gt;. It worked unreasonably well.&lt;/p&gt;

&lt;p&gt;A while later I ran into &lt;a href="https://arxiv.org/abs/2601.17019" rel="noopener noreferrer"&gt;a paper&lt;/a&gt; that put a name to the thing I’d stumbled into: a &lt;strong&gt;Context Lake&lt;/strong&gt;. First idea in the entire memory conversation that made me go &lt;em&gt;oh… yeah, that actually makes sense.&lt;/em&gt; It also didn’t hurt that I already built part of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  One brain, not one per agent
&lt;/h2&gt;

&lt;p&gt;The paper is a theory paper. It lays out what a Context Lake &lt;em&gt;is&lt;/em&gt; and what it has to guarantee, then more or less leaves the actual building as an exercise for the reader. But the core idea fits in one breath:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop giving every agent its own memory. Give them all one brain, and let them read from it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrhn7uuld8v0y17qp8p2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrhn7uuld8v0y17qp8p2.jpg" alt="One brain, not one per agent" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, that’s the hype again, but by building it I knew how it worked. One place that quietly keeps track of everything you actually work on (your notes, your code, your past AI conversations) and stays current. Whatever tool you’re using just asks it for what it needs. I also knew I wouldn’t have to install it as a plugin in Claude. And I am going to say it. FUCK plugins. Let’s just call them “lockins.” We have portable standards, right? So why the fucking plugins, seriously. Yeah, it’s a touchy subject with me.&lt;/p&gt;

&lt;p&gt;Now, if you’ve used any of these coding tools, you already have a version of this in your head. “A brain my agent reads from” probably sounds like: it remembers what we did last session, it knows the shape of the project, maybe someday it knows about my Jira tickets or my Confluence pages. That’s the version everyone’s racing to ship. And if that were all a Context Lake was, I’d have kept tuning it out.&lt;/p&gt;

&lt;p&gt;It’s the stuff that only shows up &lt;em&gt;once the brain is sitting outside the agents&lt;/em&gt; that got me to actually build one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody pictures
&lt;/h2&gt;

&lt;p&gt;Start with where the brain’s contents even come from. The tools I use all day, Claude Code and OpenCode, already write down what they did: every session is a record of what I asked, what the agent changed, and, crucially, &lt;em&gt;which project I was in when it happened&lt;/em&gt;. That last part is the sneaky-powerful bit. If the lake reads those session logs, it doesn’t need me to tell it which repos matter or point it at my projects. The sessions already say. It back-traces from “here’s what you were working on” to “here’s the code and the context that go with it,” on its own.&lt;/p&gt;

&lt;p&gt;Which means the core of the thing assembles itself. I don’t sit down and configure my whole life into it. I work the way I already work, and the record of that work &lt;em&gt;is&lt;/em&gt; the setup. Everything else (pulling in an Obsidian vault, wiring up email or Jira down the line) is stuff I add on purpose, on top of a spine that populated itself for free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxq4cml8x2th55zx0emf2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxq4cml8x2th55zx0emf2.jpg" alt="The part nobody pictures" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And once the lake is quietly recording all of that, not just what’s in your files but how you and your agents actually work together, it stops being only a place to &lt;em&gt;read&lt;/em&gt; from. It starts to notice things. Where you keep hand-fixing the same kind of output. Where you ask for the same thing over and over. Those are patterns, and patterns are something it can act on: “you keep correcting this, want me to fix the skill that keeps getting it wrong?” For a developer, that’s sharpening your own tools. For someone who isn’t a developer, it’s the same engine pointed a different direction: “you keep doing this by hand, want me to build you a app that just does it?”&lt;/p&gt;

&lt;p&gt;That’s the part I keep coming back to. Every other memory tool stops at handing your agent better context. This one watches the friction pile up over time and offers to &lt;em&gt;remove&lt;/em&gt; it, because it’s the only thing in the stack that can see the whole loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sketchy part: it was going to need an MCP
&lt;/h2&gt;

&lt;p&gt;I already ranted about plugins up there. Treat this as the sequel, because I’ve got one more name on the list: MCPs. I hate MCPs. Yeah, so fuck MCPs too, while your at it. Not the idea of them, the idea’s fine, a shared standard for handing an agent tools and data. The reality is that in my experience they randomly work when they’re supposed to and randomly don’t, and I’ve never found the pattern. So I’ve ended up at the same sad little ritual everyone ends up at: every single time I need the thing, I tell the agent to use it, by name, out loud, because it will not remember on its own. Ever. Or it might, sometimes, but that’s even worse actually.&lt;/p&gt;

&lt;p&gt;Which is exactly where this project got sketchy. A Context Lake is a brain the agents read from. So how does an agent read from it? It calls out to it. And the standard, everybody-does-it-this-way plumbing for “agent calls out to an external service” is an MCP. I’d designed myself straight into depending on the one piece of the stack I trust the least: build the nice outside brain, then wire it to the agent with the flakiest connector I can find and pray the agent remembers to ask.&lt;/p&gt;

&lt;p&gt;Then I found &lt;a href="https://x.com/jasonzhou1993/status/2071572429298950547" rel="noopener noreferrer"&gt;a post from Jason Zhou&lt;/a&gt; about a &lt;a href="https://github.com/DeusData/codebase-memory-mcp" rel="noopener noreferrer"&gt;codebase-memory tool&lt;/a&gt; he’d been using, and it solved my problem from the side. His complaint was word-for-word mine: these “index your codebase” tools never stuck for him or his team, because either the index went stale or the agent forgot to call the special MCP tools. Same disease. His fix is the part that clicked, and the clever bit isn’t that he threw the MCP out. The tool is still an MCP. He just stopped relying on the agent to remember it. He hangs a pre-tool-use hook on grep, the one command the agent reaches for a hundred times a day anyway. The agent greps like it always does, and in the same step the hook quietly looks that query up in the graph and folds the structural answer into the result. The agent never had to remember a special tool. It greps, and the map rides along.&lt;/p&gt;

&lt;p&gt;That was the missing piece, and it wasn’t about hating MCPs into submission. It was about not depending on the agent’s goldfish memory. Claude Code has hooks. So my lake doesn’t have to sit there as a tool the agent might call if it feels like it. It can ride along on something the agent already does and push what’s relevant in at the right moment, on its own. For my own thing I can lean on that even harder than he does: a hook can read the lake and inject context directly, no MCP in the middle at all, no plugin to install, no “please use the memory tool” chanted at the top of every session. It doesn’t ask the agent to be disciplined. It just works whether the agent cooperates or not. That post didn’t hand me the Context Lake. It handed me the thing that made me sure I could build one without it living or dying on whether the agent remembers to ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build my own instead of installing one of the five billion
&lt;/h2&gt;

&lt;p&gt;Here’s the honest reason I’m building my own instead of just installing one of the memory tools that already exist: I want to know how it works. All of it. Every piece.&lt;/p&gt;

&lt;p&gt;Because right now I &lt;em&gt;can’t tell those tools apart.&lt;/em&gt; &lt;a href="https://mem0.ai" rel="noopener noreferrer"&gt;Mem0&lt;/a&gt;, &lt;a href="https://www.getzep.com" rel="noopener noreferrer"&gt;Zep&lt;/a&gt;, &lt;a href="https://www.letta.com" rel="noopener noreferrer"&gt;Letta&lt;/a&gt;, &lt;a href="https://www.cognee.ai" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt;, &lt;a href="https://github.com/getzep/graphiti" rel="noopener noreferrer"&gt;Graphiti&lt;/a&gt;, and a new one every week, each with a landing page swearing it’s the one, and from the outside they’re indistinguishable. The exact wall of “AI memory” noise that made me tune out in the first place. The only way I’ve ever cut through that kind of thing is to build it myself, badly if I have to, until I actually understand the moving parts. Once I’ve done that, I’ve got a ruler. Maybe I’ll find something in the wild that’s better than what I made. Great, I’ll happily throw mine out. But now I’ll be able to &lt;em&gt;tell&lt;/em&gt; that it’s better, and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it actually is right now
&lt;/h2&gt;

&lt;p&gt;So where is it actually? Honestly: part-built and mostly promise. The plumbing that reads my sessions and files into one place exists. A lot of the rest, the self-improving part especially, is still me sketching how the pieces fit and betting they will. I’m fairly sure they will; I’ve built enough to not see why they wouldn’t. But I want to be straight that a good chunk of what I’ve described here is &lt;em&gt;potential&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’m fine with that, because the thing I was chasing was never a product. It was a frame. A way of thinking about all this memory noise that finally sat still and made sense. Stop bolting a brain onto every agent. Build one, outside of them, that they all read from. Everything else is downstream. Whether &lt;em&gt;my&lt;/em&gt; version survives contact with reality, the idea is the part I’d want you to walk away with. It’s the first one in this whole space that made me stop tuning out.&lt;/p&gt;

</description>
      <category>contextlake</category>
      <category>aimemorymanagement</category>
      <category>agenticaiarchitectur</category>
      <category>knowledgegraph</category>
    </item>
    <item>
      <title>Claude Fable 5 Came Back, Sonnet 5 Shipped, and the Bill Went Up Anyway</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/claude-fable-5-came-back-sonnet-5-shipped-and-the-bill-went-up-anyway-p3j</link>
      <guid>https://dev.to/eristoddle/claude-fable-5-came-back-sonnet-5-shipped-and-the-bill-went-up-anyway-p3j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn4biwccv9m8sowr8ye8u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn4biwccv9m8sowr8ye8u.jpg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three weeks ago I watched the best AI model on the planet get switched off by the U.S. government. Not deprecated. Not price-hiked into irrelevance. Switched off. A Commerce Department letter landed at Anthropic on a Friday afternoon and Claude Fable 5 went dark worldwide, including for Anthropic’s own staff. I’d been using it, I got the “this model is unavailable” wall, and I spent the back half of June rerouting everything to Opus 4.8 like it was 2025.&lt;/p&gt;

&lt;p&gt;On July 1 it came back. And in the same 48-hour window, Anthropic shipped a brand-new model, Claude Sonnet 5, that looks on the pricing page like the deal of the summer. Two bucks per million input tokens. I almost repointed my whole Claude Code setup at it before my coffee finished brewing.&lt;/p&gt;

&lt;p&gt;Then I did the math. You know how that goes. The frontier is back online, folks, but this week it comes with a warning label: bring a calculator.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Frontier Came Back Online&lt;/li&gt;
&lt;li&gt;Sonnet 5: Cheaper Per Token, More Expensive Per Answer&lt;/li&gt;
&lt;li&gt;Who’s Actually Shipping (And Who’s Stuck at the DMV)&lt;/li&gt;
&lt;li&gt;The Cheapskate Table (The Part That Didn’t Flinch)&lt;/li&gt;
&lt;li&gt;Horror Stories: The Meter Is Running&lt;/li&gt;
&lt;li&gt;What’s Coming&lt;/li&gt;
&lt;li&gt;The Takeaway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Frontier Came Back Online
&lt;/h2&gt;

&lt;p&gt;Let’s start with the good news, because there isn’t much of it in a month where the top model spent nearly three weeks as a paperweight.&lt;/p&gt;

&lt;p&gt;Claude Fable 5, the one that’s been sitting at #1 on the &lt;a href="https://arena.ai/leaderboard/text" rel="noopener noreferrer"&gt;LMArena text leaderboard&lt;/a&gt; all quarter, is available again as of July 1. The &lt;a href="https://www.cnbc.com/2026/06/30/anthropic-says-trump-admin-has-lifted-export-controls-on-claude-fable-5-and-mythos-5.html" rel="noopener noreferrer"&gt;U.S. Commerce Department lifted the export controls&lt;/a&gt; it slapped on the model (and its unfiltered sibling Mythos 5) back on June 12. The whole mess started when Amazon researchers found a jailbreak: prompt Fable 5 the right way and it would happily identify a software vulnerability and, in at least one case, write the code to exploit it. That’s the kind of thing that gets you a government directive instead of a bug bounty.&lt;/p&gt;

&lt;p&gt;The fix that ended the 19-day standoff is almost anticlimactic. Anthropic &lt;a href="https://www.anthropic.com/news/redeploying-fable-5" rel="noopener noreferrer"&gt;redeployed Fable 5&lt;/a&gt; with a single new safety classifier trained to catch that one jailbreak technique. When a request trips it (reportedly &lt;a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/anthropic-restores-claude-fable-5-as-us-lifts-export-controls" rel="noopener noreferrer"&gt;99%+ of the time&lt;/a&gt;), the request doesn’t just get refused. It gets quietly rerouted to Opus 4.8 for a second opinion. Commerce’s shiny new Center for AI Standards and Innovation reviewed the safeguard before pulling the controls.&lt;/p&gt;

&lt;p&gt;And Fable 5 immediately went right back to running the table. It’s #1 on Arena Overall (1509), and #1 in Coding (1563), Creative Writing (1499), Instruction Following (1520), and Hard Prompts (1533). It’s #2 in Math by a single Elo point. Anthropic holds nine of the top twelve coding slots. Whatever you think about a model getting court-ordered off the internet, the thing is genuinely, stupidly good.&lt;/p&gt;

&lt;p&gt;Here’s the catch nobody’s putting on the marketing slides: that reroute-to-Opus classifier is &lt;a href="https://www.techtimes.com/articles/319665/20260703/claude-fable-5-back-safety-classifiers-now-reroute-security-agent-loops.htm" rel="noopener noreferrer"&gt;catching legitimate work&lt;/a&gt;. If you run security tooling, the honest kind, pentests you’re paid to run, vuln triage on your own codebase, your agent loop can hit that filter mid-run and get silently handed off to a different, weaker model with no clean signal that it happened. You asked Fable 5 to do a job and Opus 4.8 quietly answered. That’s a fun debugging session waiting to happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sonnet 5: Cheaper Per Token, More Expensive Per Answer
&lt;/h2&gt;

&lt;p&gt;Now the part where I almost got fooled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/news/claude-sonnet-5" rel="noopener noreferrer"&gt;Claude Sonnet 5 dropped June 30&lt;/a&gt;. Anthropic is calling it the most agentic Sonnet yet, and for once the marketing isn’t lying. It plans, it drives browsers and terminals, it runs autonomously at a level that a few months ago needed an Opus-sized model and an Opus-sized bill. It’s the default now for Free and Pro plans, it’s got a 1M-token context window, and on Artificial Analysis’s Intelligence Index it scores &lt;strong&gt;53, good for #5 overall&lt;/strong&gt; , sitting right on top of GPT-5.5 with high reasoning and just ahead of Opus 4.8 on agentic knowledge work.&lt;/p&gt;

&lt;p&gt;The pricing looks like a gift: &lt;strong&gt;$2/$10 per million tokens&lt;/strong&gt; as an intro rate through August 31, moving to $3/$15 after. Opus 4.8 is $5/$25. So Sonnet 5 is half the price of Opus, nearly as smart, and more agentic. Switch everything, right?&lt;/p&gt;

&lt;p&gt;No. This is the whole point of the post. Look at cost &lt;em&gt;per task&lt;/em&gt; instead of cost &lt;em&gt;per token&lt;/em&gt;, and the deal evaporates.&lt;/p&gt;

&lt;p&gt;Artificial Analysis actually &lt;a href="https://artificialanalysis.ai/articles/claude-sonnet-5-agentic-cost" rel="noopener noreferrer"&gt;ran the numbers&lt;/a&gt;, and an average task on their Intelligence Index costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~$1.20&lt;/strong&gt; on Sonnet 4.6 (the old one)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~$1.97&lt;/strong&gt; on Opus 4.8 (the “expensive” one)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~$2.29&lt;/strong&gt; on Sonnet 5 (the “cheap” one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read that again. The new Sonnet costs about &lt;strong&gt;15% more per completed task than Opus 4.8&lt;/strong&gt; , and roughly &lt;strong&gt;double the old Sonnet&lt;/strong&gt;. The per-token sticker went &lt;em&gt;down&lt;/em&gt; and the actual bill went &lt;em&gt;up&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;How? Two things stack. First, a new tokenizer that’s less efficient on a lot of content, so the same input can map to &lt;a href="https://the-decoder.com/claude-sonnet-5-continues-anthropics-pattern-of-hiding-price-increases-behind-unchanged-token-rates/" rel="noopener noreferrer"&gt;1.0 to 1.35x more tokens&lt;/a&gt; than it did under the old scheme, depending on what you feed it. Second, the more agentic behavior itself. With max effort it burned about 40% more output tokens per task than Sonnet 4.6 and took roughly &lt;strong&gt;3x the agentic turns&lt;/strong&gt; on knowledge-work evals. A more agentic model does more work per task by design: longer chains, more tool calls, more self-correction, more retries when a step fails. All of it billed.&lt;/p&gt;

&lt;p&gt;This is Anthropic’s move now, and the-decoder called it out by name: raise the real cost while the per-token rate on the pricing page stays flat or drops. It’s not a scam. Sonnet 5 is a legitimately strong model and for a lot of agentic work it’s the right call. But if you switched based on the headline number without measuring your own workload, you’d be paying more and thinking you saved. The pricing page lies. Measure cost per finished task on &lt;em&gt;your&lt;/em&gt; representative work, or don’t complain when the invoice shows up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who’s Actually Shipping (And Who’s Stuck at the DMV)
&lt;/h2&gt;

&lt;p&gt;Step back and the shape of the week is Anthropic having an absurdly good run while everybody else’s flagship is vaporware.&lt;/p&gt;

&lt;p&gt;OpenAI’s GPT-5.6 (the Sol/Terra/Luna trio) &lt;a href="https://openai.com/index/previewing-gpt-5-6-sol/" rel="noopener noreferrer"&gt;previewed June 26&lt;/a&gt;, and then went nowhere you can reach. At the U.S. government’s request, OpenAI shipped it to about &lt;a href="https://techcrunch.com/2026/06/26/openai-limits-gpt-5-6-rollout-after-government-request-says-restrictions-shouldnt-be-the-norm/" rel="noopener noreferrer"&gt;20 vetted partner organizations&lt;/a&gt; first, gated behind a safety review, with general availability “coming weeks” (analysts are betting July 10–17). OpenAI publicly grumbled that this kind of gating “shouldn’t become the norm.” It’s a launch you literally cannot use.&lt;/p&gt;

&lt;p&gt;Google’s Gemini 3.5 Pro announced at I/O on May 19 with a June target, and has now &lt;a href="https://finance.biggo.com/news/6f0c6bb2-795f-4c57-9d09-6db691d7638a" rel="noopener noreferrer"&gt;slipped again to mid-July&lt;/a&gt;. Some reports say a full architecture rebuild after early testers flagged token-efficiency and coding problems. Still preview-only.&lt;/p&gt;

&lt;p&gt;And while Google’s flagship stalls, &lt;a href="https://techcrunch.com/2026/06/24/ai-researchers-continue-to-leave-google-for-its-rivals/" rel="noopener noreferrer"&gt;its people are leaving&lt;/a&gt;. In one week Anthropic picked off four-plus senior Gemini researchers, including Nobel laureate John Jumper of AlphaFold fame, plus a couple more on pretraining and coding tools. Noam Shazeer, one of the “Attention Is All You Need” authors, went to OpenAI. Alphabet shed something like $270 billion in market cap over the stretch, and Anthropic is now reportedly the most valuable private AI company on earth. The people who built Gemini are literally going to go build the next Claude.&lt;/p&gt;

&lt;p&gt;So the scoreboard for the week: one lab restored the world’s best model, shipped a new one, and hired the competition’s brain trust. The other two are showing you a locked demo and a “give us until next month.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheapskate Table (The Part That Didn’t Flinch)
&lt;/h2&gt;

&lt;p&gt;Here’s the thing about all this frontier drama. If you’re actually shipping software, none of it changed what you should be running day to day. The value layer barely moved. The Cheapskate method is the same as it’s been: take the leader’s Arena rating in each category, look at everything within about 50 rating points of it, and pick the cheapest one, because the top of every Arena category is compressed into a tiny band. You are almost never paying for a meaningfully smarter model at the top. You’re paying for a rounding error.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Leader&lt;/th&gt;
&lt;th&gt;$/1M out&lt;/th&gt;
&lt;th&gt;Cheapskate pick&lt;/th&gt;
&lt;th&gt;$/1M out&lt;/th&gt;
&lt;th&gt;Δ rating&lt;/th&gt;
&lt;th&gt;You save&lt;/th&gt;
&lt;th&gt;On AA value frontier?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Fable 5 (1509)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash (1479)&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−30&lt;/td&gt;
&lt;td&gt;~5.6x&lt;/td&gt;
&lt;td&gt;near it (speed leader)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Fable 5 (1563)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;GLM-5.1/5.2 (1524)&lt;/td&gt;
&lt;td&gt;~$3&lt;/td&gt;
&lt;td&gt;−39&lt;/td&gt;
&lt;td&gt;~16x&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative&lt;/td&gt;
&lt;td&gt;Fable 5 (1499)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash (1472)&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−27&lt;/td&gt;
&lt;td&gt;~5.6x&lt;/td&gt;
&lt;td&gt;near it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;Opus 4.6-thinking (1518)&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;Qwen3.7 Max (1492)&lt;/td&gt;
&lt;td&gt;$3.75&lt;/td&gt;
&lt;td&gt;−26&lt;/td&gt;
&lt;td&gt;~6.7x&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Following&lt;/td&gt;
&lt;td&gt;Fable 5 (1520)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro (1481)&lt;/td&gt;
&lt;td&gt;~$12&lt;/td&gt;
&lt;td&gt;−39&lt;/td&gt;
&lt;td&gt;~4.2x&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Prompts&lt;/td&gt;
&lt;td&gt;Fable 5 (1533)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro (1507)&lt;/td&gt;
&lt;td&gt;~$12&lt;/td&gt;
&lt;td&gt;−26&lt;/td&gt;
&lt;td&gt;~4.2x&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The headline of that table is GLM-5.2, Zhipu’s roughly 753B open-weight MoE, and it’s the model I’d actually point you at this week. It’s MIT-licensed, runs about $3 per million output tokens on open hosts, tops the &lt;a href="https://www.morphllm.com/swe-bench-pro" rel="noopener noreferrer"&gt;open-weight SWE-bench Pro&lt;/a&gt; leaderboard at 62.1%, and it sits &lt;a href="https://artificialanalysis.ai/articles/glm-5-2-is-the-new-leading-open-weights-model-on-the-artificial-analysis-intelligence-index" rel="noopener noreferrer"&gt;on Artificial Analysis’s Intelligence-vs-Cost Pareto frontier&lt;/a&gt;. Cheaper than Gemini 3.5 Flash while scoring higher on capability. When two totally different methods (my dumb “cheapest in the band” heuristic and AA’s Pareto math) point at the same model, that’s about as strong a signal as this game gives you.&lt;/p&gt;

&lt;p&gt;One more nuance that rhymes with the Sonnet 5 lesson. Gemini 3.5 Flash wins Overall and Creative on &lt;em&gt;per-token&lt;/em&gt; price, but per &lt;em&gt;task&lt;/em&gt; it’s actually pricier than Gemini 3.1 Pro, because Flash burns a lot of reasoning tokens. AA has Flash costing about 75% more per task than 3.1 Pro despite the lower sticker. Same trap, different model. If your workloads are long and multi-step, price them on your own traffic before you trust the cheap-looking one.&lt;/p&gt;

&lt;p&gt;And the throughline that’s held for a couple months now: US models have &lt;a href="https://officechai.com/ai/share-of-us-models-being-used-on-openrouter-has-collapsed-from-70-to-30-over-the-past-year/" rel="noopener noreferrer"&gt;fallen from about 70% to about 30%&lt;/a&gt; of OpenRouter token volume in a year, with Chinese labs around 46% and six of the top ten by volume. When your #1 model can be switched off by a government letter, the open-weights model you can run yourself starts looking less like a budget compromise and more like insurance. Own your weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Horror Stories: The Meter Is Running
&lt;/h2&gt;

&lt;p&gt;Two this week, and they’re the same story wearing different hats.&lt;/p&gt;

&lt;p&gt;Agentic bills are blowing past budgets. TechTimes reported July 4 that Anthropic &lt;a href="https://www.techtimes.com/articles/319687/20260704/claude-enterprise-spend-controls-arrive-agentic-ai-bills-blow-past-budgets.htm" rel="noopener noreferrer"&gt;rushed enterprise spend controls out the door&lt;/a&gt; because customers’ agentic bills are overshooting what they planned. Seventy-eight percent of IT leaders reported unexpected charges from consumption-based AI pricing in 2026. Now drop a new, more-agentic default model into that fire. Sonnet 5 does more per task on purpose, and more-per-task means more-per-invoice. If you flip your team to it and don’t watch the meter, you find out at the end of the month.&lt;/p&gt;

&lt;p&gt;Fable 5’s safety net is snagging real work. As covered up top, the reroute-to-Opus classifier is catching legitimate security workflows and silently swapping models on you mid-agent-loop. It’s a smaller-dollar horror than a runaway bill, but it’s the sneakier one, because nothing errors out. You just get a subtly worse answer from a model you didn’t ask for, and you’re left wondering why your pentest agent got dumber overnight.&lt;/p&gt;

&lt;p&gt;Both are the same lesson the whole post keeps hammering. The number you look at is not the number you pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Coming
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GPT-5.6 Sol/Terra/Luna hits general availability “coming weeks,” with analysts guessing July 10–17. OpenAI is promising Cerebras hosting at up to 750 tokens/sec, which, if it’s real, is a genuinely different speed tier for agent loops.&lt;/li&gt;
&lt;li&gt;Gemini 3.5 Pro slipped its GA to roughly July 17 after an apparent architecture rebuild. Believe it when you can actually call the API.&lt;/li&gt;
&lt;li&gt;DeepSeek V4 is rumored for a full public launch mid-July (V4 Pro at 1.6T total / 49B active, V4 Flash at 284B / 13B, 1M context). DeepSeek is already the single largest token author on OpenRouter, so a real GA matters.&lt;/li&gt;
&lt;li&gt;Portugal’s Amália shipped July 1, the first open LLM in European Portuguese, Apache 2.0 on Hugging Face, built for about €7 million in public money. The sovereign-model trend is quietly real, and “we built our own for the price of a mansion” is a hell of a flex.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;The frontier rebooted this week and it’s genuinely better than it was in June — Fable 5 is back, Sonnet 5 is a real step up in agentic muscle, and the lab that shipped both is running away with the talent war. If you only read headlines, this was a triumphant week for AI.&lt;/p&gt;

&lt;p&gt;But the actual skill in 2026 isn’t picking the model at the top of the leaderboard. It’s reading the meter. Sonnet 5 taught it, Gemini 3.5 Flash taught it again, and the enterprise-spend-controls fire drill taught it to a lot of finance teams the hard way. Cost per token is marketing. Cost per finished task is reality. And they’re diverging on purpose.&lt;/p&gt;

&lt;p&gt;So run GLM-5.2 for coding until something dislodges it. Price your cheap-looking models on your own traffic before you trust them. Keep an open-weights option in your back pocket for the week your favorite model gets a letter from Washington. And when a new model shows up half the price of the old one, smile, nod, and go check the invoice.&lt;/p&gt;

&lt;p&gt;The leaderboard’s back. The meter never stopped.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>openrouter</category>
      <category>modelroundup</category>
      <category>largelanguagemodels</category>
    </item>
    <item>
      <title>The Living Plan Got Fat: Compacting a Doc That Won't Stop Growing</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 01 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/the-living-plan-got-fat-compacting-a-doc-that-wont-stop-growing-3nk0</link>
      <guid>https://dev.to/eristoddle/the-living-plan-got-fat-compacting-a-doc-that-wont-stop-growing-3nk0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh4eczp1dke26p6uur7ki.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh4eczp1dke26p6uur7ki.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a post a few weeks ago, I took a victory lap. I’d finally found a way to work with AI coding agents that didn’t &lt;a href="https://dev.to/eristoddle/i-burned-out-on-vibe-coding-came-back-and-rewrote-everything-l6i"&gt;collapse into chaos&lt;/a&gt; or drown me in specs. It was a single living &lt;code&gt;PLAN.md&lt;/code&gt; that the agent re-reads every session, where every decision gets funneled in and logged. I ended that post on a line I was proud of: the doc is the deliverable, the code is the byproduct, and over 30 days my PLAN.md got touched 16 times, more than any actual code file in the repo.&lt;/p&gt;

&lt;p&gt;That line was true. It was also the setup for the next problem, which I did see coming. I have just been only talking to Opus lately and having Sonnet minions do all the grunt work, which was really working out. I could work for a couple of hours or more and context barely got over 10% and I am only on the Pro plan. I just thought I had a little more runway.&lt;/p&gt;

&lt;p&gt;The exact property that makes a living plan work is what eventually turns it into a chore. A doc you re-read every single session is great at 3,000 words. At 28,000 words it’s a lot to load before any thinking starts. This post is about the maintenance layer, and the skill I built so I’d never have to think about it manually again.&lt;/p&gt;

&lt;p&gt;If you didn’t read &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;the first post&lt;/a&gt;, the one-line version: instead of vibe coding or a pile of spec files, I keep one PLAN.md that records decisions, open questions, and a session log, and the agent treats it as the source of truth.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Good Problem&lt;/li&gt;
&lt;li&gt;Progressive Disclosure, Which I Was Already Doing Everywhere Else&lt;/li&gt;
&lt;li&gt;What “Cooled” Actually Means&lt;/li&gt;
&lt;li&gt;The Payoff: 28,357 Words Down to 8,332&lt;/li&gt;
&lt;li&gt;It’s a Process&lt;/li&gt;
&lt;li&gt;Why It Became a Skill: The Other Project Running This&lt;/li&gt;
&lt;li&gt;The Skill Is a Router, Not a Script&lt;/li&gt;
&lt;li&gt;The Honest Scope Note&lt;/li&gt;
&lt;li&gt;What’s Next&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Good Problem
&lt;/h2&gt;

&lt;p&gt;The living plan worked so well that I kept feeding it. Every architectural call went in as a numbered decision, sessions were appended a log entries, and half-formed “we should maybe…” landed in a parking lot instead of me forgetting it.&lt;/p&gt;

&lt;p&gt;Then one morning I ran &lt;code&gt;wc -w&lt;/code&gt; on the PLAN.md for content-tools-v2, my content pipeline project, and it told me &lt;strong&gt;28,357 words&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Twenty-eight thousand words. That’s a novella. Which means every session I was spending context budget and my own attention re-skimming decisions D1 through D18, none of which had changed in over a month. D5 got decided in week two and never reopened. Why was I carrying its full body into every session four months later?&lt;/p&gt;

&lt;p&gt;The decisions I’m actively wrestling with this week are maybe 20% of the document. The other 80% is settled history. Important history but it doesn’t need to be in my face every session. It needs to be &lt;em&gt;findable&lt;/em&gt;, not &lt;em&gt;present&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive Disclosure, Which I Was Already Doing Everywhere Else
&lt;/h2&gt;

&lt;p&gt;It’s how I work with &lt;code&gt;CLAUDE.md&lt;/code&gt; in my projects. It doesn’t inline the architecture and the quickstart and the plan. It &lt;em&gt;points&lt;/em&gt; at them: “see QUICKSTART.md, see PLAN.md.” The conductor file stays small; the heavy docs are one hop away.&lt;/p&gt;

&lt;p&gt;I was using progressive disclosure everywhere except the one document that needed it most. Keep the hot layer (live decisions, open questions, recent sessions) right there in PLAN.md. Move the cold layer out to a &lt;code&gt;docs/&lt;/code&gt; tree, and leave a one-line pointer behind.&lt;/p&gt;

&lt;p&gt;A collapsed decision still shows its heading. You still see that it exists and it links straight to the full body. Nothing is hidden.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsm7v5300kx3vf5frtuh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsm7v5300kx3vf5frtuh.jpg" alt="Progressive Disclosure, Which I Was Already Doing Everywhere Else" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick naming note, because I’m about to use one word a lot. I call this &lt;strong&gt;compacting&lt;/strong&gt; the plan. When I first built the skill I named the operation “rebalancing”, and that name is now baked in. It’s the trigger word, it’s the name of the log file. So “rebalance” is going to keep showing up in this post whether I like it or not. But it’s the wrong word. I’m not balancing two things against each other toward some equilibrium. I’m compacting the hot doc and paging the cold half out to linked files on disk. So: compacting. (The skill keeps its dumb name until post 3, where it finally earns a better one.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What “Cooled” Actually Means
&lt;/h2&gt;

&lt;p&gt;This is the part that took real thought, because “just move the old stuff” is not a rule a tool can follow. Not everything cools the same way, and the heuristic has to be specific enough that I can hand it to an agent and trust the result. Here’s what I landed on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session logs cool by recency.&lt;/strong&gt; Keep the last few inline (I keep three), archive everything older into &lt;code&gt;docs/sessions/&lt;/code&gt;. This is almost always the heaviest cold mass in the whole document and it’s the safest thing to move, because a six-week-old session log is pure archive. Nobody’s making decisions off it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decisions stay whole while they’re hot, and collapse to a heading-plus-link when they cool.&lt;/strong&gt; A decision is “hot” if it’s recent, still being referenced, or actively shaping current work. It cools when it’s settled, built, and nothing live points at it anymore. The exception: anything marked &lt;code&gt;🔒 foundational&lt;/code&gt; stays whole no matter how old it is, because the whole architecture leans on it. In content-tools that’s D23, the composable-pipeline decision the entire engine is built on. That one’s never getting collapsed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions and parking-lot items are born as pointers.&lt;/strong&gt; This was the cleanest insight. A parking-lot item doesn’t need to be classified later as hot or cold. The heading is the item. Only the question itself lives in PLAN.md. The discussion, if there is any, lives in a file in &lt;code&gt;docs/&lt;/code&gt;. There’s no re-classification step because it started in the right shape.&lt;/p&gt;

&lt;p&gt;The before-and-after looks like this. A hot decision sits in PLAN.md with its full body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### D19 — Slot-3 stage reshape: deduplicator-as-gate, moved to slot 2,
contingent on empirical templating

[...a few hundred words of reasoning, tradeoffs, and what it depends on...]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A cooled one collapses to a single line that still tells you what it is and where to read it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### D5 — Per-workspace knowledge base: curated wiki built from a raw dump → [full text](docs/decisions/D05.md)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You lose nothing. You can still see D5 exists and you’re one click from the full doc. You just stopped paying for it in every session.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Payoff: 28,357 Words Down to 8,332
&lt;/h2&gt;

&lt;p&gt;I ran the first real compaction on content-tools-v2 on June 19th. The PLAN.md went from &lt;strong&gt;28,357 words to 8,332&lt;/strong&gt;. Roughly a 70% cut, and not a single byte of history was deleted. It was relocated.&lt;/p&gt;

&lt;p&gt;Here’s the &lt;code&gt;docs/&lt;/code&gt; tree it produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
├── decisions/
│ ├── D01.md
│ ├── D02.md
│ ├── ...
│ └── D18.md
├── sessions/
│ └── sessions-01-18.md
├── questions/
├── parking-lot/
├── futures.md
└── reference-prior-artifacts.md

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eighteen settled decisions filed one-per-file. Sessions 1 through 18 collapsed into a single archive. Resolved questions, speculative futures, and the pile of “prior planning artifacts” reference material all moved out.&lt;/p&gt;

&lt;p&gt;What’s left in PLAN.md is the hot layer only: the live decisions D19 through D24 with their full bodies, the open questions, and the active parking lot. Everything that’s settled is exactly one link away.&lt;/p&gt;

&lt;p&gt;If the doc is the deliverable (which was the whole thesis of post 1), then this isn’t busywork. &lt;strong&gt;This is just refactoring the deliverable.&lt;/strong&gt; You don’t delete the git history when you clean up a codebase. You file it.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s a Process
&lt;/h2&gt;

&lt;p&gt;Now, I could have stopped there. One afternoon and done. But I didn’t want to redo by hand every month because the thing keeps growing. The plan is a living document. It got fat once; it’ll get fat again. A one-off fix for a recurring problem is just a chore you’ve scheduled for future-you.&lt;/p&gt;

&lt;p&gt;So I built it as a repeatable, checked-off process with two triggers.&lt;/p&gt;

&lt;p&gt;The first trigger is a phrase. I say “rebalance” (the skill’s word, not mine) and it runs. Simple.&lt;/p&gt;

&lt;p&gt;The second is a size nudge. When the skill gets invoked, it checks the word count, and if PLAN.md is over a threshold (default &lt;strong&gt;15,000 words&lt;/strong&gt; ) it surfaces it: “PLAN.md is 27.6k words, ~12k over threshold, want to rebalance?” The key detail here, and the one I had to learn the hard way, is that the threshold is measured by &lt;code&gt;wc -w PLAN.md&lt;/code&gt;, &lt;strong&gt;not&lt;/strong&gt; by live context percentage. The agent cannot reliably read its own context usage.&lt;/p&gt;

&lt;p&gt;And then there’s a ledger. Every run writes to &lt;code&gt;docs/rebalance-log.md&lt;/code&gt; (the file’s named for the old word too), recording each hot/cold call and the reason behind it. Here’s the actual entry from that first run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffb6okgtbvulllyrp05dg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffb6okgtbvulllyrp05dg.jpg" alt="2026-06-19 — rebalance (PLAN.md 28357 → 8332 words)" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### 2026-06-19 — rebalance (PLAN.md 28357 → 8332 words)
First run; link graph not yet built, so all calls were manual read-through.
- sessions 1–18 | archived → docs/sessions/sessions-01-18.md | recency, kept last 3 (19–21)
- D1–D18 (bodies) | cooled → docs/decisions/D01–D18.md | settled/built; nothing active references them
- D19–D22 | kept | recent, conservative call (keep-recent over cooling all of D1–D22)
- D23 | kept | 🔒 foundational (novel pipeline / D23 step-3 depends on it)
- D24 | kept | active (linking work, sessions 18–21)
- Q6, Q7 | archived → docs/questions/ | resolved (Q7→D20, Q6 closed)
- Q8 | kept | open (D24 is its first capability)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why bother logging the reasons? Because the plan is that once a reason recurs often enough, it gets &lt;em&gt;promoted&lt;/em&gt; to an automatic rule. The first few runs are pure per-run judgment. But “sessions older than the last three always archive” is a pattern that shows up every single time, so eventually that stops being a judgment call and becomes a rule the skill just applies. It’s the &lt;a href="https://dev.to/eristoddle/the-agent-skills-guide-i-wish-id-had-17i1"&gt;skill-hardener&lt;/a&gt; pattern, except pointed at my own process: per-run judgment now, automation later, and the ledger is what bridges the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Became a Skill: The Other Project Running This
&lt;/h2&gt;

&lt;p&gt;The thing that pushed this from “a tidy script for one project” to “a reusable skill” was realizing I had the exact same disease on another repo. And that it was a slightly different flavor of it.&lt;/p&gt;

&lt;p&gt;My other live project is a knowledge-graph site I mentioned in the update section of post 1. It had a living PLAN.md too, around 14,700 words, but it had drifted off the rails of the workflow itself: a plan, yes, but no implementer agent and no &lt;code&gt;docs/&lt;/code&gt; tree to cool anything into. content-tools just needed a diet. This project needed the diet &lt;em&gt;and&lt;/em&gt; a couple of missing organs put back first.&lt;/p&gt;

&lt;p&gt;So the deliverable couldn’t be a one-off manual reorg of one repo. It had to be a &lt;strong&gt;reusable convention&lt;/strong&gt; I could point at any project, including one that wasn’t even fully set up yet. That’s the &lt;code&gt;plan-rebalance&lt;/code&gt; skill. It lives in my skillshare directory and &lt;a href="https://dev.to/eristoddle/microsoft-apm-managing-ai-context-like-a-dependency-problem-5361"&gt;syncs out to all my tools&lt;/a&gt;, so it’s available wherever I’m working. I ran it across both projects the same day, June 19th. On content-tools it did a straight rebalance. On the other project it did an &lt;strong&gt;adopt-plus-rebalance&lt;/strong&gt; in one pass: created the &lt;code&gt;implementer&lt;/code&gt; agent, scaffolded the &lt;code&gt;docs/&lt;/code&gt; tree, reconciled the conductor file, then trimmed the plan from 14,700 down to about 11,000 words.&lt;/p&gt;

&lt;p&gt;But here’s the catch that made portability non-optional: my two projects don’t even agree on what their own files are called.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;content-tools-v2&lt;/th&gt;
&lt;th&gt;nsf-scifi-wiki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TASK.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TASKS.md&lt;/code&gt; (plural)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conductor file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrinkle&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; is a &lt;em&gt;symlink&lt;/em&gt; to &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the skill had assumed &lt;code&gt;TASK.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt;, it would have written through the symlink instead of the real file and missed the task handoff entirely. So the skill &lt;strong&gt;discovers names, it never assumes them.&lt;/strong&gt; It globs for the planning doc, tolerates singular-or-plural task files, and resolves the conductor symlink with &lt;code&gt;readlink&lt;/code&gt; so it edits &lt;code&gt;AGENTS.md&lt;/code&gt; directly instead of writing through the link. It even records what it found in that project’s own rebalance log, so the next run doesn’t have to re-derive any of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;## Config&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Planning doc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAN.md&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Task handoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TASKS.md (plural — project convention)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Conductor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AGENTS.md (CLAUDE.md is a symlink → AGENTS.md; edit the real target)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Implementer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementer (.claude/agents/implementer.md, model&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Word threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15000&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Skill Is a Router, Not a Script
&lt;/h2&gt;

&lt;p&gt;The other design constraint came straight out of post 1’s philosophy: the planning agent has to stay light. Its job is to plan and orchestrate, nothing else. If I stuff a thousand words of compaction logic into PLAN.md or CLAUDE.md, I’ve just re-bloated the exact files I’m trying to keep lean. That’d be self-defeating.&lt;/p&gt;

&lt;p&gt;So the skill is a router. The heavy process logic is lazy-loaded from the skill’s own &lt;code&gt;workflows/&lt;/code&gt; and &lt;code&gt;references/&lt;/code&gt; files. The project only ever gets a one-line pointer that says “invoke this skill,” never a copy of the process. The skill’s own description sums up its job: it &lt;em&gt;“owns the planning-doc workflow.”&lt;/em&gt; The project doesn’t have to know how compaction works. It just has to know who to call.&lt;/p&gt;

&lt;p&gt;When you invoke it, the first thing it does is detect what state the project is in and route accordingly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Greenfield&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no planning doc at all&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;scaffold&lt;/strong&gt; the whole workflow: PLAN/TASK/implementer agent/docs tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Partial / adopt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;a plan exists but pieces are missing&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;backfill&lt;/strong&gt; only what’s missing, idempotently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;full system, heavy doc&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;rebalance&lt;/strong&gt; (the compaction pass)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9sxcv1x19oe87ubg80w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9sxcv1x19oe87ubg80w.jpg" alt="The Skill Is a Router, Not a Script" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;content-tools was the Mature case. It had the whole post-1 system already and just needed the diet. The other project was the Partial case: a plan, but no implementer agent and no docs tree, so it needed a backfill and a rebalance, which is exactly what it got, in a single run. A project can need more than one of these, and the skill reports what it found and lets me pick the actions; it doesn’t silently chain them.&lt;/p&gt;

&lt;p&gt;And every mutating action is propose-then-confirm. It shows me a manifest of what’s moving where before it touches anything. It never clobbers an existing file. I diffed the moved decision files against &lt;code&gt;HEAD&lt;/code&gt; to confirm nothing got “helpfully” reworded on the way out. When a tool is rearranging the document that is my deliverable, I want a receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Scope Note
&lt;/h2&gt;

&lt;p&gt;Every post in this series gets one of these, so here’s this one’s: &lt;strong&gt;none of this matters until the living plan has already won.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a good-problem-to-have tax. You only hit the 28,000-word wall because the plan worked well enough that you kept feeding it for weeks. If you build the compactor before you have a plan worth compacting, congratulations, you’ve just reinvented spec-kit ceremony in a different hat, which is the exact thing the entire first post was an argument against. Don’t do that. Get the plan working first. Let it get fat. Then put it on a diet.&lt;/p&gt;

&lt;p&gt;There’s no clever algorithm here. It’s “move the old stuff to a folder and leave a link.” But the alternative is the plan slowly turning into the document you dread opening, and the day you start avoiding your own source of truth is the day the whole method quietly dies. The boring maintenance layer is what keeps the interesting part alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;So the plan stays lean now. The hot layer is hot, the cold layer is filed, and the compactor keeps it that way on a trigger instead of on my willpower.&lt;/p&gt;

&lt;p&gt;Except (and this is where post 3 picks up) keeping the plan exposed a completely different bottleneck on the build side. My setup hands one task at a time to a background Sonnet agent and and then I try to plan in the gap. But the gap was not big enough. When your plan is finally clean enough to generate work faster than your builder consumes it, the new question becomes: how do you keep the builder always busy?&lt;/p&gt;

&lt;p&gt;That’s the next experiment: the batch throughput problem, and this same skill growing to own that part of the workflow too. (And, if I’m lucky, finally getting a name I can actually remember and makes sense.)&lt;/p&gt;

</description>
      <category>aicodingagents</category>
      <category>llmcontextwindow</category>
      <category>promptmanagement</category>
      <category>livingplan</category>
    </item>
    <item>
      <title>Model Buzz Roundup — Week of June 24, 2026</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/model-buzz-roundup-week-of-june-24-2026-g07</link>
      <guid>https://dev.to/eristoddle/model-buzz-roundup-week-of-june-24-2026-g07</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqj7r5j8u24duh053jdh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqj7r5j8u24duh053jdh.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week I called the West’s next two flagship models vaporware. This week one of them shipped, straight into government lockup with the others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/eristoddle/model-buzz-roundup-week-of-june-17-2026-fah-temp-slug-5125148"&gt;Last week&lt;/a&gt; the story was a single model getting unplugged: Claude Fable 5, the number one model on every leaderboard, switched off June 12 by a US export-control directive. I figured that was a one-off horror story, and that GPT-5.6 and Gemini 3.5 Pro, the two heirs everyone was waiting on, would show up and give us something we could actually use.&lt;/p&gt;

&lt;p&gt;Reader, they did not. This week GPT-5.6 &lt;em&gt;launched&lt;/em&gt; and it’s about as usable as Fable 5, for the exact same reason: Washington. Gemini 3.5 Pro slipped to July. And the one model that quietly went from “interesting” to “essential”? It’s the open-weights Chinese one the whole export-control apparatus is supposedly designed to stop. Except it can’t, because the weights are already a download and it just beat Claude on the cybersecurity benchmarks the bans were about. You know how that goes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Gate Spread to the Whole Frontier&lt;/li&gt;
&lt;li&gt;Export Controls Failed Their First Real Test This Week&lt;/li&gt;
&lt;li&gt;The Model Nobody Can Switch Off (Still GLM-5.2)&lt;/li&gt;
&lt;li&gt;Cheapskate Picks: Best You Can Actually Run&lt;/li&gt;
&lt;li&gt;Horror Stories from the Wild&lt;/li&gt;
&lt;li&gt;Where This Leaves You&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Gate Spread to the Whole Frontier
&lt;/h2&gt;

&lt;p&gt;Here’s the thing that turned this from “a weird week for Anthropic” into “a structural shift”: the export-control net is no longer catching one model. It’s catching every flagship a US lab can ship.&lt;/p&gt;

&lt;p&gt;Count them. Start with &lt;strong&gt;Anthropic’s Fable 5&lt;/strong&gt; , still dark, going on three weeks now. On June 26, Commerce Secretary Howard Lutnick sent a &lt;a href="https://cryptobriefing.com/anthropic-works-to-restore-access-to-claude-fable-5-mythos-5-after-us-directive/" rel="noopener noreferrer"&gt;follow-up letter&lt;/a&gt; that partially lifts the block on Mythos 5 (the heavier sibling), but only for a defined list of US entities, their foreign-national employees, Anthropic’s own foreign staff, and government partners. Fable 5, the model normal humans and API developers actually call, stays banned. The partial thaw is for the spy-cleared crowd, not for you.&lt;/p&gt;

&lt;p&gt;Then there’s the new one, &lt;strong&gt;OpenAI’s GPT-5.6&lt;/strong&gt;. It got &lt;a href="https://openai.com/index/previewing-gpt-5-6-sol/" rel="noopener noreferrer"&gt;previewed June 26&lt;/a&gt; as a three-model lineup: Sol (the flagship), Terra (balanced), and Luna (fast and cheap). New “max” reasoning effort, a new “ultra” mode that spins up subagents, state-of-the-art on Terminal-Bench 2.1, big gains on biology evals. Sounds great. You can’t use it. OpenAI limited the launch to roughly &lt;a href="https://venturebeat.com/technology/openai-unveils-gpt-5-6-sol-terra-and-luna-models-but-only-accessible-to-limited-preview-partners-for-now-per-us-gov" rel="noopener noreferrer"&gt;20 government-vetted partners&lt;/a&gt; at the request of the US government. This was the first public run of the AI-review process set up under the recent frontier-AI executive order, where a lab hands a “covered” model to the feds for up to 30 days before it can go to trusted partners. OpenAI itself &lt;a href="https://cybernews.com/ai-news/openai-new-models-us-gov-request/" rel="noopener noreferrer"&gt;warned&lt;/a&gt; that this kind of gating “should not become the long-term default” because it delays everyone downstream. General availability is “in the coming weeks.” Translation: maybe July.&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;Google’s Gemini 3.5 Pro&lt;/strong&gt;? Still not out. Announced at I/O on May 19 with a “give us until next month,” and next month is basically over. As of &lt;a href="https://www.techtimes.com/articles/319318/20260629/gemini-35-pro-cleared-july-launch-fable-5-nears-return-gpt-56-stays-locked.htm" rel="noopener noreferrer"&gt;June 29 reporting&lt;/a&gt; it’s stuck in limited Vertex preview and the public launch officially slid to July. Two-million-token context, Deep Think reasoning, all very nice, all behind an enterprise gate.&lt;/p&gt;

&lt;p&gt;So tally it up: of the three newest, best models from the three biggest US labs, one is suspended, one is government-rationed to 20 partners, and one is a preview that keeps sliding. Every leaderboard “winner” this week comes with the same asterisk it had last week, &lt;em&gt;of the ones you can actually call&lt;/em&gt;, except now the asterisk applies to the challengers too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export Controls Failed Their First Real Test This Week
&lt;/h2&gt;

&lt;p&gt;Now for the part that’s genuinely funny, in the bleak way.&lt;/p&gt;

&lt;p&gt;The whole justification for switching off Fable and Mythos was cyber capability, the fear that a jailbreak could turn them into offensive cybersecurity tools. Fine. Defensible premise. Here’s the problem: the day after Anthropic pulled its models, Z.ai shipped &lt;strong&gt;GLM-5.2&lt;/strong&gt; with open MIT-licensed weights, and this week a security firm sat down and measured it.&lt;/p&gt;

&lt;p&gt;Semgrep’s writeup is titled, and I am not making this up, &lt;a href="https://semgrep.dev/blog/2026/we-have-mythos-at-home-glm-52-beats-claude-in-our-cyber-benchmarks/" rel="noopener noreferrer"&gt;&lt;em&gt;“We have Mythos at Home: GLM 5.2 beats Claude in our Cyber Benchmarks.”&lt;/em&gt;&lt;/a&gt; TechTimes ran with &lt;a href="https://www.techtimes.com/articles/319234/20260628/ai-export-controls-fail-their-first-real-test-glm-52-cybersecurity-benchmarks-expose-gap.htm" rel="noopener noreferrer"&gt;&lt;em&gt;“AI Export Controls Fail Their First Real Test.”&lt;/em&gt;&lt;/a&gt; The exact class of capability the directive was meant to contain is now sitting on Hugging Face under an MIT license, FP8 and GGUF quants included, free to download and self-host on hardware nobody can subpoena.&lt;/p&gt;

&lt;p&gt;You cannot export-control a torrent. The directive successfully inconvenienced every paying, legitimate user of two American models, while the capability it was worried about walked out the front door in an open-weights release from a lab outside US jurisdiction. That’s not a security win. That’s security theater with a body count of exactly zero bad actors and a whole lot of annoyed developers.&lt;/p&gt;

&lt;p&gt;I’m not saying the underlying worry is fake. Frontier cyber capability is a real thing to think hard about. I’m saying that “ban the American version” does precisely nothing when an equivalent open-weights model ships from Shenzhen a day later, and pretending otherwise is how you get policy that hurts the people following the rules and helps no one else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model Nobody Can Switch Off (Still GLM-5.2)
&lt;/h2&gt;

&lt;p&gt;Same hero as last week, and the case for it got stronger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GLM-5.2&lt;/strong&gt; from Z.ai is the highest-ranked open-weights model on &lt;a href="https://artificialanalysis.ai/leaderboards/models" rel="noopener noreferrer"&gt;Artificial Analysis’s Intelligence Index&lt;/a&gt;. It sits at number six overall (score 51) and parks on the value frontier. &lt;a href="https://venturebeat.com/technology/z-ais-open-weights-glm-5-2-beats-gpt-5-5-on-multiple-long-horizon-coding-benchmarks-for-1-6th-the-cost" rel="noopener noreferrer"&gt;VentureBeat&lt;/a&gt; clocked it beating GPT-5.5 on SWE-bench Pro (62.1% vs 58.6%) at roughly one-sixth the cost. MIT weights, a usable 1M-token context, and output pricing in the low single digits per million tokens depending on which provider you route through. The weights dropped for real the week of June 22, so the “trust but verify” caveat I put on it last week is now “verify it yourself, it’s right there.”&lt;/p&gt;

&lt;p&gt;And it’s not a fluke, it’s the whole shape of the market. On OpenRouter, DeepSeek is the single largest model author by volume at around 17.6% of all platform tokens, and Chinese-origin models are somewhere in the 46%+ range of everything flowing through the platform. Tencent’s Hy3 is still the tool-call king. DeepSeek V4 Flash ($0.28 per million out) is the cheap daily driver an enormous chunk of production traffic quietly runs on. The usage has been voting open-and-cheap for months; this week the &lt;em&gt;news&lt;/em&gt; finally made the argument out loud.&lt;/p&gt;

&lt;p&gt;Connect last week to this week and the throughline isn’t price, it’s control. Hosted frontier models can be revoked by directive, rationed to 20 partners, or stuck in preview indefinitely. The model in your downloads folder can’t be any of those things. The cheapskate argument and the geopolitics argument keep landing on the same advice: own your weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheapskate Picks: Best You Can Actually Run
&lt;/h2&gt;

&lt;p&gt;Same method as always. Take the Arena leader in each category, draw a 50-rating-point band below it, find the cheapest model in that band. Arena’s top is so compressed that paying 5–16x more usually buys you a sub-3% rating bump. The wrinkle, still: the leader in five of six categories is Fable 5, which is &lt;em&gt;suspended&lt;/em&gt;, so each row also names the cheapest thing you can actually call, anchored to that unusable leader’s rating. Output dollars per million, because output dominates real workloads. Arena snapshot is June 25.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Leader (status)&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Cheapskate pick&lt;/th&gt;
&lt;th&gt;$ out&lt;/th&gt;
&lt;th&gt;Δ rating&lt;/th&gt;
&lt;th&gt;Cheaper by&lt;/th&gt;
&lt;th&gt;AA value frontier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Fable 5 (SUSPENDED)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;GLM-5.1&lt;/td&gt;
&lt;td&gt;~$3&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;~16x&lt;/td&gt;
&lt;td&gt;yes (GLM-5.2 #6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding&lt;/td&gt;
&lt;td&gt;Fable 5 (SUSPENDED)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;GLM-5.1 / GLM-5.2&lt;/td&gt;
&lt;td&gt;~$3–4&lt;/td&gt;
&lt;td&gt;−39&lt;/td&gt;
&lt;td&gt;~13–16x&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;Opus 4.6-thinking (Fable tie SUSPENDED)&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−0 (tie)&lt;/td&gt;
&lt;td&gt;~3x&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative Writing&lt;/td&gt;
&lt;td&gt;Fable 5 (SUSPENDED)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;−34&lt;/td&gt;
&lt;td&gt;~6x&lt;/td&gt;
&lt;td&gt;nearby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Following&lt;/td&gt;
&lt;td&gt;Fable 5 (SUSPENDED)&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;td&gt;−37&lt;/td&gt;
&lt;td&gt;~4x&lt;/td&gt;
&lt;td&gt;nearby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Prompts&lt;/td&gt;
&lt;td&gt;Fable 5 (SUSPENDED) / Opus 4.6-thinking&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;td&gt;−25&lt;/td&gt;
&lt;td&gt;~2x&lt;/td&gt;
&lt;td&gt;nearby&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What the table is actually saying:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coding is still the slam dunk.&lt;/strong&gt; GLM-5.1 (Arena 1525) and GLM-5.2 both sit in the band at a few bucks output, both beat or match Claude Sonnet 4.6 (1527, $15) on price, and GLM-5.2 throws in the 1M context, the open weights, and that SWE-bench Pro number. Cheapskate methodology and AA’s value frontier agree. Highest-confidence pick of the week, again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Math got better for the cheapskate.&lt;/strong&gt; This is the fun one. With Fable 5 gone, Gemini 3.5 Flash now literally &lt;em&gt;ties for number one&lt;/em&gt; on the Math board at 1517, dead level with Opus 4.6-thinking and the suspended Fable 5. So the cheap model isn’t “the best you can settle for” in math anymore, it’s co-champion, at $9 against Opus’s $25. Want the absolute floor? Qwen3.7 Max (1492, $3.75) is cheaper still and only 25 points back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creative writing&lt;/strong&gt; stays a Gemini 3.5 Flash story at $9. In band, no regrets if words are the product. GLM is cheaper but stylistically thin for prose, so I’m not going to pretend it’s the move here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instruction Following&lt;/strong&gt; has no genuine steal. Nothing under $10 lives in that band. Gemini 3.1 Pro at $12 is the honest value floor and I’m flagging it as “you’re paying for quality” rather than inventing a bargain that isn’t there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard Prompts&lt;/strong&gt; is the category where the &lt;em&gt;usable&lt;/em&gt; leader is right there. Only Fable and Mythos got suspended, not the Opus line. Opus 4.6-thinking (1532, $25) leads among models you can actually call, and Gemini 3.1 Pro (1507, $12) gets you within range for half the money.&lt;/p&gt;

&lt;p&gt;Boring-but-correct summary, unchanged from last week because the market didn’t move: if you’re not doing something that truly needs the frontier, GLM-5.1/5.2 and Gemini 3.5 Flash cover most of your week for single digits per million tokens, and at least one of them runs on your own iron.&lt;/p&gt;

&lt;h2&gt;
  
  
  Horror Stories from the Wild
&lt;/h2&gt;

&lt;p&gt;First, the launch you’re not invited to. GPT-5.6 “shipped” June 26, and for ~99.99% of developers that meant reading a blog post about a model they can’t touch. No API, no app, no AI Studio. Twenty vetted partners and a “coming weeks” promise. OpenAI publicly admitted the gating delays “users, developers, enterprises, cyber defenders, and global partners.” A launch you can’t use isn’t a launch, it’s a press release with benchmarks attached, and you can’t verify the benchmarks either. (&lt;a href="https://venturebeat.com/technology/openai-unveils-gpt-5-6-sol-terra-and-luna-models-but-only-accessible-to-limited-preview-partners-for-now-per-us-gov" rel="noopener noreferrer"&gt;VentureBeat&lt;/a&gt;, &lt;a href="https://dev.to/sam_hiotis_117598dbfa3ac2/openai-previews-gpt-56-sol-with-restricted-access-and-stronger-cyber-safeguards-2k09-temp-slug-4668944"&gt;The Hacker News&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Then there’s the flagship that’s still missing. Three weeks on, if you shipped anything on Fable 5 during its brief public window in early June, you’re still holding a dead dependency, and the June 26 partial reprieve doesn’t include you unless you’re an Annex A entity with a security clearance. The lesson from last week didn’t expire. It compounded. “Hosted by a responsible lab” is not “under my control,” and the failure mode is sometimes a federal agency that doesn’t care about your sprint. (&lt;a href="https://www.anthropic.com/news/fable-mythos-access" rel="noopener noreferrer"&gt;Anthropic’s statement&lt;/a&gt;, &lt;a href="https://www.forbes.com/sites/anishasircar/2026/06/16/anthropic-disabled-fable-5-and-mythos-5-after-a-us-export-control-order-heres-what-happened/" rel="noopener noreferrer"&gt;Forbes&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Leaves You
&lt;/h2&gt;

&lt;p&gt;I came into June expecting to spend these posts arguing about benchmark deltas. Instead I’ve spent three of them watching the US government become the most important variable in which model you can run. That’s the genre now. The frontier is real and moving fast, and it is also increasingly a thing that can be switched off, rationed, or delayed by people who have never seen your codebase.&lt;/p&gt;

&lt;p&gt;No inspiration porn, just the unglamorous read: if your work genuinely needs the absolute top of the stack, pay for it. But architect like it can vanish, because for three labs in a row this month it either did or never arrived. For everything else, which is most things, the open-weights stuff isn’t settling anymore. GLM-5.2 is the sixth-smartest model on Earth, it beat the banned American model on the cyber benchmarks that got it banned, and you can download it for free right now. Sit with that one.&lt;/p&gt;

&lt;p&gt;The champ’s still in jail, his heirs are either in the same jail or running late, and the model in your downloads folder is doing your coding for a few dollars a million tokens and asking no one’s permission. Pick accordingly. And configure a fallback this time. I keep being the guy who learns that the hard way so you don’t have to.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>openrouter</category>
      <category>modelroundup</category>
      <category>largelanguagemodels</category>
    </item>
    <item>
      <title>The Obsidian Plugin Collection I Built One Free Kiro Credit at a Time</title>
      <dc:creator>Stephan Miller</dc:creator>
      <pubDate>Wed, 24 Jun 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/eristoddle/the-obsidian-plugin-collection-i-built-one-free-kiro-credit-at-a-time-2b42</link>
      <guid>https://dev.to/eristoddle/the-obsidian-plugin-collection-i-built-one-free-kiro-credit-at-a-time-2b42</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3y3qiqmk1ubv2074d5fr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3y3qiqmk1ubv2074d5fr.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s the problem with Claude Code on the Pro plan: it’s enough to get you started and never enough to get you finished. You sit down on a Saturday with a real idea, you get the agent into a groove, the code is actually taking shape, and then the session cap stops you.&lt;/p&gt;

&lt;p&gt;So, once a month, I’d take one idea for an Obsidian and I’d buid it. Not on Claude. On &lt;a href="https://kiro.dev" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;, AWS’s agentic IDE, whose free tier resets on a monthly cycle. One idea, one credit, one plugin. Tweak the spec over a week or two of note-taking, then hand the whole thing to Kiro and let it grind through its task list.&lt;/p&gt;

&lt;p&gt;I’ve &lt;a href="https://dev.to/eristoddle/how-i-built-two-obsidian-plugins-while-kiro-ai-did-most-of-the-work-40e4"&gt;written about Kiro before&lt;/a&gt;, back when it built me my first two plugins in a weekend. This is where the weekend turned into a habit that turned into a handful of plugins. Some of these are real and polished. Some are working but rough. And not all of them were even built completely with Kiro, but for the most part I have been turning a month of free Kiro credits into one Obsidian plugin.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Free Tier Economy of AI Coding Tools&lt;/li&gt;
&lt;li&gt;The Monthly Grind&lt;/li&gt;
&lt;li&gt;
The Plugin List

&lt;ul&gt;
&lt;li&gt;Apple Books Annotation Import: the one that I started with&lt;/li&gt;
&lt;li&gt;Joplin Portal: the one Kiro broke, then fixed&lt;/li&gt;
&lt;li&gt;Obsidian Cleaner: the one that suffered scope creep&lt;/li&gt;
&lt;li&gt;Daily Prompts: the one that’s almost there&lt;/li&gt;
&lt;li&gt;Notebook OCR: the one that worked well and I stopped using&lt;/li&gt;
&lt;li&gt;YouTube Auto Video Summarizer: the one I forked&lt;/li&gt;
&lt;li&gt;Tag Explorer 3D: the one that doesn’t have a git repo yet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What the Process Actually Looks Like (a Kiro Horror Story)&lt;/li&gt;
&lt;li&gt;The Real ROI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Free Tier Economy of AI Coding Tools
&lt;/h2&gt;

&lt;p&gt;I’m not paying &lt;a href="https://dev.to/eristoddle/the-cheapskates-guide-to-the-arena-leaderboard-why-i-stopped-paying-claude-opus-prices-1ipn"&gt;$200 a month for a Max plan&lt;/a&gt; to ship a hobby plugin that twelve people will install. So I take advantage of free-tiers. Claude Code on Pro for the daytime stuff. Google’s AI Studio when you want a huge context window and want a quick opinion on an idea along with a rough plan before you start building something. Jules for fixing bugs in something that already exists. And Kiro for the building extensions, plugins, and the like.&lt;/p&gt;

&lt;p&gt;The free tier is the hook: $0 a month, 50 credits, and, at the time I’m writing this, access to Claude Sonnet 4.5 inside it. The credits reset at the start of each billing month and you can use them up in one session.&lt;/p&gt;

&lt;p&gt;Kiro’s whole pitch is &lt;a href="https://dev.to/eristoddle/my-third-try-how-a-living-plan-beat-both-vibe-coding-and-spec-kit-5a89"&gt;spec-driven development&lt;/a&gt;. Instead of &lt;a href="https://dev.to/eristoddle/the-great-vibe-coding-experiment-how-i-built-15-projects-with-ai-in-my-spare-time-275o"&gt;vibe-coding&lt;/a&gt;, it makes you write (or makes the agent write) a requirements doc, a design doc, and a tasks doc that breaks the build into a numbered checklist. Then it works the checklist. That structure is the entire reason I use it for Obsidian plugins specifically, and not for, say, a large web app.&lt;/p&gt;

&lt;p&gt;Here’s why Obsidian plugins are the perfect shape for a free-tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small surface area.&lt;/strong&gt; It’s a TypeScript project with a &lt;code&gt;manifest.json&lt;/code&gt;, a &lt;code&gt;main.ts&lt;/code&gt;, and a documented API. There’s no backend, no auth, and Github Actions builds it for me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear standards.&lt;/strong&gt; Obsidian’s &lt;a href="https://github.com/obsidianmd/obsidian-sample-plugin" rel="noopener noreferrer"&gt;sample plugin repo&lt;/a&gt; and &lt;a href="https://docs.obsidian.md/" rel="noopener noreferrer"&gt;developer docs&lt;/a&gt; define exactly what “correct” looks like. An agent that follows documentation does well here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can ship before you’re done.&lt;/strong&gt; &lt;a href="https://github.com/TfTHacker/obsidian42-brat" rel="noopener noreferrer"&gt;BRAT&lt;/a&gt; lets anyone install a plugin straight from a GitHub repo, no community-store review required. So “done enough” is a real, useful state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Monthly Grind
&lt;/h2&gt;

&lt;p&gt;I keep a running list of plugin ideas as plain notes. Over a week or two, the note stops being “wouldn’t it be cool if” and starts being an actual spec: what it does, what the settings are, where the edge cases live.&lt;/p&gt;

&lt;p&gt;Then, when the note is ripe and the monthly credit is sitting there unspent, I open Kiro, point it at the notes, and tell it to build. Kiro turns that into its own internal task list. For &lt;a href="https://github.com/eristoddle/obsidian-cleaner" rel="noopener noreferrer"&gt;Obsidian Cleaner&lt;/a&gt;, Kiro generated a &lt;code&gt;tasks.md&lt;/code&gt; with &lt;strong&gt;91 tasks&lt;/strong&gt;. For the &lt;a href="https://github.com/eristoddle/obsidian-ocr-note-import" rel="noopener noreferrer"&gt;Notebook OCR plugin&lt;/a&gt;, it ended up spanning &lt;strong&gt;five separate specs&lt;/strong&gt; with close to &lt;strong&gt;280 tasks&lt;/strong&gt; between them. The &lt;a href="https://github.com/eristoddle/obsidian-daily-note-prompts" rel="noopener noreferrer"&gt;Daily Prompts&lt;/a&gt; build was 45. Even “small” &lt;a href="https://github.com/eristoddle/joplin-portal" rel="noopener noreferrer"&gt;Joplin Portal&lt;/a&gt; was 43 tasks in the main spec, before I made it add a 16-task spec later just to bring it up to Obsidian’s plugin guidelines.&lt;/p&gt;

&lt;p&gt;I don’t read all 91 tasks. I read the design doc, I sanity-check the first few tasks, and then I let it run. When it finishes, I install the build into my test vault, poke at it, and sort it into one of three buckets: done messing with it, needs another pass, or back on the shelf. Most months land in the middle bucket. Some months produce a genuine mess I have to come back and fight with. It’s nice when the result works enough that I start using it all the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plugin List
&lt;/h2&gt;

&lt;p&gt;This is everything that actually exists. If it’s installed in my test vault, I built it. Here’s the status of each one, including which ones Kiro built and which ones came from somewhere else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apple Books Annotation Import: the one that I started with
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffiu9i6ah6spx8z3znkxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffiu9i6ah6spx8z3znkxn.png" alt="Obsidian Plugin: Apple Books Annotation Import" width="800" height="981"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/apple-books-annotation-import" rel="noopener noreferrer"&gt;github.com/eristoddle/apple-books-annotation-import&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.0.22 · &lt;strong&gt;Status:&lt;/strong&gt; working, most polished of the lot&lt;/p&gt;

&lt;p&gt;Kiro had nothing to do with this one actually. It started life as a Python script that pulled annotations out of Apple Books’ SQLite databases, and I used Claude desktop to convert it into a plugin and &lt;a href="https://dev.to/eristoddle/jules-ai-the-currently-free-coding-assistant-that-cant-follow-directions-but-gets-shit-done-33k3"&gt;Jules to fix the final bugs&lt;/a&gt;. It started the Obsidian plugin in an afternoon ritual.&lt;/p&gt;

&lt;p&gt;It’s also the one that’s had the most love since. It pulls highlights and notes out of the macOS Books databases and turns them into formatted markdown: book metadata, ISBN, reading progress, highlight colors as emoji (🟡🟢🔵🟣🔴), chapter detection from EPUB CFI locations, the works. There’s an interactive picker so you choose exactly which books to import, with cover thumbnails and annotation counts. Turns out Apple’s annotation data is a labyrinth spread across separate SQLite files that aren’t meant to be touched. It’s macOS-only. I use it all the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Joplin Portal: the one Kiro broke, then fixed
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2vl52sfhg1ktis4ahcc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2vl52sfhg1ktis4ahcc.jpg" alt="Joplin Portal Obsidian Plugin" width="800" height="1391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/joplin-portal" rel="noopener noreferrer"&gt;github.com/eristoddle/joplin-portal&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.0.18 · &lt;strong&gt;Status:&lt;/strong&gt; working, has a real test suite&lt;/p&gt;

&lt;p&gt;Joplin Portal gives you a sidebar panel in Obsidian that searches, previews, and selectively imports notes from a running Joplin server through Joplin’s &lt;a href="https://joplinapp.org/help/api/references/rest_api/" rel="noopener noreferrer"&gt;Data API&lt;/a&gt;. It’s not a hack or a file-format conversion. It talks to Joplin’s actual REST endpoint with a token, debounces the search, caches results, and lets you cherry-pick what comes across.&lt;/p&gt;

&lt;p&gt;This is the plugin where I learned exactly where Kiro’s limits are, and it’s the best story in the bunch, so it gets its own section further down. Short version: Kiro built the working thing in 43 tasks, then I asked it to fix one cosmetic bug and it broke a lot of things in the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Obsidian Cleaner: the one that suffered scope creep
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdl76fnr6qy8f9r33b0fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdl76fnr6qy8f9r33b0fi.png" alt="Obisidian Attachement Cleaner Plugin" width="800" height="985"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/obsidian-cleaner" rel="noopener noreferrer"&gt;github.com/eristoddle/obsidian-cleaner&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.2.0 · &lt;strong&gt;Status:&lt;/strong&gt; active, recently renamed&lt;/p&gt;

&lt;p&gt;This one started as “Attachment Cleaner,” a single-purpose tool to find attachments nothing links to. Then I kept noticing other crap in my vault. Dropbox conflicted copies. Numbered duplicates from Web Clipper (&lt;code&gt;Note 1.md&lt;/code&gt;, &lt;code&gt;Note 2.md&lt;/code&gt;). Zero-byte markdown files. Empty folders. Tags that were one typo apart from each other. So I gave Kiro the bigger spec, watched it generate a 91-task checklist, and let it turn a one-trick tool into a seven-type vault-hygiene suite. Then I renamed the whole thing to Obsidian Cleaner because “Attachment Cleaner” no longer fit.&lt;/p&gt;

&lt;p&gt;It walks you through a step-by-step modal: orphaned attachments, conflicted files, duplicates, empty markdown, empty folders, near-duplicate tags (edit distance ≤ 2), and a frontmatter-rule cleanup. Every single item gets its own accept/reject toggle before anything gets deleted. You pick the deletion mode too: system trash, Obsidian’s &lt;code&gt;.trash&lt;/code&gt;, or permanent if you’re feeling brave. Started as a scalpel, ended as a Swiss Army knife. Scope creep, but the useful kind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Daily Prompts: the one that’s almost there
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow12n4pj9ims4uwqae9h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow12n4pj9ims4uwqae9h.jpg" alt="Obisidian Daily Prompts Plugin" width="800" height="945"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/obsidian-daily-note-prompts" rel="noopener noreferrer"&gt;github.com/eristoddle/obsidian-daily-note-prompts&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.0.1 · &lt;strong&gt;Status:&lt;/strong&gt; mostly working, notifications still flaky&lt;/p&gt;

&lt;p&gt;Daily writing prompts delivered into your daily note, three ways: sequential (for structured courses), random (no repeats until the pack’s exhausted), or date-based (for seasonal stuff). Prompts live in JSON packs you can import and export, so you can share a pack or back one up. It’ll create or open the daily note when a prompt fires, optionally drop you into a distraction-free mode, and ping you with either a system notification or an Obsidian notice.&lt;/p&gt;

&lt;p&gt;That notification system is exactly where it’s still rough. Timezone-aware scheduling and “catch up on missed prompts” are great on paper, and the persistence is the part that needs another Kiro credit. It’s 45 tasks of mostly-done. One of these months it’ll get the pass that finishes it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notebook OCR: the one that worked well and I stopped using
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9c64mr2rz09npil4ezij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9c64mr2rz09npil4ezij.png" alt="Obsidian OCR Plugin" width="800" height="734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/obsidian-ocr-note-import" rel="noopener noreferrer"&gt;github.com/eristoddle/obsidian-ocr-note-import&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.0.16 · &lt;strong&gt;Status:&lt;/strong&gt; working&lt;/p&gt;

&lt;p&gt;I carry a 3.5×5.5 field notebook everywhere, and for years the digital bridge was me typing my own handwriting back into Obsidian like an animal. This plugin kills that. You photograph the pages, it runs OCR (local &lt;a href="https://tesseract.js.org/" rel="noopener noreferrer"&gt;Tesseract.js&lt;/a&gt; offline, or OpenAI Vision / Google Cloud Vision when you want it to actually read cursive), and then it routes the extracted text into your vault using regex pattern rules with capture groups. It even preprocesses multi-page notebook scans, splitting and rotating them before OCR, with presets for common pocket-notebook layouts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmrout207vwpakxm52xi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmrout207vwpakxm52xi.jpg" alt="Notebook OCR" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the most over-engineered thing on the list (five Kiro specs, nearly 280 tasks total), and it already got &lt;a href="https://dev.to/eristoddle/i-built-an-obsidian-ocr-plugin-for-my-notebooks-then-started-talking-to-openclaw-instead-2h2f"&gt;its own full writeup&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  YouTube Auto Video Summarizer: the one I forked
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/eristoddle/obsidian-auto-video-summarizer" rel="noopener noreferrer"&gt;github.com/eristoddle/obsidian-auto-video-summarizer&lt;/a&gt; · &lt;strong&gt;Version:&lt;/strong&gt; 1.2.3 · &lt;strong&gt;Status:&lt;/strong&gt; forked and customized&lt;/p&gt;

&lt;p&gt;Sometimes the best plugin is someone else’s that you make your own. This is a fork of &lt;a href="https://github.com/mbramani" rel="noopener noreferrer"&gt;mbramani’s video summarizer&lt;/a&gt;, which already pulls YouTube transcripts and summarizes them with an LLM: Gemini, OpenAI, or Anthropic, your key, your choice of model. What I added to my copy is the automatic part: it’ll summarize any YouTube URL you paste into the editor, or any new web clip whose &lt;code&gt;source&lt;/code&gt; frontmatter is a YouTube link. Just a fork and a quick modification. Took about 15 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tag Explorer 3D: the one that doesn’t have a git repo yet
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9dsumfm5fm9weqk6g0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9dsumfm5fm9weqk6g0z.png" alt="Obsidian 3D Tag Explorer Plugin" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; none (never pushed) · &lt;strong&gt;Version:&lt;/strong&gt; 1.0.0 · &lt;strong&gt;Status:&lt;/strong&gt; built, never shipped&lt;/p&gt;

&lt;p&gt;This lives in my test vault, rendering my hierarchical tags (&lt;code&gt;#obsidian/plugin/idea&lt;/code&gt;) as an interactive 3D network graph with &lt;a href="https://threejs.org/" rel="noopener noreferrer"&gt;three.js&lt;/a&gt; and &lt;a href="https://github.com/vasturiano/3d-force-graph" rel="noopener noreferrer"&gt;3d-force-graph&lt;/a&gt;: orbit, zoom, hover-to-preview note contents, hierarchical and force-directed and radial layouts.&lt;/p&gt;

&lt;p&gt;I could never decide whether a 3D tag graph is genuinely useful or just a very pretty answer to a question nobody asked. Sometimes you build things because they’re interesting, not because anyone needs them, and then you can’t quite bring yourself to delete them either.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Process Actually Looks Like (a Kiro Horror Story)
&lt;/h2&gt;

&lt;p&gt;Let me show you a real month, with the mess included.&lt;/p&gt;

&lt;p&gt;Joplin Portal worked. Kiro built the search, the preview, the import, all 43 tasks of it, and it was good. Then I noticed the panel’s icon wasn’t rendering right, which is a cosmetic nothing of a bug. So I asked Kiro to fix the icon.&lt;/p&gt;

&lt;p&gt;This is where it went sideways. Instead of reading &lt;a href="https://docs.obsidian.md/Plugins/User+interface/Icons" rel="noopener noreferrer"&gt;Obsidian’s icon documentation&lt;/a&gt; and using the one correct API call, Kiro started flailing. It wrote a &lt;code&gt;registerJoplinIcon()&lt;/code&gt; function. The icon still didn’t render, so on the next pass it added a &lt;em&gt;second&lt;/em&gt; function, &lt;code&gt;registerJoplinIconEarly()&lt;/code&gt;, and called both. It started rendering image tags that looked like &lt;code&gt;&amp;lt;img width="20" height="20" src="joplin-id:2f95b263..."/&amp;gt;&lt;/code&gt;, a made-up URL scheme that was never, ever going to resolve. It was guessing, and each guess piled another layer of garbage on top of the last one. The “fixing” produced a codebase that was worse than when it started.&lt;/p&gt;

&lt;p&gt;So I did the thing you eventually learn to do with these tools: I stopped letting it improvise and put it on a leash. I went and did my own research, figured out the actual fix, and then wrote it a prompt that was less “please help” and more “here is your one job, do not deviate.”&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This plugin needs to follow best practices. You have made it a mess trying to fix an issue with the icon rendering. See how many times you call &lt;code&gt;this.registerJoplinIcon()&lt;/code&gt; and then the duplicate function &lt;code&gt;this.registerJoplinIconEarly()&lt;/code&gt;. This is unnecessary, and whenever you catch yourself doing this, you should know you have taken a wrong turn. That was the only problem. Everything else worked and you have made a mess.&lt;/p&gt;

&lt;p&gt;You MUST, MUST, MUST follow the documentation to do this right: &lt;a href="https://docs.obsidian.md/Plugins/User+interface/Icons" rel="noopener noreferrer"&gt;https://docs.obsidian.md/Plugins/User+interface/Icons&lt;/a&gt;. Do not ever guess. Do not think you know unless you do. Do not make things up. You must also use this repo as reference for best practices: &lt;a href="https://github.com/obsidianmd/obsidian-sample-plugin" rel="noopener noreferrer"&gt;https://github.com/obsidianmd/obsidian-sample-plugin&lt;/a&gt;. And you must remember you are only fixing the mess with rendering the icon and bringing it back to standards. Nothing else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5fux22ewm7u82zrbn2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5fux22ewm7u82zrbn2b.jpg" alt="What the Process Actually Looks Like (a Kiro Horror Story)" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Its confidence is uncorrelated with its correctness, and when it doesn’t know something it will invent something that looks plausible and ship it. The duplicate function with the &lt;code&gt;Early&lt;/code&gt; suffix is the tell: when an agent starts bolting “early” and “v2” and “final” onto its own helpers, it’s not solving the problem, it’s papering over the fact that it doesn’t understand it. Your job isn’t to write the code. Your job is to notice the tell, hand it the authoritative documentation, and fence the task down to exactly one thing so it can’t wander.&lt;/p&gt;

&lt;p&gt;After that prompt, it fixed the icon. Then I had it add a 16-task spec to bring the whole plugin in line with Obsidian’s official guidelines, and that’s why Joplin Portal is the one on this list with an actual &lt;a href="https://vitest.dev/" rel="noopener noreferrer"&gt;Vitest&lt;/a&gt; test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real ROI
&lt;/h2&gt;

&lt;p&gt;So what does “one free Kiro credit a month” actually get you? Let’s add it all up.&lt;/p&gt;

&lt;p&gt;It got me eight things that run: two genuinely polished, three that are working-but-rough, one fork, and one that’s never been pushed.&lt;/p&gt;

&lt;p&gt;There’s friction too. You hit session caps. You switch tools and lose context between them. The agent sets your icon-rendering code on fire and you spend a Saturday afternoon being its very firm manager. Some months produce a finished tool and some months produce a mess.&lt;/p&gt;

&lt;p&gt;The constraint makes you good at scoping. When your AI tool can only finish work that fits inside one month’s free allotment, you’re forced to break ideas down until they’re small enough to actually ship. And a plugin idea you’ve sharpened to that point is one you understand. The vault notes that become the Kiro specs are a documentation trail I’d never have written otherwise. The real product of this whole ritual is the discipline of cutting work down to a finishable size, which is the one skill that survives no matter which AI tool you’re using this month.&lt;/p&gt;

</description>
      <category>kiroai</category>
      <category>obsidianplugins</category>
      <category>freetieraicoding</category>
      <category>agenticdevelopment</category>
    </item>
  </channel>
</rss>
