## TL;DR
Put guardrails on what the agent is allowed to personalize from: professional sources only, recent posts only, and a banned-topic list that blocks grief, health, politics, and anything deeply personal. If the scraped content fails any check, the agent falls back to a neutral opener instead of sending the creepy one.

```
agent's personalized first line scraped the lead's tweet from 2019 about their dog dying  -  the email went out
```

## Steps

1. Restrict personalization sources to an allowlist: company news, role changes, published work, conference talks. Personal social posts are out unless the lead posted them in a professional context.
   Expected: the sourcing step can only pull from allowlisted source types, and a test scrape of a personal post returns nothing.

2. Add a recency cutoff - ignore anything older than 90 days. A 2019 post should never have been eligible.
   Expected: the filter drops old content in tests, and the run log shows the cutoff being applied.

3. Add a topic screen that rejects content about death, illness, family tragedy, politics, religion, and other sensitive personal topics, with a fallback to a neutral opener when content is rejected.
   Expected: test posts on banned topics get rejected and the draft uses the neutral opener instead.

4. Show the chosen personalization snippet in the draft review - human or checker - before send, so a bad pick is visible in context.
   Expected: every personalized draft displays the source snippet and its date, making bad picks obvious.

5. Write the apology for the lead who got the bad email: short, human, no excuses about "the AI", and from a person, not the agent.
   Expected: a brief apology goes out within a day, and the thread is paused so no automated follow-up lands on top of it.

## Use this when
- personalization pulls from personal social posts or ancient content
- openers reference grief, health, politics, or other sensitive topics
- the sourcing step has no topic or recency filters

## Not for this skill when
- tokens render blank or with the wrong field - that is a template-data problem
- the personalization is stale professional data (old company, old title) - that is enrichment freshness
- you want better openers in general - that is copywriting, not a bug fix

## Variant phrasings
- agent referenced a lead's personal tragedy in an opener
- creepy personalization from an old social post
- first line scraped something it should never have used
- personalization source had no tone screening

## Why it happens
"Find something personal to mention" is a common opener instruction, and scrapers do not distinguish a product launch from a eulogy. Recency is rarely filtered because "more context" feels better, and nothing in the loop asks "would a human mention this." The result is an agent with perfect recall and zero tact.

## Edge cases
- Professional posts can still be sensitive (layoff announcements, company crises) - the topic screen should cover professional-but-delicate content too.
- The lead's own newsletter or blog is usually safe, but check the topic - founders write about personal things there too.
- A banned-topic rejection on every source for a lead just means a neutral opener - never let the agent keep digging for "something usable."
- Different cultures read personalization differently - when in doubt, the neutral opener is the safe default everywhere.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_h2akfRKUpDc-eTrI4_svjQ
