StackTrading Docs

SRS: UC_4.10.3 — Scenario A: Sim Reset (In-App)

UC_4.10.3: Scenario A — Sim Reset (In-App)

FieldValue
BA in ChargeHuyen Dinh
Date Created2026-08-08
Versionv3.8
Document ReferencesRFQ_ 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 DocumentKey Sections Used
1RFQ_ 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
2RFQ_ Website and Dashboard Implementation V7.pdf§Scenario A — Failure Modal, 1-Click Purchase Modal, Secure Checkout fallback, Payment states
3Zapier 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

FieldContent
IDUC_4.10.3
Use CaseScenario A: Sim Reset (In-App)
DescriptionAfter 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 TableTable 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 PartyQuaderno (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 fires CHALLENGE_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_date reaches days_remaining < 0 with 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:

  1. 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]
  2. Check user.is_founder to determine pricing tier (standard vs founder locked price). Ref: BR_4.10.3.1.
  3. 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-cart with the full payload.
  4. Final_Charge = base_price + tax_amount
  5. Once POST /calculate-cart returns 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.
  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

  1. 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
  2. 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).
  3. 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

  1. System detects no customer_vault_id → returns UI Fallback payload.
  2. 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).
  3. User chooses payment method and completes transaction.
  4. Full payment flow (form validation, processing, success/failure handling, error recovery) → see §7 Exceptional Flow — Payment flow, all standard cases.
  5. On successful payment:
    • Same post-payment actions as Path A Success

