Attorney review packet: first-run funnel copy and /tools copy (card #4835)
Status: research-only. This document does NOT constitute legal advice. Before any held string ships or any funnel flag flips, consult a securities/investment-adviser regulatory attorney licensed in Pennsylvania (and federal practice) for the advice-posture and hold-list items, a consumer-protection/advertising attorney for the subscription-disclosure items, and a privacy attorney for the privacy-notice items. Last updated: 2026-10-31 UTC. Snapshot:
origin/developat78b417d24. Sources as of that date; verify freshness. Delivery: NOT delivered. No counsel was contacted and no engagement was opened. Delivery goes to the engagement tracked in #3141 when counsel is available (new engagements are on hold).
Card: #4835 (epic #4818, funnel) and the /tools review queued by epic #4819.
Appendices (the inventories, one row per string). Each row carries an ID, a key (appendix A) or a file:line location (appendix B), the string and its guardrail tags; the source file, owner, route, flags and status of a row are stated once in the header of its group, so they are recorded at group granularity, not per row (the held-strings table in appendix A is the exception and carries a file per row):
docs/legal/research/funnel-copy-inventory-2026-10-31.md(appendix A, 480 rendered or pre-staged rows plus 9 held strings; the held journal line also appears in group A7 as PAY-059, marked HELD and not counted)docs/legal/research/tools-copy-inventory-2026-10-31.md(appendix B, 592 rows plus pre-staged proposals for three pages)
TL;DR
Nothing is counsel-cleared: of the funnel strings on develop, 8 are held with the counsel-hold-4835 tag and one more retention line is held by the lapse audit, none of the 9 renders, and every other funnel string renders behind default-OFF flags while the /tools strings carry no flag and go live on the next promotion of develop to main. The decisions staged for counsel are the four hold categories (edge, "your plan", leak-to-rule, numeric goal), the subscription-disclosure copy, two open privacy-notice points, and the advice-adjacent wording on three calculators, as 34 numbered questions in section 9. The web trial and its reminder email (#4831), the personal-rule store (#4828), the watchlist (#4829) and three calculator pages (#4842, #4843, #4844) are not on develop, so their copy is pre-staged or absent here and must be inventoried again when each lands.
1. What is in this packet and what is missing
1.1 Covered (on develop at 78b417d24)
| Area | Cards and PRs | Inventory |
|---|---|---|
| Promise, quiz, hand-off notices, Plan, web paywall, confirmation, Settings answers | #4825 (PR 4904), #4823 (PR 4903), #4826 (PR 4907), #4827 (PR 4910), #4830 (PR 4909), #4834 (PR 4911), #4824 (PR 4905) | Appendix A, groups A1 to A11 |
| iOS paywall | #4832 (PR 4908) | Appendix A, group A12 |
| Privacy policy, setup answers | #4837 (PR 4906) | Appendix A, group A13 |
| Pricing and trial numbers behind the paywall copy | #4820 (PR 4878, ADR-0152), #4821 (PR 4884) | Cited in A7 and in hold row HELD-09 |
/tools hub, shell, position size, options payoff (with call spread section), risk of ruin |
#4838 (PR 4895), #4839 (PR 4899), #4840 (PR 4901), #4841 (PR 4902) | Appendix B, groups B1 to B6 |
| Analytics events (not customer-facing) | #4833 (PR 4913) | Not inventoried; relevant only to the analytics claims in section 7 |
1.2 Not on develop (what is missing and what it changes)
The task for this card named #4842, #4843 and #4844 as dependencies that did not land. The check against develop found three further gaps that matter for counsel. Everything below is either pre-staged from an open PR or the design stage (clearly labelled in the appendices) or absent.
| Missing item | State at snapshot | Effect on this packet |
|---|---|---|
| Expectancy and profit factor page, #4842 | open, no page on develop | Appendix B group B7 lists the design-stage proposals (title, description, the "not future results" line). Not shipped copy. |
| Covered call page, #4843 | open, no page on develop | Group B7. The design records that the covered call "income wording" is queued for attorney review (design open question 4), so this is the page counsel should see first when it lands. |
| Risk/reward and breakeven win rate page, #4844 | open, no page on develop | Group B7. |
| Web trial, annual price, cancel link and day-5 reminder email, #4831 | PRs 4887, 4891, 4892 open | The reminder email is required by this card's inventory criterion. Its text is pre-staged from the head of PR 4892 (groups A14, A15), not from develop. The paywall's trial rows only render when the entitlement read backs a trial, and that read comes from these PRs, so the trial wording is not reachable end to end on develop. The onboarding_paywall_v1 Raptor flag and its console migration are in PR 4887 too. |
| Personal rule store, #4828 | open | The Promise screen (PRM-020) and the Confirmation row labelled "Personal rule" (CNF-008) refer to it. The leak-to-rule hold category has no rendered rule copy yet; new strings will need inventory. |
| Watchlist, #4829 | open | The only surface where a customer types a symbol. No strings yet. |
| Dashboard benchmark tile (second PR on #4827) | not built | The Plan section "Pinned to your dashboard" (PLN-009, PLN-023) describes it. |
| Stripe and App Store Connect annual and trial setup, #4836 | open | Not copy. The paywall prices come from one config (lib/paywall/priceConfig.ts) and are not yet verified against the live price records. |
| Pro feature list wording | owner marketing-strategist |
The slot is absent from the paywall by design. |
2. Context counsel needs
These statements are what the code and the decisions say today. Each has the file that backs it; none is a legal conclusion.
- Personalization uses only the user's own inputs. The Plan screen is a pure function of the answers held in the visitor's browser tab (
lib/plan/planModel.ts, header comment: "The Plan is an ECHO"). Every value shown is a value the visitor chose, or the registry default a skipped question stores, which is labelled "Default setting - change anytime." The five journal prompts are picked by the style answer id and nothing is generated (journalTemplateFor). A skipped benchmark stays empty; there is no default and no suggestion. - Tickers are never proposed. The quiz offers a fixed list of supported instrument classes (US stocks and ETFs, options) from
lib/traderProfileRegistry.ts; no screen has a ticker or symbol field, and the privacy text says no ticker symbols and no free text are stored./toolsexamples use the placeholder XYZ andscripts/lint-tools-copy.jsfails the build on a list of real tickers. The one planned surface where a customer types symbols is the watchlist (#4829), which is not on develop. - Execution stays deterministic. No funnel screen reads, creates or changes a trade order (the paywall and confirmation call the billing endpoints, which handle subscriptions only). The epic decision is that the personal rule is an advisory prompt only and never blocks, delays or changes an order (#4828 acceptance criteria require a test that no order path reads it); that store is not on develop. The Wheel Structure Engine (#4286) is out of scope here and has its own counsel-gated language track.
- No AI-generated content is shown. A word-boundary search of the funnel libraries, components and routes for OpenAI, Anthropic, LLM, GPT and generative returned nothing; the design rules say the same (
docs/design/funnel-v2/README.md, "no AI text"). - Audience and geography. The funnel is for public signups; the closed beta is unchanged. EU/EEA and Quebec visitors are geoblocked at signup, and on
/toolsthe signup call to action is hidden and analytics are suppressed for those visitors and for an unknown region (lib/tools/region.ts). - The company. The footer line reads "MooseQuest LLC dba Raxx" (PRM-024). Raxx is positioned as a rules-and-record tool, not an adviser; the existing analysis is in
docs/business/legal/2026-07-01-securities-attorney-question-list.md,docs/business/raxx-marketing-compliance-brief-2026-05-27.mdanddocs/legal/research/getraxx-differentiation-copy-review-2026-06-04.md. This packet does not restate it. The journal prompts on the Plan screen are the Shape 1 journal (docs/legal/research/shape-1-personal-sentiment-journal-compliance-2026-06-05.md). - Stage. Funnel copy ships behind default-OFF flags;
/toolsships with no flag. The operator decision of 2026-10-29 is that/toolspublishes without waiting for counsel and that review runs in parallel; the same decision keeps the four funnel hold categories held until counsel clears them.
3. Hold list
Status vocabulary: HELD (tagged in code, not rendered, blocks the flag); RENDERED-NEUTRAL (neutral replacement is on screen behind a default-OFF flag, not cleared); CLEARED (none: no sign-off is recorded for any string). Held strings carry the tag counsel-hold-4835; they are exported only for tests and no component imports them (verified by search at the snapshot; tests PromiseCopy4825, PlanCopy4827, PlanScreen4827, ConfirmationCopy4834 prove none renders).
3.1 Held strings (not rendered)
| ID | Category | Held wording | Where | Rendered instead | Status |
|---|---|---|---|---|---|
| HELD-01 | Edge as a promise | "Know your edge" | Promise headline | "Trade by your own rules." (PRM-002) | HELD |
| HELD-02 | "Your plan" framing | "Build my plan" | Promise button | "Get started" (PRM-004) | HELD |
| HELD-03 | "Your plan" framing | "Raxx turns the rules you write into a plan you can follow and a record you can review." | Promise sub | PRM-003 | HELD |
| HELD-04 | "Your plan" framing | "Your plan" | Plan heading | "Your starting setup" (PLN-002) | HELD |
| HELD-05 | "Your plan" framing | "Here is the plan built for you." | Plan sub | PLN-003 | HELD |
| HELD-06 | Leak-to-rule mapping | "The leak this rule closes" | Plan habit section | "You chose to track:" (PLN-020) | HELD |
| HELD-07 | Edge as a promise | "Your edge, written down" | Plan section label | "How you trade" (PLN-006) | HELD |
| HELD-08 | Numeric goal target | "Your monthly target" | Plan benchmark label | "Benchmark you set" (PLN-022) | HELD |
| HELD-09 | Retention claim (lapse audit, not a counsel tag) | "Your journal and history always stay yours and stay viewable on Free." | Paywall, behind JOURNAL_LINE_CONFIRMED = false; also listed in appendix A group A7 as PAY-059, marked HELD and left out of the rendered count and the scan |
nothing | HELD |
HELD-06 to HELD-08 are stand-ins that name their category; the code comment in lib/plan/planCopy.ts says the real held strings come from this packet and replace them. This packet does not invent held wording. Replacing the stand-ins is a code change for the card that records counsel's answer.
3.2 Rendered neutral wording that sits on a hold category
These are on screen (behind flags) in place of the held wording. They are listed so counsel clears or rejects them, not only the held text.
| Category | Rendered neutral wording | Rows | Status |
|---|---|---|---|
| Edge as a promise | None. A search of every rendered funnel and /tools string found no "edge". |
n/a | nothing to clear |
| "Your plan" framing, trading sense | None rendered. The route /start/plan and the flag onboarding_plan_v1 carry the word, and the URL is visible in the address bar (question A2). |
route and flag | RENDERED-NEUTRAL |
| "Plan" as a billing noun | Every row tagged G1p in appendix A (24 rows). Examples: "Choose a plan" (paywall title, iOS lede), "Plan status", "There is a payment issue with this plan.", "You already have a plan", "Other plans", "The plan details were updated.", reminder email "Review or cancel your plan", "There is nothing to cancel on your plan right now." | The full G1p set, which is the set counsel's answer to A2 decides: PAY-001 to PAY-003, PAY-006, PAY-062, PAY-073, PAY-075 (paywall); CNF-017, CNF-024, CNF-025, CNF-032, CNF-034, CNF-080 (confirmation); IOS-002, IOS-004, IOS-011, IOS-014, IOS-062, IOS-065, IOS-067, IOS-071 (iOS); EML-004, EML-007 (reminder email, pre-staged); BIL-002 (billing notice, pre-staged) | RENDERED-NEUTRAL (EML and BIL rows: PRE-STAGED); scope of the hold is question A2 |
| Leak-to-rule mapping | "Which habit would you most like to track in your own trades?" with five habit options; Plan "You chose to track: |
QZ-008 to QZ-010, QZ-032 to QZ-037, PLN-008, PLN-014 to PLN-021, PRM-016, PRM-017, PRM-020 | RENDERED-NEUTRAL |
| Numeric goal target or benchmark display | Quiz question 5 ("Is there a number you want to compare your results with, after the fact?"), the number and unit fields, the Plan echo ("Benchmark you set", the number in words, "How your results compare to the benchmark you set, after the fact..."), the Promise step 3, the Settings row and note | QZ-011 to QZ-013, QZ-038 to QZ-046, PLN-009, PLN-022, PLN-023, PRM-023, SET-011, SET-013 | RENDERED-NEUTRAL |
The quiz rows in the last two lines render on onboarding_quiz_v1 alone, not on onboarding_plan_v1; section 6.1 records what that means for questions A3 and A5.
4. Guardrail map
The codes are the "Touches" column of both appendices. The column is a mechanical pattern match, a triage aid and not a legal conclusion; a dash means no pattern matched, and counsel reviews every string regardless.
| Code | Guardrail | Source | Where it bites most |
|---|---|---|---|
| G1 | Hold categories: edge as a promise, leak-to-rule mapping, "your plan" framing, numeric goal targets (a goal is stored as a personal benchmark and shown only retrospectively) | Epic #4818 decisions 2026-10-29; card #4835 | Promise, quiz 4 and 5, Plan, Settings, Confirmation. On /tools the word "target" means a target price the visitor types, so G1 is not used there. |
| G1p | The word "plan" used as a billing noun | Scope question A2 | Paywall, Confirmation, iOS, reminder email, billing notice (24 rows, listed in section 3.2) |
| G2 | Retrospective and structural language only: no forward-looking, predictive or emotion-labeling copy; no performance promise, testimonial, urgency or social proof | Rules for the epics; #4819 guardrails 2 and 3 | "after the fact" wording, "in this simulation", "Real results differ.", "appears here once trades are recorded" |
| G3 | No broker, payment-processor or data-vendor name in customer copy. Apple is named only in the iOS platform-required subscription wording | Rules for the epics; ADR-0152 section 2.7 | iOS paywall |
| G4 | Tickers are never proposed; the user supplies instruments; placeholders only (XYZ) | Rules; #4819 guardrail 1 | Quiz question 1, Plan, /tools examples |
| G5 | Deterministic execution; no AI-generated content; the rule is advisory and never blocks; nothing is a recommendation | Epic #4818 | Promise step 2, Plan sub, /tools disclaimer and hints |
| G6 | No recommended or default amount or risk percentage; numbers are the user's own | Epic #4818 (#4828 criteria); #4819 guardrail 1 | /tools risk percent fields, risk profile step |
| G7 | Billing terms disclosure (price, trial, renewal, cancellation), equal-weight Free option, no urgency; "free" claims | Epic #4818; ADR-0152 sections 2.4 and 2.5 | Paywall, Confirmation, iOS, email, /tools call to action |
| G8 | Privacy and data-handling claims (held in the tab, stored, deleted, analytics, stays in the browser) | #4837; #4819 guardrail 6 | Quiz notices, Plan, Settings, privacy rows, /tools privacy notes |
| G9 | Disclaimer and not-advice framing, visible on every /tools page |
#4819 guardrail 5 | /tools shell |
| G10 | EU/EEA and Quebec visitors | Geoblock decisions | /tools call to action and analytics, signup |
Design rules that are not copy but touch the same screens: hide unavailable features, never gray them; Pro is preselected but "Continue with Free" has equal weight (ADR-0152 section 2.5).
4.1 Mechanical scan of the shipped strings
A scan was run over every row of the two inventories, held rows excluded (the 9 held strings, including PAY-059, which is HELD-09 listed in its code position). Two banned-word lists exist, one per surface, and each was run over the surface it was written for. They differ on purpose: the funnel list bans "target", "win rate" and "must", which are input names and validation wording on /tools.
| Surface | List that applies | Where it lives | How it is run |
|---|---|---|---|
| Funnel (appendix A) | The funnel design stage's banned-word list | FORBIDDEN in docs/design/funnel-v2/check.py |
Design-stage check over the funnel mockups (python3 docs/design/funnel-v2/check.py) |
/tools (appendix B) |
The /tools copy lint |
RULES in frontend/raxx-next/scripts/lint-tools-copy.js, adopted from docs/design/seo-tools/README.md (Compliance) |
npm run lint:tools-copy over the source, and tests/tools/copyLint.test.tsx over the rendered pages |
The funnel list in full (case-insensitive; the exact patterns are in check.py): will, edge, leak, leaks, biggest mistake, guarantee (so guaranteed too), optimize or optimise, win rate, recommended for you, best ticker or tickers, AI pick or picks, forecast, projected, projection, expected, predict (so prediction too), should, must, your plan, upgrade, target (so targets too); and the names Stripe, Alpaca, Postmark, PostHog, Apple, Schwab, Interactive Brokers, Tradier, Polygon, Massive, Intrinio, Cloudflare, Infisical, Sentry.
The /tools lint list in full is RULES in the script. In outline: about 40 broker, payment-processor and data-vendor names; advice, promise and prediction wording (recommended for you, guarantee and its forms, beat the market, you will, you'll, most traders, expected, predict and its forms, chance of, probability of, blow up, safe and its forms, best, optimal, good, bad, fear, greed, panic, forecast and its forms, annualized, should); tier and price names (Pro, Pro+, Founder or Founders, pricing); PDT and pattern day trader; and 14 real tickers. One phrase is allowed: the mandated H2 "How many shares should I buy?". The lint does not match "prediction" (its pattern is the whole word "predict" with an optional s or ed), "win rate", "target" or "must".
Counts at the snapshot (appendix A 480 rows, appendix B 592 rows):
| List run | Appendix A (funnel) | Appendix B (/tools) |
|---|---|---|
| Funnel design list | 12 rows. "your plan": 3 (EML-004, EML-007, BIL-002). "Apple": 8 (IOS-035, IOS-036, IOS-052, IOS-053, IOS-056, IOS-057, IOS-059, IOS-060; a ninth string, IOS-061, names Apple through its description and the scan cannot see it, see the Apple bullet below). "must": 1 (IOS-068). No other word and no other vendor name in the rows the scan reads. | Not the rule for this surface. For reference, 43 distinct rows: "target" 13, "win rate" 22, "must" 4, "should" 1, "predict" 3 |
/tools lint list |
Not the rule for this surface. For reference, 53 rows, all of them the tier names Pro, Pro+ and Founders, which are the subject of the paywall | 0 rows. The source passes npm run lint:tools-copy; the lint skips the mandated H2 (PSZ-010) and does not match the "prediction" rows |
What the funnel hits are:
- "your plan" (3 rows). EML-004 ("Review or cancel your plan"), EML-007 (the email button label) and BIL-002 ("There is nothing to cancel on your plan right now."). The funnel list bans the phrase because "your plan" framing is a hold category. These rows use "plan" as a billing noun, not in the trading sense, and all three are pre-staged from open PRs (groups A14 and A15). They belong to the G1p set that question A2 asks counsel to decide (listed in section 3.2); until counsel answers A2 they are neither cleared nor treated as held.
- "Apple" (8 rows found by the scan, group A12, plus a ninth string). Apple is named only in the platform-required subscription wording, the documented exception to the no-processor-name rule (ADR-0152 section 2.7). The scan finds 8 rows: IOS-035, IOS-036, IOS-052, IOS-053, IOS-056, IOS-057, IOS-059 and IOS-060. A ninth customer string also names Apple: IOS-061, the terms text for the no-trial case, which is the IOS-060 text minus the sentence "The free trial lasts 7 days." and so still contains "Apple Account" twice. Appendix A stores IOS-061 as a description of that difference, not as its full text, so a word scan over the rows cannot flag it. So "no vendor name" is true of every funnel string except these 9 iOS strings (8 rows the scan finds and IOS-061). Question B7 asks counsel to confirm the exception and lists all 9.
- "must" (1 row, IOS-068). The iOS purchase error "You must be signed in to your Raxx account to make a purchase." states a sign-in requirement and is not a trading instruction. The funnel list bans "must", so it is reported here; the packet does not rewrite it.
Why the /tools hits under the funnel list are acceptable on /tools (each is covered by a question where counsel should look):
- "target" (13 rows). "Target price", the label of a price the visitor types on the position size page, and the R multiple "at target" worked out from it (REG-002, PSZ-007, PSZ-013, PSZ-015, PSZ-021, PSZ-025, PSZ-051, PSZ-066, PSZ-072, PSZ-077, PSZS-035, PSZS-049, PSZS-056). It is an input name, not a goal or return target, which is why guardrail G1 is not used on
/tools. - "win rate" (22 rows). The name of an input the visitor types on the risk of ruin page, and the method text that echoes "the win rate you entered" (REG-014, REG-016, REG-017, ROR-005, ROR-012, ROR-013, ROR-021, ROR-028, ROR-030, ROR-033, ROR-038, ROR-039, RORS-007, RORS-016, RORS-022, RORS-026, RORS-032, RORS-036, RORS-046, RORS-054, RORS-062, RORS-064). It is the visitor's own number, not a statement about win rates in general.
- "must" (4 rows). The validation message for strike order on a spread, "For a bull call spread the long call strike must be below the short call strike." and its bear put twin (OPT-073, OPT-074, OPTS-050, OPTS-051). It states a condition the arithmetic needs, shown as an error on the visitor's own entry, not an instruction to trade.
- "should" (1 row, PSZ-010). The mandated H2 "How many shares should I buy?" (epic #4819), the one phrase the lint allows. Question E1.
- "predict" (3 rows, ROR-001, ROR-031, RORS-052). Each is a negation: "not a prediction of results", and the method paragraph "it is not a prediction of results". Question E2.
The scan does not replace review: it cannot see meaning, and several of the questions below concern strings that pass it.
5. Copy inventory summary
Row counts are in the appendices. Owner, flags and status are repeated in each group header there.
| Surface | Route | Flag (all default OFF unless noted) | Source of truth | Owner | Status |
|---|---|---|---|---|---|
| Promise | /start |
onboarding_quiz_v1 and onboarding_plan_v1 |
lib/promise/promiseCopy.ts |
marketing-strategist (drafts); Kristerpher decides |
RENDERED-NEUTRAL |
| Quiz, hand-off notices | /start/quiz/1..5, /wizard, /signup?from=start, /login |
onboarding_quiz_v1 |
lib/quiz/quizCopy.ts |
same | RENDERED-NEUTRAL |
| Plan | /start/plan |
onboarding_plan_v1 |
lib/plan/planCopy.ts |
same | RENDERED-NEUTRAL; 5 held |
| Paywall (web) | /start/paywall |
onboarding_paywall_v1 (defined in an open PR, not on develop) and FLAG_ANTLERS_BILLING_SELF_SERVICE |
lib/paywall/paywallCopy.ts, priceConfig.ts |
wording marketing-strategist; prices Kristerpher (ADR-0152) |
RENDERED-NEUTRAL; 1 held |
| Confirmation | /start/done |
onboarding_paywall_v1 |
lib/confirmation/confirmationCopy.ts |
same | RENDERED-NEUTRAL |
| Settings: Setup answers | /settings?tab=setup-answers |
onboarding_quiz_v1 |
lib/quiz/setupAnswersCopy.ts |
same | RENDERED-NEUTRAL |
| iOS paywall | app | none; App Store eligibility | ios/Raxx/Features/Billing/PaywallCopy.swift |
same; terms rows are platform-required | RENDERED-NEUTRAL |
| Privacy policy: setup answers | /privacy |
onboarding_quiz_v1 (two build switches kept equal by CI) |
docs/legal/policies/privacy-policy-v1.md |
counsel writes the final wording | DRAFT |
| Trial reminder email | none added by #4831 | open PR 4892 | engineering under #4831 | PRE-STAGED, not on develop | |
/tools (hub, shell, three calculators) |
/tools/* |
none (registry is the only control) | lib/tools/*, components/tools/*, app/tools/* |
Kristerpher decided (epic #4819); no copy owner recorded | PUBLISHED-PENDING-REVIEW |
Gap for PM: neither the epic nor the code names a copy owner for /tools (the funnel names marketing-strategist in ADR-0152 section 2.7). A named owner will be needed to receive counsel's rewrites.
6. Flag gating (acceptance criterion 5)
| Flag | State at snapshot | Evidence | Condition before it may be ON for customers |
|---|---|---|---|
onboarding_quiz_v1 |
OFF (default false; B1 migration 0322) | backend_v2/api/feature_flags.yaml; absent from the prod NEXT_PUBLIC_FLAGS in .woodpecker/deploy-antlers-next-prod.yaml |
Its own flip checklist (public signup that can enrol an account has no owner card; closed beta retired from the build; #4837 and #4824 merged) plus, per questions D2 and D3, counsel's answer on notice. The flag comment names no #4835 prerequisite. The quiz screens render the habit question and the benchmark number and units, which section 3.2 sets against two hold categories; whether questions A3 and A5 also gate this flag is an open decision recorded in section 6.1. |
onboarding_plan_v1 |
OFF (default false; B1 migration 0326) | same files | Counsel clearance recorded on #4835, the rule store (#4828), the dashboard benchmark tile, and the quiz flag's prerequisites. The Plan and Promise screens contain no held string today, but the flag comment already forbids the flip until clearance is recorded. |
onboarding_paywall_v1 |
Not defined on develop; the Antlers gate reads it from the build-time list, where it is absent. The Raptor flag and migration are in open PR 4887. | lib/funnelGate.ts; deploy file |
Counsel clearance recorded on #4835, plus the #4831 PRs and #4836. The paywall renders HELD-09 only if JOURNAL_LINE_CONFIRMED is flipped, which is a separate gate. |
At the snapshot no onboarding_* flag is in the prod or staging build lists, so every funnel route answers 404 for customers. This packet changes no flag.
6.1 The quiz flag and questions A3 and A5
onboarding_quiz_v1 alone controls the quiz screens. lib/funnelGate.ts gates /start/quiz/* and the signed-in quiz steps in /wizard on that flag (PUBLIC_SCREEN_FLAGS.quiz = [QUIZ_FLAG]; funnelLive). The Plan flag is not consulted for them. Those screens render:
- the habit question and its five options (QZ-008 to QZ-010, QZ-032 to QZ-037), the leak-to-rule category and the subject of question A3;
- the benchmark question, the number field and the units (QZ-011 to QZ-013, QZ-038 to QZ-046), the numeric-goal category and the subject of question A5 (a) and (b).
What the record says about gating them:
- The 2026-10-29 decision (epic #4818, card #4835) keeps strings in the four hold categories held until counsel clears them. Card #4835's last acceptance criterion names
onboarding_plan_v1andonboarding_paywall_v1as the flags that stay OFF until sign-off is recorded. It does not name the quiz flag. - The
onboarding_quiz_v1comment inbackend_v2/api/feature_flags.yamllists three prerequisites (#4837, #4824, public signup that can enrol an account) and notes that counsel decides the 30-day notice. It names no #4835 prerequisite. Theonboarding_plan_v1comment names #4835 and also requires the quiz flag's own prerequisites. - The design register (
docs/design/funnel-v2/README.md, "Copy register") says rendered copy is neutral and that only the held strings wait for #4835.
So, on the record as written, A3 and A5 do not gate the quiz flag: the held wording is not on the quiz screens and the neutral wording is. That is a reading of the card text. Nothing records that the decision weighed the habit and benchmark questions specifically, so this packet does not treat it as settled, and an operator who relies on section 6 alone should not flip onboarding_quiz_v1 believing A3 and A5 have been considered.
Open decision for Kristerpher, to be recorded on #4835 before onboarding_quiz_v1 is flipped; one of:
- The quiz may ship ahead of A3 and A5. The neutral wording renders on the quiz flag alone and counsel's answers arrive later (A6 then covers any rewording, F2 any later review).
- A3 and A5 gate the quiz flag as well. Then
onboarding_quiz_v1needs a #4835 prerequisite line infeature_flags.yaml(a separate code-side change, not made here) and the quiz row above adds A3 and A5 to counsel's conditions.
7. Claims to verify (what each notice says versus the code that backs it)
Counsel is asked to review the wording; engineering has the code. Where a row says "open PR", the claim cannot be confirmed from develop.
| Claim in copy | Rows | What backs it | Gap |
|---|---|---|---|
| "Held in this browser tab until you create an account or close the tab" | QN-002, QN-007, PRV-004 | sessionStorage key raxx.start.v1 (lib/quiz/quizHold.ts) |
An in-app browser or a second browser starts empty; the screens say so (design 04). |
| "Stored on your profile, where you can change or delete them in Settings" | QN-002, QN-005, SET-003 | PUT /api/profile/trader (#4822), Settings tab (#4824); Clear empties both trader_profiles and the quiz slugs in onboarding_state |
none found |
| "Deleting your account removes them" | QN-002, QN-009, SET-005, PRV-007 | Console customer delete (hard delete cascades) and runbook step 4c; the automated sweep erase_user_setup_answers exists but is reachable only while billing_dsr_erasure_flow is ON, which is OFF by default |
The automated path is off; the claim rests on the manual path (history entry 1.0.1 says so). |
| "If you have allowed analytics, Raxx also records which options you choose, but never a number you type" | QN-002, PRV-005 | quiz_answered {question_id, answer}; the benchmark sends provided or skipped only; consent-gated through the consent banner queue; non-enumerated values are dropped (lib/quiz/quizEvents.ts) |
Policy Section 6 describes opt-out by email (question D1). |
| "No ticker symbols and no free text are stored" | PRV-001, PRV-003 | Registry ids only; no free-text field | none found |
| "We email you before your trial ends" (Day 5) | PAY-023 | Scheduled at-most-once send in open PR 4892 | open PR |
| "Cancel anytime in Settings > Billing", one-click cancel | PAY-029, PAY-030, CNF-045 | Cancel flow in open PR 4887 | open PR |
| "Nothing is charged today. Card required to start." | PAY-053, PAY-054 | Web trial with a card required (ADR-0152 section 2.4); built in open PRs | open PR; the hosted checkout step is outside this inventory |
"Your numbers stay in your browser" / "not sent to a server, saved or logged" (/tools) |
HUB-012, HUB-013, SHL-041 | Client-side math; analytics event carries the slug only (lib/tools/toolsAnalytics.ts); URLs scrubbed before PostHog and Sentry (lib/tools/privacy.ts); PostHog memory persistence, no cookies |
The calculators write the typed numbers into the URL fragment on every edit (debounced history.replaceState, lib/tools/hashState.ts), so they persist in the browser's history and in any copied link (SHL-018 says so). Whether "saved" is accurate is question E6. |
| The signup call to action is hidden for EU/EEA, Quebec and unknown regions | SHL-042, SHL-043 | lib/tools/region.ts: shown only when a country returns and the visitor is not in the suppressed set; failure, timeout, unknown country and Tor hide it |
The pages themselves stay reachable and indexable from those regions (question E7). |
| "Raxx lists only what it supports today" (quiz 1) | QZ-002 | lib/traderProfileRegistry.ts mirrors the backend registry |
none found |
Other accuracy points counsel may want to know about (each describes a feature that is not on develop yet, and each sits behind a flag whose checklist already requires the feature first):
- Promise step 2 and step 3 describe the personal-rule reminder and a comparison with the rule and benchmark (PRM-020, PRM-023). The rule store is #4828; the comparison tile is a second PR on #4827.
- The Plan states "The comparison appears here once trades are recorded." (PLN-023), which promises the same tile.
- The paywall promises a Day-5 email and a billing-page cancel (PAY-023, PAY-029); both are in open PRs.
8. Facts with citations (legal framework counsel will apply)
This section lists the primary sources the questions rely on. It states what each says; it does not apply it to Raxx.
- Investment adviser definition. 15 U.S.C. 80b-2(a)(11): any person who, for compensation, engages in the business of advising others, directly or through publications or writings, as to the value of securities or the advisability of investing in, purchasing or selling securities. Exclusions include the publisher exclusion in (D). Text: Cornell LII, 15 U.S.C. 80b-2; controlling interpretation cited in the existing analysis: SEC Release IA-1092.
- Online negative option sales (ROSCA). 15 U.S.C. 8403: a seller must clearly and conspicuously disclose all material terms before obtaining billing information, obtain the consumer's express informed consent before charging, and provide simple mechanisms to stop recurring charges. Text: Cornell LII, 15 U.S.C. 8403; the FTC statute page is FTC, Restore Online Shoppers' Confidence Act (its summary covers the post-transaction third-party provision).
- FTC "click to cancel" rule. The FTC's rule was vacated by the Eighth Circuit on 2025-07-08 (Custom Communications, Inc. v. FTC, No. 24-3137), per secondary sources; the opinion itself was not retrieved: Covington, Eighth Circuit vacates FTC negative option rule. The FTC's own page records a 2026 advance notice of proposed rulemaking (published 2026-03-13, docket FTC-2026-0265) and the 2026-02-12 notice revising the rule: FTC, Negative Option Rule. Whether any rule is in force is a question for counsel; ROSCA and Section 5 apply regardless.
- California automatic renewal law. Cal. Bus. & Prof. Code 17602, as amended for contracts entered on or after 2025-07-01: offer terms presented clearly and conspicuously in visual proximity before the agreement is fulfilled, including the post-trial price; affirmative consent; a retainable acknowledgment with cancellation instructions; a pre-renewal notice 3 to 21 days before the end of a free trial or promotional price that lasts more than 31 days; and online cancellation through a prominently located direct link or button when sign-up was online. Text mirror: California Public Law, section 17602; the official source is leginfo.legislature.ca.gov, which refused an automated fetch, so verify against it. A 7-day trial is below the 31-day threshold. Other states have automatic renewal laws; the list that matters for nationwide public signups was not researched here (unsourced, confirm with a consumer-protection attorney).
- Deception standard. FTC Policy Statement on Deception (1983): a representation, omission or practice likely to mislead the consumer acting reasonably in the circumstances, and material. The FTC's staff report on deceptive design is Bringing Dark Patterns to Light (September 2022) (cited by title and date only; the report text was not summarized here).
- Endorsements and typical results. FTC Endorsement Guides, what people are asking: an ad featuring above-average results needs proof they are typical or a clear statement of generally expected results. There are no testimonials or results claims in the funnel or on
/tools(no hits in the scan). - Email. FTC CAN-SPAM compliance guide: a message is transactional or relationship only if its content falls in a listed category, which includes notices about a change in the terms or features of a subscription or account; such messages carry accurate routing information and are otherwise exempt from most provisions; commercial messages need a valid physical postal address and an opt-out. The category boundaries are read narrowly.
- Options legend. FINRA Rule 2220, paragraph (d)(2)(A)(vii): no member or associated person may use an options communication that fails to include a warning to the effect that options are not suitable for all investors. The rule binds members and associated persons; the existing analysis concludes Raxx is not a member (
docs/legal/research/getraxx-differentiation-copy-review-2026-06-04.md, section 1.3). Cited as an analogue for the/toolsdisclaimer, not as a requirement. - App Store subscriptions. App Store Review Guidelines, 3.1.2: before asking a customer to subscribe, clearly describe what the user gets for the price, and communicate the requirements in Schedule 2 of the Apple Developer Program License Agreement (not retrieved here); free trials are offered through App Store Connect.
- Raxx's own prior positions.
docs/business/raxx-marketing-compliance-brief-2026-05-27.md(sections 1 to 3 and 5): the line Raxx cannot cross, risky phrasings, pre-approved candidate phrasings (all still subject to attorney review), and the footer disclaimer draft.
8.1 Jurisdiction flags
| Jurisdiction | What changes the answer | Where in this packet |
|---|---|---|
| Federal (SEC) | Whether any output is "advice about securities" under the Advisers Act definition; the existing analysis is the three-prong test staged in docs/business/legal/2026-07-01-securities-attorney-question-list.md |
Questions A1 to A5, C1 to C3, E1 to E4, E8 |
| Federal (FTC) | Section 5 deception and substantiation; ROSCA for online subscriptions; CAN-SPAM for the reminder email; the status of the negative option rulemaking | Questions B1 to B6, E2, E5, E6 |
| Pennsylvania | The home state of the company: UTPCPL exposure is analysed in docs/business/raxx-marketing-compliance-brief-2026-05-27.md section 6; Pennsylvania securities-regulator questions are in the 2026-07-01 question list |
Counsel should be licensed here |
| California | Automatic renewal law (Bus. & Prof. Code 17602) for the paywall and cancellation; CCPA/CPRA for the setup answers | Questions B1 to B4, D3 |
| Other states | Their own automatic renewal laws; the list was not researched (unsourced) | Question B1 |
| EU/EEA and Quebec | Geoblocked at signup; /tools stays reachable with no call to action and no analytics |
Question E7 |
| Apple platform | Subscription disclosure wording in the iOS paywall | Question B7 |
9. Questions for counsel
Priority: P1 gates a flag flip or a hold; P2 runs in parallel and does not block. Pro: SEC = securities/investment-adviser regulatory attorney; CONS = consumer-protection/advertising attorney (not the CPA, who is a separate pro); PRIV = privacy attorney.
A. Hold categories (gate onboarding_plan_v1; A3 and A5 also concern strings on the quiz flag, see section 6.1)
| ID | Question | Basis | Pro | Pri |
|---|---|---|---|---|
| A1 | Is there any use of "edge" you would clear (for example, a label above a retrospective comparison of the user's own recorded results), or should the word stay out of customer copy entirely? What separates an acceptable use from an outcome promise? | HELD-01, HELD-07; no "edge" renders today | SEC | P1 |
| A2 | Which uses of "plan" fall inside the "your plan" hold? Trading sense ("Build my plan", "a plan you can follow", "Your plan") versus billing sense (paywall "Choose a plan", "Plan status", "payment issue with this plan", email "Review or cancel your plan", billing notice "There is nothing to cancel on your plan right now.", iOS "Choose a plan"). The Confirmation module avoids the word in one sentence (it says "subscription") but the paywall and the reminder email use it. Do the URL /start/plan and the flag name matter, since the URL is visible? Does your answer supersede the 2026-05-27 brief's candidate "Audit your process against your plan."? |
HELD-02 to HELD-05 and every row tagged G1p (24 rows, listed by ID in section 3.2: PAY-001 to PAY-003, PAY-006, PAY-062, PAY-073, PAY-075, CNF-017, CNF-024, CNF-025, CNF-032, CNF-034, CNF-080, IOS-002, IOS-004, IOS-011, IOS-014, IOS-062, IOS-065, IOS-067, IOS-071, EML-004, EML-007, BIL-002); three of them contain the literal phrase "your plan": EML-004, EML-007, BIL-002 (section 4.1) | SEC, CONS | P1 |
| A3 | The Plan echoes the user's habit answer ("You chose to track: |
PLN-008, PLN-014 to PLN-021, QZ-008 to QZ-010, QZ-032 to QZ-037 (these quiz rows render on onboarding_quiz_v1 alone, section 6.1); see Shape 1 journal analysis |
SEC | P1 |
| A4 | When the personal rule store lands (#4828), the design proposes units per habit with no suggested value (for example position sizing in dollars or percent per position). Is offering unit choices per habit, with no default and no suggestion, within what you would clear? Which wording around the rule is out of bounds ("limit", "should", "must" are already banned)? | Design README "Rule (#4828, proposed)"; PRM-020 | SEC | P1 |
| A5 | Quiz question 5 asks for "a number you want to compare your results with, after the fact", in percent or dollars per month or year; the Plan echoes it in words ("2.5 percent per month" form) under "Benchmark you set"; a dashboard tile is planned. (a) Is echoing the user's own return figure back, with retrospective comparison wording, acceptable? (b) The units include per year; does an annual figure read as a projection or annualized claim (the /tools lint bans the word "annualized")? (c) PLN-023 says "The comparison appears here once trades are recorded." Is it acceptable to describe a tile that is not yet built, or must the flag wait for the tile? |
QZ-011 to QZ-013, QZ-038 to QZ-046 (these quiz rows render on onboarding_quiz_v1 alone, section 6.1), PLN-009, PLN-022, PLN-023, PRM-023, SET-011, SET-013 |
SEC | P1 |
| A6 | Provide replacement wording for every held string you decline. The stand-ins in PLAN_HELD_COPY name categories only; counsel's real strings replace them. |
HELD-01 to HELD-08 | SEC | P1 |
| A7 | The paywall line HELD-09 depends on a retention decision. The lapse audit found paper trade rows older than 90 days on a never-paid Free account are purged, and 11 retention statements in the repo (including the live privacy page) say the opposite. What retention wording can the paywall and the privacy policy both carry without inconsistency? | HELD-09; PR 4884; lib/paywall/paywallCopy.ts comment |
CONS, PRIV | P2 |
B. Subscription and billing disclosures (gate onboarding_paywall_v1)
| ID | Question | Basis | Pro | Pri |
|---|---|---|---|---|
| B1 | Does the paywall disclosure sentence ("7 days free, then $39 per month. Card required to start. Nothing is charged today. Renews until canceled. Cancel anytime.") satisfy ROSCA's clear-and-conspicuous disclosure before billing information is collected and the California visual-proximity rule, given that card entry happens on a hosted checkout page after the paywall? Must the terms be repeated at the point of consent? Which other state automatic-renewal laws should the funnel be reviewed against for nationwide public signups? | PAY-053, PAY-054, PAY-055, PAY-056; 15 U.S.C. 8403; Cal. B&P 17602 | CONS | P1 |
| B2 | "Nothing is charged today" and "Card required to start": is the first accurate if the card issuer sees an authorization or hold at checkout (engineering to confirm what the hosted checkout does before this is sent)? Is "Cancel anytime" accurate given that cancelling in the trial lets access continue to the trial end and nothing is charged (CNF "Pro access continues until |
PAY-053, CNF-044 to CNF-057, ADR-0152 section 2.4 | CONS | P1 |
| B3 | The trial is 7 days, under the California 31-day pre-conversion notice threshold, yet the paywall promises "We email you before your trial ends." (Day 5) and the reminder email states the charge date, price and a cancel link. Does promising the email create an obligation if a send fails? Is the email a transactional or relationship message under CAN-SPAM, and is its footer (registered-agent postal address, support address) sufficient? | PAY-023, EML-001 to EML-007 (pre-staged); CAN-SPAM guide | CONS | P1 |
| B4 | Cancel is one confirm click on the billing page and the email links straight to it after sign-in. Does a login-gated direct link meet the online-cancellation requirements, and does the acknowledgment required after sign-up (with cancellation instructions, in a retainable form) exist? Which email or screen is that acknowledgment? | PAY-029, PAY-030, BIL-001, BIL-002 (pre-staged); Cal. B&P 17602(a)(3), (d) | CONS | P1 |
| B5 | "About 2 months free" and "Equal to 10 months of $39" compare the annual price with twelve monthly ones. Is that substantiated and acceptable wording? iOS shows a months-free badge only when the arithmetic is within 0.15 of a whole number; is that tolerance acceptable? | PAY-010, PAY-011, IOS-047 | CONS | P2 |
| B6 | Pro is preselected (monthly by default, annual one tap away) and "Continue with Free" has equal weight, with no countdown, urgency or social proof. Does the preselection raise a design-practice concern in light of the FTC's dark-patterns report, and is "Founders" acceptable as an offer label on Pro+ ("$29 per month for the first 6 months, then $79 per month")? | PAY-035, PAY-047 to PAY-050; ADR-0152 section 2.5 | CONS | P2 |
| B7 | iOS names Apple only in the platform-required subscription wording ("Charged to your Apple Account", "Manage or cancel in your Apple Account settings", the terms paragraph). Do those rows satisfy Guideline 3.1.2 and Schedule 2, and are you content with this as the one exception to the no-processor-name rule (ADR-0152 section 2.7)? | every iOS row that names Apple: IOS-035, IOS-036, IOS-052, IOS-053, IOS-056, IOS-057, IOS-059, IOS-060, and IOS-061 (the same terms text without the trial sentence), 9 strings in all; the scan in section 4.1 finds the first 8 as funnel-list hits, and IOS-061 names Apple through its description, which the scan cannot read | CONS | P2 |
C. Advice posture on funnel screens
| ID | Question | Basis | Pro | Pri |
|---|---|---|---|---|
| C1 | The Plan sub says "Nothing here is a recommendation." No funnel screen carries the footer disclaimer drafted in the 2026-05-27 brief (the funnel footer has Terms and Privacy links). Is a disclaimer needed on the Promise, quiz or Plan screens, and if so what wording and placement? | PLN-003; brief section 5A | SEC | P1 |
| C2 | The risk-profile step is existing copy now on the single first-run path. Its sub says "This tells Raxx how to size positions relative to your account" and its options describe sizing and variance ("Aggressive: Larger allocations, wider stops, higher variance between outcomes"). A search of backend_v2/api and console found no code that reads the stored answer except the route that stores it. Does this wording, as is, imply that Raxx sizes positions for the user? (Engineering to confirm what, if anything, consumes the answer before this is sent.) |
RSK-002 to RSK-005; backend_v2/api/routes/onboarding.py (step_data["risk"], write-once) |
SEC | P1 |
| C3 | Is the Promise (PRM-003, "keeps the rules you write in view when you trade, and keeps a record you can review afterwards") and the rest of the funnel consistent with the retrospective, process-based register of the safe-zone candidates in the 2026-05-27 brief (candidates counsel has not yet reviewed)? Anything to change before launch? | PRM-002 to PRM-023; brief sections 2 and 3 | SEC | P2 |
D. Privacy notices (belong with the privacy and terms engagement, #3149, per the note on #3141)
| ID | Question | Basis | Pro | Pri |
|---|---|---|---|---|
| D1 | Policy Section 2.3 says "If you have allowed analytics, we also record which option you choose", an opt-in model, and points to Section 6; Section 6 is unchanged and the published page still says analytics can be opted out of by emailing privacy@raxx.app with an in-product control "coming" (the policy record says "via consent banner"). Which model is correct, and what must Section 6 say before onboarding_quiz_v1 flips? (Raised on #4835 from PR 4906.) |
PRV-005; history entry 1.0.1 | PRIV | P1 |
| D2 | Setup answers are a new category of personal data, which the policy history treats as a material change. Is 30 days' email notice to registered users needed before the quiz flag flips, and what is the earliest flip date? | docs/legal/policies/privacy-policy-v1-history.md |
PRIV | P1 |
| D3 | The legal-basis cell says "counsel to confirm". How should setup answers (trading experience, holding style, habit, a return benchmark) be classified for CCPA/CPRA, and is a visible notice with optional answers and no checkbox enough, or is explicit consent needed? (EU/EEA and Quebec are geoblocked at signup.) | PRV-001, QN-002; design open question 2 | PRIV | P1 |
| D4 | "Deleting your account removes them" is backed by the Console delete and the manual runbook; the automated sweep exists but is off by default. Is the claim accurate as worded while the automated path is off? | QN-002, SET-005, PRV-007 | PRIV | P1 |
| D5 | Policy Section 3 says automated decision-making rules are not engaged. Does a fixed journal prompt chosen by the user's style answer change that statement? | PRV, policy Section 3; PLN-014 to PLN-018 | PRIV | P2 |
| D6 | The policy names the payment processor and other sub-processors in Section 4 (disclosure) while customer copy elsewhere never names vendors. Confirm the policy is the intended exception. | policy Section 4 | PRIV | P2 |
E. /tools (published without waiting for counsel; review runs in parallel)
| ID | Question | Basis | Pro | Pri |
|---|---|---|---|---|
| E1 | The position size page carries the H2 "How many shares should I buy?" (the only allowed "should"), a title tag "Position Size Calculator - Shares to Buy From Your Risk", an FAQ and the line "The calculator does not choose any of them." Together with inputs the visitor types, do these read as personalized advice? The FAQ and answers are also published as FAQPage structured data; does that change anything? | PSZ-010 to PSZ-012, PSZ-002 to PSZ-009, REG-001 | SEC | P1 |
| E2 | Risk of ruin: "Given these inputs, in this simulation 12.0% of paths hit a 50% drawdown." with the caption "Simulation of the numbers you entered; not a prediction of results.", the assumptions list and "Real results differ." Is a Monte Carlo output on user-entered numbers "hypothetical performance" under any rule that applies to Raxx (FTC substantiation applies; the SEC marketing rule is for advisers), and are the caption and assumptions prominent enough? Is the term "ruin" acceptable in the title and H1? | RORS-001, RORS-052, ROR-021 to ROR-024, REG-013 | SEC, CONS | P1 |
| E3 | Epic #4819 guardrail 1 says no recommended or default risk percentage. The risk percent fields start empty and say "the calculator suggests none", but the ruin threshold field is prefilled with 50 ("50 is an example value; change it") and the FAQ says "50% is the example value". Are the prefilled threshold and the worked examples (0.75%, 0.5%, 4%, 3% risk, labelled example numbers, with a "Load these numbers" button) consistent with the guardrail? | PSZ-046, ROR-026, ROR-053, constants RUIN_DEFAULT_THRESHOLD; design open question 7 |
SEC | P1 |
| E4 | The shared disclaimer ("Educational tool. Results are arithmetic on the numbers you enter. Not investment advice, not a recommendation to buy or sell any security. Options involve risk and are not suitable for all investors.") sits under the calculator and in the footer. Is it sufficient, and should it reference the standardized options disclosure document? (FINRA 2220 is cited as an analogue only; Raxx is not a member.) | SHL-040; FINRA 2220(d)(2)(A)(vii) | SEC | P1 |
| E5 | The call to action next to the result reads "Track this in Raxx - free" and "Keep your sizing rules and your own trade history in one place. Free account, no card needed." Any concern with a signup solicitation adjacent to calculator output? Is "no card needed" accurate given that the funnel paywall asks for a card for the Pro trial? | SHL-042, SHL-043, PAY-053 | CONS | P2 |
| E6 | "Nothing you enter is sent to a server, saved or logged" (hub) and "Your numbers stay in your browser" are true of servers and analytics, but the typed numbers are written into the URL fragment as the visitor types, where browser history and bookmarks keep them. Is "saved" accurate, and should the wording change? | HUB-012, HUB-013, SHL-018, SHL-041; lib/tools/hashState.ts |
PRIV, CONS | P2 |
| E7 | Visitors from EU/EEA and Quebec can reach and index the English /tools pages; the signup call to action is hidden and analytics suppressed for them and for unknown regions. Is that consistent with the signup geoblock decisions (EU targeting under GDPR Art. 3(2); Quebec language rules for commercial content)? Unsourced, confirm with EU and Quebec counsel. |
SHL-042; lib/tools/region.ts |
PRIV | P2 |
| E8 | Options payoff: the page shows "No upper limit" for a long call's max gain and a long put's max gain "assumes XYZ finishes at 0", with a call spread section; the design cuts net-credit spreads. Any wording to change in the explanations or FAQ? | OPT-001 to OPT-011, OPTS-017, OPTS-028 | SEC | P2 |
| E9 | When #4842, #4843 and #4844 land, review them in this order: covered call (income wording: "Return if called", "Return if unchanged at expiry", per-day figures that are never annualized), expectancy ("not future results"), then risk/reward (breakeven win rate FAQ). Send the inventory again from develop at that time. | Appendix B group B7 | SEC | P2 |
F. Process
| ID | Question | Pro | Pri |
|---|---|---|---|
| F1 | In what form will you return clearance so it can be recorded on #4835 (date, scope, string IDs from the appendices, conditions)? | all | P1 |
| F2 | What change to a cleared string triggers a new review (any wording edit, a new flag state, a new surface)? | all | P2 |
Count: 34 numbered questions (A 7, B 7, C 3, D 6, E 9, F 2).
10. Counsel sign-off record (complete when counsel responds)
Record this on #4835 before any held string ships. The opinion or memo itself is stored in the private legal Drive folder, not in the repo (policy on #3141).
| Field | Value |
|---|---|
| Date (UTC) | |
| Counsel and firm | |
| Engagement reference (#3141) | |
Scope (surfaces and groups, for example Promise, Plan, paywall web, iOS paywall, /tools B4 to B6) |
|
| Strings cleared (IDs from the appendices) | |
| Strings cleared with conditions (ID and condition) | |
| Strings declined and replacement wording supplied (ID and wording) | |
| Open items counsel deferred | |
Flags that may now flip (onboarding_plan_v1, onboarding_paywall_v1) and the date |
|
Code change that releases the strings (the PR that moves them out of *_HELD_COPY) |
|
| Drive location of the written opinion |
Delivery log (this card opens no engagement):
| Date (UTC) | Delivered to | By | Files sent |
|---|---|---|---|
| not delivered |
11. Staleness check and how to regenerate
Both inventories are snapshots of 78b417d24. The copy modules are the single source for the funnel (lib/promise, lib/quiz, lib/plan, lib/paywall, lib/confirmation); a few strings live inline and are listed in groups A10 to A15. To see whether a re-review is needed, run from a clean checkout:
git fetch origin
git diff --stat 78b417d24 origin/develop -- \
frontend/raxx-next/lib/promise frontend/raxx-next/lib/quiz frontend/raxx-next/lib/plan \
frontend/raxx-next/lib/paywall frontend/raxx-next/lib/confirmation \
frontend/raxx-next/components/promise frontend/raxx-next/components/quiz \
frontend/raxx-next/components/plan frontend/raxx-next/components/paywall \
frontend/raxx-next/components/confirmation frontend/raxx-next/components/settings/SetupAnswersTab.tsx \
frontend/raxx-next/components/wizard/steps frontend/raxx-next/components/wizard/WizardShell.tsx \
frontend/raxx-next/components/onboarding 'frontend/raxx-next/app/(public)/start' \
frontend/raxx-next/lib/tools frontend/raxx-next/components/tools frontend/raxx-next/app/tools \
ios/Raxx/Features/Billing docs/legal/policies \
backend_v2/api/templates/email/billing
Any output means a string may have changed since this packet. To rebuild the tables: the funnel modules are plain TypeScript exports with no framework imports, so they can be loaded under any TypeScript loader and walked (functions called with sample arguments); the /tools static text comes from extractCopy in frontend/raxx-next/scripts/lint-tools-copy.js (it returns JSX text with HTML entities undecoded, such as ', ' and →; decode them before listing, or the string is dropped or misread), and the run-time sentences come from calling evaluatePositionSize, computePayoff, describeResult, simulateRuin and resultSentence. The run-time sentences in appendix B are sampled (each page's golden examples and the edge cases that trigger a note, an error or a limit), not exhaustive; the appendix's method notes say which cases were added after review and why. The generators used for this snapshot were throwaway scripts and are not committed.
12. Timing
- No statutory deadline was found for any item. Dates that matter:
/toolshas no flag, so it goes live on the next promotion of develop to main (the last promotion,70fe475, did not include it); the quiz flag may not flip before the notice question D2 is answered; California's amended renewal law applies to contracts entered on or after 2025-07-01; the FTC's 2026 rulemaking docket (FTC-2026-0265) is open and its comment window was not checked. - Counsel availability is the constraint named in the card's risks. Held strings are isolated in the
*_HELD_COPYexports so the cleared remainder can ship behind the flags.
13. Pre-delivery checklist (internal; remove before sending)
- Re-run the staleness check in section 11 and refresh the inventories if any listed path changed.
- Engineering confirms what consumes the stored risk answer (question C2) and what the hosted checkout does at card entry (question B2).
- Re-inventory the web trial copy, the reminder email and the billing notices from develop once PRs 4887, 4891 and 4892 merge; replace groups A14 and A15 (pre-staged) with the shipped text.
- Re-inventory
/toolswhen #4842, #4843 and #4844 land (appendix B group B7 is a design-stage proposal only). - PM assigns a copy owner for
/tools(section 5). - Send nothing until the operator lifts the hold on new engagements; delivery goes to the #3141 engagement and is logged in section 10.
Sources
Primary and repository sources used for facts:
https://www.law.cornell.edu/uscode/text/15/80b-2(Investment Advisers Act definition and exclusions)https://www.sec.gov/files/rules/interp/1987/ia-1092.pdf(SEC Release IA-1092, as cited in the existing analysis; not re-fetched)https://www.law.cornell.edu/uscode/text/15/8403(ROSCA, negative option marketing on the Internet)https://www.ftc.gov/legal-library/browse/statutes/restore-online-shoppers-confidence-act(FTC page for ROSCA)https://www.ftc.gov/legal-library/browse/rules/negative-option-rule(FTC page: 2024 rule, 2026 notices, docket FTC-2026-0265)https://www.insideprivacy.com/united-states/federal-trade-commission/eighth-circuit-vacates-ftc-negative-option-rule/(secondary: Eighth Circuit vacatur, 2025-07-08)https://california.public.law/codes/business_and_professions_code_section_17602(text mirror of Cal. B&P 17602; official source leginfo.legislature.ca.gov)https://www.ftc.gov/legal-library/browse/ftc-policy-statement-deception(FTC Policy Statement on Deception)https://www.ftc.gov/reports/bringing-dark-patterns-light(FTC report, September 2022)https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking(Endorsement Guides)https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business(CAN-SPAM guide)https://www.finra.org/rules-guidance/rulebooks/finra-rules/2220(FINRA Rule 2220)https://developer.apple.com/app-store/review/guidelines/(App Store Review Guidelines 3.1.2)
Repository sources: docs/design/funnel-v2/README.md, docs/design/seo-tools/README.md, docs/architecture/adr/0152-funnel-pricing-and-trial-decisions.md, backend_v2/api/feature_flags.yaml, docs/legal/policies/privacy-policy-v1.md and privacy-policy-v1-history.md, the copy modules named in section 5, issues #4818, #4819, #4835, #3141 and PRs #4887, #4892.
Before you act on this, consult a securities/investment-adviser regulatory attorney (Pennsylvania and federal), a consumer-protection/advertising attorney for the subscription items, and a privacy attorney for the notice items. This packet is research to prepare that conversation; it contains no advice.