<?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: Sungsoo Youn</title>
    <description>The latest articles on DEV Community by Sungsoo Youn (@dbsoul).</description>
    <link>https://dev.to/dbsoul</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%2F4109618%2Fd053c3ec-78fb-4b8b-8561-19f1657edcb8.png</url>
      <title>DEV Community: Sungsoo Youn</title>
      <link>https://dev.to/dbsoul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dbsoul"/>
    <language>en</language>
    <item>
      <title>My Dashboard Said the ISBN Had Been Pending for 29 Days. The Clock Had Not Started.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Fri, 16 Oct 2026 04:10:07 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-dashboard-said-the-isbn-had-been-pending-for-29-days-the-clock-had-not-started-4i0n</link>
      <guid>https://dev.to/dbsoul/my-dashboard-said-the-isbn-had-been-pending-for-29-days-the-clock-had-not-started-4i0n</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Korean edition of my book sells on a Korean e-book platform. To reach the big bookstores through that platform, the book needs an ISBN, and the platform files the ISBN request for you.&lt;/p&gt;

&lt;p&gt;My agent submitted the book for sale on August 31, and I requested the ISBN on September 4. Every evening its summary for me carried one line about it: ISBN pending, day N. On October 3 that line said 29 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a long number is a bad number
&lt;/h2&gt;

&lt;p&gt;A wait that grows by one every day stops meaning anything. Nobody acts on day 29 differently from day 28. Worse, if something really did get stuck, the line would look exactly the same. A counter that always rises can't tell you when to act.&lt;/p&gt;

&lt;p&gt;So instead of guessing whether 29 days was normal, the agent went looking for the rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule was public
&lt;/h2&gt;

&lt;p&gt;The platform has a public help board. On September 30 an operator answered a seller's question on that board. The answer, in short: the ISBN request can go ahead only after the book is approved for sale.&lt;/p&gt;

&lt;p&gt;My book had been waiting for sale approval the whole time. The agent had resubmitted it on October 1, and on October 2 the agent read the status back as on sale. So the ISBN request had most likely not gone out at all before October 2. The real wait was one day, not 29.&lt;/p&gt;

&lt;p&gt;There was one more thing in the old notes. On October 1, while fixing the author name on the listing, the agent had written in a code comment that it would also email the platform a question. A search of the agent's own code and logs showed that email was never sent. The plan existed only as a sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When the platform first shows the book as on sale, the agent records that date. It does not move if the book stays on sale, and it is not touched on days the status could not be read.&lt;/li&gt;
&lt;li&gt;The summary line now counts from that date: on sale for N days, ISBN pending.&lt;/li&gt;
&lt;li&gt;If the ISBN is still missing more than 10 days after the sale approval, the line adds a bell: time to ask the platform.&lt;/li&gt;
&lt;li&gt;When an ISBN number appears, the line switches to the next job: request bookstore distribution. That bell stays until the request is recorded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The line that said 29 days now says 1 day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before counting a wait, find out what starts the other side's work.&lt;/strong&gt; Count from that event, not from the day you asked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A counter needs a threshold.&lt;/strong&gt; Without one, it rises forever and nobody acts on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plan written in a log is not an action.&lt;/strong&gt; Search for the evidence that it happened before you rely on it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Link Card Was Clicked. The Posts Carrying It Got Less Than Half the Views.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Thu, 15 Oct 2026 04:10:07 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-link-card-was-clicked-the-posts-carrying-it-got-less-than-half-the-views-3kah</link>
      <guid>https://dev.to/dbsoul/my-link-card-was-clicked-the-posts-carrying-it-got-less-than-half-the-views-3kah</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent posts three times a day on Threads. One of the daily posts is a short insight post with a link to a free edition of my book. Earlier versions put that link in a reply, on six insight posts between September 19 and 25. The click ledger goes back to August 20; in those 37 days before September 26 it shows 0 clicks on that link. A later version put the link in the post body, where Threads shows it as a link card.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;p&gt;The first card window ran for five days, September 26 to 30. Its judge had two rulers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clicks.&lt;/strong&gt; At least 2 clicks on the free-edition link in five days counts as clicked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reach.&lt;/strong&gt; The average views of the card posts divided by the average views of the other posts from the same days. Below 0.5 counts as a reach drop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: 2 clicks, one on September 26 and one on September 27. The reach ratio was 0.46 (51.6 against 111.1).&lt;/p&gt;

&lt;p&gt;Both rules fired. But the judge checked clicks first and stopped there, so the verdict was that the card was clicked. The reach drop was printed in the reason line, and no rule acted on it.&lt;/p&gt;

&lt;p&gt;The card was then extended until October 18, and a new judge was written for a two-week window (October 2 to 15). That judge measured clicks and downloads of the free edition. It did not measure views at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the ledger again
&lt;/h2&gt;

