Provenance · personalization router + action layer

Two decisions, one tree: what you may say — gated by the identity you can prove — and what makes them act, the play that tier permits. The router proposes; the Gate disposes — now on persuasion too.

The research is blunt: relevance you can’t verify reads as spam, and nothing else fires — which is this product’s whole thesis. So the tree runs in two passes. Pass 1 (permission): classify the identity key, score per-field confidence, route to a personalization tier — assert an industry only at high confidence, else fall to a true neutral default. Pass 2 (action): the tier hands the copy agent exactly one provable hook, and the action layer turns it into a move that drives a reply — then the Gate verifies both the claim and the persuasion hygiene before a line ships.

Axis 1 — Permission · “what may I say?”
Provable identity → Tier 0·1·2·3 · say / allude / hold. Deterministic, cheap, itself provable. wired
Axis 2 — Action · “what makes them act?”
One trigger → loss-frame → matched-peer proof → one soft CTA. The copy research, encoded as the play each tier earns. partly wired now
wired — live in scene.py / creative.py today proposed — the research integration designed here; code target named, not yet merged

▸ Read the full engineering writeup — how the 15-agent research swarm became this wired, tested Gate.

Exhibit 1 — Pass 1 · the permission router: identity key → personalization tier wired

Unchanged spine, one rule made explicit: when the company won’t resolve, default down the identity ladder to the individual — never sideways to a guessed sector.

① Identity key: work email (first-party) · resolve_email() → domain → PDL company + person
TIER 2 · FIRMOGRAPHIC · SAY Works for any company size. A startup’s domain IDs the company even when reverse-IP only sees a CDN (gauntletai.com → Fastly). The visitor told us — so these facts are say (recitable), not allude.
email → company (high conf) + title / seniority (PDL person). A consumer mailbox (gmail.com) → no company → drop to the individual default ↓.
② Identity key: IP only (involuntary) — classify it · reverse_ip() → ip-api.com (cached): geo + org + mobile/proxy/hosting. Everything below is allude.
IP private / loopback / unreachable
TIER 0 · NEUTRAL Product-thesis landing, brand wash.
No signal → assert nothing. General default.
IP resolves → classify the network (priority order, as in code)
mobile = true? cellular gateway — geo coarse, no company
TIER 1 · LOCATION-AWARE NEUTRAL Region framing only. company void
Carrier IP geolocates to the gateway metro — treat location as low-precision.
proxy = true? VPN / proxy / Tor — the IP describes the exit node, not the visitor
…but does org still look corporate? (not a VPN-provider / hosting / ISP name)
TIER 2 · FIRMOGRAPHIC (med-conf) Corporate-VPN exception. Employee on the company VPN → exits via the company netblock = a real B2B signal.
Personalize, but cap industry confidence at MEDIUM (the netblock, not a clean office IP).
TIER 0/1 · NEUTRAL + BEHAVIORAL Commercial VPN → the IP signal is void. There is no other firmographic variable hiding in it.
Pivot to a different signal class: referrer / UTM / landing-path, language, or first-party (known cookie/email). Never fabricate firmographics.
hosting = true? datacenter / cloud — bot, scraper, or VPN exit
TIER 0 · NEUTRAL Not a human office IP.
Serve neutral; this is also where bot traffic lands — don’t spend enrichment on it.
is_isp — consumer ISP / carrier name? name heuristic (AT&T, Comcast…) — ip-api’s flags miss residential
TIER 1 · LOCATION-AWARE NEUTRAL The org is the provider, not the visitor’s company. company void
Location generally OK → region-aware copy, neutral backdrop, no industry/company claim. ← this is the AT&T / Tailscale-egress case.
⑤ none of the above → is_corporate = true · clean corporate office IP
Company resolved → PDL company-enrich → industry does PDL return an industry that maps to a known sector?
industry resolved · high confidence
TIER 2 · FIRMOGRAPHIC Industry-tailored copy + curated backdrop, region-aware. Allude — tailored, never recites “we detected you”.
+ if a competitive category is known → escalates to Tier 3 ↓
TIER 3 · FIRMOGRAPHIC + COMPETITIVE The gauntletai.com case. Competitor-research sub-agent → a brief of provable differentiators for the visitor’s category → copy agent drafts the comparative angle → the Gate verifies every comparative claim → unproven lines fall back to category value.
Allude the edge, don’t name the enemy. No “your current tool can’t…” — that recites an inferred vendor.
company resolved, but PDL industry sparse / no bucket match
TIER 1 · NEUTRAL (company-aware) Hold the industry specialization — don’t guess a sector.
Region + company-shape tone only; backdrop stays neutral. Falls to the individual default ↓ for the hook.
Default rule (the practical fallback): can’t resolve the company → don’t guess a sector, step DOWN the identity ladder to the individual. Firmographic (reverse-IP company) fails → try the person lane (resolve_email() → PDL person: role / seniority you can prove) → if no person either → honest segment / neutral default (General). A confident-looking sector on a guess is the exact failure mode this removes. Industry is opt-in by proof; identity degrades gracefully — it never fabricates upward.
Tier 0 — neutral (no provable signal) Tier 1 — location-aware neutral Tier 2 — firmographic (B2B) Tier 3 — + competitive (LLM + Gate)

