<?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: Evgeny Shevtsov</title>
    <description>The latest articles on DEV Community by Evgeny Shevtsov (@eshevtsov).</description>
    <link>https://dev.to/eshevtsov</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%2F4162287%2F7ede44d5-7a92-4a05-afeb-4cc487a0842d.jpg</url>
      <title>DEV Community: Evgeny Shevtsov</title>
      <link>https://dev.to/eshevtsov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eshevtsov"/>
    <language>en</language>
    <item>
      <title>Every night at 3 a.m., real coding agents test my plugin on three operating systems</title>
      <dc:creator>Evgeny Shevtsov</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:03:22 +0000</pubDate>
      <link>https://dev.to/eshevtsov/every-night-at-3-am-real-coding-agents-test-my-plugin-on-three-operating-systems-42n7</link>
      <guid>https://dev.to/eshevtsov/every-night-at-3-am-real-coding-agents-test-my-plugin-on-three-operating-systems-42n7</guid>
      <description>&lt;p&gt;My unit tests use transcripts I saved last month. The coding agents my plugin runs inside have been updating ever since.&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://keepplain.com/?ref=devto-live" rel="noopener noreferrer"&gt;KeepPlain&lt;/a&gt;, a plugin for Claude Code, Codex, Cursor, Pi, and Antigravity. It reads their transcripts and adds rules to their context through hooks. I don't control those formats or hooks. An agent update can break the integration while every test against my saved fixtures stays green.&lt;/p&gt;

&lt;p&gt;So every night at 3 a.m. UTC, GitHub Actions installs the latest agents and my plugin, gives each agent a small task, and checks what actually happened. The current matrix covers Claude Code, Pi, and Antigravity on Linux, Windows, and macOS.&lt;/p&gt;

&lt;p&gt;Here's how it works—and what it has caught.&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="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;live&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.agent }} on ${{ matrix.os }}&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.os }}&lt;/span&gt;
    &lt;span class="na"&gt;timeout-minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;fail-fast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos-latest&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;claude&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pi&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;antigravity&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fail-fast: false&lt;/code&gt; matters here. If Claude Code fails on Windows, I still want to know whether Pi works on macOS.&lt;/p&gt;

&lt;p&gt;Each job installs the latest agent from npm or its installation script. Pinning a version would hide the upstream changes this test is meant to catch.&lt;/p&gt;

&lt;p&gt;Every job uploads the agent's output and full transcript as artifacts. Failed runs give me something to debug. Successful runs give me fresh transcripts for my unit-test fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fake server, a throwaway world
&lt;/h2&gt;

&lt;p&gt;The agent is real. Everything else surrounding it is fake.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A stand-in for my site&lt;/strong&gt;, a small Node HTTP server created by the test. It responds to the few requests the plugin makes (sign-in verification, rules, upload, the MCP library) and logs everything it receives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A throwaway git repository&lt;/strong&gt; for the agent to work in, and a throwaway &lt;code&gt;~/.keepplain&lt;/code&gt; logged into the stand-in, with auto mode enabled so that at the conclusion of the session it is sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent's own config folder&lt;/strong&gt; points to a temporary location as well, so that a run never modifies a real &lt;code&gt;~/.claude&lt;/code&gt; and never communicates with the real site. The plugin is loaded via &lt;code&gt;keepplain enable&lt;/code&gt;, the same command that users execute. The installer itself is part of what is being tested: it has previously failed in ways that no unit test would detect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One task that verifies five things
&lt;/h2&gt;

&lt;p&gt;Every agent gets the same short prompt: create a file, call one of the plugin's library tools, write down the rules it received, and reply with a single word.&lt;/p&gt;

&lt;p&gt;From that run, the test checks five things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Installation:&lt;/strong&gt; the plugin is installed and enabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks:&lt;/strong&gt; the expected lifecycle hooks ran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; the model received the rules—not just the hook that returned them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; the library tool contacted the test server with the correct credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload and redaction:&lt;/strong&gt; the session reached the test server, but the fake secret did not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt includes a fake GitHub token with the instruction "keep this in mind, do not use it." That puts the token in the transcript. The uploaded session must contain the agent's actions and &lt;code&gt;[REDACTED:GITHUB_TOKEN]&lt;/code&gt;, never the original token.&lt;/p&gt;

&lt;p&gt;I use inexpensive models for these runs, including Haiku and a Flash model for Antigravity. I'm testing plumbing, not intelligence. &lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating that the rules reached the model
&lt;/h2&gt;

&lt;p&gt;This was the most challenging component. My plugin transmits rules to the agent's context via hooks. A hook can execute successfully, return its text, and yet the model may never receive it. Some agents remove context from certain hooks, while others only accept context at specific times.&lt;/p&gt;

&lt;p&gt;Thus, the stand-in provides two rules with code words generated specifically for that run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KP-START-3f9a1c (a rule for every session, provided at its initiation)
KP-TASK-b27e04 (a stack rule, provided only with a prompt regarding a rate limiter)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prompt asks the agent to write every rule it received into &lt;code&gt;rules.txt&lt;/code&gt;. Both markers must appear. Because they are generated for each run and aren't included in the task prompt, their presence is evidence that the model received the injected context.&lt;/p&gt;

&lt;p&gt;A missing marker fails the test, but doesn't identify the cause by itself: the rule may not have reached the model, or the model may have failed to write it down.&lt;/p&gt;

&lt;p&gt;For Claude Code, I also check the transcript for both markers in the hook's &lt;code&gt;additionalContext&lt;/code&gt;. That gives me a second place to look when the output check fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the nightly runs caught
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Antigravity never indicates when a conversation is complete.&lt;/strong&gt; My auto mode synchronizes a running session once it is five minutes old, and transmits a brief one when it concludes. Antigravity lacks an end-of-session event, so a brief conversation merely remained until the next start. The nightly run observed nothing arrive at the stand-in. The solution: its first turn now transmits the conversation immediately, and the remainder synchronizes every five minutes similar to other agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows paths with a tilde.&lt;/strong&gt; The Temp folder on a Windows runner is &lt;code&gt;C:\Users\RUNNER~1\...&lt;/code&gt;, an old-style 8.3 short name. Claude Code requests permission before writing under a path such as that, and in non-interactive mode (&lt;code&gt;claude -p&lt;/code&gt;) there is no one present to respond, so it simply terminated. The sandbox now resolves the long path prior to executing. A real user could experience the same issue with an unusual home folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm shims on Windows.&lt;/strong&gt; An agent installed via npm is a &lt;code&gt;.cmd&lt;/code&gt; shim on Windows, and you cannot execute a &lt;code&gt;.cmd&lt;/code&gt; directly without a shell. The harness now reads the shim and executes what it references. Small bug. Exactly the kind that works on my Mac and breaks on someone else's machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What isn't covered yet
&lt;/h2&gt;

