SRS: UC_4.10.3 — Scenario A: Sim Reset (In-App)
UC_4.10.3: Scenario A — Sim Reset (In-App)
| Field | Value |
|---|---|
| BA in Charge | Huyen Dinh |
| Date Created | 2026-08-08 |
| Version | v3.8 |
| Document References | RFQ_ Stack Trading Prop Tech V7.pdf (§Scenario A: Sim Reset) · RFQ_ Website and Dashboard Implementation V7.pdf (§Scenario A) · Zapier Integration V7.pdf (§Flow 7B Path A, §Table C, §Table J) |
Document References
| # | Original Document | Key Sections Used |
|---|---|---|
| 1 | RFQ_ Stack Trading Prop Tech V7.pdf | §Scenario A: Sim Reset (In-App) — Pricing Rule, Business Logic (Reset Account Now / Start New Track), Flow 7B Path A |
| 2 | RFQ_ Website and Dashboard Implementation V7.pdf | §Scenario A — Failure Modal, 1-Click Purchase Modal, Secure Checkout fallback, Payment states |
| 3 | Zapier Integration V7.pdf | §Flow 7B Path A (SIM failure retention pricing), §Table C (Discount_Code_Duration_Days), §Table J (Reset Fee, Full Challenge Price, Founder locked prices) |
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.10.3 |
| Use Case | Scenario A: Sim Reset (In-App) |
| Description | After a SIM Hard Breach (Status = Failed), the trader sees a Hard Breach Popup with a CTA.On clicking the CTA, the system calculates tax and opens the appropriate purchase modal. Depending on whether a vaulted card exists, one of 2 modal variants is shown: Reset (1-Click) or Reset (Secure Checkout). The price on the Reset modal differs based on whether archive_date has passed — see BR_4.10.3.1. [CHR-59] |
| Zapier Flow | — |
| Zapier Table | Table C (Discount_Code_Duration_Days)Table J (Reset Fee (within archive_date), Full Challenge Price (after archive_date), Founder locked_reset_price) [CHR-59] |
| 3rd Party | Quaderno (tax calculation via /calculate-cart)Compliance_geo_restrictions (sanctions check) |
2. Trigger
This UC has four independent entry points that all land on the Reset purchase modal (§9.2):
- Entry Point 1 — Dashboard (Hard Breach Popup): Status =
'Failed'after Hard Breach (Net_P&L <= −Absolute_Stop_Loss, Ref: UC_4.10.2 §2 Trigger) → Middleware firesCHALLENGE_FAILED→ Flow 2 →POST /fail-challenge→ Flow 7B Path A → Frontend renders Hard Breach Popup (§10.1) on every Dashboard visit until purchase → user clicks its CTA button (§5.1). - Entry Point 2 — Account Actions screen ("Reset" button): User clicks "Reset" on the Account Actions screen → bypasses the Hard Breach Popup entirely, goes straight into pricing calculation and the purchase modal (§5.3).
- Entry Point 3 — Founding mentor case: Same downstream flow as Entry Point 2, triggered from the founding mentor context instead of Account Actions.
- Entry Point 4 — SIM Stagnation Expiration (Flow 19):
expiration_datereachesdays_remaining < 0with no Time Extension purchased → Flow 19 triggers the same basic flow as Hard Breach — Status transitions to'Failed'(Ref: UC_4.10.4 BR_4.10.4.2) → same downstream path as Entry Point 1 (Hard Breach Popup). - Full Hard Breach flow → see UC_4.10.2
3. Pre-conditions
- User's Status =
'Failed'OR'Active_SIM'(Ref: [CHR-40])
4. Post-conditions
Reset [CHR-59]:
- Payment successful
- trade history auto-archived →
user_account_history - Virtual balance reset to tier's starting capital (Level 1/2/5)
- Status =
'Active_SIM',expiration = Today + 60 days - Broker-specific provisioning completes — new sub-account always provisioned, per UC_4.10.2 BR_4.10.2.7.
- User must log in with new credentials (available in Dashboard Settings).
- Success screen "Associate Track Reset Complete" displayed with CTA "Return to Dashboard" — Ref: §10.7
- User clicks "Return to Dashboard" → screen closes → Frosted Glass removed → Dashboard Day 0
- No email, no Interstitial, Auth0 untouched
5. Basic Flow
5.1 Flow "Reset Account Now" — Dashboard entry point
Step 0 — Hard Breach Popup displayed:
- After Hard Breach, Dashboard shows Frosted Glass overlay.
- Hard Breach Popup (§10.1) is rendered on top.
- This popup persists on every Dashboard visit until the trader completes a purchase.
- → Wireframe: Hard breach popup (1).png
Step 1 — User clicks CTA on Hard Breach Popup → system loads pricing:
On CTA click:
- Compare NOW against
failure_timestamp + Discount_Code_Duration_Days(Table C) — determines pricing tier only. Note:archive_date(broker-specific per UC_4.10.2 BR_4.10.2.7) governs data archival and sub-account cleanup, not pricing. The modal shown is always the Reset Modal regardless. Ref: BR_4.10.3.1 for pricing routing. [CHR-59] - Check
user.is_founderto determine pricing tier (standard vs founder locked price). Ref: BR_4.10.3.1. - The Hard Breach Popup transitions to a loading state showing spinner + text "Calculating regional taxes..." → Wireframe: Calculating regional taxes.png. The frontend calls
POST /calculate-cartwith the full payload. Final_Charge = base_price + tax_amount- Once
POST /calculate-cartreturns HTTP 200: Hard Breach Popup closes → Reset Modal (§10.2) opens with calculated pricing (price differs by archive_date check per BR_4.10.3.1; modal is always the same). [CHR-59] The promo code entry point ("Have a promo code?") is available on this modal — Ref: §6. - The base price displayed in the Reset Modal is the amount that will be charged — it does not change between modal open and pay click. Tax is recalculated at the moment the user clicks pay and may differ slightly from the estimate shown in the modal. Ref: §6.
Step 2 — User clicks CTA "Reset Account Now ($X)" on Reset Modal:
The system performs three gate checks in order:
Gate 1: Status IN ('Failed', 'Active_SIM') AND user is in SIM evaluation → Continue. If not → Reset Modal closes immediately, then Ref: TE-DASH-01 toast displayed. (Ref: [CHR-40] — Active_SIM added for Early Reset.)
Gate 2: Sanctions — Query billing_country + billing_region from Users table → check Compliance_geo_restrictions → If match → display 403 screen, Ref: FP-02.
Gate 3: Check Users table for customer_vault_id (NMI):
- Present → Path A: 1-Click Purchase
- Not present → Path B: Secure Checkout Fallback
Path A — 1-Click Purchase (vaulted card present): → Wireframe: Reset modal (1).png
- The base price locks at this click; tax is recalculated at this click, not locked (Ref: §6). If the server-side price/tax re-check detects a change (e.g. tax rate updated since
/calculate-cart), Ref: OV-08 renders instead of proceeding — user clicks Refresh now to reload pricing and retries. Otherwise: system charges the vaulted card via NMI. During processing: the Reset modal closes and the Processing Payment popup is displayed → Wireframe: Processing payment modal.png - Success:
- Success screen "Associate Track Reset Complete" displayed → Wireframe: Payment succeed - Reset account.png — Ref: §10.7
- User clicks CTA "Return to Dashboard" → screen closes → Frosted Glass removed → Dashboard Day 0
- Broker-specific provisioning completes (new credentials issued per UC_4.10.2 BR_4.10.2.7) [CHR-59]. User must log in with new credentials (available in Dashboard Settings).
- Failure: NMI returns error code (card expired, declined, insufficient funds)
- Processing Payment popup closes → Reset modal is re-displayed with an inline banner error message (not a toast) showing the failure reason
- User remains on the Reset modal and can retry or click "Change Payment Method" to proceed to Path C
- Auto-fallback to Path B does NOT occur — Path B is only reached if the user clicks "Change Payment Method" (Path C)
- All payment error handling, retry logic, idempotency, refund, double-charge prevention → see §7 Exceptional Flow — Payment flow, all standard cases.
Path B — Secure Checkout Fallback (no vaulted card): → Wireframe: Popup when users have not saved vaulted card info before.png
- System detects no
customer_vault_id→ returns UI Fallback payload. - Frontend displays Secure Checkout page. The promo code entry point is also available here (same §6 flow, carried over from the modal that triggered this fallback).
- User chooses payment method and completes transaction.
- Full payment flow (form validation, processing, success/failure handling, error recovery) → see §7 Exceptional Flow — Payment flow, all standard cases.
- On successful payment:
- Same post-payment actions as Path A Success
Path C — Change Payment Method: → Wireframe: Change payment method.png
- User clicks "Change Payment Method" on the modal.
- System opens Secure Checkout page.
- Same flow as Path B.
5.2 [Removed — CHR-59]
This section previously described a "Start New Track" flow for the expired-window case. Per [CHR-59], SIM has only one flow: the Reset flow described in §5.1. Both within-
archive_dateand after-archive_datecases use the same Reset modal and success screen — only the price differs, per BR_4.10.3.1. "Start New Track" is a LIVE concept; see UC_4.15.3.
5.3 Flow "Reset" via Account Actions screen (bypasses Hard Breach Popup)
Step 0 — User clicks "Reset" button on Account Actions screen:
- This button is enabled on the Account screen (Account Actions tab) whenever Status IN (
'Failed','Active_SIM') — the Active_SIM case is the Early Reset entry point (Ref: [CHR-40]): a trader currently on an active track can voluntarily reset without waiting for Hard Breach. - Unlike the Dashboard entry point, the Hard Breach Popup (§10.1) is not shown on this path — clicking "Reset" here goes straight to pricing calculation. See §2 Trigger for the full entry-point comparison.
Step 1 — System loads pricing:
- Check the trader's input
Status:Status = 'Active_SIM'(Early Reset — Ref: [CHR-40]): skip straight to item 2 below — noarchive_datecheck. Pricing always routes to the "Withinarchive_date" tier (Ref: BR_4.10.3.1). [CHR-59]Status = 'Failed': continue with item 1 below (same logic as §5.1 Step 1).
- (Failed input only) Compare NOW against
failure_timestamp + Discount_Code_Duration_Days(Table C) → determines pricing window. Ref: BR_4.10.3.1 for pricing routing. Note:archive_date(broker-specific, UC_4.10.2 BR_4.10.2.7) governs data archival, not pricing. - Check
user.is_founderto determine pricing tier (standard vs founder locked price). Ref: BR_4.10.3.1. - Account Actions screen shows a loading state (spinner + "Calculating regional taxes..." text) while calling
POST /calculate-cartwith the full payload. Final_Charge = base_price + tax_amount.
Step 2 — Modal opens directly (no Hard Breach Popup in between):
- Input
Status = 'Active_SIM'(Early Reset — Ref: [CHR-40]): Reset Modal (§10.2), priced at the Within-archive_datetier (Ref: BR_4.10.3.1). - Input
Status = 'Failed'(within or afterarchive_date): Reset Modal (§10.2), priced per BR_4.10.3.1. Both cases use the same modal; only the price differs. [CHR-59] - The base price displayed in the modal is the amount that will be charged — it does not change between modal open and pay click. Tax is recalculated at the moment the user clicks pay and may differ slightly from the estimate shown in the modal. Ref: §6.
Step 3 onward — Identical to Dashboard entry point:
- Gate 1 (Status check), Gate 2 (Sanctions), Gate 3 (vaulted card check) → same as §5.1 Step 2 / §5.2 Step 2.
- Path A (1-Click), Path B (Secure Checkout Fallback), Path C (Change Payment Method) → same as §5.1 / §5.2.
6. Promo Code Flow
The promo code section is available on all 4 modal variants (Reset 1-Click, Reset Secure Checkout, Start New Track 1-Click, Start New Track Secure Checkout). The full flow mirrors UC_2.7.8 (Apply Promo Code at Step 6 checkout).
Price Lock and Re-validation at Pay Click:
- The base price (Reset Fee / Full Challenge Price /
locked_reset_price/locked_rebuy_price— per the 4-route matrix in §9.2) is locked when the user clicks the CTA to pay — not when the modal opens, and not when a promo code is applied. Tax is never locked — it is always recalculated server-side at the pay-click moment, on top of whichever base price applies. - At pay click, the backend re-validates the applied promo code atomically (Ref: BR_2.7.8.6). Price/tax check runs first — if
PRICE_CHANGEDis returned, Ref: OV-08 renders ("Please refresh to get the latest price") and no promo re-validation occurs for this attempt. User clicks Refresh now → modal reloads pricing → retries. - Promo re-validation fails at pay click (code expired or consumed between Apply and Pay by another user):
- Inline banner renders below promo input. Ref: IN-PROMO-04.
- Discount line item removed from price breakdown.
- Input field stays locked and retains the now-invalid code. [Remove] button shown — manual removal required. Input is NOT auto-cleared.
- Promo error takes effect only after price/tax check passes (step 2 above). If price changes on the same click, price error is shown instead and promo error deferred to next attempt.
- Locked price + promo code: the discounted price via promo code applies to the base fee only. Tax is always recalculated at pay click on the discounted base (never locked). If tax changes between Apply and Pay → Ref: OV-08 triggers (see step 2).
6a. Payment Flow — All Standard Cases
The 1-Click modal flow (Reset, Start New Track, and — per UC_4.10.4 §6 — Time Extension) shares the same backend payment handling as the main checkout flow, and the Secure Checkout page (Path B/C, §7) hits the same backend paths with a different UI shell. This table is the single canonical reference for these cases — covering both UI contexts side by side — so other UCs and sections should point here rather than repeating it.
| Case | Description | UX — 1-Click Modal | UX — Secure Checkout (Path B/C) | Reference |
|---|---|---|---|---|
| Pre-gateway Dedup Check (HTTP 409) | Backend detectsprovider_event_id IS NOT NULL for this user + product — a prior payment for this exact purchase already succeeded | Modal stays open; banner error shown (Ref:BN-07); no charge created. Otherwise — if provider_event_id IS NULL (prior attempt failed or still in progress) — the check does not block, and payment proceeds/continues normally through the standard flow. | Orizon red failure banner renders at the top of the checkout screen; no charge created; CTA re-enables | UC_2.8.1 §5 step 6.0 + BR_2.8.1.5 + BN-07 |
| Card declined (hard/soft decline, insufficient funds, expired card, etc.) | NMI Customer Vault returns a decline code | Processing popup closes; modal re-displays with a banner error showing the decline reason; user can retry or switch to Secure Checkout / Change Payment Method | Orizon red failure banner renders at the top of the checkout screen with the raw decline reason (not generalized); CTA re-enables; user can retry or change payment method | UC_2.8.1 §5 step 8 |
| 5-failure email lock | 5 consecutive declines within a rolling 10-minute window for this email (tracked cross-method in Redis) — 15-minute lock | Current modal closes;OV-03 overlay is displayed — this happens every time the user clicks the CTA payment button while the lock is active. | OV-03 overlay displayed — every CTA click while the lock is active, and also on page reload/re-navigation | UC_2.8.1 §5 + BR_2.8.1.2 |
| 10-minute frontend timeout | Frontend gives up waiting on the gateway response after 10 minutes (25-minute rate-lock exception for Triple-A Crypto (pending, Ref: CR-20260810-001), Ref:UC_2.7.5) | Processing popup closes; modal re-displays with theBN-01 banner rendered at the top of the re-displayed modal | BN-01 banner rendered at the top of the checkout page | UC_2.8.1 §5 step 8.1–8.3 |
| Post-payment Restricted Region fail-safe | The asynchronous Zapier Flow 1 gatekeeping fail-safe (triggered off theNEW_PAYMENT_SUCCESS webhook, not the CTA click itself) detects a sanctions violation after the charge already completed | On the next screen render after the fail-safe resolves, the user is routed to theFP-02 403 screen, with BN-03a (refund in progress) → BN-03b (refund completed) banners rendered on that screen | User routed toFP-02 403 screen, with BN-03a → BN-03b banners | UC_2.8.1/UC_2.8.2 Flow 1 Logic |
| Double-payment after timeout retry | User ignores the 10-minute timeout warning, retries, and both the original (delayed) payment and the retry payment clear via webhook | No user-facing error at click time — both charges appear to succeed independently. Backend always routes this through the irreversible-refund handling path regardless of the payment method's own reversibility: logs the transaction exception to the financial ledger and immediately generates a high-priority Freshdesk compliance ticket for treasury desk restitution | No user-facing error at click time; backend always routes through the irreversible-refund handling path (financial ledger log + high-priority Freshdesk compliance ticket), regardless of payment method reversibility | BR_2.8.1.4 |
7. Exceptional Flow
-
[Gate 1 fails — Status no longer 'Failed' or 'Active_SIM' at pay click]
- Reset/Start New Track Modal closes immediately → Ref: TE-DASH-01 toast displayed. (Ref: [CHR-40])
-
[Gate 2 fails — Sanctions]
Compliance_geo_restrictionsmatch → 403 screen Ref: FP-02 displayed.
-
[SIM provisioning failure — Reset, after payment already succeeded] [CHR-59]
- Applies to §5.1 Step 2 Success (all cases — within or after
archive_date), where broker-specific provisioning is called after the charge has already cleared. Handled with the same classify → retry → escalate pattern, Freshdesk ticket, SES-23 email, and Success Screen replacement described in UC_2.8.2 §Step 3 Exception — Ref: OV-07, SES-23, UC_2.8.4 §6 Exceptional Flow.
- Applies to §5.1 Step 2 Success (all cases — within or after
8. Business Rules
BR_4.10.3.1: Reset Pricing — Routing by Discount_Code_Duration_Days and is_founder
The price displayed on the Reset modal depends on two factors: Discount_Code_Duration_Days window timing (failure_timestamp + Discount_Code_Duration_Days, Table C) and is_founder status. Note: this is distinct from archive_date (broker-specific per UC_4.10.2 BR_4.10.2.7) which governs data archival and sub-account cleanup, not pricing.
| Condition | Standard User | Founder (is_founder == TRUE) |
|---|---|---|
Withinfailure_timestamp + Discount_Code_Duration_Days | Modal: Reset (§10.2) · CTA: "Reset Account Now" · Price: Reset Fee from Table J (by Current_Level + Asset_Class) | Modal: Reset (§10.2) · CTA: "Reset Account Now" · Price:locked_reset_price |
Afterfailure_timestamp + Discount_Code_Duration_Days | Modal: Reset (§10.2) · CTA: "Reset Account Now" · Price: Full Challenge Price from Table J | Modal: Reset (§10.2) · CTA: "Reset Account Now" · Price:locked_rebuy_price — the locked reset privilege expires after the window |
Founder users pay
locked_reset_pricewithin thefailure_timestamp + Discount_Code_Duration_Dayswindow. After the window expires, the locked reset privilege expires and pricing falls back tolocked_rebuy_price.
Early Reset override (input Status = 'Active_SIM' — Ref: [CHR-40]): always uses the within failure_timestamp + Discount_Code_Duration_Days pricing tier (no window check performed). is_founder pricing still applies within that tier: Founder → locked_reset_price; Standard → Reset Fee from Table J.
BR_4.10.3.2: Reset Provisioning — Always Provisions a New Sub-Account [CHR-59]
POST /purchase-challenge-resetalways provisions a new sub-account via broker-specific provisioning (Case A — before Failsafe / Case B — after Failsafe).- Execution order within provisioning is strict: (1) Sync PostgreSQL + S3 Glacier → (2) Provision new sub-account → (3) Delete/unassign old sub-account (broker-specific).
- Full broker-specific detail (Rithmic / MT5 / TraderEvolution provisioning steps for both Case A and Case B) is documented in UC_4.10.2 BR_4.10.2.7 — the Hard Breach UC owns the broker-provisioning mechanics; this UC only triggers it via the pricing/purchase flow above.
- In all cases: wipe failed state from DB, clear trade history, reset virtual balance to tier's starting capital.
- For Early Reset (input
Status = 'Active_SIM', Ref: [CHR-40]): no failed state to wipe (no-op); trade history clear and virtual balance reset still apply. Case A always applies (Active_SIM means no Failsafe has fired).
BR_4.10.3.4: Sanctions Re-Check — Real-Time, Not Cached
- Both tiers of sanctions check (
POST /calculate-cartandPOST /purchase-challenge-reset) queryCompliance_geo_restrictionsreal-time usingbilling_country+billing_regionfrom Users table.
BR_4.10.3.5: Auth0 Unchanged During Reset/Restart
- Auth0 session is not affected by Reset or Start New Track.
- User does NOT need to log in again.
- JWT token does not need refresh —
user_idis unchanged. - Status in DB changes from
'Failed'→'Active_SIM'on the post-Hard-Breach path. For Early Reset (input alreadyStatus = 'Active_SIM', Ref: [CHR-40]), Status does not change.
BR_4.10.3.6: Trade History Archive at Reset
- On successful Reset purchase, trade history is auto-archived from active dashboard view →
user_account_history. - On Reset after
archive_date, trade history was already archived by cron atarchive_date(broker-specific per UC_4.10.2 BR_4.10.2.7). [CHR-59] - After archive, trade history is no longer visible from the frontend (data remains in DB).
- All screens that display trade history data (including the Trade History screen, Dashboard performance widgets, and any related metrics) reset to Day 0 state upon successful Reset completion.
BR_4.10.3.8: Card Display — Brand-Aware Text Variants
The vaulted card display text on the 1-Click Modal (§10.2 item 4, §10.3 item 4) and the Processing Payment popup subtext (§10.6 item 3) renders differently based on card brand returned by NMI Customer Vault. Card brand mapping is handled on the frontend. See §10.2 item 4 for the full display list per brand.
9. Wireframe / UI
9.1 Overall Flow — Popup Sequence
The full flow when a trader with Status = 'Failed' starts a purchase, from any of the entry points described in §2 Trigger:
[Entry Point 1: Dashboard] [Entry Point 2: Account Actions screen]
| |
v |
[1. Hard Breach Popup] |
<- persists on every |
Dashboard visit until purchase |
| |
| User clicks CTA | User clicks "Reset" button
| ("Reset Associate Track") | (Hard Breach Popup bypassed)
| |
v v
`---------------------> [Loading: "Calculating regional taxes..."] <---------------------'
POST /calculate-cart -> price calculated
|
v
[2. Reset Modal] <- branches on vaulted card only
|- Vaulted card present -> Reset modal (1-Click) [§10.2]
`- No vaulted card -> Secure Checkout (Reset) [§10.4]
|
| User clicks CTA (Pay) on modal
v
[3. Processing Payment popup] <- always shown during charge (1-Click path only)
|
|- Success -> [4a. Success screen] -> User clicks "Return to Dashboard" -> Dashboard Day 0
| - Reset: "Associate Track Reset Complete" (all cases — CHR-59)
`- Failure -> Back to modal (2) with inline banner errorNote: The Reset Modal is displayed immediately on Hard Breach and remains the same before and after
archive_date. If the trader has not reset/rebought byarchive_date, data is archived on the backend — but the modal shown on UI does not change. TheDiscount_Code_Duration_Dayswindow check determines the price shown inside the Reset Modal only.
9.2 Reset Modal — 2-Variant Matrix [CHR-59]
| Vaulted card present (1-Click) | No vaulted card (Secure Checkout) |
|---|---|
Reset modal (1).png | Popup Reset track (without vaulted card) + display error.png |
[CHR-59] The "Start New Track" modal variants have been removed. Both within-
archive_dateand after-archive_datecases use the Reset modal. Price displayed differs per BR_4.10.3.1.
Frosted Glass overlay behaviour on the Dashboard (blur states, permanence, non-Dashboard screen access by sub-account lifecycle) → see UC_4.10.2.
9.3 Other Wireframe References
| Wireframe | File |
|---|---|
| Hard Breach Popup | References/Wireframe/Stage 2/Failure and Recovery/Hard breach popup (1).png |
| Change Payment Method | References/Wireframe/Stage 2/Failure and Recovery/Change payment method.png |
| Processing Payment | References/Wireframe/Stage 2/Failure and Recovery/Processing payment modal.png |
| Success Screen — Reset | References/Wireframe/Stage 2/Failure and Recovery/Payment succeed - Reset account.png |
| Account screen (window expired) | References/Wireframe/Stage 2/Failure and Recovery/Account (hard breach + account has been reseted (window expired)).png |
10. Screen Description and Business Rules
10.1 Hard Breach Popup (Dashboard Entry Point Only)
Wireframe reference:
Hard breach popup (1).png
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Track Label | Label | Display rule:- "Associate Track Evaluation" — identifies which track type the breach applies toBehaviour:- Static |
| 2 | Modal Header | Label | Display rule:- "Risk Parameters Breached"Behaviour:- Static. |
| 3 | Body Text | Label | Display rule:- "Your account has exceeded the maximum drawdown or time limit. This evaluation session is closed."Behaviour:- Static copy |
| 4 | Archive Countdown Banner | Label | Display rule:- "Data will be archived in X days" while (archive_date - NOW) >= 24 hours- "Data will be archived in Y hours" while 1 hour <= (archive_date - NOW) < 24 hours- "Data will be archived in less than 1 hour" once (archive_date - NOW) < 1 hourBehaviour:- Dynamic: (archive_date - NOW) computed continuously; X = days rounded down while ≥ 24h remaining (e.g. 36 hours remaining → X = 1 day)- Below 24h remaining, switch to hour units: Y = hours rounded down (e.g. 23 hours remaining → "Data will be archived in 23 hours"; 5 hours remaining → "Data will be archived in 5 hours")- Below 1 hour remaining, switch to fixed text "Data will be archived in less than 1 hour"- Hidden once NOW > archive_date (window has expired) |
| 5 | CTA Button | Button (Primary) | Display rule:- Always: "Reset Associate Track" — label does not change based on window state. There is only one CTA button on this popup.Behaviour:- On click → popup transitions to loading state (spinner + "Calculating regional taxes..." text) → Wireframe: Calculating regional taxes.png |
10.2 Reset Modal (1-Click) [CHR-59]
Used for all Reset purchases — both within and after
archive_date. Price shown differs per BR_4.10.3.1.
Wireframe reference:
Reset modal (1).png
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Modal Header | Label | Display rule:- "Reset Associate Track"- Countdown: "[X days, Y]h remaining", following the countdown rule defined in UC_4.7.4.- Subtext: "Your evaluation will be reset to Day 1"Behaviour:- Static except the countdown- Countdown segment hidden once NOW > archive_date (window expired) |
| 2 | Promo Code — "Have a Promo Code?" | Expandable Text Link | Display rule:- Positioned above the price breakdown line items- Text link reading "Have a Promo Code?" — default state is collapsed- On click → expands inline to reveal: Search Field input (placeholder: "Enter promo code", max 100 chars) + [Apply] buttonBehaviour:- Ref: §6 Promo Code Flow |
| 3 | Price Breakdown | Label | Display rule:- Line item: "Full reset, charts restart from Day 1" — $[Reset_Fee] or $[locked_reset_price] (founder) — Ref: BR_4.10.3.1- Line item: "Tax ([Region/Country])" — $[tax_amount], where [Region/Country] follows the billing region/country returned by Quaderno via /calculate-cart- Total: "Total" — $[Final_Charge] = base + tax- Display format → CR-11Behaviour:- Ref: BR_4.10.3.1 for pricing routing |
| 4 | Vaulted Card Display | Label (read-only) | Display rule:- Shows card brand + last 4 digits based on card brand returned by NMI Customer Vault: · Visa → "Visa ending in XXXX" · Apple Pay → "Apple Pay Card ending in XXXX" · Google Pay → "Google Pay Card ending in XXXX"Behaviour:- Sourced from NMI Customer Vault via customer_vault_id in Users table. Brand mapping handled on frontend. |
| 5 | "Change Payment Method" Link | Link | Behaviour:- On click → opens Secure Checkout page (Path C)- Payment methods from GET /system/status saved state |
| 6 | CTA Button | Button (Primary) | Display rule:- "Reset Account Now ($[Reset_Fee])" (standard) or "Reset Account Now ($[locked_reset_price])" (founder)Behaviour:- Disabled immediately on click (prevents double-click)- On click → Reset modal closes → Processing Payment popup displayed- On success → Success screen "Associate Track Reset Complete" displayed (§10.7); user clicks "Return to Dashboard" → Dashboard Day 0 |
| 7 | Cancel Button | Button (Secondary) | Behaviour:- On click → modal closes; Dashboard stays with Frosted Glass only- No payment is triggered |
10.3 [Removed — CHR-59]
This section previously described a "Start New Track" modal for the expired-window case. Per [CHR-59], both within-
archive_dateand after-archive_datecases use the Reset Modal (§10.2). See BR_4.10.3.1 for price routing.
10.4 Secure Checkout Modal (No Vaulted Card)
Wireframe reference:
Popup when users have not saved vaulted card info before.png
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Modal Header | Label | Display rule:- "Reset Associate Track"- Matches the CTA that was clicked on the Hard Breach Popup |
| 2 | Price Breakdown | Label | Same element/behaviour as§10.2 item 2 — carried over from the triggering modal |
| 3 | Payment Method List | Selectable list | Same element/behaviour asUC_2.7.1 - Order Summary, BR_2.7.1.3- Ref: §5.1 Path B step 3 |
| 4 | Card Entry Form | Form | Same element/behaviour asUC_2.7.2 — Credit Card (NMI Collect.js) |
| 5 | CTA Button — "Pay" | Button (Primary) | Same element/behaviour asUC_2.8.1 — Phase 1, Payment Execution- On success → same post-payment actions as 1-Click Path A Success (§5.1 Step 2 / §5.2 Step 2)- On failure → see §6a Payment Flow — All Standard Cases, "UX — Secure Checkout (Path B/C)" column, for the exact case-by-case UX (not a generic toast) |
| 6 | Cancel Button | Button (Secondary) | Behaviour:- On click → modal closes; Dashboard stays with Frosted Glass |
10.5 Change Payment Method Modal
Wireframe reference:
Change payment method.png
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Modal Header | Label | Display rule:- "Change Payment Method" |
| 2 | Entry Point | Link (from §10.2 item 5) | Behaviour:- Triggered by "Change Payment Method" link on Reset Modal- Opens the same Secure Checkout page described in §10.4 |
| 3 | Payment Method List + Card Entry Form | Selectable list / Form | Identical elements/behaviour to§10.4 items 3-4 — this modal reuses the Secure Checkout flow rather than introducing new elements |
| 4 | CTA Button — "Pay" | Button (Primary) | Identical behaviour to§10.4 item 5 |
10.6 Processing Payment Popup
Wireframe reference:
Processing payment modal.png
Displayed after user clicks the CTA button on the Reset Modal (§10.2). Only applies to Path A (1-Click / vaulted card)
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Spinner / Loading Indicator | Animated Icon | Behaviour:- Circular spinner animation displayed during NMI charge processing- User cannot interact with the popup |
| 2 | Primary Text | Label | Display rule:- Fixed headline: "Processing Payment." — Ref: OV-05Behaviour:- Static copy |
| 3 | Subtext — Card Reference | Label | Display rule:- Dynamic: "Charging [Brand] ending in [last 4 digits]"- Brand-aware text follows the same mapping as BR_4.10.3.8: · Visa → "Charging Visa ending in XXXX" · Apple Pay → "Charging Apple Pay Card ending in XXXX" · Google Pay → "Charging Google Pay Card ending in XXXX"Behaviour:- Sourced from NMI Customer Vault (same customer_vault_id used for the charge) |
10.7 Success Screen — Reset ("Associate Track Reset Complete")
Wireframe reference:
Payment succeed - Reset account.png
| No. | Element | Type | Validation Rule / Behaviour |
|---|---|---|---|
| 1 | Header | Label | Display rule:- "Associate Track Reset Complete"Behaviour:- Static copy |
| 2 | Body Text | Label | Display rule:- "Your evaluation has been reset to Day 1. All charts and metrics have been cleared."Behaviour:- Static copy |
| 3 | CTA Button | Button (Primary) | Display rule:- "Return to Dashboard"Behaviour:- On click → screen closes → Frosted Glass removed → Dashboard Day 0 |
10.8 [Removed — CHR-59]
This section previously described a "Track Started" success screen used after the expired-window "Start New Track" purchase. Per [CHR-59], all Reset purchases (within or after
archive_date) use the "Associate Track Reset Complete" success screen (§10.7).
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-09-03 | v3.8 | BR_4.10.3.1 table + note + Early Reset override — window anchor made explicit | within/after Discount_Code_Duration_Days | within/after failure_timestamp + Discount_Code_Duration_Days | Editorial — matches the anchor wording already used elsewhere in this BR (failure_timestamp + Discount_Code_Duration_Days, Table C) and in UC_4.10.2 BR_4.10.2.7 M2. No logic/value change. |
| 2026-09-03 | v3.7 | §4 Post-conditions; §5.1 Step 2 Success item 2; BR_4.10.3.2; BR_4.10.3.3 removal note | §4 restated the Rithmic/MT5/TraderEvolution broker provisioning steps directly; BR_4.10.3.2 contained the full Pre-deletion gate + Case A/Case B broker tables, duplicatingUC_4.10.2 BR_4.10.2.7's equivalent content across two documents; BR_4.10.3.3's removal note said its content was "consolidated in BR_4.10.3.2" even though that detail actually moved to UC_4.10.2. | §4 now points toUC_4.10.2 BR_4.10.2.7 instead of restating the broker list. BR_4.10.3.2 reduced to a summary rule (always provisions new sub-account, strict execution order, Early Reset no-op wipe) pointing to UC_4.10.2 BR_4.10.2.7 for full Case A/Case B broker detail — mirroring UC_4.15.3 BR_4.15.3.2's relationship to UC_4.15.2. BR_4.10.3.3's removal note corrected to point to UC_4.10.2 BR_4.10.2.7. | BA request 2026-09-03: this UC now owns pricing + UI only; UC_4.10.2 is the single owner of broker-provisioning mechanics. |
| 2026-08-08 | v1 | Initial creation | — | Full SRS with 8 BRs, Basic Flow (Reset / Start New Track), Promo Code Flow, Payment Flow States, Screen Description + Dynamic/Fixed Field Classification, Apple Pay / Google Pay card variants | Init Flow Step 3: Architect |
| 2026-08-10 | v2.6 | Client feedback round 2 (9 items) | v2.5 content | Deleted 3 fabricated §10.1 rows (Next Steps Section, Trading Authority Restoration Notice, Support Contact Notice — not in source) and renumbered table; added "<1 hour remaining" text case to Archive Countdown Banner (§10.1); corrected §10.2 item 1 countdown cross-ref from §10.1 item 5 to UC_4.7.4 (not yet documented in this repo) and trimmed its Behaviour text; replaced §10.2 item 2 Promo Code Behaviour with a bare §6 reference (removed restated Apply/success/error/remove logic); deleted the Florida tax-label example clause and the fabricated "Next Lvl. 10" open-item note from §10.2 item 3; reformatted §10.2/§10.3 item 6 CTA Button Display rule out of broken<br />-joined formatting and trimmed redundant Behaviour text (Path A mention, duplicate success-route sentence, BR_4.10.3.1 CTA-text ref); deleted §10.9 Payment Flow States entirely; fixed 12 missing-space-before-link rendering bugs found across the file during re-verification | Client feedback round 2, 2026-08-10 |
| 2026-08-10 | v2.7 | Fix$[...] price-token rendering | v2.6 content | Root-caused the CTA Button Display rule still rendering "like code" after the v2.6 formatting fix: bare $[Reset_Fee]/$[locked_reset_price]/$[Challenge_Price]/$[locked_rebuy_price]/$[Price]/$[tax_amount]/$[Final_Charge] tokens have an even count of unescaped $ per line, which common Markdown previewers (GitHub, VS Code) interpret as inline-math delimiters — the invalid LaTeX inside then falls back to a broken/code-like render. Escaped all 9 occurrences of $[ to \$[ across §5.2, §10.2 item 3, §10.2 item 6, §10.3 item 6; verified against remark+remark-gfm (the actual docs-site parser) that the escaped form parses as a plain text node, not code/math | Client feedback round 2 follow-up, 2026-08-10 |
| 2026-08-10 | v2.8 | Payment case completeness check (7-case list) | v2.7 content | Added "Double-payment after timeout retry" row to §6a Payment Flow — All Standard Cases table and to §7 Exceptional Flow Secure Checkout Path B/C table, citingBR_2.8.1.4; added new §7 Exceptional Flow bullet block "SIM provisioning failure — Start New Track, after payment already succeeded", referencing the classify → retry → escalate pattern, Freshdesk ticket, SES-23 email, and BN-06 banner defined in UC_2.8.2 §Step 3 Exception; added matching cross-ref in §10.3 item 6 CTA Button Behaviour pointing to the new §7 block | Client-provided 7-case payment list, 2026-08-10 |
| 2026-08-10 | v2.9 | §6a timeout row — Triple-A pending annotation | No annotation present | Added "(pending, Ref: CR-20260810-001)" to the Triple-A Crypto rate-lock exception mention | CR-20260810-001 |
| 2026-08-12 | v3.0 | Gate 1 Status list expanded for Early Reset | Status ='Failed' only | Status IN ('Failed', 'Active_SIM') at §3, §5.1/§5.2 Gate 1, §5.3 Step 0, §7 Exceptional Flow | [CHR-40] |
| 2026-08-15 | v3.0 | §2 Trigger — Entry Point 1 Hard Breach cross-reference | Equity <= Market_Loss_When_Stopped | Net_P&L <= −Absolute_Stop_Loss (Ref: UC_4.10.2 §2 Trigger) | BA update: kept in sync with UC_4.10.2's Hard Breach formula rewrite |
| 2026-08-15 | v3.1 | [CHR-40] — Early Reset pricing rule confirmed | v3.0 content | Added Early Reset override to BR_4.10.3.1 (Active_SIM input always routes to Within-window pricing); updated §5.3 Step 1 to skip archive_date/window check for Active_SIM input; updated §5.3 Step 2 to branch modal on input Status; trimmed §3 Pre-conditions citation; clarified BR_4.10.3.2 (no-op wipe) and BR_4.10.3.5 (status unchanged) for Active_SIM input; added CR citation to §7 Exceptional Flow Gate 1 bullet | [CHR-40], BA session 2026-08-15 |
| 2026-08-17 | v3.2 | §2 Trigger — added Flow 19 Stagnation Expiration entry point | 3 entry points | Added Entry Point 4: SIM Stagnation Expiration (Flow 19) — same downstream path as Hard Breach Popup | QnA FR-52 |
| 2026-08-23 | v3.3 | §1 Description + Zapier Table; §2 Trigger; §4 Post-conditions; §5.1 header + Step 1 + Step 2 success; §5.2 REMOVED; §5.3 Step 1+2; §7 rename; BR_4.10.3.1 2-row routing; BR_4.10.3.2 broker-split Case A/B; BR_4.10.3.3 REMOVED; BR_4.10.3.6 archive_date; §9.1 diagram; §9.2 2-variant matrix; §9.3 remove Start New Track wireframe; §10.2 header; §10.3 REMOVED; §10.8 REMOVED | "Start New Track" modal, 4-variant matrix,locked_rebuy_price, sub-account reuse, Discount_Code_Duration_Days uniform window | Reset only. archive_date broker-specific. 2-variant matrix. New sub-account always provisioned (broker-split Case A/B). Founder alwayslocked_reset_price. | [CHR-59] |
| 2026-08-23 | v3.4 | BR_4.10.3.1 (heading + intro + table + note + Early Reset); §5.1 Step 1 item 1; §5.3 Step 1 item 1; §10.2 item 1; BR_4.10.3.2 | Founder expired →locked_reset_price; pricing referenced archive_date; no countdown hide; no S3 step | Founder expired →locked_rebuy_price. Pricing window references Discount_Code_Duration_Days (not archive_date). Countdown hidden once NOW > archive_date. Pre-deletion S3 gate added (Case A only). | Per product decision and architecture requirement. |
| 2026-08-24 | v3.5 | §9.1 flow diagram + note | §9.1 diagram branched on window + vaulted card (4-way, Start New Track branch remnant from pre-CHR-59) | §9.1 diagram updated: 2-variant, branches on vaulted card only. Added note: Reset Modal persists unchanged before and afterarchive_date; Discount_Code_Duration_Days window determines price only. | Product decision clarification. |
| 2026-08-27 | v3.6 | §6a table (merged with §7's duplicate); §7 Payment fails bullet; §10.4 item 5 | §6a and §7 each held a separate 6-row payment-case table with identical case/description content, differing only in the UX column (1-Click Modal vs Secure Checkout). §10.4 item 5 said "On failure → error toast, form remains open for retry" — inconsistent with the real per-case UX defined in §6a/§7. | Merged into a single 6a table with two UX columns side by side ("UX — 1-Click Modal" / "UX — Secure Checkout (Path B/C)"); §7's "Payment fails" bullet now points to that table instead of repeating it; §10.4 item 5 now references §6a's Secure Checkout column instead of a generic "error toast". | BA request: remove duplicate table, fix inconsistent §10.4 failure description, 2026-08-27. |