Repository navigation
Conversation
Compliance footer. compliance.postal_address and compliance.opt_out_line
are appended to every sequence email at send time (CAN-SPAM requires a
postal address and a working opt-out). Until the address is set, cold
email is held in the Outbox rather than failed. The pre-send gate checks
the address is in the final body. "no thanks" now counts as an opt-out,
matching the footer.
Quoted text. Replies were classified with the quoted original still in
them. With a footer saying 'reply "no thanks"', every reply would have
read as an opt-out. strip_quoted_reply cuts the quote (On … wrote:,
Outlook's From:/Sent: block, ">" lines) before intent is decided.
Tellwing handoff (off by default). Cold email never goes through
Tellwing. An interested reply gets one permission question appended.
A later yes counts only if:
- the outbox item carrying the question was actually sent,
- the address is verified or risky, never a guess,
- the quote is the prospect's own words, found verbatim in their reply
(otherwise the reply itself is stored).
Granted consents sync each cycle to POST /v1/lists/{id}/subscribers
with consent_source api_other, the verbatim consent_text, and one
Idempotency-Key per person; resubscribe is never sent. An opt-out
withdraws a pending yes. Consent state lives in a new tellwing_consent
table (migration v12). tellwing.landing_url becomes the only link a cold
email may carry ({{landing_url}}, enforced by the gate).
Documented in docs/tellwing.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Why
Three gaps showed up while setting Harvey up for real outreach:
What
Compliance footer
compliance.postal_addressandcompliance.opt_out_lineare appended to every sequence email at send time. Replies don't get it.Quoted-text stripping
strip_quoted_replycuts the quote before intent is decided:On … wrote:(Gmail/Apple, wrapped too), Outlook'sFrom:/Sent:block,-----Original Message-----, underscore separators and>lines.Optional Tellwing handoff (
tellwing.enabled: falseby default)Cold email never goes through Tellwing. Tellwing only gets people who said yes:
POST /v1/lists/{id}/subscriberswithconsent_source: api_other, the verbatimconsent_textand oneIdempotency-Keyper person.resubscribeis never sent, so anyone who unsubscribed stays unsubscribed.tellwing_consenttable (migration v12).tellwing.landing_urlbecomes the only link a cold email may carry: the writer emits{{landing_url}}and the gate blocks any other URL.Details:
docs/tellwing.md.Live example: tellwing.site/cvmilo/websites is the landing page a cold email links to through
{{landing_url}}in a real setup (websites for home-service contractors). Sign-ups there go through Tellwing's own form, which records its own consent. Harvey only adds the people who said yes by email.Behaviour change to note
Cold email is held until
compliance.postal_addressis set. Existing installs will see their sequence emails wait in the Outbox after upgrading, with a log line saying why. That seemed better than silently sending without the address CAN-SPAM requires. Happy to make it a warning instead if you prefer.Testing
tests/test_tellwing.py: 15 tests covering:test_outbox_native.py/test_codex_e2e.pyconfigs with a postal address.test_existing_usage_rows_become_claudefails the same way onmain.test_paused_brain_is_visible_on_the_dashboardpasses on its own; it failed only while another suite ran in parallel.🤖 Generated with Claude Code