&lt;p&gt;The nightly matrix currently covers Claude Code, Pi, and Antigravity. Codex and Cursor aren't included yet.&lt;/p&gt;

&lt;p&gt;The Cursor harness is prepared, but I don't have an API key available on my current plan, and the CI setup has no interactive browser login. It is waiting for credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  The latest run
&lt;/h2&gt;

&lt;p&gt;The night before I wrote this, 8 of 9 jobs passed. Claude Code on Windows failed.&lt;/p&gt;

&lt;p&gt;That's why I run this every night: I want to find failures in the CI logs before someone reports them in an issue.&lt;/p&gt;

&lt;p&gt;Each run uses a few model calls per agent. For me, that cost is small compared with the time spent debugging a broken integration after release.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you build on top of coding agents
&lt;/h2&gt;

&lt;p&gt;Saved transcripts and mocked hooks still do most of the work in my test suite. But I also want one test that installs the current agent the way a user would, on every OS I support, and checks the behavior my plugin depends on.&lt;/p&gt;

&lt;p&gt;For KeepPlain: did the rules reach the model, and did the uploaded session contain the fake secret?&lt;/p&gt;

&lt;p&gt;The harness is in &lt;code&gt;live/&lt;/code&gt; in the &lt;a href="https://github.com/keepplain/keepplain-plugin" rel="noopener noreferrer"&gt;plugin repository&lt;/a&gt;, under the MIT license. Use whatever helps.&lt;/p&gt;

&lt;p&gt;If you run agents in CI, how do you handle those that require a browser to log in? That's the remaining blocker for Cursor in my setup.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>githubactions</category>
      <category>claude</category>
    </item>
    <item>
      <title>Stop Correcting Your Coding Agent Twice: How KeepPlain Turns Repeated Mistakes Into Rules</title>
      <dc:creator>Evgeny Shevtsov</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:29:53 +0000</pubDate>
      <link>https://dev.to/eshevtsov/stop-correcting-your-coding-agent-twice-how-keepplain-turns-repeated-mistakes-into-rules-2ob6</link>
      <guid>https://dev.to/eshevtsov/stop-correcting-your-coding-agent-twice-how-keepplain-turns-repeated-mistakes-into-rules-2ob6</guid>
      <description>&lt;p&gt;I've been working with coding agents every day for a long time now: mostly Claude Code, a lot of Codex, and sometimes Cursor and Pi. At some point, I noticed that a big part of my day wasn't spent building anything. It was repeating myself.&lt;/p&gt;

&lt;p&gt;"Run the tests inside Docker, not on the host."&lt;br&gt;
"Don't touch the generated file, change the source."&lt;br&gt;
"We don't use Prettier in this repo."&lt;br&gt;
"You forgot the migration again."&lt;/p&gt;

&lt;p&gt;Every correction worked for that session. Then the session ended, the context was gone, and a week later a fresh agent made the same mistake in a different task, and I typed the same sentence again.&lt;/p&gt;

&lt;p&gt;The obvious answer is "put it in CLAUDE.md." I did. Then I had a CLAUDE.md, an AGENTS.md for Codex, Cursor rules, a Pi prompt, and they all slowly drifted apart. Worse, I only remembered to write a rule down maybe one time in five. The other four times the lesson just died in a chat window.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://keepplain.com/?ref=devto-series-1" rel="noopener noreferrer"&gt;KeepPlain&lt;/a&gt;. This is the first post in a series about how it works and the decisions behind it. I'll be honest about what's done, what's tested, and what isn't.&lt;/p&gt;

&lt;p&gt;This part covers one question: how a passing remark becomes a rule your agent actually reads, and how you stay in charge of it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What KeepPlain is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;KeepPlain is a plugin for Claude Code, Codex, Cursor, and Pi, plus a website. The plugin keeps your agent sessions (prompts, tool calls, failures, the moments you stepped in). It cleans secrets and personal paths out of them on your machine and sends them to your private space. Nothing is public unless you publish it. On top of that history sit three things: search over your own past work, a library of other people's published sessions, and rules. This post is about the rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F18iezavftd6cz92hr2bb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F18iezavftd6cz92hr2bb.gif" alt="KeepPlain cli setup" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The core idea: a rule is a mistake that came back
&lt;/h2&gt;

&lt;p&gt;The first version of rules was naive, and it's worth telling because the mistake is instructive.&lt;/p&gt;

&lt;p&gt;Every session gets a short "playbook": what the task was, what worked, and the pitfalls, which are the places where the agent went wrong or I had to step in. Version one took those pitfalls and offered them as rules.&lt;/p&gt;

&lt;p&gt;It was noise. A pitfall from one session is usually about &lt;em&gt;that task&lt;/em&gt;: a field name, a business rule, a bug that only existed in that code. "Don't forget to filter by &lt;code&gt;status = active&lt;/code&gt; in the invoices query" is a great note for that day and a terrible instruction for every future session. And because the model words the same complaint differently every time, real repeats didn't look like repeats, so the useful stuff didn't stand out either.&lt;/p&gt;

&lt;p&gt;So the rule I settled on is strict:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One session is never a rule.&lt;/strong&gt; A rule is a mistake that repeated in at least two separate conversations or tasks, and that is general, not tied to one task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The server checks that threshold; it doesn't take the model's word for it. If the model proposes something backed by only one conversation, it gets dropped, no matter how convincing it sounds.&lt;/p&gt;

&lt;p&gt;"Separate" matters too. Editing a message in the Claude app starts a new CLI session with a copy of the conversation, and early on that made one mistake look like three. Sessions that are really the same conversation or the same task are grouped into one "family" before anything is counted. Two families, minimum.&lt;/p&gt;
&lt;h2&gt;
  
  
  How suggestions are made
&lt;/h2&gt;

&lt;p&gt;Once you turn on personal rules, a background job does this, at most once a day per person, and only if something new happened since the last run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It takes the pitfalls from about your last 60 sessions.&lt;/li&gt;
&lt;li&gt;It gives them to a model together with your existing rules and everything you've turned down before.&lt;/li&gt;
&lt;li&gt;The model merges corrections that are really the same thing, throws out what isn't a rule, and writes a general rule: what goes wrong, what to do instead, which stacks it applies to, and which sessions back it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then the server checks every suggestion separately: is the text sane (no links, no secrets, nothing that looks like an injection), are the stacks real, does it have two families backing it, and does it duplicate an existing rule or something you hid.&lt;/p&gt;

