Skip to content

feat: add contact-check skill for cold email permission (UK, US, CA, DE, FR) - #16

Open
gabrielaoimevbore-beep wants to merge 9 commits into
iPythoning:mainfrom
gabrielaoimevbore-beep:feat/contact-check-skill
Open

gabrielaoimevbore-beep wants to merge 9 commits into
iPythoning:mainfrom
gabrielaoimevbore-beep:feat/contact-check-skill

Conversation

@gabrielaoimevbore-beep

@gabrielaoimevbore-beep gabrielaoimevbore-beep commented Oct 14, 2026 •

Copy link
Copy Markdown

Exporters emailing buyers in Europe and North America run into rules that change by country. Germany's UWG wants prior consent for advertising email even to businesses, France has its own rules, a UK sole trader counts as an individual under PECR, and Canada's CASL depends on whether the address was published. Getting it wrong is how a sending domain gets reported and blocked.

This adds a small, optional contact-check skill. It's off by default, so nothing changes for anyone until they set PRECLEARED_SENDER_COUNTRY (GB or US). Once it's on, the SDR runs it before the Day 1 email to a new address:

  • skills/contact-check/check.mjs: Node 18+, no dependencies. It calls Precleared, prints one JSON line and exits 0 for ok_to_email (or when the check is off), 2 for don't email, and 3 when the check couldn't be made, including a response that isn't a JSON object with a known verdict.
  • workspace/AGENTS.md Stage 9: run it before the Day 1 email and send only on exit 0, with a footer that meets footer_text. On exit 2, follow next_step and note it in the CRM. On exit 3, hold that lead for the next run and carry on with replies and other leads. Save the receipt id with the lead.
  • workspace/TOOLS.md, the README skills table, deploy/config.sh.example (PRECLEARED_SENDER_COUNTRY empty by default, optional PRECLEARED_API_KEY) and the CHANGELOG.
  • scripts/validate-template.sh: a syntax check, a check that it stays off by default, a --dry-run request check, and checks that unexpected responses count as the check being unavailable, so CI needs no network. npm test passes on my fork: https://github.com/gabrielaoimevbore-beep/b2b-sdr-agent-template/actions/runs/38621068843

I haven't run a full deployment against one of the examples/. The AGENTS.md change is a single rule that only applies once PRECLEARED_SENDER_COUNTRY is set.

Once on, it works without a key (10 checks a day per server); a free key gives 25 a day.

Disclosure: I built Precleared, and I wrote this with help from Claude.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
- Only a JSON object with a known verdict counts as an answer; anything else exits 3, and text fields must be strings
- Exit 3 now means hold that lead for the next run and carry on with replies and other leads, rather than noting it as do-not-email
- Check again if the pitch or where the address came from changes
- validate-template.sh checks that unexpected responses count as the check being unavailable

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQdvgNwwnTYBHUGD2dPwFh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant