Skip to content

feat(onboarding): stop writing 'Keep informed' as an Intent - #1060

Merged
RisingOrange merged 3 commits into
mainfrom
feat/subscribe-emits-none
Aug 28, 2026
Merged

feat(onboarding): stop writing 'Keep informed' as an Intent#1060
RisingOrange merged 3 commits into
mainfrom
feat/subscribe-emits-none

Conversation

@RisingOrange

Copy link
Copy Markdown
Collaborator

Closes #1057. Supersedes #1059, which GitHub closed non-reopenably when #1014 merged and its branch was deleted; these are the same two commits cherry-picked onto main, and #1014's None value is now in main as 9289abc2.

/subscribe hardcoded intent=Keep informed, a value no form offers as a choice. /join's options are Act now / Volunteer / Lead, and since #1014 picking none writes None. So the field carried a value nobody could pick, which reads as a choice the person made.

The change

Both forms now submit None when the person picked no intent. Intent then means exactly one thing: which of the offered options they picked, or none. Provenance stays in Signup source (June 2026 subscribe form), which the CRM already treats as authoritative for these rows.

Three lines plus the docs:

  • SubscribeFlow.svelte: the hidden input writes None.
  • OnboardingFlow.svelte: collapses the isContinuation arm of the /join fallback (see below).
  • options.ts + docs/join-form-flow.md: prose that described the old split.

Why the continuation arm goes too

#1014 writes intent ? INTENT_VALUES[intent] : isContinuation ? 'Keep informed' : 'None'. That isContinuation arm is unreachable: the step-2 submit button carries disabled={(isContinuation ? !intent : ...)}, so a continuation cannot be submitted while intent is falsy, and the fallback only evaluates when it is falsy.

Dropping it is therefore behaviourally inert today. It is worth doing because it would otherwise be the last remaining Keep informed writer in the codebase, guarded only by a client-side disabled attribute. If that guard is ever relaxed, Keep informed writes resume silently and nothing reports it, since the value stays deliberately valid in the CRM vocabulary for historical rows.

Behaviourally inert

Every consumer treats None and Keep informed identically, so this changes analytics semantics only:

  • chapter_optin() — neither value is in CHAPTER_OPTIN_INTENTS; the subscribe branch keys on chapter-share consent anyway.
  • The Airtable escalation automation (wfl6875hJNujN1gx0) — triggers on Intent entering Volunteer/Lead.
  • The welcome/verification email — anything not Volunteer/Lead routes to the non-volunteer template.
  • The onboarder alert filters — subscribe rows post keep_informed=on, which is what those read.

What it costs

Intent alone stops distinguishing "picked nothing on /join" from "came via /subscribe"; that query goes through Signup source instead. Accepted: that field exists for provenance and is authoritative for this cohort.

Legacy

No form emits Keep informed any more. It stays in INTENTS because that list is the server's accepted-POST allowlist (isIntent in embed/onboarding-form/+page.server.ts), so dropping it would start rejecting a post rather than merely retiring a label. Migration cost is near nil: 106 rows carry it today, of which exactly one is a June 2026 subscribe form row (created 2026-08-20); the other 105 are pre-#1014 /join defaults.

CRM side

PauseAI/pauseai-civicrm#530 adds None to the member_intent vocabulary and is already open. Nothing further is needed there: the import and the System Status vocabulary guard both read the active option values dynamically.

Verification

pnpm check and pnpm lint both green locally (remaining warnings are pre-existing and untouched).

/subscribe hardcoded intent=Keep informed, a value no form offers as a choice:
/join's options are Act now / Volunteer / Lead, and picking none writes None
(#1014). So the field carried a value nobody could pick, reading as a choice the
person made.

Both forms now submit None when no intent was picked. Provenance stays in
Signup source, which the CRM already treats as authoritative for these rows.

Also collapses the /join fallback's isContinuation arm. That arm was
unreachable: the step-2 submit button is disabled while intent is falsy on a
continuation, so a continuation cannot be submitted without picking one. Leaving
it would keep the only remaining 'Keep informed' writer alive behind a
client-side guard, ready to silently re-pollute the field if that guard is ever
relaxed.

Behaviourally inert. Every consumer treats None and Keep informed identically:
chapter_optin (neither is in CHAPTER_OPTIN_INTENTS), the Airtable escalation
automation (triggers on Volunteer/Lead), the welcome email (anything not
Volunteer/Lead takes the non-volunteer template), and the onboarder alert
filters (which read keep_informed).

'Keep informed' stays in INTENTS as a historical value and is never written
again. PauseAI/pauseai-civicrm#530 adds None to the CRM's member_intent
vocabulary.

Closes #1057
Follow-up from review. The prose claimed the value stays "so historical rows
typecheck", which is wrong twice over: INTENTS never sees stored Airtable rows,
and the list is the server's accepted-POST allowlist (isIntent in
embed/onboarding-form/+page.server.ts). So 'Keep informed' is not merely
vestigial, it is still accepted from a post; dropping it from INTENTS would
start rejecting one.

No form emits it, which is the claim that actually holds.
@netlify

netlify Bot commented Aug 22, 2026

Copy link
Copy Markdown

Deploy Preview for pauseai ready!

Name Link
🔨 Latest commit d50468e
🔍 Latest deploy log https://app.netlify.com/projects/pauseai/deploys/6a918f951b85770008ca0e0a
😎 Deploy Preview https://deploy-preview-1060--pauseai.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 59 (🔴 down 11 from production)
Accessibility: 91 (no change from production)
Best Practices: 100 (no change from production)
SEO: 82 (no change from production)
PWA: -
View the detailed breakdown and full score reports
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@RisingOrange
RisingOrange merged commit b7fed75 into main Aug 28, 2026
9 checks passed
@RisingOrange
RisingOrange deleted the feat/subscribe-emits-none branch August 28, 2026 13:45
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.

Stop writing 'Keep informed' as an Intent: /subscribe should emit None

1 participant