Find and qualify
8From a stranger on the internet to a verified contact worth writing to.
- Publisher Scout
- Advertiser Scout
- Influencer Scout
- Enricher-Verifier
- Publisher Outreach
- Advertiser Outreach
- Reply Handler
- Demo Prep
Capability
A fleet that finds prospects, verifies them, writes, replies, onboards, watches the numbers and checks its own work — with every outward action held for approval.
Built to run my own products, because I needed the work done and could not hire it. Grouped by what they are for rather than by which product they serve — most of them run for more than one.
From a stranger on the internet to a verified contact worth writing to.
Agents whose only job is to notice when something has quietly stopped being true.
The part most outbound tooling ignores entirely.
Everything that has to be written, published or watched.
Agents that manage agents, because twenty-seven of anything needs a shape.
27 specialised types in the catalogue, plus a declarative spec kind for agents defined in configuration rather than code.
What it cost to learn
All four are from my own platform. Three of them were found in a single afternoon, behind one complaint: I paused an agent and it sent mail anyway.
01
restarted on deploy
pause was a status check, not a queue operation
Pause is the control most agent platforms implement least carefully. The symptom that exposes it is specific: an agent is paused, stays quiet, and then resumes on the next deploy — because pause was never the thing that stopped it.
The mechanism is worth understanding because it generalises. Pause was enforced in exactly one place — a worker checking status before doing work — while the scheduled jobs themselves remained queued. The queue kept firing, and every firing was one unrelated bug away from acting. Pause now unschedules the jobs and sweeps stale entries at boot, which is what the word should have meant from the start.
The general form: a control that is honoured by convention rather than enforced by construction will eventually not be honoured.
02
455 prospects
matched by a filter that could not tell unchecked from clean
The filter that decided who was safe to contact excluded anything marked invalid. It did not exclude records that had never been checked at all — and because the verification key was empty in production, nothing had been checked. Four hundred and fifty-five prospects sat in the gap between not-invalid and verified.
The same shape shows up elsewhere in the fleet and is now written into the code as a comment: a query for documents that have been reviewed and cleared must ask for the field to equal false, not merely to not equal true. The second form also matches every document where nobody ever looked.
It now fails closed. With no verifier, the filter returns nothing and zero messages go out, and there is an explicit override for when you genuinely want to send unverified.
03
275 vs 11
enrichment errors against successes before anyone noticed
This one is invisible from every dashboard, and the detection method is a ratio nobody thinks to compute. Contact enrichment was running in a container where the headless browser could never have worked — the image pointed it at a system binary rather than the one the library expects. Comparing error count to success count over a quarter gave the answer immediately: two hundred and seventy-five to eleven.
Nothing failed loudly, because the pipeline was designed to fall through to guessing addresses from a name and a domain — which produces plausible output indefinitely. An automation that degrades into guessing is more dangerous than one that stops, because its output still looks like work. Any fallback path that cannot be distinguished from the primary path in the output is a latent version of this.
Fixed, and — the part that matters — verified by launching the browser inside the running production container rather than trusting the build that claimed to contain it.
04
12 agents, one timestamp
identical to the second — the tell that a deploy had rewritten them
The deploy script re-ran the seed on every release, and the seed's update was applied as a set rather than an insert. Any agent already in the database had its status and its configuration overwritten with the seed defaults, every single time.
The evidence was unmistakable once I looked at it the right way: all twelve production agents shared an updated timestamp to the second, and every calendar link in their configuration was the placeholder from the seed file.
Seeding is now insert-only and the deploy step is opt-in. The broader rule is that a deploy should never be able to write to the rows an operator has edited.
05
Agents that act without asking are a liability wearing the costume of leverage. Every action that touches the outside world — an email, a post, an account change — is filed for approval rather than executed, and the interesting engineering is in that queue rather than in the models.
It is also where cost lives. Spend is recorded per agent run through the request context, so the question "what did this agent cost me this week" has an answer rather than an estimate.
This is the part I would build for someone else first. The agents are the easy half.
What that buys you
How the models behind these are routed, constrained and checked is under AI-native development.
It is the most common failure in an agent fleet and the hardest to see, because the output never stops looking like work. Five days, fixed price, findings in writing.
Get in touch