How a research swarm on persuasive outreach became a wired, tested Gate — without ever letting the product break its own promise: can’t say what it can’t prove. This page documents the whole loop, from the question to the code that now runs on every line and every message.
Step 1 — the research
The question: how do you write personalized copy that drives a customer to act? Rather than answer from memory, a workflow fanned out 7 researchers — one per dimension of action-driving copy — each running real web searches, then pipelined each into an adversarial verifier that downgraded inflated single-vendor stats, then a synthesizer merged the verified findings into a playbook.
Step 2 — the insight
“Relevance you can’t verify reads as spam” is the same sentence as “can’t say what it can’t prove.” So the decision tree runs as two passes on one spine — permission, then action — and the Gate disposes on both.
The practical fallback you asked for is the spine of both passes: can’t resolve the company → don’t guess a sector; step down the identity ladder to the individual (role/seniority you can prove), then to an honest neutral default. Identity degrades gracefully; it never fabricates upward.
Step 3 — the implementation
The permission router (Pass 1) and the Gate’s provability checks (Axis A) already existed. This work added the action layer (Pass 2) and the persuasion-hygiene axis (Axis B) — at the line, the message, and the sequence scale — and enforced them where outbound copy actually flows.
| What | Where (code) | What it does | Status |
|---|---|---|---|
| Loss-frame angle | creative.ANGLES |
A loss cost-of-inaction angle that frames the status quo without inventing a number — provable by construction. |
wired |
| Gate · Axis A | creative.verify_copy |
Per-line provability: blocks superlatives, comparatives, recited competitors, ungrounded numbers, reciting the company under allude. |
existing |
| Gate · Axis B (line) | creative.verify_copy |
Per-line hygiene: blocks AI-tell phrases/words (delve, leverage, “hope this finds you well”…) and >1 em-dash. | added |
| Message Gate | creative.verify_message |
One CTA · ≤125 words (cold) · no cold calendar link · ≤1 link · no spam-promise wording · every line clean. Numbers stay claim-gated, not checked here. | added |
| Sequence Gate | creative.verify_sequence |
Never single-touch; no follow-up repeats a prior step verbatim. | added |
| Action-pool enforcement | variants.build_action_pool |
A variant now enters the optimizer’s pool only if claims_cleared AND message_ok. Provable-but-spammy never ships. |
wired |
| Policy surface | /policies · Anti-slop |
The message rules publish as a locked, platform-standard card set (grounded in the real thresholds), alongside the AI-tell defaults. | live |
Step 4 — verification
Every layer was exercised, and the behavior locked by added tests (existing tests untouched — Art. VII). The message Gate clears all honest variants (the cold meeting-ask is a warning, not a veto) and vetoes the spammy ones:
"We're the #1, best-in-class platform — guaranteed. Grab time: https://calendly.com/me → Also reply here →" ✗ blocked 2 CTAs — a message gets exactly one ask ✗ blocked a calendar link in a cold first touch ✗ blocked spam-promise wording (“guaranteed”) ✗ blocked line fails the Gate (unprovable superlative)
"Hi {name}, … A verified cut in total cost of ownership.
Worth a 20-minute look for {company}? Book a demo →"
✓ ok words: 26 · one CTA · clean lines
⚑ advisory cold touch leads with a meeting ask — a soft
interest question lifts reply (warns, doesn't block)
Step 5 — honest edges (Art. VIII)
/policies anti-slop standard.Numbers are deliberately not checked by the message Gate — in outbound copy they’re claim-backed and gated by the NLI claim Gate, so a real “30 EHR systems” ships while a fabricated stat is blocked one layer down.