Exhibit 2 — Industry needs a confidence gate — assertion is earned, not defaulted wired

ALLUDE HIGH

Clean corporate IP · PDL returns an industry · it maps to a known sector (optionally corroborated by the company domain).
Ship industry-tailored copy + backdrop. Still allude — shape to the sector, never recite that we detected it.

ALLUDE MEDIUM

Company resolved but industry is sparse/ambiguous, or a corporate-VPN netblock (not a clean office IP).
Shape tone only — region + company-aware framing, neutral backdrop. Hold the sector claim.

HOLD LOW / UNKNOWN

No company resolved (consumer ISP, mobile, VPN, bot) — nothing to attribute an industry to.
Never assert a sector. Fall to the General neutral default. ← the fix for “why is my industry mining?”

Why this matters: location is ~city-accurate on fixed-line broadband, so we treat it as generally correct (and still allude, never recite). Industry is a second-order inference (IP→company→PDL→sector) — each hop loses confidence, so it must clear a bar before it changes the page. A confident-looking sector on a guess is the failure mode we just removed.

Exhibit 3 — Pass 2 · permission × play: what drives action at each tier proposed integration

Each tier is a budget of provable facts. The play spends exactly that budget — no more (that’s creepy/unprovable), no less (that’s a wasted send). One trigger, a loss-framed implication, matched-peer proof, one soft ask. loss angle + AI-tell Gate now wired in creative.py · full play orchestration proposed

TIER 0 · NEUTRALbudget: nothing provable about this visitor
The play
Honest segment copy — don’t fake 1:1. Lead with the category pain + a matched-peer proof at segment level, label it segment-level. No merge tags pretending to be personal.
P#1 relevance-gateP#8 matched-peerangle default/peer
Example line
“Most RevOps leads at 200–300-person SaaS shops tell me the data’s in five tools and none of them agree.”
CTA: lowest-friction permission — “Worth a look, or not a priority?”
TIER 1 · LOCATION-AWAREbudget: region (allude) only
The play
Region framing, zero company/sector claim. Shape tone to the locale; never imply we know the employer. Region is a backdrop, not a hook.
P#2 one real anchorangle local
Example line
“Built for the way {region} teams actually run pipeline.”
CTA: soft interest — “Is that worth two minutes this quarter?”
TIER 2 · FIRMOGRAPHICbudget: industry + region + (person: role/seniority)
The play
One provable trigger → loss-frame → matched-peer proof → one personal-value line. ≤20-word opener from a public fact; convert the upside into the cost of inaction (only if the loss is real); proof from the visitor’s own segment with a sharp, non-round number; one line aimed at their standing.
P#2 triggerP#6 loss-frameP#7 personal valueP#8 sharp peer
Example line
“Saw {company} is scaling the SDR team — when outbound ramps that fast, account research usually becomes the choke point before headcount pays off.”
CTA: one soft interest question — never a calendar link cold (see Exhibit 4)
TIER 3 · + COMPETITIVEbudget: + a provable category differentiator (Gate-verified)
The play
Allude the edge, loss-frame the status quo — never name the enemy. Lead with a structural differentiator of our own product (provable by construction); frame the cost of the current approach. The Gate blocks any superiority claim or recited competitor.
P#6 loss-frameP#9 don’t pitch firstfn competitor_brief()
Example line
“Most tools personalize on guesses you can’t audit. Here, every line ships with its source — so nothing goes out you can’t defend.”
CTA: offer-based, named asset — “Want the 1-page teardown? No call needed.” (once warm)

Mapping back to your one-liner: “can’t figure out the company → default to individual” is the spine of Pass 2 too — Tier 2’s play degrades to Tier 1/0’s the instant the firmographic budget empties. The play always has a provable fallback move, so the page never blocks; it spends a smaller, honest budget.

Exhibit 4 — The ask, by temperature: drive action with one CTA, friction-matched to trust proposed integration

Rule: exactly ONE ask per message · ≤15 words · escalate commitment only as the lead warms · never a calendar link in a cold first touch.