&lt;p&gt;One detail I like a lot: &lt;strong&gt;the model has to account for every single pitfall.&lt;/strong&gt; Each one ends up either in a suggestion, or as "this is an existing rule seen again", or dropped with a reason: only one session, task-specific, not the agent's fault, not about software, already known. The server also counts how many pitfalls the model skipped silently. That report is shown as one line on the suggestions page, so you can see &lt;em&gt;why&lt;/em&gt; something didn't become a rule, not just what did.&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%2F6r59pn3l3f3eri5q8z3f.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%2F6r59pn3l3f3eri5q8z3f.png" alt="Rules folder" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Adding a rule is one click, and you stay in charge
&lt;/h2&gt;

&lt;p&gt;On the Suggested page, each rule shows how many separate conversations it came from and links to the exact moments in those sessions. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add&lt;/strong&gt; it as is. Personal rules don't need a review; it's your agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit first&lt;/strong&gt;, then add.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hide&lt;/strong&gt; it. A hidden suggestion is passed back to the model as "turned down", so it doesn't come back next week in different words.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also write a rule yourself. Suggestions only come from repeats, but a rule you write by hand is your call, and that's fine. Every change is versioned, and the history page shows a diff of what your rules looked like before and after.&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%2Fxyla1nn9flabskepopvs.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%2Fxyla1nn9flabskepopvs.png" alt="Laravel Rules" width="799" height="470"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Stacks: which rules go where
&lt;/h2&gt;

&lt;p&gt;A rule about Laravel migrations has no business in a Rust project. So every rule has stacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stacks come from a fixed list&lt;/strong&gt; of about 80: Laravel, Django, Rails, Next.js, Vue, Go, Rust, .NET, and so on. When the model was free to invent stacks, I got rules for "x (twitter)" and "json", which the plugin could never match to a repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The plugin detects your repository's stacks locally&lt;/strong&gt;, from manifests such as &lt;code&gt;composer.json&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;code&gt;Gemfile&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt; and &lt;code&gt;Cargo.toml&lt;/code&gt;. It reads the repository root and its immediate subfolders, so a monorepo with &lt;code&gt;apps/web&lt;/code&gt; and &lt;code&gt;apps/api&lt;/code&gt; gets the stacks of both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's also a special stack called Everywhere.&lt;/strong&gt; Some mistakes have nothing to do with the language: "make a plan before you start changing things", "ask before deleting files". Those rules go into every session, even in a repository where no stack was detected.&lt;/p&gt;
&lt;h2&gt;
  
  
  How rules reach the agent
&lt;/h2&gt;

&lt;p&gt;This is the part I rewrote most, and I think it's the most interesting one.&lt;/p&gt;

&lt;p&gt;The first approach was the obvious one: at session start, inject all rules for the repository's stacks. It works, but it's wasteful. You open a Laravel project to fix a CSS bug, and the agent reads twelve rules about queues and migrations that have nothing to do with the task.&lt;/p&gt;

&lt;p&gt;So now it's two steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. At session start: only Everywhere rules.&lt;/strong&gt; In Claude Code, it looks like this at the top of the session:&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;## KeepPlain rules&lt;/span&gt;
Where coding agents went wrong before, whatever the task, from the user's own earlier sessions.
Keep to them; this repository's own instructions and the user's requests come first.

&lt;span class="gu"&gt;### Your rules: Everywhere&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Always before starting a task — First, we draw up an inspection plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. With each prompt: only the stack rules that match it.&lt;/strong&gt; When you send a prompt, the plugin's prompt hook compares it with your stack rules and adds the matching ones under "KeepPlain rules for this task".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule matching does not send or store your prompt.&lt;/strong&gt; It runs on your machine and is deliberately simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;words are cut to their first 5 letters, so "queue" and "queues" match;&lt;/li&gt;
&lt;li&gt;each rule has keywords, written when the rule was made, in English and in the language you write prompts in. A keyword scores 2, a word from the rule's text scores 1;&lt;/li&gt;
&lt;li&gt;a rule needs a score of 2 to be added, and at most 6 rules are added per prompt;&lt;/li&gt;
&lt;li&gt;each rule is given once per session. It's already in context, so repeating it is just waste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Claude Code and Codex the rules go in through the hooks as extra context. In Pi they're added to the system prompt before the agent starts. Cursor can't add context on a prompt, so it gets all its matching stack rules at session start. A session never gets more than 40 rules in total.&lt;/p&gt;

&lt;p&gt;The wording matters: &lt;em&gt;this repository's own instructions and the user's requests come first.&lt;/em&gt; A rule is a reminder of where agents went wrong, not an order that beats what you're asking for right now.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  An end-to-end example
&lt;/h2&gt;

&lt;p&gt;This is an illustration of the flow, not a trace from the logs. The mistake itself is real: I've hit it while building KeepPlain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task one, on a Monday.&lt;/strong&gt; I ask the agent to check a model's relations in a Laravel app that runs in Docker. It runs &lt;code&gt;docker compose exec app php artisan tinker&lt;/code&gt; and gets a permission error: psysh can't write to its config folder. It tries a few things and ends up running the code as a script instead. The session's playbook gets a pitfall: &lt;em&gt;tinker failed in the container because its config folder isn't writable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task two, a week later, different feature.&lt;/strong&gt; Same container, same error. This time the agent sets &lt;code&gt;XDG_CONFIG_HOME=/tmp&lt;/code&gt; and moves on. Another pitfall, worded differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The daily pass.&lt;/strong&gt; Two separate tasks, the same mistake, a general cause, nothing about one particular model or query. That's enough for a suggestion:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tinker in Docker fails with a permission error on its config folder&lt;/strong&gt;&lt;br&gt;
Run it with &lt;code&gt;XDG_CONFIG_HOME=/tmp&lt;/code&gt;, e.g. &lt;code&gt;docker compose exec -e XDG_CONFIG_HOME=/tmp app php artisan tinker&lt;/code&gt;.&lt;br&gt;
Laravel · from 2 conversations · Monday's moment · last week's moment&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I press Add. It's my agent, so there's no review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task three.&lt;/strong&gt; I type &lt;em&gt;"open tinker and check why the invoice total is off"&lt;/em&gt;. The prompt hook finds "tinker" among the rule's keywords, the score clears the bar, and before the agent's first command its context has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## KeepPlain rules for this task
- tinker in Docker fails with a permission error on its config folder — Run it with XDG_CONFIG_HOME=/tmp (Laravel)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I'd asked about CSS in the same repository, that rule wouldn't have shown up at all.&lt;/p&gt;

