Skip to content

feat(lifecycle): founder session offer as step one, one-word unsubscribe link - #1012

Merged
blove merged 10 commits into
mainfrom
blove/founder-email-campaign-0cdecc
Sep 5, 2026
Merged

feat(lifecycle): founder session offer as step one, one-word unsubscribe link#1012
blove merged 10 commits into
mainfrom
blove/founder-email-campaign-0cdecc

Conversation

@blove

@blove blove commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

What

  • All three steps are founder session offers in Brian's voice, each linking only his Google Calendar booking page. Research artifacts still gate and inform the internal summary but no longer select recipient copy; the five-minute enrichment wait is removed.
  • One-word unsubscribe link. Recipient mail now carries a plain HTML alternative rendered from the text part (paragraphs and HTTPS anchors only, no layout or tracking). The footer reads "To stop these emails, click here." The text part keeps the raw URL for text-only clients, and List-Unsubscribe headers are unchanged.
  • Guarded sender. sendRecipientEmail rejects any HTML part containing images, scripts, styles, forms, event handlers, non-HTTPS anchors, unknown elements, or a missing/duplicated unsubscribe anchor, before final authorization runs.
  • Draft checks approve exactly one booking URL; Calendly, cal.com, calendar.google.com and any other calendar.app.google path are still rejected.

Before merge

Verification

  • vitest lifecycle: 372 passed; growth: 455 passed
  • nx run lifecycle:check and nx run growth:build green
  • lint: warnings only, none new

🤖 Generated with Claude Code

…ibe link

- Step one of every campaign is now Brian's engineer-to-engineer session
  offer, written in his register (no contractions, one thought per line) and
  linking only his Google Calendar booking page. Research angles shape
  steps two and three only, and the five-minute enrichment wait is gone.
- Recipient mail gains a plain HTML alternative rendered from the text part
  (paragraphs and HTTPS anchors only) so the unsubscribe footer reads
  "click here" instead of the long signed URL. The Resend sender rejects
  any HTML part with images, scripts, styles, forms, event handlers, or a
  missing/duplicated unsubscribe anchor, before final authorization.
- The draft checks approve exactly one booking URL; every other calendar
  host or path is still rejected.

FOUNDER_BOOKING_URL is a placeholder until Brian's real booking link is
pasted in.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
threadplane Ready Ready Preview Sep 5, 2026 5:55pm UTC

Request Review

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval: this PR received an intelligent (AI) code review. See the review comments on this PR.

Comment thread apps/lifecycle/src/campaign/send.spec.ts Fixed
…if the email is relevant

Step two now mirrors step one in Brian's voice (30-minute hands-on session,
booking link). Research angles shape only the final step. The unsubscribe
footer reads "Is this email not relevant to you? Click here." in HTML and
carries the raw URL after "Stop here:" in the text part.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

blove and others added 2 commits September 5, 2026 10:08
…r depends on research

All three campaign steps are fixed founder session offers in Brian's voice,
each linking only the booking page. Research artifacts still gate and
inform the internal summary but no longer select recipient copy.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

…eer wording

Every campaign step opens with "Hey <first name>," when the persisted
display name is a plain name, and "Hey there," otherwise, so free-text
form input cannot inject into the email. Steps one and two say
"founding engineer" per Brian's samples.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

The three research angles now carry the same quick-note session offer,
founding-engineer wording, and booking link as the fixed steps, and a
cited angle again selects that flavor for its step.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove enabled auto-merge (squash) September 5, 2026 17:31
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove merged commit 30cb1d8 into main Sep 5, 2026
34 checks passed
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.

2 participants