friction ▁
Cold · 1st touch
Permission / one-word
“Worth a look, or not a priority right now?”
Max reply volume; busy senior buyers; breakup touches.
friction ▂
Cold · default
Interest question
“Is keeping ramp under 60 days on your plate this quarter?”
The default cold first ask. Costs the reader nothing = a micro-yes.
friction ▃
Hook present
Offer (named asset)
“Want the 1-page teardown? No call needed.”
When you hold a real, relevant asset + any personalization.
friction ▅
Engaged · touch 3+
Soft conversation
“Worth 15 minutes to compare notes?”
After light engagement, not before.
friction ▇
In eval · replied
Two-option time
“Tue 2pm or Thu 10am ET — or a time that’s easier?”
Only after a positive reply. Include timezone + one link.

Sequence, not single-touch: default 4–7 total touches, each carrying a new angle (never “just bumping this”), and reuse the same anchor signal across email · voicemail · call so the channels reinforce one identity. The CTA is the only place the message asks for a finite resource — so it’s the last thing to escalate. Wired: the no-cold-calendar-link veto (verify_message) and the never-single-touch / no-repeat rules (verify_sequence) are enforced; the staged escalation itself is the lead-temperature policy layered on top.

Exhibit 5 — The agent graph: a deterministic router, LLM leaves, one Gate wired spine

Every visit runs this graph. The spine is deterministic and reproducible; only two nodes call an LLM (Research · Copy agent); the Gate is the single point of disposition; and any blocked line falls back to provable copy — so the page degrades, never blocks. Drag to pan · ⌘/Ctrl-scroll to zoom · click a node for its spec · trace a tier.

Trace the path
det deterministic cache LLM cache llm agent (LLM) gate the Gate out render
control flow cache hit (skip LLM) Gate block → fallback loop · every navigation
Click any node — or trace a tier — to see what it reads, how it branches, what it outputs, its provable default, and the code it maps to. The full table is Exhibit 6 below.

wired Axis A — provability (verify_copy())

  • blocks unprovable superlatives (#1, best, leading)
  • blocks comparative superiority it can’t source (better/faster than, vs)
  • blocks reciting an inferred competitor (Clay, Apollo…)
  • blocks a number not in the facts (\d+% / \dx / $\d)
  • blocks reciting the company under an allude policy

+ wired Axis B — persuasion hygiene (verify_copy + verify_message)

  • per-line: blocks AI-tell phrases/words (delve / leverage / “hope this finds you well” …) wired
  • per-line: blocks >1 em-dash (one is fine) wired
  • offers the loss cost-of-inaction angle, provable by construction wired
  • message Gate — one CTA · ≤125 words · no cold calendar link · no spam-promise, in verify_message(); enforced where variants enter the action pool + on /policies wired
  • sequence Gate — never single-touch · no repeated step, in verify_sequence() wired

Exhibit 6 — Every node explained: input → branches → output → default → code

The same agent graph as a table — the accessible, printable form of the diagram above. Click a node in Exhibit 5 and its row flashes here.

NodeReads (input)BranchesOutputDefault / fallback
wiredIdentity key work email or visitor IP email present → first-party lane · else → IP lane company + person (email) or raw IP to classify consumer mailbox / no email → IP lane
wiredNetwork classify mobile/proxy/hosting + org name mobile · proxy · hosting · is_isp · is_corporate (priority order) which signal class the IP actually carries unreachable/private → Tier 0 neutral
wiredCompany enrich corporate domain / netblock → PDL company resolves? · industry maps to a sector? firmographic facts (industry, region) no company → person lane, then neutral
wiredConfidence score per-field: location / company / industry HIGH · MEDIUM · LOW/UNKNOWN the bar each claim must clear to surface below bar → hold the claim (don’t assert sector)
wiredTier route classify + score Tier 0 · 1 · 2 · 3 the permission budget + surface policy (say/allude/hold) always resolves to a tier — 0 is the floor
proposedPlay select the tier’s provable budget segment · region · trigger+loss+peer · differentiator the action move (Exhibit 3) budget empties → step down a tier’s play
proposedCTA / temperature lead stage (cold → replied) permission · interest · offer · soft-talk · two-option time exactly one ask, friction-matched cold/unknown → soft interest question
wired+BThe Gate every proposed line + facts + policy provable & clean? → ship · else → block verdict + reason per line any block → deterministic angle_copy ships

Read top-to-bottom, the tree never widens a claim it can’t back and never asks for more than trust earned: identity gates permission, permission gates the play, the play gates the ask, and the Gate gates the send. Every branch has a provable default, so the worst case is always honest, never broken.