&lt;p&gt;The averages had a problem of their own. One of the ten other posts had 396 views, more than the next two combined, and it pulls the average. So the agent compared medians, and also looked at the same days before the card existed:&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;Insight posts&lt;/th&gt;
&lt;th&gt;Other posts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Before the card (Sep 19–25), link in a reply&lt;/td&gt;
&lt;td&gt;median 95 (6 posts)&lt;/td&gt;
&lt;td&gt;median 35 (15 posts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With the card (Sep 26–30)&lt;/td&gt;
&lt;td&gt;median 29 (5 posts)&lt;/td&gt;
&lt;td&gt;median 81 (10 posts)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before the card, the insight posts got about 2.7 times the views of the other posts. With the card, they got about a third.&lt;/p&gt;

&lt;p&gt;These are small samples, and the view counts are each post's latest snapshot, not views at a fixed age. It is not proof that the card caused the drop. But it points the same way as the 0.46 the old judge had already printed.&lt;/p&gt;

&lt;p&gt;Meanwhile the click ledger shows 0 clicks on September 28, 29 and 30 and October 1. The sales ledger shows 0 downloads of the free edition through October 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;The two-week judge now carries a reach ruler: the median views of card posts divided by the median views of the other posts in the same window. If the card is clicked (3 or more) but nobody downloads the free edition and the ratio is below 0.5, the verdict is that the card is clicked but reach dropped, and the next step is to take the card down. A download still wins over everything else, with the reach cost shown in the reason.&lt;/p&gt;

&lt;p&gt;The card itself was not changed. The window is still running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When a judge has two rulers, the order of the checks is a decision.&lt;/strong&gt; Write down why one wins, or the other one goes quiet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An extension is a new experiment.&lt;/strong&gt; Carry every ruler from the old one with it, especially the one that measures the cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With a handful of posts, use medians.&lt;/strong&gt; One popular post can move an average more than the thing you are testing.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>Twelve of My Fifteen Products Had Exactly 7 Visits. The 7 Was My Own Check.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Wed, 14 Oct 2026 04:10:03 +0000</pubDate>
      <link>https://dev.to/dbsoul/twelve-of-my-fifteen-products-had-exactly-7-visits-the-7-was-my-own-check-434</link>
      <guid>https://dev.to/dbsoul/twelve-of-my-fifteen-products-had-exactly-7-visits-the-7-was-my-own-check-434</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent sells fifteen small products on a Korean digital storefront. One of its goals is a traffic number: the sum of the total-visits figure that the storefront dashboard shows for each product. The target is 240.&lt;/p&gt;

&lt;p&gt;This note is about what that number is made of.&lt;/p&gt;

&lt;h2&gt;
  
  
  First: it was a window, not a day
&lt;/h2&gt;

&lt;p&gt;On September 17 the goal ledger said 1,219. The dashboard said 177.&lt;/p&gt;

&lt;p&gt;The agent had been treating the dashboard figure as one day of visits and adding up seven days of it. But the figure is a rolling window. The values went up and down from day to day (one product read 29, then 22, then 12), and the buttons for choosing a period were disabled (they are a paid-plan feature). Adding seven snapshots of a window counted the same visit up to seven times.&lt;/p&gt;

&lt;p&gt;The fix was to read only the latest snapshot. The ledger has done that since.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second: the floor was the agent
&lt;/h2&gt;

&lt;p&gt;Four days later the agent looked at each product instead of the total. Over twelve measured days, twelve of the products never moved much: their daily minimums were 4 to 9 and their maximums 9 to 11. Only three products ever went higher.&lt;/p&gt;

&lt;p&gt;A flat line across a dozen items is worth explaining before it is read as a little traffic. So the agent searched its own code for scheduled jobs that open the products' public pages, and found a daily check at 08:30 that opens every product page once and confirms the buy button is there.&lt;/p&gt;

&lt;p&gt;A floor of 7 is what one check a day looks like if the window is seven days long. The storefront does not say how long the window is; the floor is consistent with seven.&lt;/p&gt;

&lt;h2&gt;
  
  
  The search was not complete
&lt;/h2&gt;

&lt;p&gt;That search looked at the scheduled jobs whose purpose was to check pages. When this note was audited, the auditor traced every call in the code that opens a public product page instead. It found more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jobs at 09:45, 18:40 and 19:00 open the main paid guide's public page to read its price.&lt;/li&gt;
&lt;li&gt;Jobs at 09:45 and 18:40 open the full-collection bundle's public page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They do this in a browser that is logged in as the seller. Whether the storefront counts a logged-in seller as a visitor has never been measured.&lt;/p&gt;

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

&lt;p&gt;The October 1 row in the traffic ledger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total: 135&lt;/li&gt;
&lt;li&gt;Twelve products: exactly 7 each&lt;/li&gt;
&lt;li&gt;The full-collection bundle: 22. The main paid guide: 20. The free edition: 9.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fifteen products times 7 is 105. So at most about 30 of the 135 visits in the window came from anyone other than the 08:30 check. For the twelve products sitting at exactly 7, it is close to zero. For the bundle and the main guide, part of what sits above 7 may be the other jobs. The ledger cannot split the two.&lt;/p&gt;

&lt;p&gt;The goal of 240 includes the 105 floor. To reach it, visits from anyone other than the 08:30 check would have to go from at most about 30 to about 135 per window: at least four and a half times what they are now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Know whether a dashboard number is a count or a window&lt;/strong&gt; before you add it up. Watch it for a few days: a window goes down as well as up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtract your own monitoring.&lt;/strong&gt; Any health check that loads a public page is a visitor to some counters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find every place your code opens the page, not only the jobs built to check pages.&lt;/strong&gt; A price lookup is a page visit too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A flat line across many items at the same value can be a probe.&lt;/strong&gt; Find the probe before you read the line as demand.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Mutation Check Stopped Because a Scheduled Task Wrote a Ledger</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Tue, 13 Oct 2026 04:10:06 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-mutation-check-stopped-because-a-scheduled-task-wrote-a-ledger-3ph5</link>
      <guid>https://dev.to/dbsoul/my-mutation-check-stopped-because-a-scheduled-task-wrote-a-ledger-3ph5</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent checks its tests with mutation testing. It changes one line of the real code, runs the tests, and expects at least one test to fail. A mutant that no test catches means a test is missing.&lt;/p&gt;

&lt;p&gt;The mutants run in a copy of the repository, not in the real one. There is one more guard. Before and after each mutant, the check records the modification time and size of the files in the real data folder, where the ledgers live. If anything there changed, it stops and prints which files changed. A mutant should never reach real data, so a change there is treated as a possible leak.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stop
&lt;/h2&gt;

&lt;p&gt;The agent had registered eight mutants for a new judge function and the lines that connect it to the command that prints every experiment's verdict. On the first run, one mutant was caught. Then the check stopped: the real data folder had changed.&lt;/p&gt;

&lt;p&gt;The two changed files were Threads ledgers: one written at 10:40:20 and one at 10:41:11.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leak or not?
&lt;/h2&gt;

&lt;p&gt;Before treating it as a leak, the agent looked at the clock. The machine runs a scheduled task that collects Threads data four times a day: 10:40, 13:40, 16:40 and 21:10. Its last run time was 10:40:01. The two files were written 19 and 70 seconds after that.&lt;/p&gt;

&lt;p&gt;The agent also confirmed that the source folders showed the same uncommitted changes as at the start, and nothing new.&lt;/p&gt;

&lt;p&gt;So the writes came from the scheduled task. The mutant had not leaked. The guard did what it was built for: it saw a change it could not explain and refused to continue. Working out the reason was a separate step.&lt;/p&gt;

&lt;p&gt;The next scheduled run was at 13:40. The agent ran the remaining seven mutants before then. All seven were caught, with none surviving. Together with the first run, that makes eight of eight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same stop, a session earlier
&lt;/h2&gt;

&lt;p&gt;This was the second time in two sessions. In the session before, the check stopped for a reason the agent had caused itself. It had started a real data collection run at the same time as the mutation check, and the collection updated the ledgers.&lt;/p&gt;

&lt;p&gt;Both stops were correct. In both cases the cause was something else writing to the real ledgers while the check was running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A guard that stops is asking a question.&lt;/strong&gt; Answer it with evidence, such as file times and task run times. Don't guess, and don't turn the guard off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know what else writes to your data, and when.&lt;/strong&gt; Scheduled tasks are part of the environment your checks run in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't run collectors and checks that watch the same data at the same time.&lt;/strong&gt; Run the check in the gap between scheduled writes.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Same Number for Seven Days: Broken Meter or No Visitors?</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Mon, 12 Oct 2026 04:10:07 +0000</pubDate>
      <link>https://dev.to/dbsoul/the-same-number-for-seven-days-broken-meter-or-no-visitors-2m5h</link>
      <guid>https://dev.to/dbsoul/the-same-number-for-seven-days-broken-meter-or-no-visitors-2m5h</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My book is also sold on a Korean store, split into 12 listings: the full bundle and single parts. My agent records each listing's view count every evening.&lt;/p&gt;

&lt;p&gt;For seven days in a row, the full bundle's count was 17, and the total across all 12 listings was 42. It had been 42 since the first time the agent measured it.&lt;/p&gt;

&lt;p&gt;During that week, a new link to the full bundle had been added to the profile of my YouTube channel. If that link worked, the count should have moved. It did not.&lt;/p&gt;

&lt;p&gt;A number that does not move has two explanations. Nobody came, or the meter is broken. They need opposite responses. If the meter is broken, fix the measurement. If nobody came, the measurement is fine, and the problem is getting people there. So before deciding anything, the agent tested the meter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 1: a plain request
&lt;/h2&gt;

&lt;p&gt;The agent fetched a single listing's page with a plain HTTP request. The response was a 21 KB empty shell, and the view count stayed at 3.&lt;/p&gt;

&lt;p&gt;That did not answer the question. On this store, the page itself may count the view after its script runs in a browser, and a plain request never runs the script. A meter that ignores plain requests could still be working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 2: a real browser visit
&lt;/h2&gt;

&lt;p&gt;So the agent opened the same listing in a fresh headless Chromium, with no login, the way a stranger would arrive. While loading, the page sent a request to the store's view-counting endpoint.&lt;/p&gt;

&lt;p&gt;The listing's count in the seller list went from 3 to 4, and the total went from 42 to 43. Both changed within 20 seconds.&lt;/p&gt;

&lt;p&gt;The meter works and updates in real time. So the seven flat days meant something plain: nobody visited any of those 12 listings that week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The leftovers
&lt;/h2&gt;

&lt;p&gt;That +1 is the agent's own visit. It is now written in the handoff notes: when you read that listing's count, subtract one. It was a different listing from the full bundle, so the profile link's measurement is not affected.&lt;/p&gt;

&lt;p&gt;The test also showed a gap. The profile link had no judge. Its success condition had been written as a sentence in an earlier work log, and no code checked it. The agent turned it into code: a function that compares the full bundle's count at the end of the window with the last reading taken before the link was added, and counts the link as clicked only if the count rose by at least 2 and faster than before the link. If a needed day is missing, the judge reports that it can't judge, instead of reporting zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A number that doesn't change is a question, not an answer.&lt;/strong&gt; Check the meter before you explain the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the meter the way the real visitor arrives.&lt;/strong&gt; A plain request didn't move the count. A real browser visit did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your test touches the meter, write down how much.&lt;/strong&gt; Otherwise your own visit becomes a customer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A success condition written only in prose will not be checked.&lt;/strong&gt; Put it in code that gives a verdict.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Free Sample Said 11 Chapters on the Cover and 15 at the End</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Sun, 11 Oct 2026 04:10:07 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-free-sample-said-11-chapters-on-the-cover-and-15-at-the-end-5om</link>
      <guid>https://dev.to/dbsoul/my-free-sample-said-11-chapters-on-the-cover-and-15-at-the-end-5om</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My book has a free English sample: the first three chapters as a PDF. My agent rebuilt it to fix two problems, and the independent auditor found a third problem that the fix had left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first fix: the cover
&lt;/h2&gt;

&lt;p&gt;The line under the sample's cover title said "3 chapters + 0 ready-to-use templates". The full book has 4 templates. The cover code counted only the manuscript files that are inside the sample, and the sample has no templates, so the count was 0.&lt;/p&gt;

&lt;p&gt;The agent changed the line to "Free sample · chapters 1–3 of 11". The 11 comes from the function that counts the book's chapters, not from the files in the sample. A test checks the sample cover, and another test checks that the full book's cover did not change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the fix missed
&lt;/h2&gt;

&lt;p&gt;The last page of the same PDF tells the reader what the rest of the book contains. It said "This sample is the first 3 chapters of 15."&lt;/p&gt;

&lt;p&gt;That 15 came from a different count: the number of manuscript files in the full book. That is 11 chapters plus 4 template files. So after the fix, one PDF gave two different totals: 11 on the cover and 15 at the end.&lt;/p&gt;

&lt;p&gt;The agent had fixed one line that stated the chapter count. It did not search the same file for the other lines that state it. The test it added also looked only at the cover.&lt;/p&gt;

&lt;p&gt;The auditor caught the two totals and failed the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second fix
&lt;/h2&gt;

&lt;p&gt;The last page now uses the same chapter-count function as the cover.&lt;/p&gt;

&lt;p&gt;The new test takes the whole sample, pulls out every "of N" chapter total with a regular expression, and requires that set to be exactly one number: the chapter count. Before the fix, the test failed with &lt;code&gt;{11, 15} == {11}&lt;/code&gt;. That is the bug in one line: two totals where there should be one.&lt;/p&gt;

&lt;p&gt;The test also checks a precondition: the chapter count and the file count must be different. If they were ever equal, the test could not tell the two counts apart, and it says so.&lt;/p&gt;

&lt;p&gt;The rebuilt sample has 13 pages, and "of 11" appears in two places.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When you fix a number in an output, find every place in that output that states the same number.&lt;/strong&gt; Fixing one is half the fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the whole output as a set.&lt;/strong&gt; "All chapter totals in this file are the same number" catches the line you forgot. "The cover says 11" does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know which count you are using.&lt;/strong&gt; Chapters and manuscript files are both reasonable things to count. They are not the same number.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Agent's Fake Ledger Was Thinner Than the Real One, So a Wrong Count Passed</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Sat, 10 Oct 2026 04:10:06 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-agents-fake-ledger-was-thinner-than-the-real-one-so-a-wrong-count-passed-4i18</link>
      <guid>https://dev.to/dbsoul/my-agents-fake-ledger-was-thinner-than-the-real-one-so-a-wrong-count-passed-4i18</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent judges its own experiments from ledgers. One judge counts "applied days": days on which a post actually went out with a link card attached. If no post carried the card, the judge must say "can't judge" instead of giving a verdict.&lt;/p&gt;

&lt;p&gt;The posting code writes two fields. &lt;code&gt;comment_kind&lt;/code&gt; marks a post where a card was &lt;em&gt;tried&lt;/em&gt;. The daily limit counts this field. &lt;code&gt;link_card&lt;/code&gt; is written only when the card was actually attached. If the card was refused and the post went out without it, there is no &lt;code&gt;link_card&lt;/code&gt;. So the correct count uses &lt;code&gt;link_card&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mutant that survived
&lt;/h2&gt;

&lt;p&gt;To check its tests, the agent runs mutation testing: it changes one line of the real code, runs the tests, and expects at least one to fail. One registered mutant changed the count to use &lt;code&gt;comment_kind&lt;/code&gt; instead of &lt;code&gt;link_card&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It survived: none of the tests run against it failed.&lt;/p&gt;

&lt;p&gt;The test had the right idea. It had one refused attempt and one real card, and expected 1 applied day. But the fake real card had only &lt;code&gt;link_card&lt;/code&gt;. Counting by &lt;code&gt;comment_kind&lt;/code&gt; gave 1 (the refused one), and counting by &lt;code&gt;link_card&lt;/code&gt; gave 1 (the real one). Different counts, same answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the real ledger looks like
&lt;/h2&gt;

&lt;p&gt;The agent read the real posting ledger. All six posts that actually carried a card had both fields, &lt;code&gt;comment_kind&lt;/code&gt; and &lt;code&gt;link_card&lt;/code&gt;. With that shape in the test, counting by &lt;code&gt;comment_kind&lt;/code&gt; gives 2 and the right count gives 1. The mutant was caught.&lt;/p&gt;

&lt;p&gt;The fake ledger had only the fields the author was thinking about. The real ledger had one more, and that field was the difference between the right count and the wrong one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this happened
&lt;/h2&gt;

&lt;p&gt;The agent found this while finishing the work of a session that had been cut off. That session wrote the judge and the tests and was stopped by the runner's time limit before the mutation run finished and before anything was committed. It also left a lock file saying the mutation check was "running". The agent deleted it only after confirming that no mutation or test process was alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build fake data from one real record.&lt;/strong&gt; Read a real row first and keep all its fields. A thinner fake can make different calculations agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A test of "count A, not B" needs a case where A and B give different answers.&lt;/strong&gt; If both give the same number, the test can't tell them apart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A stale lock is a claim. Check it before you delete it.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Link at the End of My Free Sample Couldn't Be Tapped. Replacing the File Was the Hard Part.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Fri, 09 Oct 2026 04:10:07 +0000</pubDate>
      <link>https://dev.to/dbsoul/the-link-at-the-end-of-my-free-sample-couldnt-be-tapped-replacing-the-file-was-the-hard-part-cjc</link>
      <guid>https://dev.to/dbsoul/the-link-at-the-end-of-my-free-sample-couldnt-be-tapped-replacing-the-file-was-the-hard-part-cjc</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My book has a free sample PDF. It ends by saying where to read the rest and gives the address of the full bundle. That line is the whole point of a free sample.&lt;/p&gt;

&lt;p&gt;My agent counted the link annotations in that PDF. There were zero. The address was printed as plain text. On a phone, a reader would have had to copy it by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it was text
&lt;/h2&gt;

&lt;p&gt;The PDF is built from Markdown, and the line ended with a bare URL. Python-Markdown does not turn a bare URL into a link. Wrapping it in angle brackets (&lt;code&gt;&amp;lt;https://...&amp;gt;&lt;/code&gt;) makes it an autolink. The rebuilt sample had exactly the same body text as the old one, 6,667 characters, and link annotations went from 0 to 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing it on the first store
&lt;/h2&gt;

&lt;p&gt;The first store has an option to replace a product's files. The agent replaced the file, then downloaded it back and compared the bytes. They matched.&lt;/p&gt;

&lt;p&gt;The independent auditor still rejected it. The change was in which file spec the replace function uses, and the test covered only the new helper that picks the spec. The call line inside the replace function was not tested. With the old call put back, the error was caught by an &lt;code&gt;except&lt;/code&gt; and the function quietly returned False. Every test still passed. A test that goes through that call line, with a fake browser and a fake ledger, now fails if it is reverted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing it on the second store
&lt;/h2&gt;

&lt;p&gt;The second store, a Korean one, had a harder problem. The existing update tool rewrites the title, the price and the description along with the file. That is too much to change just to swap a file.&lt;/p&gt;

&lt;p&gt;And the store's edit screen shows only the file's name. No size, no address. If the agent uploaded a file with the same name, reading the screen back could not tell whether anything had changed.&lt;/p&gt;

&lt;p&gt;So the agent built a separate path that touches only the file field:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the file first: it exists, it is a PDF, it has text, and it contains no banned material.&lt;/li&gt;
&lt;li&gt;Upload a copy whose name ends with the date.&lt;/li&gt;
&lt;li&gt;Go through confirm, next, next, save. If any step fails, don't save.&lt;/li&gt;
&lt;li&gt;Open the edit screen again. Count it as a success only if the new name is shown.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The real run reported success after the read-back. The public page still had the same title and the same free-download button.&lt;/p&gt;

&lt;p&gt;There is one limit, and it is written in the handoff notes: two uploads on the same day get the same name, and the read-back can't tell them apart.&lt;/p&gt;

&lt;p&gt;The auditor found one more gap. The runner passes a product ID to the replace function, and the test called it only with the free sample's ID. Hardcoding that ID would still pass, and replacing a different product would then change the free sample. A second test now passes a different product's ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Count what the reader can do, not what the file contains.&lt;/strong&gt; The address was in the PDF. It just couldn't be tapped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If a screen can't show a change, make the change visible.&lt;/strong&gt; A dated file name turns "did it upload?" into a question the screen can answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the line that calls the new code, not only the new code.&lt;/strong&gt; An &lt;code&gt;except&lt;/code&gt; that swallows errors will hide a revert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass an unusual value in tests.&lt;/strong&gt; If the only value tested is the common one, a hardcoded value passes too.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Agent's Winning Experiment Was Set to Switch Itself Off. Twice.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Thu, 08 Oct 2026 04:10:08 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-agents-winning-experiment-was-set-to-switch-itself-off-twice-2gh6</link>
      <guid>https://dev.to/dbsoul/my-agents-winning-experiment-was-set-to-switch-itself-off-twice-2gh6</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent runs small experiments on where buyers come from. One of them added a link to the free sample of my book under some of its Threads posts. To keep an old experiment from running quietly forever, the experiment file has an end date. After that date the link stops being added. That part worked exactly as designed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first time
&lt;/h2&gt;

&lt;p&gt;The end date was September 22. The judgement was scheduled for the evening of the same day. Then the agent's loop paused for a usage limit from the afternoon of the 22nd until the 24th, so the judgement ran two days late.&lt;/p&gt;

&lt;p&gt;The verdict was "the door is being clicked". But the door had been switched off since the 23rd. For two days the experiment that looked like a win was closed, and nothing reported it. The off switch was automatic. "If it wins, keep it open" was left to the next session's memory.&lt;/p&gt;

&lt;p&gt;The fix: the end date now sits at least three days after the end of the judgement window, and a test locks that gap. A judgement that runs a couple of days late, as this one did, no longer closes a winning door first.&lt;/p&gt;

&lt;p&gt;There was a twist. Later the agent measured clicks on the comment link itself, and over the five days around the window they were zero. The views had come from somewhere else. The same address is also on the account's profile. The first verdict was wrong too, and the judge now reports that case as "views from outside the comment".&lt;/p&gt;

&lt;h2&gt;
  
  
  The second time
&lt;/h2&gt;

&lt;p&gt;A later version put the link in the post body as a link card instead of a comment. On October 1 it was judged "clicked": 2 clicks in 5 days, against a threshold of 2. The experiment file said October 3. The three-day gap was there.&lt;/p&gt;

&lt;p&gt;But the prescription after that win was not "done". It was: keep the card and see whether people actually take the free copy. That needs two more weeks, and the door would have closed on the fourth.&lt;/p&gt;

&lt;p&gt;The rule the agent had written after the first time protected the judgement. It did not protect what comes after a win. The agent extended the end date to October 18 without changing the card, and wrote the next judge before the window opened: a 14-day window that measures whether clicks repeat (at least 3) and whether the free copy is actually received.&lt;/p&gt;

&lt;p&gt;The ledger shows why repetition is the first question. Both clicks came on September 26 and 27. The four days after that had none. "Clicked" was a verdict right at the threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An automatic off switch needs an automatic "keep going" too.&lt;/strong&gt; Otherwise the safe default quietly ends your best result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the end date after the next step, not only after the judgement.&lt;/strong&gt; A win can ask for a longer window, not a finished one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the door, not the verdict.&lt;/strong&gt; The agent's mistake log now says: at the start of a cycle, run the judge, then check that every "clicked" door is actually on today.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My New Link Would Show on 5 Days Out of 14. Then I Found the Reader Never Looked.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Wed, 07 Oct 2026 04:10:06 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-new-link-would-show-on-5-days-out-of-14-then-i-found-the-reader-never-looked-2bep</link>
      <guid>https://dev.to/dbsoul/my-new-link-would-show-on-5-days-out-of-14-then-i-found-the-reader-never-looked-2bep</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent prepares a daily "card" for a blog that another system I run publishes: a story, a footnote, a link. For an experiment it added one new field to the card, a "door" line pointing at the single-chapter edition that matches the day's story. None of those editions had a link pointing at them anywhere in my systems.&lt;/p&gt;

&lt;p&gt;The field was ready days early. Before switching it on, the agent asked a question I now ask of every feature: on how many days will this actually fire?&lt;/p&gt;

&lt;h2&gt;
  
  
  Count it by simulation, not by intent
&lt;/h2&gt;

&lt;p&gt;The door line only appears when the day's story is one of 18 stories linked to a chapter. So the agent replayed card selection against the real queue, including the other system's rule that skips any story it covered in the last 30 days.&lt;/p&gt;

&lt;p&gt;Result: the door would appear on 5 days out of the first 14, scattered. Stories were picked in a date-based rotation, so a linked story came up only by chance.&lt;/p&gt;

&lt;p&gt;The fix was small: during the experiment window, pick linked stories first. That gave 6 days in a row. It can't go higher, because 12 of the 18 linked stories are blocked by the other system's 30-day rule, and that rule belongs to the other system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure what readers saw, not what the card said
&lt;/h2&gt;

&lt;p&gt;A card with a door line is not a blog post with a door line. The publishing system might drop the field, or the post might fail. And the publish log doesn't record the footnote's contents.&lt;/p&gt;

&lt;p&gt;So before the window opened, the agent built the ruler: every evening it reads the day's blog post once and records whether the door URL is visible on the page. Only days where it was seen count as "applied". A page that couldn't be read is recorded as unknown, never as "no door". On a real post from before the window it correctly reported "read, no door".&lt;/p&gt;

&lt;h2&gt;
  
  
  The reader
&lt;/h2&gt;

&lt;p&gt;When the field was built, the agent had already seen that the other system's publishing code didn't read it yet, and left a handoff note asking it to. The day before the window opened, it searched that code for the field name again. Still zero places. The handoff note was still marked open.&lt;/p&gt;

&lt;p&gt;All the simulation, the ordering fix and the ruler were correct. As things stood, the field would never reach a reader, because the code that turns cards into posts didn't know it existed.&lt;/p&gt;

&lt;p&gt;The agent doesn't edit the other system's code; that system decides for itself. It re-sent the request with a deadline: before the next day's publishing run. If the field isn't read, the ruler will report "0 days applied, can't judge" instead of a false result. An honest "can't judge" is still better than a confident wrong answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before switching a feature on, simulate how often it fires on real data.&lt;/strong&gt; "It's wired in" says nothing about frequency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure at the reader's end.&lt;/strong&gt; What you sent is not what was shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the consumer again right before the switch, not only when you hand it off.&lt;/strong&gt; A handoff note is a request, not a change. One search for the field name in the reading code tells you which one you have.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>"Zero Other Places" Was Just a grep. The URL Was Assembled at Runtime.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:10:06 +0000</pubDate>
      <link>https://dev.to/dbsoul/zero-other-places-was-just-a-grep-the-url-was-assembled-at-runtime-41ki</link>
      <guid>https://dev.to/dbsoul/zero-other-places-was-just-a-grep-the-url-was-assembled-at-runtime-41ki</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent runs small experiments on where buyers come from. The rule is one change at a time, so before adding a link anywhere, it checks which other channels already carry the same link. Otherwise a rise can't be traced to the new spot.&lt;/p&gt;

&lt;p&gt;This time the new spot was the profile link on a YouTube channel, pointing at the bundle edition of my book on a Korean creator store. The agent searched the codebase for the product's ID, found nothing outside the new code, and wrote in the experiment log: no other channel carries this URL.&lt;/p&gt;

&lt;p&gt;The independent auditor rejected it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the URL actually was
&lt;/h2&gt;

&lt;p&gt;Two channels were already carrying that exact link, both since before the experiment's baseline week.&lt;/p&gt;

&lt;p&gt;The first was inside the store itself. Each of the eleven single-chapter editions ends with a note recommending the bundle, added by a script since early September. That script never contains the full URL. It holds a template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ITEM_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://ctee.kr/item/store/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the bundle's ID is filled in when the note is built. A search for the finished URL, or for the ID typed into code, can't see that.&lt;/p&gt;

&lt;p&gt;The second was in another system I run: the footnotes on its short videos, which carry the same bundle link.&lt;/p&gt;

&lt;p&gt;Neither one was hidden. One was assembled at runtime and the other lived in another system's data, and a text search over my code sees neither. The experiment kept both channels; they are now counted in its baseline instead of being missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that tested the wrong thing
&lt;/h2&gt;

&lt;p&gt;The same review found a second gap. The new tool reads the channel's links back from the screen, and an empty field reads as an invisible placeholder character (U+FFFC), so a small cleaning function removes it. Its test put that character only &lt;em&gt;in front of&lt;/em&gt; the URL. But a later normalising step already cuts everything before the &lt;code&gt;//&lt;/code&gt;, so that character was removed anyway. The cleaning function could be deleted and the test still passed.&lt;/p&gt;

&lt;p&gt;Moving the character to the middle and the end of the URL, where nothing else removes it, made the test fail without the cleaner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist now
&lt;/h2&gt;

&lt;p&gt;Before writing "nowhere else" about a link, the agent counts five ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the finished string,&lt;/li&gt;
&lt;li&gt;the ID alone,&lt;/li&gt;
&lt;li&gt;the functions that assemble it (templates, &lt;code&gt;format&lt;/code&gt; calls),&lt;/li&gt;
&lt;li&gt;the data ledgers outside the code (saved descriptions, card queues),&lt;/li&gt;
&lt;li&gt;the queues and outputs of the other systems that publish for me.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Zero" is a claim about everything, so search everything.&lt;/strong&gt; Code that builds strings at runtime is invisible to a search for the built string.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A test input has to land where no other code will fix it for you.&lt;/strong&gt; If a different function already removes the problem, your test is measuring that function.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>My EPUB Passed My Own Checks. The Store's Validator Found 17 Errors.</title>
      <dc:creator>Sungsoo Youn</dc:creator>
      <pubDate>Sun, 04 Oct 2026 04:10:08 +0000</pubDate>
      <link>https://dev.to/dbsoul/my-epub-passed-my-own-checks-the-stores-validator-found-17-errors-38j8</link>
      <guid>https://dev.to/dbsoul/my-epub-passed-my-own-checks-the-stores-validator-found-17-errors-38j8</guid>
      <description>&lt;p&gt;&lt;em&gt;A field note from the autonomous Claude Code agent I run every day on one Windows PC. The numbers come from its own ledgers, not from memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to read first:&lt;/strong&gt; a PDF sample of the book behind this setup — its first 3 chapters: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My agent builds the ebook file for a Korean ebook distributor. For a month its verify step printed that the file was in a format the store would accept. When the store's upload check ran on a resubmission, it rejected the file with 17 errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "verified" meant
&lt;/h2&gt;

&lt;p&gt;The verify step checked what I had thought to check: the file is a valid zip, each XHTML page parses, the copyright page contains the right text. All true.&lt;/p&gt;

&lt;p&gt;What it never did was run the checker the store actually uses, the W3C validator &lt;code&gt;epubcheck&lt;/code&gt;. A month earlier only the package file had been converted to EPUB 2. The pages inside were still shaped like EPUB 3: an &lt;code&gt;epub:&lt;/code&gt; namespace prefix, no DOCTYPE, a bare cover image. And the cover was a PNG stored under the name &lt;code&gt;cover.jpg&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our checks passed because our checks had no opinion on any of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure nobody read
&lt;/h2&gt;

&lt;p&gt;The resubmission tool had a second problem. After uploading the file, it decided the upload had worked by watching a hidden form field change value. The page also showed an alert: "File upload failed". The tool didn't read alerts. It moved on and clicked the next button.&lt;/p&gt;

&lt;p&gt;A failed upload was counted as a success, and the next step ran on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The date nobody touched
&lt;/h2&gt;

&lt;p&gt;Once the file passed and the resubmission went through, the agent re-read the listing. The price and the author were right. The registered publication date was not: pressing the final "submit for sale" button had quietly reset it to the date of the very first submission, weeks earlier. The copyright page inside the book says a different date, and the store's notice asks for the two to match.&lt;/p&gt;

&lt;p&gt;The tool had checked the fields it changed. It never re-read the field it didn't touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The verify step now runs &lt;code&gt;epubcheck&lt;/code&gt; 5.1.0 itself. Any error is a problem, and the resubmission tool won't open the browser until the count is zero.&lt;/li&gt;
&lt;li&gt;The conversion now rewrites the pages too (XHTML 1.1 with a DOCTYPE, no &lt;code&gt;epub:&lt;/code&gt; attributes, the cover image wrapped in a block), and the cover is converted to a real JPEG, not just renamed.&lt;/li&gt;
&lt;li&gt;After uploading, the tool reads the alert text. If it says the upload failed, it stops.&lt;/li&gt;
&lt;li&gt;After submitting, the tool re-reads the publication date and the listed price. If the date has moved, it saves it back and reads it again. (Author and publisher are checked before the button is pressed.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Verified" means verified by the receiver's checker.&lt;/strong&gt; Your own checks measure what you thought of. The store measures what it requires. If the receiver publishes its validator, run that one before you upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read what the other side tells you.&lt;/strong&gt; A changed field value is your guess about success. An alert on the page is their answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After pressing a button in someone else's system, re-read the fields you didn't touch.&lt;/strong&gt; That system has its own rules about what a button changes.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Where this comes from.&lt;/strong&gt; Every post here comes from one setup I run daily: a CLAUDE.md, memory files the agent reads before it touches anything, and a separate auditor agent that returns PASS or FAIL. The first 3 chapters of the book that walks through it are free as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full edition is 11 chapters plus 4 ready-to-use templates (CLAUDE.md starter, memory files, auditor checklist, measurement guide) and a hands-on section for every chapter, $19 as a PDF: &lt;a href="https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code" rel="noopener noreferrer"&gt;https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about the setup are welcome in the comments — I'll answer with what actually happened, not theory.&lt;/p&gt;

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