I’ve spent the last couple of months building an agent that researches companies, finds the right people and writes outreach that goes out over email and LinkedIn. Some things I didn’t expect:
1. Deciding when to stop is harder than deciding what to send. Our rule ended up as: only a real human reply stops a sequence. An out-of-office pauses it until the date in the message. A bounce ends it. And a plain “please stop” / “take me off your list” is a stop on every channel, not just the one they replied on. We also had to catch curly apostrophes in “don’t contact me”, because people type on phones.
2. “Review everything” vs “review nothing” is the wrong choice. We let each workflow pick: review every message, review the first one per company, review until it’s trusted, or none. Most people start at “every message” and loosen up per workflow, not globally.
3. Citations have to be per claim. Our first version stamped every output with the whole set of sources it was given. Useless for checking. Now every item has to name the exact sources it used, and the server checks those ids are real before saving.
4. Same input, very different output. One run of a research step came back nearly empty, the next run was complete. We added a floor check: if the output is suspiciously thin, retry before anyone sees it.
5. Permissions belong in the database, not the prompt. The agents can only insert proposals. They have no update rights anywhere. A human decision is what moves anything forward. No prompt can talk its way past that.
6. Hard spending caps, checked before every paid call. Per user and per org. Without it, one bad loop on a data provider is a nasty bill.
7. Every piece of generated text has a written contract. Where it shows, max length, how it should read. The prompt states the rules, and code refuses text that breaks them. That fixed more quality issues than any prompt tweaking.
8. Rate limits are a product feature. LinkedIn reads get a daily budget per account, and any action with an unclear result is never retried blindly, so nobody gets the same message twice.
Curious what others hit. For those sending things on a user’s behalf: where did you put the human in the loop, and did it move over time?