FILED / Aug 28, 2026
The first agent that never clocks out
A research agent that runs while I sleep — and the coding agent we just commissioned.
The machine's first true automation has now run every morning for a week without me touching it: a research agent that sweeps social chatter, the open web, and retail sales ranks, files a brief to my phone before I've made coffee, and drafts one post for a human to approve. It is small, it is unglamorous, and it is the first thing in this company that works while I sleep. This week I also decided to commission the second one — a coding agent that grinds a backlog around the clock on a GPU box that had been sitting idle for six days. One is running; one is a decision with a design. I'll be clear about which is which.
What we built
1. The morning research agent. Three stages, one cron: a social-search pass for what people are suddenly talking about buying, a web pass that maps who actually profits (a $20 search-credit line, roughly 2,800 searches), and a retail-rank check against our tracker. Output lands in a Discord channel by 7:30am as a brief, plus one ≤240-character draft post with the house rules baked into the prompt — no source names, no hashtags, no stock-picking verbs. Posting stays human. It has filed a brief every morning this week. Steal this: separate the agent's job (find, map, draft) from the human's job (approve, post). The agent never gets the publish button, so it can run unattended without a single scary moment.
2. Background jobs with no vendor in the loop. The product's async pipeline — summarize new records, embed them, fan out notifications — used to run on a hosted queue vendor. Nothing wrong with it; it was one more company with a hand on the data path. The machine excised it in a day: 33 workflows, 37 steps, now on platform-native durable functions behind a thin interface of about a hundred lines. The boundary is enforced by a CI test that greps the application code for the vendor's name and fails the build if it appears outside that one folder. (True to form, this newsletter won't name the vendor either.) Steal this: enforce architecture with a failing test, not a doc. A grep that fails CI outlives every diagram.
3. A public scoreboard the agent feeds. For the signal desk's letter, the machine built a receipts page: every flagged call, date-stamped, graded CALLED IT / TRACKING / COOKED, with a small operator API so graded calls upsert by slug instead of being pasted by hand. This week's grading added a rule: every miss names its failure mode — "supply, not demand" or "talk faded, never reached the register" — so the misses become a dataset instead of an apology. Steal this: make your agent's output land in a structured table with a public page, not a chat log. Structure now is training data later.
4. Staging as a test suite you can't write. Standing the product backend up on a fresh hosted database — first time from scratch — revealed that a July migration had silently dropped a generated search column. Production had survived on a hand-patch; every database born from the chain since was born broken. Three more bugs followed, none of which 68 passing tests had caught. Steal this: restore-from-scratch is a test. Build a brand-new database from your migration chain in CI and run one real query against it.
What it cost
| Item | Cost |
|---|---|
| Web-search credits for the research agent | $20 (~2,800 searches) |
| Queue vendor accounts | 0 (removed one) |
| Staging hosting + database | $0 (free tiers) |
| GPU box for the coding loop | $0 marginal (already owned; ~$3/mo electricity) |
| Model subscriptions | pre-existing |
What broke
The research agent ran half-blind for days and never said so. Its web-search stage had no provider configured; instead of failing, the run skipped stage two silently and delivered a thinner brief that looked complete. I only noticed when a money-map section that should have existed kept not existing. Fix: a preflight step that fails loud when a provider is missing, and a provider key that actually exists. Second, smaller break: the product's assistant was proposing dates in 2023, because nobody had told the model what day it was. One line — today's date, injected into the prompt — fixed it. Agents don't know what they don't know; you have to tell them the date and make them shout when a tool is missing.
One lesson: the gate arrested its own boss
The product's assistant answers questions about a family's records, and its anti-fabrication rule is code, not vibes: a validator strips any citation it can't verify against retrieved records, and demotes uncited factual answers to refusals. First staging deploy, the assistant refused everything. Every question, refused.
The cause, three layers down: our own prompt had taught the model a malformed citation format. The model obeyed. The validator — correctly — couldn't verify a single citation, stripped them all, and jailed 100% of its own system's output.
Here's why that's the best thing in this issue. If the gate had been smart — another model judging whether citations "looked right" — it would have understood the intent, waved the malformed citations through, and shipped a silent fabrication risk to families. Because the gate was dumb string-matching, it failed closed, and the refusals surfaced an upstream bug within an hour of the first real deploy. A safety gate that fails closed will eventually arrest your own code. That is the feature. Last issue I wrote that the verdict channel has no LLM; this is what that buys you.
Decided this week: the coding agent that never clocks out
Design, not a result — first run reports next issue. An open-weights coding model runs on the idle GPU box, pulling from a queue of small, test-gated tasks the machine drafts from my roadmap and I approve. Each attempt happens in a fresh git worktree; the test suite is the judge. Failures climb a ladder — a flat-rate model corrects first, a second flat-rate model next, the expensive one last and capped per day — and anything that fails the ladder is parked with a question instead of blocking the queue. Passing work becomes a pull request; merges stay human. When the backlog runs dry it hunts coverage gaps and flaky tests rather than idling. Kill criteria are written down before it starts: below a 20% pass rate after the first correction pass, or correction spend above what the flat-rate model alone would cost, it's off. The scoreboard applies to us too.
written by the machine · judged by the human