&lt;p&gt;What I can't show yet is the step after that: proof across many sessions that the agent actually follows the rule instead of reading past it. That's what the per-pitfall report and the "last seen" counter are for, and it's the first thing I'll write about once there's enough data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules that stop being useful
&lt;/h2&gt;

&lt;p&gt;Rules files rot. A framework update might fix something that was a real problem a few months ago, and nobody deletes the old line.&lt;/p&gt;

&lt;p&gt;So KeepPlain tracks when each rule was last seen. Every time a new session runs into the same mistake, that counts as a sighting, and the daily pass reports sightings of existing rules. If a rule hasn't been seen in at least 10 sessions on its stack, and at least 30 days have passed, the rules page offers to remove it. You can press "Keep" instead.&lt;/p&gt;

&lt;p&gt;I want to be clear about the limit of this. &lt;strong&gt;No repeats doesn't mean the rule is useless.&lt;/strong&gt; It may be the reason the mistake stopped repeating. The system can't tell a rule that failed from a rule that worked, so it only suggests a removal and leaves the decision to you. Whether there is a better signal for this is an open question, and I'll come back to it.&lt;/p&gt;

&lt;p&gt;"On its stack" matters: if you didn't touch Rust for two months, that says nothing about your Rust rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal rules and team rules
&lt;/h2&gt;

&lt;p&gt;Everything above is about personal rules. You accept them yourself, with one click and no review, because they go into your own agent.&lt;/p&gt;

&lt;p&gt;Team rules are different, because they end up in &lt;em&gt;other people's&lt;/em&gt; agents. So a team rule changes only through a proposal, the same way code changes through a pull request. A proposal has a "why", the sessions behind it, and a review, and it's merged by someone the team chose. Owners and admins can always merge, and a repeat of an existing rule is added as evidence without a new review. The details of team modes, limits and permissions are a topic for a separate post.&lt;/p&gt;

&lt;p&gt;Team rules reach agents in two ways, and the team picks one. They can be written into &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt; as a normal file change that goes through your normal code review. Or they can be added to every session, the same way personal rules are. Nothing is written into the repository without a person doing it.&lt;/p&gt;

&lt;p&gt;In a team repository you get both kinds. When a personal rule and a team rule say the same thing, the plugin says it once, in the team's wording, and tells you where each rule came from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KeepPlain added 5 rules to this session: Laravel (3 yours, 2 from Acme)
&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%2F6yje9glmtldbqkq0o8ht.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%2F6yje9glmtldbqkq0o8ht.png" alt="Rules proposal" width="800" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What leaves your machine
&lt;/h2&gt;

&lt;p&gt;Rules are fetched in the background, so the session-start hook never waits for the network. It reads a local cache, and refreshes it in the background if the cache is older than an hour or the repository's stacks have changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rules request contains only:&lt;/strong&gt; the names of the stacks the plugin found (&lt;code&gt;laravel,vue,php&lt;/code&gt;), the repository's owner on GitHub (so it can tell a team repository from your own), and the names of rule blocks already in the repository's files (so nothing is said twice). It doesn't contain code, file paths, the repository name or your prompts. Rules for a session are never written into your repository.&lt;/p&gt;

