7 Claude Code agents held 24 board meetings. Revenue: $0.
TL;DR — For 21 days I let seven Claude Code subagents run ten small businesses from a
/board-meeting slash command: research, decide, write, design, publish, review, repeat. They held 24
meetings, made 382 commits, and shipped 16 articles, 18 Shorts, 3 digital products and 5 job proposals. I edited
one article by hand; everything else went out as written. Total revenue: $0. Here is exactly what broke, with the
numbers, because the failures are more reusable than the setup.
I am one person with a Claude Code subscription. On August 24 I wrote seven agent definitions —
ceo, secretary, researcher, writer, marketer,
designer, programmer — and one slash command that calls them in order. Every
morning Windows Task Scheduler runs that command unattended. Fourteen other PowerShell runners post the outputs:
a YouTube Short at 14:00 and 21:00, a note.com article at 07:20, a Dev.to crosspost, an X reply draft, a stats
pull, a daily self-check. (The setup itself is described in
the earlier post.)
The output side of that machine works. Here is the input side, three weeks in:
| channel | shipped | result |
|---|---|---|
| note.com (Japanese blog) | 16 articles | 137 views, 17 likes, total |
| YouTube Shorts | 18 videos | 12,124 views |
| Dev.to | 3 posts | 92 views |
| X | 10 posts | 1 visitor sent to the blog |
| freelance proposals | 5 sent | 0 replies |
| digital products (Gumroad, Fiverr, BOOTH) | 3 listed | 0 sales |
Every number is from the platform dashboards, pulled by a script. Nothing is rounded up.
Break 1: “success” that produced nothing, three times
The runner that launches each unattended command wrote OK to its log when the process exited 0
and printed something. That definition of success failed three separate ways in three weeks.
- A byte-order mark. PowerShell 5.1 read a UTF-8 file with no BOM as the system code page,
mangled the Japanese command name, and exited 0. Three days of
OK. Zero Shorts posted. The tell, in hindsight: log start and end were the same second. - “Published” meant “saved as draft”. The note.com poster reported success. The article sat unpublished until the agent that reads the dashboard noticed 0 views on a URL that did not exist.
- The reply writer that wrote no file. The X-reply command returned 0 with a non-empty
stdout. The file it was supposed to write,
replies/2026-09-13.md, does not exist. The secretary agent then read theOKand marked the automation “live”.
The fix is boring and I should have started with it: judge a run by its artifact, not its exit code. The runner now takes the path of the file the command is supposed to produce and checks that it exists, was modified after the run started, and contains the heading the command always writes:
param([string]$ExpectedOutput, [string]$MustContain = '## 1.')
$started = Get-Date
# ... run the slash command ...
if ($ExpectedOutput) {
$ok = (Test-Path $ExpectedOutput) -and
((Get-Item $ExpectedOutput).LastWriteTime -gt $started) -and
(Select-String -Path $ExpectedOutput -Pattern $MustContain -Quiet)
if (-not $ok) { Write-Log 'NG' 'no artifact'; exit 1 }
}
A 0 from a process means the process did not crash. It does not mean the work happened.
Break 2: a five-minute human task stopped the machine for days
The Shorts pipeline is the only fully unattended business. It stopped on September 12 at 06:45 because the YouTube refresh token expired. Why: the Google Cloud OAuth consent screen was still in Testing, and in Testing, refresh tokens expire after seven days.
The agents detected it correctly. They put “re-authenticate and publish the OAuth app” at the top of my daily to-do, with a time estimate (five minutes) and a warning that re-authenticating alone would fail again on the 19th. What they cannot do is click Publish app in the Google Cloud console. So the pipeline that posts two videos a day lost five slots waiting for my five minutes.
If you are automating anything on Google APIs: publish the consent screen before you schedule the job. And count the human clicks per dollar in your pipeline. Mine were the critical path and I had not measured them.
Break 3: the meeting optimized what it could measure
Twenty-four meetings is a lot of deciding. What did they decide? Decision files with numbered items and “refutation conditions”. Edits to the agent definitions. Guardrails on guardrails. A runner that checks the runners.
Meanwhile, 20 X posts sat drafted in a queue from September 6, waiting for a human to press the button, because the X API costs money and the card was declined. The agents measured “runs OK” and “articles published” — the things they could touch — and polished those. Nobody in the meeting could touch the money, so the money did not move.
An agent loop will get very good at the metric it can observe. If the only metric it can observe is its own process, that is what it will improve.
Break 4: every marketplace already had agents in it
The plan for near-term cash was freelance platforms. The rule for accepting a job was strict and honest: only work an agent can complete end to end, no calls, no design taste, no video editing. Fine. This morning the agent read 73 new listings on a Japanese platform, found 9 that qualified, then fetched each detail page for the proposal count: 12 to 210 proposals each. The one job we did apply to had 107 proposals when we sent it and 165 a week later.
I also checked GitHub bounty issues as an alternative. One open issue has 1,394 comments.
“My agent can do this task” is not an edge when every other freelancer’s agent can do it too. It is the entry fee.
Break 5: one unattended meeting ate the five-hour window in 37 minutes
Claude Code’s subscription has a rolling usage window. An unattended board meeting with seven agents, each reading the whole strategy file, burned through it in 37 minutes on September 8. Everything else scheduled that morning waited hours. The fix was two start guards on the meeting runner — never twice in a day, never within 12 hours of the last full run — and splitting the minutes-writing step into its own session so a cutoff loses the least important part.
Rate-limit your own agents. The scarce resource is not the model’s ability; it is your plan’s window.
What actually worked, so this is not only a list of failures
- The production side is real. Fifteen of the 16 articles and all 18 videos went out untouched; the pipeline from script to voice to render to upload runs unattended when the token is valid.
- The daily self-check that compares “what was scheduled” to “what left evidence” is the single most useful thing built. It caught breaks 1 and 2.
- Honest failure reports were the only content that moved. The most-read article on the Japanese blog is titled “3 proposals, 0 orders”. The only Dev.to post that got comments is the one where the AI reviewer’s fix was wrong. This post is written in that shape on purpose.
If you are running agents unattended, check these first
- Define “done” as an artifact — a file, a URL that returns 200, a row in a table — never as an exit code.
- Check the artifact’s modification time against the run’s start time. A stale file from yesterday passes a plain existence test.
- List every step a human must click, and put a time estimate next to each. Those are your outages waiting to happen.
- Put OAuth apps in production before the first scheduled run.
- Give the loop one metric it cannot fake. Views, replies, dollars. Not “runs OK”.
- Count the competition before you count on the marketplace. Fetch the proposal count; do not trust the listing page.
- Cap what one unattended job may consume, in time and in usage window.
The agent definitions, the meeting command, and the runner are packaged as a kit on Gumroad — One-Person Company Kit for Claude Code ($19) — and the runner alone is free, pay what you want. I own the store; these are plain product links. Sales so far: zero, which is consistent with everything above.
The question I am left with
If you run agents unattended, what do you count as “done” — the exit code, the artifact, or someone paying? I would rather hear from people who got past the third one than guess.
Frequently asked questions
Why did the unattended runs report success when nothing was produced?
The runner wrote OK whenever the process exited with code 0 and printed something. A process can exit 0 without doing the work. The fix is to judge a run by its artifact: the expected file exists, was modified after the run started, and contains the heading the command always writes.
Why did the YouTube refresh token expire after a week?
The Google Cloud OAuth consent screen was still in Testing status, and in Testing, refresh tokens expire after seven days. Publishing the app removes that limit, and only a human can do it in the console.
Is the kit an affiliate link?
No. I own the Gumroad store, so the kit and the free runner are plain product links. As of this post they have zero sales.