SRS: UC_4.10.2 — Hard Breach: Level Stop
UC_4.10.2: Hard Breach — Level Stop
| Field | Value |
|---|---|
| BA in Charge | Huyen Dinh |
| Date Created | 2026-08-08 |
| Version | v1.4 |
| Document References | RFQ_ Stack Trading Prop Tech V7.pdf (§Hard Breach — Level Stop) · RFQ_ Website and Dashboard Implementation V7.pdf (§Hard Breach) · Zapier Integration V7.pdf (§Flow 2, §Flow 7B Path A) |
Document References
| # | Original Document | Key Sections Used |
|---|---|---|
| 1 | RFQ_ Stack Trading Prop Tech V7.pdf | §Hard Breach — Level Stop (Definition, Trigger, Formula, Business Logic, Founding Mentor Edge Cases, Endpoints, UI/UX) |
| 2 | RFQ_ Website and Dashboard Implementation V7.pdf | §Hard Breach — Level Stop, §Failure Modal UI, §Frosted Glass |
| 3 | Zapier Integration V7.pdf | §Flow 2 (Challenge Monitor), §Flow 7B Path A (SIM failure retention → Klaviyo), §Table C (Discount_Code_Duration_Days), §Table J (Pricing) |
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.10.2 |
| Use Case | Hard Breach — Level Stop |
| Description | When a trader's Net_P&L drops to or below −Absolute_Stop_Loss (flat 7.5% × Notional, all SIM tiers — same threshold variable asUC_4.10.1), the system triggers the Atomic Kill Switch:(1) lock order entry, (2) flatten all positions, (3) cancel all working orders, (4) update DB Status to 'Failed'. The Dashboard renders a permanent "Frosted Glass" Failure Modal until a Reset is purchased. [CHR-59] Archive timing and reset mechanics differ by broker: see BR_4.10.2.7.Since 2026-08-25 this same Failed pipeline is also entered by a voluntary SIM resignation (failure_reason = 'VOLUNTARY_RESIGNATION') — Ref: UC_4.11.2, CR-65. |
| Zapier Flow | Flow 2 (Challenge Monitor — SIM gate, POST /fail-challenge) · Flow 7B Path A (SIM failure retention → Klaviyo) |
| Zapier Table | Table C (Discount_Code_Duration_Days,SIM_stop_percent — default 7.5%, Ref: [CHR-49])Table J (Reset Fee, Full Challenge Price) |
| 3rd Party | Rithmic (Suspend Trading + flatten call — Futures)MT5 Manager API (Disable/Read-Only — Forex)TraderEvolution Admin API (Lock/Read-Only — Forex)Klaviyo (retention email via Flow 7B Path A) |
2. Trigger
This UC owns the
Failedstate, not just the breach that causes it. Two events writestatus = 'Failed'on a SIM account, and everything downstream of that write is shared:
Entry point failure_reasonOwned by Hard Breach — Net_P&L <= −Absolute_Stop_LossDrawdownThis UC Voluntary resignation — POST /resignVOLUNTARY_RESIGNATIONUC_4.11.2 — the middleware sequence and the Resignation Complete modal only; everything after the statuswrite is this document (Ref: CR-65)The pipeline below (Flow 2 → Flow 7B Path A), §4 Post-conditions, BR_4.10.2.2, BR_4.10.2.3 and BR_4.10.2.7 therefore apply unchanged to a resigned trader. The only divergences are the entry point (BR_4.10.2.4's SIM gate does not apply — a resignation is user-initiated), the
failure_reasonvalue, and which modal renders over the frost (selected bystate_reason).
Middleware detects: Net_P&L <= −Absolute_Stop_Loss
Formula:
Absolute_Stop_Loss = Notional × SIM_stop_percent (Zapier Table C, default 7.5% — same variable defined in UC_4.10.1 §2 Trigger, Ref: [CHR-49])
Net_P&L = Realized P&L + Unrealized P&L(same definition as UC_4.10.1)Notional= Notional for the respective Associate Track (Level 1, 2 or 5) from ZapierSIM_stop_percent= 7.5% (default, Zapier Table C, Ops-editable — Ref: UC_4.10.1 §BR_4.10.1.6), flat rate applied regardless of level tier
Worked example (SIM Level 1, $25,000 notional): Absolute_Stop_Loss = $25,000 × 0.075 = $1,875 → Hard Breach fires when Net_P&L <= −$1,875.
- Detection runs continuously — as fills arrive and P&L updates in real-time, the middleware recalculates and checks against the threshold
- Open positions are continuously monitored in real-time (Mark-to-Market) as market prices fluctuate
- Once triggered, the decision is final — no recalculation or rollback even if post-flatten slippage changes P&L
3. Pre-conditions
- Trader has an active SIM account (Status =
Active_SIM) - Middleware maintains a persistent connection to the execution gateway
- Equity is being tracked in real-time via WebSocket streams
4. Post-conditions
Immediate (T+0):
- All open positions flattened via execution gateway
- All working orders cancelled
- Trading sub-account locked (Read-Only state)
LEVEL_STOP_BREACHWebSocket event fired to frontend- Frontend renders Failure Modal with "Frosted Glass" full-dashboard blur
- DB updated with current Equity, Balance, Closed_Trades
- Net_P&L <= −Absolute_Stop_Loss →
POST /fail-challengewith{ user_id, Reason: "Drawdown" } - DB Status updated to
'Failed', failure_timestamp = NOW() - This DB Status change is what fires the
CHALLENGE_FAILEDstate-change webhook → invokes Flow 2 → Flow 7B Path A (SIM retention email) — full sequence documented once, at Basic Flow Steps 7-8
From T+0 to archive_date (broker-specific — see BR_4.10.2.7) [CHR-59]:
- Reset Modal: Displayed immediately at T+0 (Hard Breach). The modal shown does not change based on
archive_date— it is always the Reset Modal. Only the price inside the modal differs (see UC_4.10.3 BR_4.10.3.1). - Trading sub-account: Locked (Read-Only). NOT deleted.
- Dashboard screen only: permanently frosted (blurred, non-interactive except for the Failure Modal/purchase CTAs). The dashboard data rendered underneath the frost is a static data captured at the exact moment of the hard breach (equity, balance, closed trades, charts as they stood at
failure_timestamp) — it is NOT live data and is NOT reset to any starting/blank state.- PnL Gauge specifically: frozen in the "Breached (Account Disabled)" state — needle locked, no further
ACCOUNT_METRICSupdates (Ref: BR_4.8.1.5). - Notification bell and Days Remaining counter (Persistent Header), by contrast, are NOT frozen: both keep running normally — notifications continue to arrive and the countdown keeps ticking, unaffected by the Hard Breach/Frosted Glass state (Ref: UC_4.1.1 §2 Screen Description, Source: BA/client direct instruction, 2026-08-17)).
- PnL Gauge specifically: frozen in the "Breached (Account Disabled)" state — needle locked, no further
- All other screens (Account, Settings, etc.): render completely normally, exactly as business-as-usual — no blur, no restrictions, nothing logged out, nothing deleted. Only the Dashboard screen carries the frosted/permanent-failure treatment during this window.
GET /get-failure-statereturns:is_breached: true,archive_date: <broker-specific per [BR_4.10.2.7](#BR_4.10.2.7)>[CHR-59]- Trader can purchase Reset at discounted price → see UC_4.10.3
After archive_date fires [CHR-59]:
- Trade history cleared from active dashboard view → archived to
user_account_history - Broker-specific provisioning:
- Rithmic: Revoke Market Data entitlements. Change failed sub-account status to
"unassigned". Provision brand-new sub-account. Assign to existing User ID. Re-enable User ID. - MT5 and TraderEvolution: Hard-delete the locked sub-account. Provision brand-new sub-account.
- Rithmic: Revoke Market Data entitlements. Change failed sub-account status to
- Dashboard screen: data underneath the frost resets to T=0 state (same as a fresh account) — no longer the breach snapshot. Frosted Glass remains permanent (does not disappear). The Reset Modal continues to be displayed — same modal as before
archive_datefired. If the trader has not reset/rebought yet, the modal remains present and functional afterarchive_date.- Level Progression widget exception: the Associate Track / SIM evaluation package card is shown in a locked state (lock icon overlay) — this differs from a normal Day 0 dashboard, where the same card is unlocked.
- All other screens carrying trader data (Account, Settings, Journal, etc.) — not just the Dashboard — also reset to T=0 state.
- Account screen (triggered from the sidebar) now shows 3 tabs: "Profile & Preferences", "Billing", and "Account Actions" (Billing tab remains accessible after archive) → Wireframe: Account (hard breach + account has been reseted (window expired)).png
- Trader can purchase Reset at full Challenge Price → see UC_4.10.3
Dashboard access:
- Dashboard login never expires. Trader can return at any time.
5. Basic Flow
Note on Flow 2 architecture: Zapier Flow 2 no longer triggers on a
Trade_Closedwebhook, and its failure check no longer includesDaily_Loss < Limit(Daily Loss is a soft pause, never a hard failure — see UC_4.10.1). The Node.js middleware performs continuous real-time equity monitoring and makes the failure decision itself — Zapier is invoked only afterward, as an event router off the middleware'sCHALLENGE_FAILEDstate-change webhook.
Step 1 — SIM Gate (pre-check, prevents race conditions):
Before evaluating any breach condition, the middleware verifies Status == 'Active_SIM'. IF Status is anything else (e.g., 'Promoting' during a Flow 3 race condition) → skip; no further action this cycle.
Step 2 — Detect breach:
Middleware continuously monitors Net_P&L in real-time from the execution-gateway stream (ACCOUNT_METRICS) and checks Net_P&L <= −Absolute_Stop_Loss as fills arrive and P&L updates.
Step 3 — Check Failure → Atomic Kill Switch (4 sequential sub-steps):
- Lock: Disable order entry via Broker API
- Flatten: Send Market Close for ALL open positions
- Cancel: Cancel all working orders (pending orders)
- DB Update: Status =
'Failed', failure_timestamp = NOW()
The endpoint POST /fail-challenge only returns HTTP 200 when account is CONFIRMED FLAT (Open_Positions == 0). The decision is final once triggered — no recalculation or rollback even if post-flatten slippage changes the P&L.
Step 4 — Update DB (Sotatek can change the payload if needed):
Write current Equity, Balance, Closed_Trades to Users table. Call POST /fail-challenge with { user_id, Reason: "Drawdown" }.
Step 5 — Fire WebSocket event (Sotatek can change the payload if needed):
Middleware emits LEVEL_STOP_BREACH to the frontend:
| Field | Type | Description |
|---|---|---|
event_type | string | "LEVEL_STOP_BREACH" |
user_id | string | Trader's user ID |
net_pnl | float | Current Net P&L at breach (negative float) |
absolute_stop_loss | float | Account's flat 7.5% × Notional stop threshold (negative float) |
amount_over_stop_loss | float | Amount by which Net P&L exceeded the stop loss |
Note — the resignation path does not emit
LEVEL_STOP_BREACH. There is no breach event to push: the frontend already holds the HTTP 200 fromPOST /resignand re-fetches state directly. Steps 5–6 are Hard-Breach-only; a resigned trader reaches the same Frosted Glass state through theGET /failure-staterefresh instead — Ref: UC_4.11.2 §BR_4.11.2.15.
Step 6 — Frontend renders Failure Modal:
- "Frosted Glass" blur applied to the Dashboard screen only → Wireframe: Dashboard - Day 0 + Hard breach.png.
- Other screens (Account, Settings, etc.) render normally — no blur outside the Dashboard.
- Full display rule and re-summon behaviour → BR_4.10.2.2.
Step 7 — State-change webhook → Flow 2 "Challenge Monitor" (router only):
Middleware's DB Update in Step 3 fires the CHALLENGE_FAILED state-change webhook → invokes Flow 2. Flow 2 now routes SIM-status failures to Flow 7B Path A.
A voluntary resignation joins the flow exactly here.
POST /resignperforms its own equivalent of Steps 3–4 (lock → flatten → cancel →status = 'Failed'withfailure_reason = 'VOLUNTARY_RESIGNATION') and then fires the sameCHALLENGE_FAILEDwebhook. Steps 7–8 below run identically for it — same cool-down, same purchase check, same pricing route, same KlaviyoChallenge_Failedemission. Ref: UC_4.11.2 §BR_4.11.2.9, CR-65.
Step 8 — Flow 7B Path A (SIM failure retention):
- Trigger: Account Status changes to Failed (Any Level) — DB webhook
- Action 1 — Cool-Down: Delay 1 Hour (gives user time to click Dashboard "Reset" CTA before marketing email fires)
- Action 2 — Purchase Check: After 1 hour, check whether the trader has already reset the account themselves — IF the last purchase date (
Last_Purchase_Date) is later than the failure time (Failure_Timestamp), it means they already bought a Reset during the cool-down window, so STOP the retention flow (no email sent). - Action 3 — Path Router: Check User_Level → routes to Path A (SIM)
- Action 4 — Pricing route [CHR-59]:
- IF
is_founder == TRUEAND withinfailure_timestamp + Discount_Code_Duration_Days→ retrievelocked_reset_price(Table J) - IF
is_founder == TRUEAND afterfailure_timestamp + Discount_Code_Duration_Days→ retrievelocked_rebuy_price(Table J) — the locked reset privilege expires after the window; pricing falls back to the Live Re-Buy locked price - IF
is_founder == FALSEAND withinfailure_timestamp + Discount_Code_Duration_Days→ retrieve Reset Fee (Table J) by Current_Level + Asset_Class - IF
is_founder == FALSEAND afterfailure_timestamp + Discount_Code_Duration_Days→ retrieve Full Challenge Price (Table J)
- IF
- Action 5 — Reason Code Gate (Ref: UC_4.10.4 §BR_4.10.4.2): IF incoming Reason Code ==
STAGNATION(i.e. this Failed status originated from Flow 19's Stagnation path, not a real-time Hard Breach) → do NOT emit theChallenge_Failedpayload in Action 6 below. ELSE → proceed to Action 6. - Action 6: Emit
Challenge_Failedpayload to Klaviyo API withuser_nameandPricing_Logic_Amount - Out of system scope: Klaviyo monitors conversion lifecycle natively. IF no new transaction within
failure_timestamp + Discount_Code_Duration_Days→ Klaviyo executesCoupon_Expiring_Soonfollow-up broadcast.
6. Alternative Flow
-
[Founding Mentor Hard Breach]
- If
Role_Flag = 'Founding Mentor'and the overlay has NOT yet been acknowledged for this breach event, the Failure Modal is replaced by a Founding Mentor-specific overlay, re-shown until acknowledged, on any of these 3 cases: (a) reloading while already on the Dashboard, (b) navigating to the Dashboard from the header menu/another tab, or (c) logging in and landing on the Dashboard → Wireframe: Hard breach for founding mentor.png - Overlay content:
- Header: "Risk Threshold Breached"
- Body: "Your account has triggered a Level Stop Loss and all positions have been liquidated. As a Founding Mentor, while your trading account is closed, your Pod Leadership and Discord roles are protected and remain active. Your trading account is eligible for reduced pricing to restart."
- Button: "I Acknowledge"
- After acknowledgement: The Founding Mentor overlay is dismissed. Since this overlay already stands in for the Hard Breach Popup as the entry-point popup, clicking "I Acknowledge" does not then show the Hard Breach Popup as a separate intermediate step — it routes straight into pricing + modal, the same way the Account Actions "Reset" button bypasses the Hard Breach Popup (BR_4.10.2.2). The two steps are:
- System calls
POST /calculate-cart(Quaderno tax calculation) → price is locked. - Reset Modal or Start New Track Modal opens directly (4-variant matrix per UC_4.10.3 §9.2) — further branching depends on
Discount_Code_Duration_Dayswindow andcustomer_vault_id.
- System calls
- The mentor's trading account is closed and locked in read-only status exactly like a standard user. They cannot trade immediately. The overlay's "eligible for reduced pricing to restart" line refers to the standard within-window discounted Reset Fee (vs. the Full Challenge Price after expiry) that applies to every trader during
Discount_Code_Duration_Days. - From then on: every subsequent Dashboard reload or click on "Reset" shows the Hard Breach Popup directly — the Founding Mentor overlay does not reappear for this breach event, since it has already been acknowledged.
- Capital Protection (runs immediately, no bypass): All positions flattened via execution gateway. All working orders cancelled.
- Administrative Termination: Discord roles are NOT revoked. Pod assignments remain intact.
- If
7. Exceptional Flow
-
[Founding Mentor closes tab without acknowledging]
- The Founding Mentor overlay is displayed on their next login.
- Dashboard remains locked in Frosted Glass state.
- After acknowledgement, transitions to standard Reset or Start new track Modal.
8. Business Rules
BR_4.10.2.2: Frosted Glass — Permanent Until Reset
- The Hard Breach modal and Frosted Glass display permanently anytime the user is on the Dashboard. Other screens (Account, Settings, etc.) render normally, without blur.
- Hard Breach Popup (the Dashboard-only popup, §10.1 of UC_4.10.3) is (re-)summoned on any of these 3 cases: (a) reload while already on the Dashboard, (b) navigate to the Dashboard from the header menu or another tab, (c) login and land on the Dashboard.
- Account Actions screen "Reset" button is a separate, direct entry point — clicking it does NOT summon the Hard Breach Popup. It bypasses the popup entirely and goes straight to pricing calculation + the Reset modal. See UC_4.10.3 §2 Trigger and §5.3 for the full flow.
- In Frosted Glass mode: all interactive controls on the Dashboard are disabled; data displays and charts appear desaturated and blurred.
- Navigation isolation — the trader is never trapped. The following stay fully interactive behind/around the overlay, in every
Failedstate: the sidebar navigation, the sidebar user chip and its dropdown (including Logout), and every Settings / Account tab (Profile & Preferences,Billing,Account Actions). Only the Dashboard's own widgets are frozen. Shared by every SIMFailedpath, resignation included — Ref: UC_4.11.2. - Modal selection is driven by
state_reason.GET /failure-statereturnsstate_reason: "BREACH" | "RESIGNATION";"BREACH"renders the Hard Breach Popup / Reset Modal specified here,"RESIGNATION"renders the Resignation Complete modal owned by UC_4.11.2 §9.4. The Frosted Glass treatment underneath is identical in both cases — Ref: CR-65. - The Reset Modal is the only modal shown for a SIM Hard Breach. It is displayed immediately upon Hard Breach and remains the same modal before and after
archive_date. Thearchive_datedoes not change which modal is displayed — only the price inside the modal differs byDiscount_Code_Duration_Dayswindow (see UC_4.10.3 BR_4.10.3.1).
BR_4.10.2.3: Discount_Code_Duration_Days — Dynamic Configuration
- The reset window duration is NOT hardcoded. It is read dynamically from Zapier Table C as
Discount_Code_Duration_Days. - Default value: 10 days. Operations can change this at any time without code deployment.
- This variable is one input to the
archive_datecalculation — butarchive_dateis broker-specific (see BR_4.10.2.7) [CHR-59]. For MT5/TE:archive_date = failure_date + Discount_Code_Duration_Days. For Rithmic:archive_date = Min(23:00 UTC last day of failure month, failure_date + Discount_Code_Duration_Days). - Scope of this variable:
Discount_Code_Duration_Daysdetermines the price shown in the Reset Modal (Reset Fee vs. Full Challenge Price — see UC_4.10.3 BR_4.10.3.1). It does not control which modal appears or when the modal appears. The Reset Modal is always displayed immediately on Hard Breach, regardless of whether this window has elapsed.
BR_4.10.2.4: Hard Breach → SIM Gate (Pre-Check)
- Before evaluating any breach condition, the middleware verifies
Status == 'Active_SIM'(Basic Flow Step 1). - If Status is anything else (e.g.,
'Promoting'during a Flow 3 race condition), the middleware skips the breach check entirely for that cycle. - This prevents accidentally failing an account that is mid-promotion.
- Scope: this pre-check guards the automated breach evaluation only. It does not apply to a voluntary resignation, which is user-initiated and validated by its own endpoint — Ref: UC_4.11.2 §BR_4.11.2.7.
BR_4.10.2.5: is_founder vs Role_Flag — Distinct Fields
is_founder(Boolean): Set at Flow 1 Step 4 by comparing the price charged against the Founder Price for the user's tier (Table J). Ref: [CHR-53], UC_2.8.2 §2 Step 4. Used for grandfathered pricing (locked_reset_price,locked_rebuy_price).Role_Flag = 'Founding Mentor'(String): Set via Flow 1.5 when Pod Leader signs Rippling agreement. Used for Founding Mentor Defense Bypass (protection from automated suspension).- Flow 7B Path A uses
is_founderBoolean for pricing, NOTRole_Flag. Being a Founding Mentor does not by itself grant reduced pricing.
BR_4.10.2.7: Broker-Specific Archive Date, Failsafe, and Reset Provisioning Mechanics [CHR-59]
archive_date — Broker-Specific Calculation:
| Marker | Name | Definition |
|---|---|---|
| M1 | Financial EOM Failsafe | 23:00 UTC on the last calendar day of the failure month — Stack Trading will not roll a dead account into a new calendar month and incur new market data fees for a failed trader. |
| M2 | Discount Window Expiry | failure_timestamp + Discount_Code_Duration_Days (Table C, default 10 days) |
| Broker | archive_date formula |
|---|---|
| Rithmic | Min(M1, M2) |
| MT5 | M2 only |
| TraderEvolution | M2 only |
Pre-Archive Gate — Data Integrity Sync
Before executing any broker-side cleanup (disable / revoke / unassign / delete), the system must verify that all final trade data and P&L snapshots for the failed account are successfully written to:
user_account_history(PostgreSQL) — active query layer- AWS S3 Glacier — immutable system of record for all trade logs and compliance data, operating independently of the execution platforms
No cleanup action may proceed until both writes are confirmed. This gate applies at two trigger points:
- Failsafe (
archive_datefires): archive runs before Rithmic disable/revoke/unassign or MT5/TE hard-delete. - Case A (Reset before Failsafe): archive runs before any broker-side cleanup as part of Reset provisioning.
- Case B (Reset after Failsafe): archive was already completed when Failsafe ran — no repeat required.
Execution order is strict: (1) Sync PostgreSQL + S3 Glacier → (2) Provision new sub-account → (3) Delete/unassign old sub-account (broker-specific).
Failsafe — actions when archive_date fires (after Pre-Archive Gate passes)
| Broker | Failsafe Action |
|---|---|
| Rithmic | (1) Disable User ID on the Paper Trading Server. (2) Revoke Market Data entitlements — revoke all active Non-Pro feed entitlements on the sub-account. (3) Unassign sub-account. |
| MT5 | Hard-delete locked sub-account. |
| TraderEvolution | Hard-delete locked sub-account. |
Reset Provisioning — Broker-Specific (New Sub-Account Always)
POST /purchase-challenge-reset always provisions a new sub-account. Provisioning steps differ depending on whether the trader resets before or after the Failsafe has fired.
Case A — Reset BEFORE Failsafe (within archive_date):
Failed sub-account still exists (locked). Failsafe has not fired — User ID remains enabled and Market Data entitlement may still be active. Pre-Archive Gate runs first, then Reset provisioning cleans up the old account.
| Broker | Provisioning |
|---|---|
| Rithmic | Unassign failed sub-account. Provision brand-new sub-account. Assign to existing User ID (User ID remains enabled — no toggle required). Handle Market Data perBR_4.10.2.8 [CHR-60]. New credentials issued. |
| MT5 | Hard-delete failed sub-account. Provision brand-new sub-account.New credentials issued. |
| TraderEvolution | Hard-delete failed sub-account. Provision brand-new sub-account.New credentials issued. |
Case B — Reset AFTER Failsafe (after archive_date):
Failsafe has already run: User ID disabled, Market Data revoked, sub-account unassigned (MT5/TE: hard-deleted). Archive already completed at Failsafe time. Reset provisions the new account and restores access.
| Broker | Provisioning |
|---|---|
| Rithmic | Re-enable User ID (was disabled by Failsafe). Provision brand-new sub-account. Assign to existing User ID. Handle Market Data perBR_4.10.2.8 [CHR-60] (already revoked by Failsafe). New credentials issued. |
| MT5 | Provision brand-new sub-account (old sub-account already deleted by Failsafe).New credentials issued. |
| TraderEvolution | Provision brand-new sub-account (old sub-account already deleted by Failsafe).New credentials issued. |
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: UC_4.10.3 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.2.8: Market Data Handling — Rithmic Reset (SIM) [CHR-60]
Applies to Rithmic traders purchasing a Reset on the SIM track. Because the exchange charges a flat fee per User ID per calendar month, the backend action depends on two conditions: (a) whether the reset occurs in the same calendar month as the failure, and (b) whether the Failsafe has already revoked the entitlement.
| Scenario | Condition | Backend Action |
|---|---|---|
| Same Calendar Month — Before Failsafe | Reset purchased withinarchive_date; entitlement still active on User ID | Backend takes no action — existing Non-Pro data entitlement remains active. No Broker API call. |
| Same Calendar Month — After Failsafe | Reset purchased afterarchive_date; Failsafe has already revoked entitlement | Backend executes an API call to re-enable Non-Pro data. Stack Trading does NOT incur a duplicate exchange fee (flat fee per User ID per calendar month). |
| New Calendar Month | Reset purchased in a subsequent calendar month | Previous entitlement has expired. Backend triggers a Non-Pro data purchase via Broker API. |
BR_4.10.2.6: Immediate Triggering — No Rollback
- As soon as Net_P&L crosses the Level Stop threshold (
−Absolute_Stop_Loss), the Atomic Kill Switch is initiated immediately. - The system WILL NOT recalculate or roll back the Status, even if post-execution slippage causes the final realized P&L to fall back above the threshold.
- Once the flow is initiated, the decision is final (the Status is
'Failed'until a Reset purchase changes it).
9. Wireframe / UI
Wireframe references (Hard Breach state itself only — Reset / Start New Track modal wireframes and the post-expiry Account screen live in UC_4.10.3 §9):
| Wireframe | File |
|---|---|
| Dashboard — Day 0 + Hard Breach (Frosted Glass) | References/Wireframe/Stage 2/Failure and Recovery/Dashboard - Day 0 + Hard breach.png |
| Hard Breach for Founding Mentor | References/Wireframe/Stage 2/Failure and Recovery/Hard breach for founding mentor.png |
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-09-03 | v1.4 | §5 Step 8 Action 4 pricing routes + Action 6 out-of-scope note — 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 in BR_4.10.2.7 M2 and UC_4.10.3 BR_4.10.3.1. No logic/value change. |
| 2026-09-03 | v1.3 | BR_4.10.2.7 — merged Reset Provisioning Case A/Case B tables in from UC_4.10.3 BR_4.10.3.2; heading renamed | BR_4.10.2.7 covered onlyarchive_date calculation and the passive Failsafe cleanup — the broker-specific Case A/Case B new-sub-account provisioning tables lived solely in UC_4.10.3, split across two documents. | BR_4.10.2.7 (renamed "Broker-Specific Archive Date, Failsafe, and Reset Provisioning Mechanics") now ownsarchive_date, the Pre-Archive Gate (with explicit execution order), the passive Failsafe action table, and the Case A / Case B broker-specific provisioning tables. UC_4.10.3 BR_4.10.3.2 is reduced to a summary rule pointing here — mirroring how UC_4.15.2 BR_4.15.2.7 / UC_4.15.3 already split LIVE. | BA request 2026-09-03: SIM's Hard-Breach-vs-Reset split was inconsistent with LIVE's Hard-Breach-vs-Re-Buy split (LIVE consolidates all broker provisioning logic in the Hard Breach UC). Reconciled by moving SIM's Case A/B tables here to match. |
| 2026-08-26 | v1.2 | New BR_4.10.2.9 — Day 0 Gateway Lock and Liquidation, Shared Contract (superseded — folded back into §5 Step 3 in v1.3+, see rows above); BR_4.10.2.2 gains a navigation-isolation bullet; §5 Step 3 cross-refs the new BR | §5 Step 3 said only*"Lock: Disable order entry via Broker API"* — theper-gateway state values did not exist in this document at all, they lived only in UC_4.11.2 BR_4.11.2.5. BR_4.10.2.2 said "all interactive controls disabled" without scoping it to the Dashboard or naming what stays reachable. | BR_4.10.2.9 now owns the shared gateway contract for every path that puts a SIM account into 'Failed': the per-gateway Day-0 read-only values (Rithmic INACTIVE · MT5 READONLY · TE TRADING IS DISABLED BY RISK RULE), the explicit do NOT unassign/delete on Day 0 rule, flatten, cancel, and the Open_Positions == 0 completion contract — noting the one divergence, that resignation reaches completion asynchronously via a middleware retry queue because it can be submitted out of hours. BR_4.10.2.2 gains navigation isolation: sidebar, user chip/Logout and every Settings tab stay interactive; only Dashboard widgets freeze. | Editorial de-duplication soUC_4.11.2 can reference rather than restate — no rule of this UC changed. The state table was written here for the first time; it was previously reachable only through the resignation UC, which is backwards given both paths use it. |
| 2026-08-25 | v1 | Cross-reference added — voluntary SIM resignation now enters this same Failed pipeline. §1 Description, §2 Trigger (new entry-point table), §5 Step 5 note + Step 7 note, BR_4.10.2.2, BR_4.10.2.4 | The document described Hard Breach as the sole producer ofstatus = 'Failed'. BR_4.10.2.2 stated "The Reset Modal is the only modal shown for SIM failure". BR_4.10.2.4's SIM gate was stated without scope. Nothing pointed back to UC_4.11.2. | §2 gains an entry-point table naming both producers of'Failed' — Hard Breach (failure_reason = 'Drawdown', this UC) and voluntary resignation (VOLUNTARY_RESIGNATION, UC_4.11.2) — and states explicitly that §4, §5 Steps 7–8, BR_4.10.2.2/.3/.7 apply unchanged to both. §5 Step 7 gains a note that resignation joins the flow at that exact point; a note before Step 6 records that resignation does not emit LEVEL_STOP_BREACH. BR_4.10.2.2 gains a modal-selection bullet keyed on state_reason ("BREACH" → Reset Modal · "RESIGNATION" → Resignation Complete modal), and the "only modal for SIM failure" claim is narrowed to "SIM Hard Breach". BR_4.10.2.4 gains a scope bullet — the SIM gate guards the automated evaluation only, not a user-initiated resignation. | Ref:CR-65. No behavioural rule of this UC changed — this is a bidirectional cross-reference so the Hard Breach owner document acknowledges its second entry point. UC_4.11.2 v1.5 was rewritten as a delta doc pointing here; without this row the reference ran one way only. |
| 2026-08-08 | v1 | Initial creation | — | Full SRS with 5 BRs (BR_4.10.2.2–BR_4.10.2.6), Basic Flow, Alternative Flow (Founding Mentor), Exceptional Flow, Screen Description + Dynamic/Fixed Field Classification | Init Flow Step 3: Architect |
| 2026-08-10 | v1 | BA answers on audit backlog (GAP-03, GAP-04, GAP-05, GAP-07) | — | Fixed "Reser" typo to "Reset" (§7, GAP-07). Corrected stale BR count from 8 to 5 in this Changelog andindex.md (GAP-05). Confirmed §6 Founding Mentor overlay header ("Risk Threshold Breached") and the standard Failure Modal ("Risk Parameters Breached", per WBS) are two distinct UI elements, not a naming conflict (GAP-04). Annotated STAGE2-008 in the shared category QnA as superseded by QN-4.10.2-04 (GAP-03). | BA: response to audit-v1 backlog |
| 2026-08-12 | v1 | §4 Post-conditions — Account screen tab count afterT+Discount_Code_Duration_Days | Account screen showed only 2 tabs: "Profile & Preferences" and "Account Actions" | Account screen shows 3 tabs: "Profile & Preferences", "Billing", and "Account Actions" — Billing screen remains viewable even after the account is archived/reset | BA update: user must still be able to manage billing after the reset window expires |
| 2026-08-15 | v1 | Document References, §1 Overview, §2 Trigger, §4 Post-conditions, §5 Basic Flow (Step 2, Step 5 payload), BR_4.10.2.6 — Hard Breach trigger formula | Trigger wasEquity <= Market_Loss_When_Stopped, with Equity = Balance + Unrealized P&L and Market_Loss_When_Stopped looked up per-level from Table A (Forex)/Table B (Futures) | Trigger isNet_P&L <= −Absolute_Stop_Loss, where Absolute_Stop_Loss = Notional × 7.5% (flat rate, all SIM tiers) — same variable/definition as UC_4.10.1. Table A/B removed from this UC's references (LIVE-only, not used by SIM) | BA update: client-supplied formula clarification — SIM Hard Breach uses a flat rate, not the LIVE per-level Table A/B lookup |
| 2026-08-18 | v1 | §5 Basic Flow Step 8 — added Reason Code Gate | Step 8 emittedChallenge_Failed unconditionally (Action 4 → Action: Emit, no gate) | Inserted new Action 5 — Reason Code Gate: IF incoming Reason Code ==STAGNATION → do NOT emit Challenge_Failed (renumbered old Action to Action 6); cross-ref UC_4.10.4 §BR_4.10.4.2 | Gap found in BA audit: UC_4.10.2 was not in sync with the already-confirmed FR-52 suppression rule documented in UC_4.10.4 (2026-08-17). No CR needed — FR-52 is client-confirmed for both SIM and LIVE; this closes the SIM-side sync gap. |
| 2026-08-20 | v1 | §4 Post-conditions — "Dashboard screen only" bullet, T+0 to T+Discount_Code_Duration_Days window | Bullet described the frost/static-snapshot behavior only, with no PnL Gauge/Notification/Days Remaining distinction | Added 2 sub-bullets: PnL Gauge is frozen ("Breached (Account Disabled)" state, needle locked, Ref:UC_4.8.1 §BR_4.8.1.5); Notification bell and Days Remaining counter keep running normally, unaffected by the Hard Breach state (Ref: UC_4.1.1 §2) | BA clarification (2026-08-20): cross-referenced existing confirmed sources (BR_4.8.1.5, Persistent Header table sourced BA/client 2026-08-17) — no new source, gap-fill only. Defense Protocol state not applicable to SIM (Ref:BR_4.8.1.1) |
| 2026-08-23 | v1 | §1 Description; §4 Post-conditions (archive_date headers + broker-split provisioning); §5 Step 8 Action 4 pricing + new Action 5 Market Data + Actions renumbered; BR_4.10.2.3 (archive_date cross-ref); new BR_4.10.2.7 | “Start New Track” in Description; uniformDiscount_Code_Duration_Days window; locked_rebuy_price in pricing; cron DeleteUser; no Market Data logic | Reset only. archive_date broker-specific (Rithmic EOM Min vs MT5/TE duration). Founder alwayslocked_reset_price. Market Data logic (Rithmic). New BR_4.10.2.7. | [CHR-59] [CHR-60] |
| 2026-08-23 | v1 | §5 Step 8 Action 4 — Founder pricing split +Discount_Code_Duration_Days window; BR_4.10.2.7 — pre-provisioning S3 Glacier gate | Founderlocked_reset_price regardless of archive_date; pricing referenced archive_date; no S3 sync step | Founder within window →locked_reset_price; Founder expired → locked_rebuy_price. Pricing window references Discount_Code_Duration_Days (not archive_date). Pre-deletion gate (Case A only): sync PostgreSQL + S3 → provision → delete/unassign old. | Per product decision and architecture requirement. |
| 2026-08-24 | v1 | §4 Post-conditions (T+0→archive_date block: new Reset Modal bullet; after archive_date block: Dashboard bullet extended); BR_4.10.2.2 (new bullet; fix "Reset/Start New Track modal" → "Reset modal"); BR_4.10.2.3 (new scope bullet) | Modal display language adjacent toarchive_date window; BR_4.10.2.2 referenced "Reset/Start New Track modal" (LIVE concept) | Reset Modal displayed immediately on Hard Breach — independent ofDiscount_Code_Duration_Days / archive_date. archive_date is backend-only (data archival + sub-account cleanup). Modal remains the same before and after archive_date; only price differs. | Product decision clarification. |