Inspiration
Small companies now run several AI agents at once: one finds prospects, one writes, one sends. Sometimes a second team sells a sister brand on another channel. Each agent keeps its own notes, so one studio gets an email on Monday and a WhatsApp on Tuesday. Someone who said stop to one brand hears from the other. And nobody notices that the founder already knows someone there. We ran into all of this with our own agents.
What it does
Every agent shares one Relate graph: owners, brands, teams, agents, people, companies, every message and every reply. Before any send, the agent asks the graph can_contact(agent, person, brand) and gets back SEND, HOLD or BLOCK, with the reason in plain words:
- HOLD when anyone at the company was touched by any team of the same owner in the last 30 days
- BLOCK when the person opted out of any brand of the same owner, or the company already said no
- SEND with a warm intro path when one exists (founder to partner to friend to prospect)
Scouts search research notes by meaning, and in the same query the graph drops anyone touched, refused or opted out. When two scouts reach for one studio at once, a claim lets only one through. One "please stop" blocks every brand.
How we built it
- Relate embedded through the Python package
relate-db: one file (data/warmpath.rl), no server, nothing to deploy - The gate is one Cypher statement with three
CALLsubqueries: recent touches by any team of the same owner, refusals at the company, and live claims by other agents - Warm intros use
SHORTEST 1overKNOWS|WORKS_ATup to 4 hops - Hybrid recall: local embeddings (BAAI/bge-small-en-v1.5, 384 dims, no API key) and graph filters in one query
- The same file is served over MCP (
relate serve --mcp stdio --read-only), so Claude Code or any MCP host can ask its own questions - The CLI returns exit code 0 on go and 2 on hold or block, so any agent framework can call it as a tool
- 8 pytest tests. The gate check's median is 0.69 ms (p95 0.89 ms) on a small cloud VM
Challenges
Making one opt-out cover every brand of the same owner without copying data around, and keeping the whole decision in a single statement so it cannot drift between agents.
What we're proud of
The decision and its reason come from the same query, so an agent can never say "blocked" without saying why.
What's next
Plugging the gate into our live outreach CRM and WhatsApp and email senders, plus a shared timeline view for the humans who supervise the agents.
AI disclosure
We wrote the code, README and demo script with help from AI coding assistants. The narration is text-to-speech, and the video is rendered from our own HTML with Playwright and ffmpeg. All seed data is made up.