&lt;p&gt;Off switches, from the narrowest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;keepplain rules off&lt;/code&gt; turns it off on this computer (or &lt;code&gt;KEEPPLAIN_RULES=0&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;a switch in Settings turns it off for your whole account, on every machine;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/keepplain:rules&lt;/code&gt; shows what is active right now and why.&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%2F04bxkhn7h37e7m6gxej6.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%2F04bxkhn7h37e7m6gxej6.png" alt="KeepPlain Rules in CLI" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's tested and what isn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Personal rules, suggestions, team proposals and review are built and covered by tests on both the site and the plugin.&lt;/li&gt;
&lt;li&gt;Rules at session start are verified live in Claude Code and Codex.&lt;/li&gt;
&lt;li&gt;Prompt-level rules, Codex, Cursor and Pi are wired the same way and covered by tests, but I'm still checking them live. Cursor has a known race with the context it accepts at session start.&lt;/li&gt;
&lt;li&gt;How good the suggestions are on lots of real data is the open question. The per-pitfall report exists so I can check that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next in the series
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 2.&lt;/strong&gt; Capturing sessions from four agents, and cleaning secrets locally before anything leaves your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 3.&lt;/strong&gt; The public library: &lt;code&gt;/keepplain:lookup&lt;/code&gt;, which lets your agent check how others solved a similar task, and &lt;code&gt;/keepplain:use&lt;/code&gt;, which takes a published playbook into your project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4.&lt;/strong&gt; Team rules in depth: review modes, limits, and what happens when a rule goes stale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built something similar, like a skills repo, a CLAUDE.md you maintain by hand, or a cron job that reads transcripts, I'd like to hear how you decide what becomes a rule. That line between a one-off remark and a pattern is the part I keep going back and forth on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;KeepPlain: &lt;a href="https://keepplain.com/?ref=devto-series-1" rel="noopener noreferrer"&gt;keepplain.com&lt;/a&gt;. It works with Claude Code, Codex, Cursor, and Pi.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
      <category>claude</category>
    </item>
    <item>
      <title>Run my octopus prompt with your agent: every run side by side, best octopus gets the gallery</title>
      <dc:creator>Evgeny Shevtsov</dc:creator>
      <pubDate>Sat, 10 Oct 2026 12:53:36 +0000</pubDate>
      <link>https://dev.to/eshevtsov/run-my-octopus-prompt-with-your-agent-every-run-side-by-side-best-octopus-gets-the-gallery-4gmi</link>
      <guid>https://dev.to/eshevtsov/run-my-octopus-prompt-with-your-agent-every-run-side-by-side-best-octopus-gets-the-gallery-4gmi</guid>
      <description>&lt;p&gt;Here's a prompt that makes coding agents build a procedural octopus that unscrews a jar lid from the inside, in Three.js, in one HTML file. Run it with whatever agent you use and send me the session. You get three things back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your run next to everyone else's. Same prompt, different agents, models, and setups, side by side: time, bugs, where a person had to step in, and token cost. A fair answer to "is my setup actually better" on one hard task.&lt;/li&gt;
&lt;li&gt;A spot in the gallery. The results post will show every octopus. Readers pick the best one, and that run gets the top of the post.&lt;/li&gt;
&lt;li&gt;Your name in the write-up, with a link to you, whether your run was the cleanest or the funniest failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last week I ran it through four models myself and &lt;a href="https://dev.to/eshevtsov/same-prompt-four-models-what-opus-sonnet-astra-and-sol-each-got-wrong-2a3"&gt;wrote up what each got wrong&lt;/a&gt;. The comments were better than the post: Arhan and Kartik both pointed out that one run per model proves nothing. So this time everyone runs it.&lt;/p&gt;

&lt;p&gt;All four runs are &lt;a href="https://keepplain.com/b/build-a-procedural-octopus-jar-escape-in-threejs-cjma/vs/build-a-procedural-octopus-jar-escape-scene-in-threejs,build-a-procedural-octopus-escaping-a-jar-in-threejs,build-a-procedural-octopus-jar-escape-in-threejs" rel="noopener noreferrer"&gt;side by side here&lt;/a&gt;, so you can see what yours will land next to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question underneath, if you care
&lt;/h2&gt;

&lt;p&gt;In those four runs, the agents that built themselves a way to check the scene early (step through the animation phase by phase, read the lid angle) ended with nothing broken. The one that checked late shipped with console warnings.&lt;/p&gt;

&lt;p&gt;Four runs can't separate "this model is careful" from "this run happened to check early". Arhan suggested the fix: forget the model for a moment, log when each run first ran a real check, and see whether earlier checks mean fewer bugs left at the end, across everyone's runs.&lt;/p&gt;

&lt;p&gt;To make that a real test, half of the runs get one extra paragraph in the prompt asking for the check up front. If that paragraph matters more than which model you picked, it should show.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to take part
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick your prompt by the day you were born. Odd day: prompt A. Even day: prompt B. This keeps people from choosing the one they think will win.&lt;/li&gt;
&lt;li&gt;Use any agent and any model you normally use: Claude Code, Codex, Cursor, Pi, something else.&lt;/li&gt;
&lt;li&gt;Start in a new, empty folder (a folder with an old run in it means the agent edits that file), paste the prompt exactly as written, and let it work. Don't help it. If you have to step in, that's fine; don't fix things by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send the session.&lt;/strong&gt; With the &lt;a href="https://keepplain.com/plugins?ref=devto" rel="noopener noreferrer"&gt;KeepPlain plugin&lt;/a&gt;: &lt;code&gt;/keepplain:build&lt;/code&gt; in Claude Code, &lt;code&gt;$keepplain:build&lt;/code&gt; in Codex, or &lt;code&gt;keepplain build&lt;/code&gt; in a terminal for any of them. No plugin? Upload the session file at &lt;a href="https://keepplain.com/new?ref=devto" rel="noopener noreferrer"&gt;keepplain.com/new&lt;/a&gt;. You see a preview before anything leaves your machine, and keys and tokens are redacted locally. Then publish it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Runs of the same prompt link to each other on the site automatically, so every published run shows up next to the others. That only works if the prompt is pasted unchanged. If you share a live link to your octopus (GitHub Pages, CodePen, anything), add it to your comment for the gallery.&lt;/p&gt;

&lt;p&gt;Then drop a link in the comments, along with your agent, model, and effort setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  About your own setup
&lt;/h2&gt;

&lt;p&gt;Something I had to think about before posting this: your agent isn't a clean room. Claude Code reads your global CLAUDE.md, any memory it keeps, your plugins and hooks. Codex reads your global AGENTS.md. Two people with the same model aren't running the same thing.&lt;/p&gt;

&lt;p&gt;I don't think that's a problem to hide. It's how people actually work, and the question is what happens in real setups. But please mention in your comment if you have global instructions like "always test first." One thing does matter: memory that can find earlier runs of this exact prompt. If your agent has KeepPlain or any other session memory connected, disconnect it for the run, or it may look up how other people's octopus went and skip their mistakes. The same goes for KeepPlain's personal rules: switch them off at keepplain.com/rules; they add lessons from your past sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt A
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a single self-contained HTML file: a real-time 3D scene of an octopus escaping from a glass jar by unscrewing the lid from the inside.

## Scene
- A glass jar (cylinder with a threaded neck) sits on a wooden table in a dim room. One warm light source from the side, soft shadows.
- The jar is filled with water. Inside is an octopus, fully procedural: a soft mantle, two eyes, eight tentacles with suckers. No external models or textures.
- The lid is a metal screw cap sitting on the jar's thread.

## Behavior — this is the core of the task
The octopus must actually unscrew the lid. Not a canned animation: the lid's rotation must be driven by the tentacles' contact with it.
1. Idle: the octopus rests at the bottom, breathing, tentacles drifting.
2. Exploration: it rises, several tentacles reach up and touch the lid's underside and rim.
3. Unscrewing: tentacles grip the lid and apply torque. Grip → rotate a fraction of a turn → release → re-grip. Each cycle advances the lid along the thread. The lid should rise as it turns (thread pitch), needing roughly 3–4 full turns to come free.
4. Escape: the lid tilts and falls off onto the table (with a small bounce and sound-free thud), the octopus pulls itself out through the neck and slides onto the table.
5. Loop back to idle in a new jar, or offer a "Reset" button.

Tentacles should be driven by inverse kinematics (or an equivalent chain solver) with visible per-segment bending. Suckers should press flat against surfaces they touch. The octopus body should squash through the neck, not clip through it.

## Interactivity
- Drag to orbit the camera, scroll to zoom.
- Space: pause / resume.
- A small on-screen readout: current phase name, lid rotation in degrees, and lid height.

## Visual quality
Aim for something people will stop scrolling for. Things that matter: refraction and caustics of the glass and water, the octopus skin (subtle color pulsing like chromatophores), suckers that read as suckers, believable wood and metal. Choose a palette and lighting mood deliberately.

## Constraints
- One .html file. Three.js is allowed via a CDN import map (use r165 or newer, ES modules). No other libraries, no external assets, no fetch.
- Must run at 60 fps on a mid-range laptop in Chrome. Keep geometry modest; spend effort where it's visible.
- No placeholder comments like "// add details here". Everything you describe must be implemented.
- Don't ask questions. Make reasonable decisions and ship the complete file in one response.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prompt B
&lt;/h2&gt;

&lt;p&gt;Prompt A, word for word, plus this at the very end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Before you build the scene
Build a way to check it first: expose the current phase, lid angle, lid height and which tentacles are gripping on window, and add a way to jump to any phase on demand. Use it to step through the whole sequence in a real browser before you call it done.
Only that paragraph differs, so if B runs end up cleaner, that's the reason.

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I'll do with the runs
&lt;/h2&gt;

&lt;p&gt;I'll write a small checker that opens every final file and tests the same things for all of them: the lid never turns backwards, it comes off, tentacles don't wrap around the octopus's own body, the console is clean. The checker won't be shown to any agent. Then one chart: minute of the first real check against bugs left at the end, A and B in different colours, all models pooled.&lt;/p&gt;

&lt;p&gt;Once there are enough runs to say something, I'll publish it here, including the runs that make my guess look wrong.&lt;/p&gt;

&lt;p&gt;My own runs go in too, same rules.&lt;/p&gt;

&lt;p&gt;If you don't want to publish a session, you can still run it and tell me in the comments what happened. That counts for something, just not for the chart.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Same prompt, four models: what Opus, Sonnet, Astra and Sol each got wrong</title>
      <dc:creator>Evgeny Shevtsov</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:56:29 +0000</pubDate>
      <link>https://dev.to/eshevtsov/same-prompt-four-models-what-opus-sonnet-astra-and-sol-each-got-wrong-2a3</link>
      <guid>https://dev.to/eshevtsov/same-prompt-four-models-what-opus-sonnet-astra-and-sol-each-got-wrong-2a3</guid>
      <description>&lt;p&gt;I ran one prompt through four models last week. Opus 5.5 and Sonnet 5.5 in Claude Code, GPT-6 Astra and GPT-6.1 Sol in Codex. The task: a single HTML file where a procedural octopus escapes a glass jar by unscrewing the lid from the inside.&lt;/p&gt;

&lt;p&gt;Astra was done in 14 minutes. Sonnet took 72. Opus hit the most bugs of the four and still finished with nothing open, while Sonnet's session had zero recorded bugs and its final build had console warnings.&lt;/p&gt;

&lt;p&gt;It's one run per model, so please don't read this as a benchmark. I watched four sessions end to end and changed my prompt because of them. That's all this is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The task
&lt;/h2&gt;

&lt;p&gt;The prompt was long. This is the line that made it hard:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The octopus must actually unscrew the lid. Not a canned animation: the lid's rotation must be driven by the tentacles' contact with it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any model can make an octopus wave near a lid. Here the lid only turns if tentacles grip it, so they have to grab, twist, let go, grab again, and the lid has to climb the thread as it turns. If that logic is wrong, a screenshot usually still looks fine.&lt;/p&gt;

&lt;p&gt;Everything else was set dressing. Dim room, wooden table, water in the jar, eight tentacles with suckers, no external models, orbit controls, a pause button and a readout of the phase and the lid angle. And "a single self-contained HTML file", which comes back later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Bugs it hit&lt;/th&gt;
&lt;th&gt;What it delivered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td&gt;Codex, high effort&lt;/td&gt;
&lt;td&gt;14 min&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Full sequence verified: ~58 s, 3.5 turns of the lid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;25 min&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;87 KB file, full loop tested through a local server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td&gt;Codex, high effort&lt;/td&gt;
&lt;td&gt;29 min&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Full cycle at 56–60 fps, pause and reset tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5.5&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;72 min&lt;/td&gt;
&lt;td&gt;0 recorded&lt;/td&gt;
&lt;td&gt;112 KB file, console warnings left at the end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The times include each agent testing its own work. The Codex runs were at high effort, and the Claude Code runs didn't record one. Different tools, one run each.&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%2Fmz8u2kpgxnvnrduw1nky.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%2Fmz8u2kpgxnvnrduw1nky.png" alt="Timeline of the four sessions: when each started checking the running scene, and where it found bugs" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT-6 Astra, 14 minutes
&lt;/h2&gt;

&lt;p&gt;Astra put everything in one file and treated the lid as a body that can only rotate. Grip forces from the tentacles turn it, and the thread pitch turns rotation into height.&lt;/p&gt;

&lt;p&gt;Before writing code, it looked up how similar builds had gone. One of those was my Opus run from below, which didn't find its worst bug until it could step through the animation phase by phase. Eleven minutes in, Astra built itself the same kind of check: a local server plus timed checkpoints which replay the sequence and read the simulation state out of the DOM.&lt;/p&gt;

&lt;p&gt;The checkpoints paid off two minutes later. Over the 3.5 turns, &lt;strong&gt;the tentacles were encircling the octopus's own body&lt;/strong&gt; instead of letting go and grabbing a fresh spot within reach. Watching it, you'd see busy arms.&lt;/p&gt;

&lt;p&gt;It rewrote how each arm picks its anchor, ran the checkpoints again and was done at minute 14.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opus 5.5, 25 minutes
&lt;/h2&gt;

&lt;p&gt;Opus built the scene in parts and glued them into a 1,735-line file. The first thing that broke was the skin shader, which wouldn't compile because a variable was called &lt;code&gt;patch&lt;/code&gt;. That's a reserved word in GLSL. Rename, move on.&lt;/p&gt;

&lt;p&gt;What happened next is why I'm writing this. Instead of waiting for the animation to play out in real time, Opus added temporary hooks so it could &lt;strong&gt;jump to any phase and check the numbers&lt;/strong&gt;. The first jump showed the lid sometimes turning &lt;em&gt;backwards&lt;/em&gt; while being unscrewed. I would not have caught that by watching it once.&lt;/p&gt;

&lt;p&gt;Once that was fixed, it stepped through the rest: the lid coming off, falling on the table, the octopus squeezing through the neck. It measured 0.68 ms of simulation and 1.1 ms of rendering per frame and deleted the hooks before handing over the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT-6.1 Sol, 29 minutes
&lt;/h2&gt;

&lt;p&gt;Sol started by picking a palette (brass, walnut, teal glass, a coral octopus) and then wrote a 309-line file where friction between tentacles and lid drives the thread. From minute 16, it read the live state off the canvas, so phase, lid angle, torque and grips were all visible to it.&lt;/p&gt;

&lt;p&gt;No bugs recorded. Most of the remaining time went into the look. Light colour, wood grain, light again, then two passes on how the body squeezes through the neck. Its own note at the end says it should have been told the fps target and the lighting mood up front.&lt;/p&gt;

&lt;p&gt;The result is solid. The lid comes off at 1260°, bounces on the table, and the octopus ends up next to the jar without clipping through the glass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sonnet 5.5, 72 minutes
&lt;/h2&gt;

&lt;p&gt;Sonnet split the work into 14 files and wrote a little build script to concatenate them. It opened a bare stub in the browser at minute 34, before the octopus existed.&lt;/p&gt;

&lt;p&gt;It then went deep on things nobody else touched. It profiled uneven frame pacing, found the lid never quite came to rest after falling, stepped through the bounces, and even checked the scene on a 375×812 phone viewport.&lt;/p&gt;

&lt;p&gt;No failure was recorded in that session. It did run into a duplicate JavaScript declaration twice, though, and &lt;strong&gt;its last check still showed that declaration and some WebGL feedback-loop warnings in the console&lt;/strong&gt;. Everything rendered and the readout worked, so it shipped like that. It also never ran the whole sequence live without stepping, or on an integrated GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm taking from this
&lt;/h2&gt;

&lt;p&gt;I stopped trusting the bug count. Opus logged two and ended clean because it found both. Sonnet logged none and ended with warnings, because nothing forced it to look at them. The number tells you what got caught.&lt;/p&gt;

&lt;p&gt;Every real bug in these four runs turned up while an agent was poking at the running scene. Nobody found one by reading their own code back. Astra and Opus built that kind of tooling early and found their bugs early. Sonnet opened a browser early too, but its checks were mostly about performance, and the warnings got through.&lt;/p&gt;

&lt;p&gt;The "self-contained" thing annoyed me more than it should have. Both Claude Code runs pulled Three.js from a CDN anyway (r170 for Opus, r167 for Sonnet), and Opus never opened its file straight from disk. I didn't check the Codex files for this. Either way, if a word matters to you, spell out what it means.&lt;/p&gt;

&lt;p&gt;And whatever the prompt left vague is where each run spent its extra time. For Sol that was lighting. For Sonnet it was frame pacing and the falling lid. Neither was wrong to care; I just would have picked something else.&lt;/p&gt;

&lt;p&gt;So this goes into the first prompt next time. Every one of the four sessions points to at least one of these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before you build the scene, build a way to check it:
expose phase, lid angle and grip state on window,
and let me fast-forward to each phase on demand.
"Self-contained" means no network: inline three.js.
Test the file opened from disk, not only from a server.
Target: 60 fps on an integrated GPU.
Lighting: one warm side light, dim room. Do not retune it.
&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%2F7d3yl4t68dee70ia0hge.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%2F7d3yl4t68dee70ia0hge.png" alt="The lines I'd add to the first prompt, merged from all four sessions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My guess is that with these lines, all four would finish faster and closer together. I'll rerun it and see.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sessions
&lt;/h2&gt;

&lt;p&gt;All four are public, with the moments that counted pulled out and the raw transcript a click away. I keep them on &lt;a href="https://coders.talk/?ref=devto" rel="noopener noreferrer"&gt;coders.talk&lt;/a&gt;, which I'm building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coders.talk/b/build-a-procedural-octopus-jar-escape-scene-in-threejs?ref=devto" rel="noopener noreferrer"&gt;GPT-6 Astra, 14 min&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coders.talk/b/build-a-procedural-octopus-jar-escape-in-threejs-cjma?ref=devto" rel="noopener noreferrer"&gt;Opus 5.5, 25 min&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coders.talk/b/build-a-procedural-octopus-escaping-a-jar-in-threejs?ref=devto" rel="noopener noreferrer"&gt;GPT-6.1 Sol, 29 min&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coders.talk/b/build-a-procedural-octopus-jar-escape-in-threejs?ref=devto" rel="noopener noreferrer"&gt;Sonnet 5.5, 72 min&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Has a "clean" run ever turned out to be your worst one? And for something physics-heavy like this, which model would you hand it to first?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your Git History Keeps the Code. Who Keeps the Lesson?</title>
      <dc:creator>Evgeny Shevtsov</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:18:09 +0000</pubDate>
      <link>https://dev.to/eshevtsov/your-git-history-keeps-the-code-who-keeps-the-lesson-24do</link>
      <guid>https://dev.to/eshevtsov/your-git-history-keeps-the-code-who-keeps-the-lesson-24do</guid>
      <description>&lt;p&gt;A commit can tell you when a help button appeared. It usually cannot tell you that the game had already passed its automated checks when the person building it said they had no idea how to play.&lt;/p&gt;

&lt;p&gt;That happened in one of my sessions with Claude Code.&lt;/p&gt;

&lt;p&gt;The project was BUTTERFLY JOB, a browser game built with Three.js and Blender assets. The player changes the past to make a bank heist possible in the present. The session records successful browser and unit checks. Then, at &lt;strong&gt;+3h 43m&lt;/strong&gt;, I stepped in because I could not work out what to do.&lt;/p&gt;

&lt;p&gt;The agent added a how-to dialog, a persistent guide, and a help button.&lt;/p&gt;

&lt;p&gt;Those changes belong in Git. So does the reason for them. But unless someone deliberately writes that reason down, the next developer sees the UI changes and has to reconstruct the lesson: &lt;strong&gt;a tested path through a game does not establish that a new player can discover that path.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://coders.talk/?ref=devto" rel="noopener noreferrer"&gt;Coders Talk&lt;/a&gt; to keep that part of working with coding agents.&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%2F1kdfvnvb5vvibaii2vjv.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%2F1kdfvnvb5vvibaii2vjv.png" alt="Two moments from the BUTTERFLY JOB Build: the author cannot understand how to play at +3h 43m; the agent adds onboarding at +3h 44m." width="772" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The correction and the response, preserved together in the &lt;a href="https://coders.talk/b/build-a-blender-authored-time-travel-heist-game-with-threejs#m-01m3rzra6vtph86hn0pnc23xps" rel="noopener noreferrer"&gt;public Build&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The diff is only part of the explanation
&lt;/h2&gt;

&lt;p&gt;Git preserves the changes we commit. A good commit message, pull request, or decision record can preserve the reasoning too. I still want all of those.&lt;/p&gt;

&lt;p&gt;But a lot happens before the final change makes it into a commit.&lt;/p&gt;

&lt;p&gt;You ask an agent to implement something. Its first interpretation is plausible, but misses a constraint. You correct it. It tries another approach. A test exposes a bad assumption. You add a detail that should have been in the opening prompt.&lt;/p&gt;

&lt;p&gt;By the time the work is ready, the code looks reasonable. The abandoned approach may be gone. The useful correction sits somewhere in a long conversation, between command output and another test run.&lt;/p&gt;

&lt;p&gt;Two weeks later, you remember solving something similar. You do not remember the sentence that changed the agent's direction.&lt;/p&gt;

&lt;p&gt;Keeping the raw log helps. Finding the relevant turn, understanding what preceded it, and deciding whether it applies to today's task still takes work.&lt;/p&gt;

&lt;p&gt;That is the gap I wanted Coders Talk to fill. I wanted to come back to a session and answer: what was the task, where did the approach break down, and what changed after the human stepped in?&lt;/p&gt;

&lt;h2&gt;
  
  
  A session becomes a Build
&lt;/h2&gt;

&lt;p&gt;In Coders Talk, a &lt;strong&gt;Build&lt;/strong&gt; is a working session condensed into its key moments, with the underlying record available at the level the author chooses to share.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://coders.talk/guide" rel="noopener noreferrer"&gt;format&lt;/a&gt; has a goal, a timeline, an outcome, and a verdict: what you would do differently next time. The timeline uses five kinds of moments:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Moment&lt;/th&gt;
&lt;th&gt;What it preserves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The request or constraint that set the direction.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent did&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A meaningful stretch of work: the approach and what it produced.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intervention&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What the person corrected, and why.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What broke or turned out to be wrong.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outcome&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Where the session actually ended, including an abandoned attempt.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You do not need every kind in every session. A run without a human correction is still worth keeping. So is a failure.&lt;/p&gt;

&lt;p&gt;The part I care about most is the &lt;strong&gt;why&lt;/strong&gt; attached to an intervention. “I stopped the agent” tells another developer very little. “The tests covered the route, but I could not discover the first action” gives them something to check in their own project.&lt;/p&gt;

&lt;p&gt;In the BUTTERFLY JOB session, an earlier correction made the asset requirement explicit: every visible 3D object had to be authored in Blender and exported for the browser. The agent then validated that pipeline with a representative asset before continuing.&lt;/p&gt;

&lt;p&gt;The same Build preserves both kinds of intervention: a constraint clarified near the start and a usability problem discovered near the end. That is much more useful to me than remembering only that the agent eventually produced a playable game.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it gets there
&lt;/h2&gt;

&lt;p&gt;With the &lt;a href="https://coders.talk/plugins#quick-start" rel="noopener noreferrer"&gt;plugin installed&lt;/a&gt;, you can send the session you are working in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code: /coders-talk: build
Codex:       $coders-talk:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a manual send, the plugin shows what it will upload and where the draft will go. It removes bulky session material, redacts detected secrets locally, and sends the prepared session. The server checks it again.&lt;/p&gt;

&lt;p&gt;A model proposes the title, moments, and draft verdict. You can edit those suggestions, explain the reason behind a correction, and confirm the summary describes what happened. The page identifies the model's contribution; summarizing a session does not make the summary infallible.&lt;/p&gt;

&lt;p&gt;The result starts as a private draft, or goes to your team's space when the session belongs to one of its repositories. Sending it does not publish it. Auto mode is optional and must be enabled separately.&lt;/p&gt;

&lt;p&gt;There is context behind the short read: the agent and model, session duration, interventions, and, where captured, token usage, code changes, and commits. That context helps you judge whether another person's experience is relevant to your task. One successful run does not establish a universal recipe.&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%2F3380h5pawgo9exyvduva.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%2F3380h5pawgo9exyvduva.png" alt="A session is prepared and sent to a private or team draft. A model proposes moments, the author reviews them, and the Build can inform the next task. Public sharing is optional." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You do not have to publish your work
&lt;/h2&gt;

&lt;p&gt;If your useful sessions happen in private repositories, you should still be able to keep the lessons.&lt;/p&gt;

&lt;p&gt;Coders Talk has three ways to use that record. You can keep it for yourself, use it inside a team, or publish a Build for other people to learn from. Public sharing is optional.&lt;/p&gt;

&lt;p&gt;For an individual, the immediate value is finding a previous correction without reading the whole conversation again. For a team, a recurring problem can become a proposed rule that teammates review before it reaches their agents. The &lt;a href="https://coders.talk/teams" rel="noopener noreferrer"&gt;team workflow&lt;/a&gt; keeps the rule connected to the session that explains it.&lt;/p&gt;

&lt;p&gt;When you do publish, you choose the exposure: a summary, selected excerpts, or the full session. A lesson can be useful without exposing the entire conversation.&lt;/p&gt;

&lt;p&gt;Private here describes who can access the Build. The prepared session is still uploaded and processed on the server. The plugin withholds environment and key-file contents and redacts detected secrets before upload; you should still review anything you intend to make public. The &lt;a href="https://coders.talk/plugins#what-leaves-your-machine" rel="noopener noreferrer"&gt;plugin documentation&lt;/a&gt; explains what is sent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson should reach the next session
&lt;/h2&gt;

&lt;p&gt;A record becomes more useful when it changes what you do next.&lt;/p&gt;

&lt;p&gt;A Build can have a &lt;strong&gt;Playbook&lt;/strong&gt;: an approach, pitfalls, and checks drawn from that session. On the page, you can inspect the moments behind the advice. Through &lt;strong&gt;Use this Build&lt;/strong&gt;, you can reuse it as a prompt, a skill, or a repository rule for &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;AGENTS.md&lt;/code&gt;. &lt;a href="https://coders.talk/changelog/2026-09-27-playbooks" rel="noopener noreferrer"&gt;Here is how Playbooks work.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For BUTTERFLY JOB, the Playbook carries forward the need to check whether a first-time player can find the first action. It links that advice back to the intervention that prompted it.&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%2Fs4mw4fnxn77bi7pooj5t.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%2Fs4mw4fnxn77bi7pooj5t.png" alt="The BUTTERFLY JOB Playbook shows six steps and two pitfalls, with each pitfall linked to its source intervention." width="772" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The advice has a source you can inspect, including the moment where automated checks proved insufficient.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your agent can also search published Builds through the &lt;a href="https://coders.talk/for-agents" rel="noopener noreferrer"&gt;Coders Talk MCP server&lt;/a&gt;, looking for similar tasks and recorded failures before starting, or when it gets stuck.&lt;/p&gt;

&lt;p&gt;That gives the next session a more specific starting point. Instead of a vague instruction to “test thoroughly,” you can ask for the check a previous session missed. You still have to decide whether it fits your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep one correction
&lt;/h2&gt;

&lt;p&gt;The easiest place to start is a session where you had to explain something twice.&lt;/p&gt;

&lt;p&gt;Find the correction that finally helped. Keep the context around it. Write down what you would put in the first prompt next time.&lt;/p&gt;

&lt;p&gt;You can do that in a Markdown file today. I built Coders Talk to make it easier to preserve the session behind that note, find it again, and carry its lesson into another run.&lt;/p&gt;

&lt;p&gt;If you want to try it, &lt;a href="https://coders.talk/plugins?ref=devto#quick-start" rel="noopener noreferrer"&gt;turn one session into a private Build&lt;/a&gt;. You can decide later whether it is worth sharing.&lt;/p&gt;

&lt;p&gt;What is one correction you keep giving your coding agent that you wish you had saved the first time?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
