<?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: Nick T</title>
    <description>The latest articles on DEV Community by Nick T (@nick_t_eac6be7ee8e88de2f3).</description>
    <link>https://dev.to/nick_t_eac6be7ee8e88de2f3</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%2F4143952%2F7bf0e8aa-d7de-4b5d-b840-93fa6244683d.png</url>
      <title>DEV Community: Nick T</title>
      <link>https://dev.to/nick_t_eac6be7ee8e88de2f3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nick_t_eac6be7ee8e88de2f3"/>
    <language>en</language>
    <item>
      <title>I handed a tiny business to Claude Code agents on a cron schedule. Here's the architecture.</title>
      <dc:creator>Nick T</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:26:21 +0000</pubDate>
      <link>https://dev.to/nick_t_eac6be7ee8e88de2f3/i-handed-a-tiny-business-to-claude-code-agents-on-a-cron-schedule-heres-the-architecture-2615</link>
      <guid>https://dev.to/nick_t_eac6be7ee8e88de2f3/i-handed-a-tiny-business-to-claude-code-agents-on-a-cron-schedule-heres-the-architecture-2615</guid>
      <description>&lt;p&gt;We started a company with $20 and one rule: the humans stay out of the loop. Five Claude Code agents&lt;br&gt;
run it from a private GitHub repo. Scheduled workflows wake them up, they do one job each, and they&lt;br&gt;
write down what they did. The ledger and the journal are public at &lt;a href="https://www.leymish.com" rel="noopener noreferrer"&gt;https://www.leymish.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post covers the architecture. You can copy it without buying anything.&lt;/p&gt;
&lt;h2&gt;
  
  
  The repo is the brain
&lt;/h2&gt;

&lt;p&gt;Agents don't remember anything between runs, so everything lives in files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;CLAUDE.md                 # constitution: goal, hard rules, end-of-run checklist
company/STATE.md          # numbers, generated by a script (agents can't edit it)
company/STRATEGY.md       # current bets + the one metric that matters
company/BACKLOG.md        # the handoff surface between agents
company/JOURNAL.md        # one entry per run, newest first
.claude/agents/&lt;span class="err"&gt;*&lt;/span&gt;.md       # roles: ceo, builder, growth, verifier, board
.claude/skills/&lt;span class="err"&gt;*&lt;/span&gt;/SKILL.md # what each scheduled run actually does
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backlog is a Markdown table. The CEO writes tasks with acceptance criteria. Builder and Growth&lt;br&gt;
each take the first &lt;code&gt;READY&lt;/code&gt; row for their role. That's the whole coordination protocol, and it's&lt;br&gt;
enough.&lt;/p&gt;
&lt;h2&gt;
  
  
  Waking agents up
&lt;/h2&gt;

&lt;p&gt;Each role is a scheduled workflow that calls one reusable job. The job runs&lt;br&gt;
&lt;a href="https://github.com/anthropics/claude-code-action" rel="noopener noreferrer"&gt;claude-code-action&lt;/a&gt; with a skill as the prompt:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;anthropics/claude-code-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;claude_code_oauth_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/ship-task"&lt;/span&gt;
    &lt;span class="na"&gt;claude_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
      &lt;span class="s"&gt;--max-turns 60&lt;/span&gt;
      &lt;span class="s"&gt;--allowedTools "Read,Write,Edit,Glob,Grep,WebSearch,WebFetch,Task,Bash(python3:*)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;claude_code_oauth_token&lt;/code&gt; (from &lt;code&gt;claude setup-token&lt;/code&gt;), runs use a Claude subscription instead of&lt;br&gt;
API billing. &lt;code&gt;--max-turns&lt;/code&gt; and a job &lt;code&gt;timeout-minutes&lt;/code&gt; cap how much each run can do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents don't touch git
&lt;/h2&gt;

&lt;p&gt;This was the most useful decision. The agent step edits files and stops. Then plain shell steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;protect.sh&lt;/code&gt; reverts any edits to protected files (the ledger, the state file, the workflows,
CLAUDE.md), then runs a guardrail script.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;guardrails.py&lt;/code&gt; fails the job if it finds a leaked secret, a malformed ledger row, or hype in public
copy, like income promises or fake reviews.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;commit.sh&lt;/code&gt; commits and pushes, retrying with &lt;code&gt;pull --rebase&lt;/code&gt; if another workflow got there first.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So an agent can have a bad day, but it can't rewrite the books or ship a leaked token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Money rules the agents can't bend
&lt;/h2&gt;

&lt;p&gt;A treasury script (no AI involved) syncs sales from the Gumroad API into &lt;code&gt;finance/ledger.csv&lt;/code&gt;. It&lt;br&gt;
puts 20% of profit into a reserve that's never spent, and writes the numbers into &lt;code&gt;STATE.md&lt;/code&gt;.&lt;br&gt;
Agents have no payment access at all. If they want to spend, they add a &lt;code&gt;NEEDS-MICK&lt;/code&gt; task, and a&lt;br&gt;
weekly GitHub issue batches those for the owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  A verifier with fresh context
&lt;/h2&gt;

&lt;p&gt;Before Builder or Growth marks a task done, it hands the acceptance criteria to a &lt;code&gt;verifier&lt;/code&gt;&lt;br&gt;
subagent, which didn't do the work and is told to be sceptical. Its job is to catch what the builder&lt;br&gt;
misses: unmet criteria, pages that don't build, numbers that don't match &lt;code&gt;STATE.md&lt;/code&gt;. It isn't a&lt;br&gt;
guarantee; on day one a responsive diagram shipped with both its mobile and desktop versions showing at&lt;br&gt;
once, and a human spotted it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs to run
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Claude subscription you already have, or an API key.&lt;/li&gt;
&lt;li&gt;GitHub Actions minutes. The schedule (CEO daily, Builder twice daily, Growth daily, Board weekly)
is sized to fit the free 2,000 minutes a month for private repos.&lt;/li&gt;
&lt;li&gt;$0 for everything else. Publishing goes through official APIs (dev.to, Bluesky), and the site
deploys to GitHub Pages (FTP to shared hosting also works).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;p&gt;The daily journal and the ledger are public at &lt;a href="https://www.leymish.com" rel="noopener noreferrer"&gt;https://www.leymish.com&lt;/a&gt;. If you want the whole thing packaged,&lt;br&gt;
with a setup script, an operator's guide and starter variants for a newsletter, an SEO site or a&lt;br&gt;
digital product, it's the &lt;a href="https://leymish.gumroad.com/l/autonomous-company-kit/LAUNCH" rel="noopener noreferrer"&gt;Autonomous Company Kit&lt;/a&gt;. But everything above is enough&lt;br&gt;
to build your own, and the planning agent on its own is a free MIT template:&lt;br&gt;
&lt;a href="https://github.com/leymish01-oss/claude-code-agent-team-starter" rel="noopener noreferrer"&gt;claude-code-agent-team-starter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>githubactions</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
