Raxx · internal docs

internal · gated

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/develop at 78b417d24. 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):

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.

  1. 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.
  2. 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. /tools examples use the placeholder XYZ and scripts/lint-tools-copy.js fails 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.
  3. 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.
  4. 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").
  5. 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 /tools the signup call to action is hidden and analytics are suppressed for those visitors and for an unknown region (lib/tools/region.ts).
  6. 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.md and docs/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).
  7. Stage. Funnel copy ships behind default-OFF flags; /tools ships with no flag. The operator decision of 2026-10-29 is that /tools publishes 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: "; five journal prompts chosen by the style answer; Promise steps 1 and 2 ("Write your rules", "Your rule shows as a reminder when you place an order. It never blocks or changes an order.") 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:

Why the /tools hits under the funnel list are acceptable on /tools (each is covered by a question where counsel should look):

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 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:

What the record says about gating them:

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:

  1. 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).
  2. A3 and A5 gate the quiz flag as well. Then onboarding_quiz_v1 needs a #4835 prerequisite line in feature_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):

This section lists the primary sources the questions rely on. It states what each says; it does not apply it to Raxx.

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: ") and picks one of five journal prompts by the style answer. The held version ("The leak this rule closes") would imply a diagnosis. Is the neutral lookup acceptable, in your view, as not personalized advice about securities when it is a fixed sentence chosen by the user's own answer and concerns the user's journaling process? The journal prompts are imperative ("record the trades you closed and whether each matched your own rule"); does the imperative mood matter? 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 . You are not charged.")? 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

13. Pre-delivery checklist (internal; remove before sending)

Sources

Primary and repository sources used for facts:

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.