Path C — Change Payment Method:Wireframe: Change payment method.png

  1. User clicks "Change Payment Method" on the modal.
  2. System opens Secure Checkout page.
  3. 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_date and after-archive_date cases 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:

  1. Check the trader's input Status:
    • Status = 'Active_SIM' (Early Reset — Ref: [CHR-40]): skip straight to item 2 below — no archive_date check. Pricing always routes to the "Within archive_date" tier (Ref: BR_4.10.3.1). [CHR-59]
    • Status = 'Failed': continue with item 1 below (same logic as §5.1 Step 1).
  2. (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.
  3. Check user.is_founder to determine pricing tier (standard vs founder locked price). Ref: BR_4.10.3.1.
  4. Account Actions screen shows a loading state (spinner + "Calculating regional taxes..." text) while calling POST /calculate-cart with the full payload.
  5. 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_date tier (Ref: BR_4.10.3.1).
  • Input Status = 'Failed' (within or after archive_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:

  1. 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.
  2. 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_CHANGED is 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.
  3. 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.
  1. 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.

CaseDescriptionUX — 1-Click ModalUX — 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 succeededModal 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-enablesUC_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 codeProcessing popup closes; modal re-displays with a banner error showing the decline reason; user can retry or switch to Secure Checkout / Change Payment MethodOrizon 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 methodUC_2.8.1 §5 step 8
5-failure email lock5 consecutive declines within a rolling 10-minute window for this email (tracked cross-method in Redis) — 15-minute lockCurrent 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-navigationUC_2.8.1 §5 + BR_2.8.1.2
10-minute frontend timeoutFrontend 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 modalBN-01 banner rendered at the top of the checkout pageUC_2.8.1 §5 step 8.1–8.3
Post-payment Restricted Region fail-safeThe 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 completedOn 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 screenUser routed toFP-02 403 screen, with BN-03aBN-03b bannersUC_2.8.1/UC_2.8.2 Flow 1 Logic
Double-payment after timeout retryUser ignores the 10-minute timeout warning, retries, and both the original (delayed) payment and the retry payment clear via webhookNo 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 restitutionNo 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 reversibilityBR_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_restrictions match → 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.

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.

ConditionStandard UserFounder (is_founder == TRUE)
Withinfailure_timestamp + Discount_Code_Duration_DaysModal: 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_DaysModal: Reset (§10.2) · CTA: "Reset Account Now" · Price: Full Challenge Price from Table JModal: Reset (§10.2) · CTA: "Reset Account Now" · Price:locked_rebuy_price — the locked reset privilege expires after the window

Founder users pay locked_reset_price within the failure_timestamp + Discount_Code_Duration_Days window. After the window expires, the locked reset privilege expires and pricing falls back to locked_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-reset always 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-cart and POST /purchase-challenge-reset) query Compliance_geo_restrictions real-time using billing_country + billing_region from 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_id is unchanged.
  • Status in DB changes from 'Failed''Active_SIM' on the post-Hard-Breach path. For Early Reset (input already Status = '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 at archive_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 error

Note: 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 by archive_date, data is archived on the backend — but the modal shown on UI does not change. The Discount_Code_Duration_Days window 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).pngPopup Reset track (without vaulted card) + display error.png

[CHR-59] The "Start New Track" modal variants have been removed. Both within-archive_date and after-archive_date cases 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

WireframeFile
Hard Breach PopupReferences/Wireframe/Stage 2/Failure and Recovery/Hard breach popup (1).png
Change Payment MethodReferences/Wireframe/Stage 2/Failure and Recovery/Change payment method.png
Processing PaymentReferences/Wireframe/Stage 2/Failure and Recovery/Processing payment modal.png
Success Screen — ResetReferences/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.ElementTypeValidation Rule / Behaviour
1Track LabelLabelDisplay rule:- "Associate Track Evaluation" — identifies which track type the breach applies toBehaviour:- Static
2Modal HeaderLabelDisplay rule:- "Risk Parameters Breached"Behaviour:- Static.
3Body TextLabelDisplay rule:- "Your account has exceeded the maximum drawdown or time limit. This evaluation session is closed."Behaviour:- Static copy
4Archive Countdown BannerLabelDisplay 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)
5CTA ButtonButton (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.ElementTypeValidation Rule / Behaviour
1Modal HeaderLabelDisplay 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)
2Promo Code — "Have a Promo Code?"Expandable Text LinkDisplay 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
3Price BreakdownLabelDisplay 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
4Vaulted Card DisplayLabel (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" LinkLinkBehaviour:- On click → opens Secure Checkout page (Path C)- Payment methods from GET /system/status saved state
6CTA ButtonButton (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
7Cancel ButtonButton (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_date and after-archive_date cases 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.ElementTypeValidation Rule / Behaviour
1Modal HeaderLabelDisplay rule:- "Reset Associate Track"- Matches the CTA that was clicked on the Hard Breach Popup
2Price BreakdownLabelSame element/behaviour as§10.2 item 2 — carried over from the triggering modal
3Payment Method ListSelectable listSame element/behaviour asUC_2.7.1 - Order Summary, BR_2.7.1.3- Ref: §5.1 Path B step 3
4Card Entry FormFormSame element/behaviour asUC_2.7.2 — Credit Card (NMI Collect.js)
5CTA 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)
6Cancel ButtonButton (Secondary)Behaviour:- On click → modal closes; Dashboard stays with Frosted Glass

10.5 Change Payment Method Modal

Wireframe reference: Change payment method.png

No.ElementTypeValidation Rule / Behaviour
1Modal HeaderLabelDisplay rule:- "Change Payment Method"
2Entry PointLink (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
3Payment Method List + Card Entry FormSelectable list / FormIdentical elements/behaviour to§10.4 items 3-4 — this modal reuses the Secure Checkout flow rather than introducing new elements
4CTA 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.ElementTypeValidation Rule / Behaviour
1Spinner / Loading IndicatorAnimated IconBehaviour:- Circular spinner animation displayed during NMI charge processing- User cannot interact with the popup
2Primary TextLabelDisplay rule:- Fixed headline: "Processing Payment." — Ref: OV-05Behaviour:- Static copy
3Subtext — Card ReferenceLabelDisplay 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.ElementTypeValidation Rule / Behaviour
1HeaderLabelDisplay rule:- "Associate Track Reset Complete"Behaviour:- Static copy
2Body TextLabelDisplay rule:- "Your evaluation has been reset to Day 1. All charts and metrics have been cleared."Behaviour:- Static copy
3CTA ButtonButton (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

DateVersionUpdated itemBeforeAfterNotes
2026-09-03v3.8BR_4.10.3.1 table + note + Early Reset override — window anchor made explicitwithin/after Discount_Code_Duration_Dayswithin/after failure_timestamp + Discount_Code_Duration_DaysEditorial — 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-03v3.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-08v1Initial creationFull 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 variantsInit Flow Step 3: Architect
2026-08-10v2.6Client feedback round 2 (9 items)v2.5 contentDeleted 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-verificationClient feedback round 2, 2026-08-10
2026-08-10v2.7Fix$[...] price-token renderingv2.6 contentRoot-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/mathClient feedback round 2 follow-up, 2026-08-10
2026-08-10v2.8Payment case completeness check (7-case list)v2.7 contentAdded "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 blockClient-provided 7-case payment list, 2026-08-10
2026-08-10v2.9§6a timeout row — Triple-A pending annotationNo annotation presentAdded "(pending, Ref: CR-20260810-001)" to the Triple-A Crypto rate-lock exception mentionCR-20260810-001
2026-08-12v3.0Gate 1 Status list expanded for Early ResetStatus ='Failed' onlyStatus IN ('Failed', 'Active_SIM') at §3, §5.1/§5.2 Gate 1, §5.3 Step 0, §7 Exceptional Flow[CHR-40]
2026-08-15v3.0§2 Trigger — Entry Point 1 Hard Breach cross-referenceEquity <= Market_Loss_When_StoppedNet_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-15v3.1[CHR-40] — Early Reset pricing rule confirmedv3.0 contentAdded 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-17v3.2§2 Trigger — added Flow 19 Stagnation Expiration entry point3 entry pointsAdded Entry Point 4: SIM Stagnation Expiration (Flow 19) — same downstream path as Hard Breach PopupQnA FR-52
2026-08-23v3.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 windowReset 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-23v3.4BR_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.2Founder expired →locked_reset_price; pricing referenced archive_date; no countdown hide; no S3 stepFounder 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-24v3.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-27v3.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.

On this page