Repository navigation
feat: add contact-check skill for cold email permission (UK, US, CA, DE, FR) - #16
Open
gabrielaoimevbore-beep wants to merge 9 commits into
Open
gabrielaoimevbore-beep wants to merge 9 commits into
gabrielaoimevbore-beep wants to merge 9 commits into
Conversation
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-checkskill. It's off by default, so nothing changes for anyone until they setPRECLEARED_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.mdStage 9: run it before the Day 1 email and send only on exit 0, with a footer that meetsfooter_text. On exit 2, follownext_stepand 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_COUNTRYempty by default, optionalPRECLEARED_API_KEY) and the CHANGELOG.scripts/validate-template.sh: a syntax check, a check that it stays off by default, a--dry-runrequest check, and checks that unexpected responses count as the check being unavailable, so CI needs no network.npm testpasses on my fork: https://github.com/gabrielaoimevbore-beep/b2b-sdr-agent-template/actions/runs/38621068843I haven't run a full deployment against one of the
examples/. TheAGENTS.mdchange is a single rule that only applies oncePRECLEARED_SENDER_COUNTRYis 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