StackTrading Docs

SRS: UC_4.17.2 — Settings: Account Actions — Resign Account (LIVE)

UC_4.17.2: Settings — Account Actions: Resign Account (LIVE)

FieldValue
BA in ChargeQuynhAnh12
Date Created2026-08-26
Versionv1
Document ReferencesQnA from clients — Stage 2 - Dashboard & Fomula (Settings).csv, category Settings: Resign Account[RES-TRIG-01], [RES-UI-01], [RES-BIZ-01] (Adrian Stack, 2026-08-12) · [RES-BIZ-02], [RES-BIZ-03], [RES-ZAPF-01], [RES-ZAPF-02] (2026-08-24) · QnA_STAGE2_FAILURE_AND_RECOVERY.md (FR-18 → FR-26 Severance, FR-30 / FR-54 Severance threshold, FR-20 resignation → full severance) · RFQ_ Website and Dashboard Implementation V7.pdf (§Part C — "Resign & Close Account Button", Step 1 Warning / Step 2 Confirmation) · RFQ_ Stack Trading Prop Tech V7.pdf (§Endpoint POST /resign, §Get Failure State) · Zapier Integration V7.pdf (§Flow 20 — Trader Resignation Handler, §Flow 7, §Flow 7B Path B, §Flow 9, §Table A/B, §Table C, §Table J) · CR-20260818-001 (Flow 7 — Pod Impact & Dispersal) · UC_4.15.2 — Hard Breach: Level Stop (LIVE) — the entire post-Terminated half of this use case is owned there and is referenced, not restated

Document References

#Original DocumentKey Sections Used
1RFQ_ Website and Dashboard Implementation V7.pdf§Part C — "There is also a red 'Resign & Close Account Button' which should have friction behind it."Step 1 (Warning) modal copy, Step 2 (Confirmation) manual phrase entry, "Sends a POST /resign request… Logs them out of the dashboard and disables access." (the logout half is superseded — Ref: BR_4.17.2.8)
2RFQ_ Stack Trading Prop Tech V7.pdf§Endpoint table — Resign Account / POST /resign, input {user_id, confirmation_phrase} → HTTP 200 OK · §Get Failure State. The source line "Trigger Flow 20…" still governs on LIVE — it was superseded for SIM only by CR-65 — Ref: BR_4.17.2.9
3Zapier Integration V7.pdf§Flow 20 — Trader Resignation Handler ("Trigger: Webhook from Middleware Hub (Event: RESIGNATION_EXECUTED) → Trigger Flow 7 (Financial Reporting/Liquidation). Reason Code: VOLUNTARY_RESIGNATION.") · §Flow 7 — full 11-step termination pipeline, owned by UC_4.15.2 §5 · §Flow 7B Path B — Retention & Retargeting (Live/Funded) · §Flow 9 — Severance Protocol · §Table A/B (Severance_Pay, Retry_Discount) · §Table C (Discount_Code_Duration_Days) · §Table J (Full Challenge Price, locked_rebuy_price)
4QnA from clients — STAGE 2: Dashboard & Evaluation (Settings), 2026-08-12[RES-TRIG-01] — the confirmation phrase is case-sensitive ("Yes. Must be typed exactly in the proper case.") · [RES-UI-01] — the Step 2 CTA stays completely disabled until an exact match, "Do not leave it enabled just to display error states." · [RES-BIZ-01] — no success screen, no logout, no token clear; "simply refresh the user's dashboard state… the dashboard will naturally render the 'Frosted Glass' failure state… either the Sim Reset or the Live Re-Buy modal". Ref: BR_4.17.2.4, BR_4.17.2.8, BR_4.17.2.15
4aQnA from clients — STAGE 2 (Settings), 2026-08-24[RES-ZAPF-01]The single answer that fixes the LIVE end state. "SIM Resignation → status = Failed; LIVE Resignation → status = Terminated" and "please update the trigger for Flow 7B. It must fire when an account status changes to EITHER Failed OR Terminated. This ensures every single trader who loses their seat, regardless of their level or how they lost it, gets dropped into the retention marketing funnel to buy a new evaluation." Ref: BR_4.17.2.9, BR_4.17.2.14, BR_4.17.2.16
4bQnA from clients — STAGE 2 (Settings), 2026-08-24[RES-BIZ-02]The 10-day window applies to a resignation. "Just retain the 10 day access. flow 20 → Flow 7. Same failsafe applies here: at the 10-day mark OR 11:59 PM on the last day of the calendar month, you must disable the gateway access to halt market data fees and archive the dashboard data." · "Don't create another endpoint. Change the state check logic in the Get Failure State endpoint. It must now evaluate IF status == 'Failed' OR status == 'Terminated'." Ref: BR_4.17.2.15, BR_4.17.2.17
4cQnA from clients — STAGE 2 (Settings), 2026-08-24[RES-BIZ-03]The three-layer separation the client insisted on: ReadOnly is a brief execution-gateway freeze used only to flatten safely, Terminated is the state after the account is flat, and the web dashboard login stays active"their actual trading terminal connection is dead" but "the user's web dashboard login remains active so they can access their history and purchase a Reset." Ref: BR_4.17.2.5, BR_4.17.2.8
4dQnA from clients — STAGE 2 (Settings), 2026-08-24[RES-ZAPF-02]Flow 7's Notification step branches on Is_Professional: "IF Is_Professional == True (Live Trader) → send Live_Account_Closed." And the Feedback Survey Gate is "a completely independent action… only triggers the Typeform survey if the user has an active pod_leader_id." Ref: BR_4.17.2.9
5QnA from clients — QnA_STAGE2_FAILURE_AND_RECOVERY.mdFR-20"if a trader voluntarily resigns, they have not breached the stop loss limit, so Amount_Over_Stop_Loss defaults to $0" → full base severance · FR-21"Flow 20 handles the VOLUNTARY_RESIGNATION trigger when the user clicks the 'Resign Account' button" · FR-30 / FR-54 — the severance gate is Severance_Pay > 0, evaluated dynamically, not a hard-coded level · FR-22/23 (payout routing), FR-24/25 (human authorisation), FR-26 (deduction math), FR-18/19 (TERMINATION_FOR_CAUSE scope). Ref: BR_4.17.2.13
6QnA from clients — QnA_STAGE2_SETTINGS_CAREER_VIRAL.md[DL-BIZ-04] — Discord role revocation on Terminate/Resign: strip every role, keep discord_user_id, do not remove the trader from the server. This is the LIVE path the rule was written for — Ref: BR_4.17.2.11 · [MDM-BIZ-14] (2026-08-24) — the Market Data Refund Check stays in Flow 7 as a chargeback failsafe, next-month prepay only, no current-month proration — Ref: BR_4.17.2.12
7CR-20260818-001New Flow 7 step Pod Impact & Dispersal, inserted immediately after Digital Eviction — mentee exit decrements Pod_Leader_Registry.Current_Count and clears pod_leader_id; leader exit sets registry Status = Terminated and fires POD_LEADER_TERMINATED → Flow 15A. ⚠️ Status 🔴 Active (pending apply) — Ref: BR_4.17.2.11, §10 A-52
8UC_4.15.2 — Hard Breach: Level Stop (LIVE) — primary reference documentEverything that happens after status becomes 'Terminated' is the Hard Breach path and is owned by UC_4.15.2, not duplicated here: §4 Post-conditions (T+0 → archive_date window, static snapshot under the frost, behaviour after expiry) · §5 Basic Flow, Flow 7 Steps 2–11 and the Flow 7B Path B block · BR_4.15.2.2 (Frosted Glass permanence) · BR_4.15.2.3 (Discount_Code_Duration_Days) · BR_4.15.2.5 (Flow 9 eligibility and payout routing) · BR_4.15.2.7 (broker-specific archive_date, failsafe actions, Glacier gate, Case A/B Re-Buy provisioning) · BR_4.15.2.8 (Market Data re-select)
9UC_7.5 — Severance (Flow 9)Not yet documented in this repo. The severance calculation, the payout routing (Dots / Rippling), the ActiveCampaign task, the exit interview and the blockchain + QuickBooks recording are owned there. This UC asserts only the two resignation-specific inputs into Flow 9 — Ref: BR_4.17.2.13

Design asset note. No LIVE design frame exists for this screen. The three SIM frames — Account Actions tab, Step 1 modal (Resign & Close Account), Step 2 modal (Confirm Resignation) — are the working source for the shell and the two friction modals, and the client-supplied Resignation Complete screenshot of 2026-08-25 is the source for §9.4. None of them is committed to References/Wireframe/ — Ref: UC_4.11.2 §Document References, §10 A-50.

⚠️ How to read this document — it is a delta on UC_4.15.2

A LIVE resignation and a LIVE Hard Breach converge on the same end state — users.status = 'Terminated' — and from that write onward they run the same pipeline: Flow 20 hands to Flow 7, Flow 7B Path B fires off the state change, the Dashboard frosts over, the 10-day archive window runs, and the re-entry purchase is the Scenario B Re-Buy. Only the trigger, four Flow 7 branch conditions and a handful of surface elements differ.

Where the behaviour is shared it is referenced, never restated. If a shared rule changes, it changes in UC_4.15.2 and this document inherits it.

Component split — shared vs unique

🔗 Referenced from UC_4.15.2 — reused verbatim, NOT respecified here. These are one codebase; a change lands there and this UC inherits it.

#Shared componentOwner
1Gateway execution lock (Day 0 read-only) — the brief freeze that lets the system cancel and flatten without new orders slipping in; no unassign/delete on Day 0UC_4.15.2 §5 Step 1 Atomic Kill Switch, BR_4.15.2.7. ⏳ Per-gateway state values are not owned anywhere on LIVE — Ref: BR_4.17.2.5, §10 A-51
2Order liquidation — flatten every open position, cancel every working order, converge on Open_Positions == 0UC_4.15.2 §5 Step 1 (Kill Switch) + Flow 7 Step 4 (confirming second pass)
3Frosted Glass overlay — Dashboard-only blur/desaturation, metrics frozen at the exact millisecond, permanent until a Re-Buy completesBR_4.15.2.2, UC_4.15.2 §4
4Navigation isolation — sidebar, user chip/Logout and every Account / Settings tab stay interactive; the trader is never trappedUC_4.15.2 §4 ("All other screens render normally"), BR_4.10.2.2
5Failure-state API engine — one consolidated GET /failure-state, same JSON shape, evaluating Failed and TerminatedBR_4.17.2.15 (the resignation branch of the contract) + UC_4.11.2 BR_4.11.2.12 (the shared contract, BE-3)
6Delayed purge policy (10-day / EOM failsafe)archive_date per broker, Pre-Archive Gate (PostgreSQL + S3 Glacier), failsafe actionsBR_4.15.2.7
7Flow 7 Steps 2–11 — Refund Check, Ledger Close, Liquidation second pass, Balance Check, Retention Gate → Flow 9, Post-Termination Access Control, Digital Eviction, GL Posting, Feedback Survey Gate, NotificationUC_4.15.2 §5 — the four branch conditions that differ on resignation are listed at BR_4.17.2.9
8Flow 7B Path B — 1-hour cool-down, purchase check, pricing route, Klaviyo Retention_Offer_DiscountUC_4.15.2 §5 Flow 7B block
9Severance Protocol (Flow 9) — eligibility gate, deduction math, Path A/B/C payout routing, human authorisationBR_4.15.2.5 → full ownership at UC_7.5
10Re-entry purchase (Scenario B In-App Re-Buy)POST /calculate-cart → Re-Buy Modal → POST /initiate-rebuy → Live→SIM rollback, Case A / Case B provisioning, Market Data re-selectUC_4.15.3, BR_4.15.2.7, BR_4.15.2.8
11Permanent compliance preservationidentity_status, contract_status, institution_approval_status, payout_status, dots_payee_id, veriff_failed_flag, veriff_attempts survive, so a returning trader bypasses Veriff and the Rippling ICAUC_4.15.3 §4 (Source: QnA FR-01)

🔨 Unique to LIVE resignation — custom build, specified in full here.

#Unique componentSpecified at
1Friction gate in Settings — two-step modal, case-sensitive typed RESIGN (all caps), CTA disabled until an exact match, no lockout or retry limitBR_4.17.2.2BR_4.17.2.4, §9.1§9.3
2POST /resign (LIVE branch) — validates the phrase, branches on Is_Professional == True from the JWT claims, orchestrates the Day 0 lock and liquidation, and emits RESIGNATION_EXECUTED into Zapier Flow 20BR_4.17.2.5
3Defense Gate bypassResignation == True short-circuits the Level 9+ Drawdown Defense check; a resigning trader never enters Flow 4BBR_4.17.2.10
4Full severance, no deductionAmount_Over_Stop_Loss is inherently $0, so an eligible trader receives 100 % of the base Severance_PayBR_4.17.2.13
5Modal copy block — shared failure-modal structure and Archive Countdown Banner, resignation-specific header/body and CTA [Start Associate Track]; selected by state_reason == "RESIGNATION"§9.4
6Out-of-hours flatten — a resignation can be submitted while the market is closed; a Hard Breach never canBR_4.17.2.18
7Session preservation on a user-initiated close — the Auth0 session is kept alive to bypass Passwordless OTP friction on re-entryBR_4.17.2.8
8This action is the hard prerequisite that enables Reset Associate Track — until it completes, the LIVE button above this section stays DisabledBR_4.17.2.16, UC_4.17.3 BR_4.17.3.4

Environment scope: LIVE only. The SIM counterpart is UC_4.11.2, whose end state and automation are different on the one point that matters: since CR-65 a SIM resignation writes status = 'Failed' and routes through Flow 2 → Flow 7B Path A, bypassing Flow 20 / Flow 7 / Flow 9 entirely. Flow 20 → Flow 7 (and Flow 9) survive intact — they are now LIVE-only, and this document owns their entry point. Ref: BR_4.17.2.19.


1. Overview

FieldContent
IDUC_4.17.2
Use CaseSettings — Account Actions: Resign Account (LIVE)
DescriptionFrom the Account Actions tab of the Account screen, a LIVE funded trader voluntarily and permanently resigns from the firm. The action sits behind a mandatory two-step friction barrier (warning modal → typed confirmation phrase) and is irreversible. POST /resign takes its LIVE branch on Is_Professional == True: it blocks order routing at the execution gateway, flattens all open positions, cancels all working orders, writes an audit record, and emits RESIGNATION_EXECUTED to Zapier Flow 20, which triggers Flow 7 with Reason Code = VOLUNTARY_RESIGNATION. Flow 7 writes users.status = 'Terminated' and runs the full termination pipeline — with four branch conditions specific to a resignation: the Defense Gate is skipped, the severance deduction resolves to zero, the Notification step sends Live_Account_Closed, and the Feedback Survey Gate can fire because a LIVE trader may hold a pod_leader_id (Ref: BR_4.17.2.9, BR_4.17.2.10, BR_4.17.2.13). From the Terminated write onward the account is, by design, indistinguishable from a Hard Breach termination — Flow 7B Path B fires off the same state change, the Dashboard frosts over the snapshot taken at failure_timestamp, the 10-day archive window runs, and the re-entry purchase is the Scenario B In-App Re-Buy (Ref: BR_4.17.2.16, BR_4.17.2.17). The trader is not logged out: the Auth0 session survives so a new Associate Track can be bought without re-authenticating (Ref: BR_4.17.2.8). Unlike SIM, the LIVE path additionally revokes every Discord role, disperses the trader's pod, posts the realised P&L to QuickBooks and may pay severance (Ref: BR_4.17.2.11, BR_4.17.2.13). There is no refund of the challenge fee; the only money that can flow back is a next-month market-data prepay (Ref: BR_4.17.2.12). Completing this use case is also the hard prerequisite that enables the Reset Associate Track control above it — Ref: BR_4.17.2.16. This UC owns the Resign & Close Account section, its two friction modals and the post-resignation modal; the surrounding Account screen shell is owned elsewhere — Ref: BR_4.17.2.1.
Zapier FlowFlow 20 — Trader Resignation Handler (triggered by the middleware's RESIGNATION_EXECUTED webhook; its only action is to trigger Flow 7 with Reason Code = VOLUNTARY_RESIGNATION) → Flow 7 — Financial Reporting / Recycling Logic (full termination pipeline, documented once at UC_4.15.2 §5) → Flow 9 — Severance Protocol (only when Severance_Pay > 0) · Flow 7B Path B — Retention & Retargeting (separate listener, fires off the Terminated state change) · Flow 15A — Pod Re-Assignment (only when the resigning trader is a Pod Leader, via POD_LEADER_TERMINATED)
Zapier Tableusers (status, termination_reason, termination_date) · audit (action) · user_account_history (archive snapshot) · Table A (Forex) / Table B (Futures) — Severance_Pay, Retry_Discount · Table CDiscount_Code_Duration_Days · Table J — Full Challenge Price / locked_rebuy_price · Table EPod_Leader_Registry (Current_Count, Status) · invoices (market-data refund lookup) — Ref: BR_4.17.2.14
3rd PartyRithmic Live FCM Gateway (Ironbeam) / MT5 Manager API / TraderEvolution Admin API — read-only switch and liquidation on Day 0, deferred purge at archive_date per BR_4.15.2.7 · Discord Bot (POST /discord/revoke-all-roles) · QuickBooks Online (GL Posting) · Typeform (natively hosted exit survey) · Klaviyo (retention email via Flow 7B Path B) · AWS SES (Live_Account_Closed, Ref: SES-20) · ActiveCampaign (severance task + exit interview, via Flow 9) · Dots / Rippling (severance payout, via Flow 9) · AWS S3 Glacier (trade-log archive before the broker-side purge) · Internal Ops Slack (Balance < 0 critical alert)

Design: ⏳ No LIVE Figma node assigned. The WBS carries no design link for UC_4.17.2. The SIM frames (Figma — Resign, node 7878-119388 · node 7878-119281) govern the shell and both friction modals; the Resignation Complete modal follows the client-supplied screenshot of 2026-08-25. Ref: §10, A-50.

2. Trigger

The trader clicks [Resign Account] in the Resign & Close Account row of the LIVE Account Actions tab (Ref: §9.1), while that button is Enabled — i.e. while users.status = 'Active_DMA' (Ref: BR_4.17.2.7).

Navigation path to that row:

  1. The trader clicks the user chip in the sidebar footer and selects Settings from the dropdown. Ref: UC_4.1.2 §2 Screen Description, row 6.
  2. The Account screen opens on its default active tab Connections & Credentials. Ref: BR_4.6.1.1.
  3. The trader selects the Account Actions tab, which renders the Reset Associate Track section (UC_4.17.3) above the Resign & Close Account section (this UC).

This is the only path to the section — there is no deep link and no shortcut from the Dashboard. Ref: BR_4.17.2.1.

The two sections on this tab are mutually exclusive by construction. While the trader is trading, Resign & Close Account is Enabled and Reset Associate Track is Disabled. The moment this use case completes, the two swap — Ref: BR_4.17.2.7, BR_4.17.2.16, UC_4.17.3 BR_4.17.3.3.

3. Pre-conditions

  • The trader is authenticated and inside the Dashboard shell. Ref: UC_4.1.1 §1 Overview.
  • The trader holds a LIVE funded account that is still runningusers.status = 'Active_DMA'. A Soft Breach daily-loss lockout still counts as running: it is a trading lock, not an account state (Ref: UC_4.15.1). An account already in status IN ('Failed', 'Terminated') cannot be resigned — Ref: BR_4.17.2.6, BR_4.17.2.7.
  • Is_Professional == True — otherwise the request takes the SIM branch, owned by UC_4.11.2. This flag is the SIM/LIVE discriminator throughout the system; Current_Level must not be used, because a SIM account is provisioned at Current_Level 1, 2 or 5 and would collide with the LIVE range. Ref: BR_4.17.2.5, UC_4.11.2 §10 A-39 (BE-1).
  • A LIVE trading sub-account exists on the execution gateway (Rithmic Live FCM, MT5 Live or TraderEvolution Live).

4. Post-conditions

Unique to resignation (specified here):

  • The Day 0 gateway contract has run: order routing blocked (read-only), all open positions flattened, all working orders cancelled, and the LIVE sub-account left assigned and locked — no purge on Day 0. Ref: BR_4.17.2.5 steps 2–4, BR_4.15.2.7.
  • users.status = 'Terminated', users.termination_reason = 'VOLUNTARY_RESIGNATION', users.termination_date = NOW(), and an audit record with action = 'RESIGN' is written — Ref: BR_4.17.2.14.
  • The Drawdown Defense Protocol never runs, whatever the trader's level and whatever Defense_Used holds. Flow 4B is not reached — Ref: BR_4.17.2.10.
  • If Severance_Pay > 0 for the trader's Current_Level, Flow 9 pays the full base amount with no deduction, because Amount_Over_Stop_Loss is $0 on this path — Ref: BR_4.17.2.13.
  • Every Discord role is revoked and the trader's pod is dispersed — Ref: BR_4.17.2.11.
  • GET /failure-state returns is_breached: true, state_reason: "RESIGNATION" and the same archive_date payload as a breach; the frontend uses state_reason to render the resignation modal (§9.4) instead of the Hard Breach Failure Modal — Ref: BR_4.17.2.15.
  • The dashboard session is not terminated: access tokens are retained and the trader stays logged in — Ref: BR_4.17.2.8.
  • The Reset Associate Track control above this section becomes Enabled, because its predicate users.status = 'Terminated' is now satisfied — Ref: BR_4.17.2.16, UC_4.17.3 BR_4.17.3.3.
  • The challenge purchase fee is not refunded. A next-month market-data prepay may be refunded; the current month is never prorated — Ref: BR_4.17.2.12.

Shared with the Hard Breach path — owned by UC_4.15.2 §4 Post-conditions, not restated here:

Post-conditionWhere it is specified
Frosted Glass on the Dashboard screen only, over the static snapshot captured at failure_timestamp; notification bell keeps running; every other screen (Account, Settings, Billing, Journal) renders completely normallyUC_4.15.2 §4, BR_4.15.2.2
LIVE sub-account kept alive (locked, Read-Only) for the whole window; archive_date computed per broker; Pre-Archive Gate (PostgreSQL user_account_history + AWS S3 Glacier) before any cleanup; failsafe purge actions at the deadlineBR_4.15.2.7
Behaviour after archive_date fires — historical ledger purged from the active view, dashboard resets to a blank D=0 state under a permanent frostUC_4.15.2 §4, UC_4.15.3 §4
Re-Buy pricing (founder locked_rebuy_price · standard Challenge_Price × (1 − Retry_Discount) inside the window · Full Challenge Price after) and Case A / Case B sub-account provisioningBR_4.15.3.1, BR_4.15.2.7
Compliance state preserved — the returning trader bypasses Veriff and the Rippling ICAUC_4.15.3 §4
Dashboard login never expires; the trader can return at any timeUC_4.15.2 §4

Explicitly NOT post-conditions:

  • The trader is not logged out. The RFQ's "logs them out of the dashboard and disables access" is superseded by [RES-BIZ-01] — Ref: BR_4.17.2.8.
  • The LIVE sub-account is not deleted at T+0. It is locked Read-Only and purged only at archive_date or on a Re-Buy — Ref: BR_4.15.2.7. ⚠️ UC_4.15.2 §1 still carries a stale "hard-deleted immediately" sentence — Ref: §10 A-53.
  • The Dashboard does not reset to D=0 at resignation. It freezes at the resignation snapshot and resets only when archive_date passes or a Re-Buy completes (Source: QnA FR-54, FR-31).

5. Basic Flow

  1. The trader opens the Account Actions tab. The Resign & Close Account row renders with [Resign Account] Enabled — Ref: §9.1, BR_4.17.2.7.

  2. The trader clicks [Resign Account]. The Step 1 warning modal opens — Ref: §9.2, BR_4.17.2.2.

  3. The trader clicks [Continue to Resign]. The Step 1 modal closes and the Step 2 confirmation modal opens with an empty phrase input — Ref: §9.3, BR_4.17.2.3.

  4. The trader types the confirmation phrase RESIGN into the input. The value is compared case-sensitively on every keystroke; the [Resign & Close Account] button stays Disabled until the value matches exactly. Paste is permitted and leading/trailing whitespace is trimmed before comparison — Ref: BR_4.17.2.4.

  5. The trader clicks [Resign & Close Account]. The button is disabled immediately on click and enters a loading state — Ref: BR_4.17.2.6. The frontend calls POST /resign with {user_id, confirmation_phrase}.

  6. The Middleware Hub executes the LIVE resignation sequence synchronously — Ref: BR_4.17.2.5:

    1. Validates confirmation_phrase.
    2. Reads Is_Professional from the decoded JWT claims → True → LIVE branch.
    3. Blocks order routing at the execution gateway (read-only / freeze), 4. flattens all open positions, 5. cancels all working orders. If the market is closed the flatten is queued for retry rather than blocking the response — Ref: BR_4.17.2.18.
    4. Inserts an audit record with action = 'RESIGN'.
    5. Emits the RESIGNATION_EXECUTED webhook to Zapier Flow 20. The dashboard session itself is not torn down — Ref: BR_4.17.2.8.
  7. The backend returns HTTP 200 OK. The frontend then, without showing any success screen — Ref: BR_4.17.2.15:

    1. Closes the Step 2 modal and leaves the session untouched (no token clearing, no logout, no redirect to login).
    2. Re-fetches the account state (GET /failure-state), which now returns is_breached: true, state_reason: "RESIGNATION" and archive_date.
    3. Redirects the trader from the Account / Settings screen back to the main Command Center / Dashboard, because the Frosted Glass state renders on the Dashboard only — Ref: BR_4.15.2.2.
    4. The Dashboard renders in Frosted Glass — freezing the background metrics at the millisecond of resignation — and the non-dismissible Resignation Complete modal opens over it — Ref: §9.4.

    A race exists between step 7.2 and Flow 7. status = 'Terminated' is written by Flow 7, not by POST /resign, so GET /failure-state may still read Active_DMA when the frontend calls it milliseconds after the HTTP 200. Ref: BR_4.17.2.15, §10 A-54.

  8. Asynchronously — Flow 20 → Flow 7, specified once at UC_4.15.2 §5 and deliberately not restated here. Flow 20's only action is to trigger Flow 7 with Reason Code = VOLUNTARY_RESIGNATION (Source: Zapier Integration V7.pdf §Flow 20). Flow 7 then runs its full pipeline — Defense Gate (skipped, Ref: BR_4.17.2.10) → Refund Check → Ledger Close → Liquidation second pass → Balance Check → Retention Gate → Flow 9 (Ref: BR_4.17.2.13) → Post-Termination Access Control → Digital Eviction → Pod Impact & Dispersal (Ref: BR_4.17.2.11) → GL Posting → Feedback Survey Gate → Notification (Live_Account_Closed). The four branch conditions that differ from the Hard Breach path are listed at BR_4.17.2.9. None of it blocks the HTTP 200 returned in step 7.

  9. In parallel — Flow 7B Path B. The status = 'Terminated' write fires the separate Flow 7B listener, which runs a 1-hour cool-down → purchase check → pricing route → Klaviyo Retention_Offer_Discount. Client-confirmed for the resignation path by [RES-ZAPF-01] — Ref: BR_4.17.2.9, BR_4.17.2.16.

[POST /resign — Node.js middleware, synchronous]
   ├─ validate phrase → Is_Professional == True → LIVE branch
   ├─ gateway read-only → flatten → cancel → audit action = 'RESIGN'
   └─ emit RESIGNATION_EXECUTED

                    ├──▶ 200 OK ──▶ GET /failure-state ──▶ redirect to Dashboard
                    │                                   ──▶ Frosted Glass + §9.4 modal

                    └──▶ [Flow 20] ──▶ [Flow 7, Reason = VOLUNTARY_RESIGNATION]
                                          ├─ Defense Gate ......... SKIPPED (BR_4.17.2.10)
                                          ├─ Refund Check ......... next-month data prepay only
                                          ├─ Ledger Close / Liquidation / Balance Check
                                          ├─ Retention Gate ──▶ [Flow 9] full Severance_Pay
                                          ├─ Access Control ....... status = 'Terminated'
                                          ├─ Digital Eviction ..... revoke ALL Discord roles
                                          ├─ Pod Impact ──▶ [Flow 15A] if Pod Leader
                                          ├─ GL Posting ........... QuickBooks
                                          ├─ Survey Gate .......... if pod_leader_id NOT NULL
                                          └─ Notification ......... Live_Account_Closed (SES-20)

                    status = 'Terminated' ──────────┴──▶ [Flow 7B Path B] retention offer

6. Alternative Flows

6.1 The trader cancels at either step

  • Clicking [Cancel] on the Step 1 modal closes the modal and returns the trader to the Account Actions tab. No request is sent.
  • Clicking [Cancel] on the Step 2 modal closes the entire flow and returns the trader to the Account Actions tab — it does not return to Step 1. Anything typed into the phrase input is discarded. Re-entering the flow starts again from step 2 of the Basic Flow with an empty input — Ref: BR_4.17.2.3.

6.2 Level 9+ trader with Defense still available

  1. The trader is at Current_Level >= 9 with Defense_Used == False — i.e. they would be eligible for the 48-hour Drawdown Defense cooling-off if they had breached (UC_4.15.4).
  2. The flow is the full §5 Basic Flow, unchanged. Nothing about Defense is surfaced in the UI, and no Defense-related copy is added to either friction modal.
  3. Flow 7 Step 1 evaluates Resignation == True before the eligibility check and short-circuits straight to Liquidation. Defense_Used is not consumed and Flow 4B is never triggered — Ref: BR_4.17.2.10.

6.3 Trader eligible for severance (Severance_Pay > 0)

  1. The flow is the full §5 Basic Flow, unchanged. No severance amount is quoted anywhere in this use case's screens — the friction modals and the Resignation Complete modal make no financial promise.
  2. Flow 7 Step 6 (Retention Gate) looks up Severance_Pay from Table A/B by Current_Level, finds it > 0, and executes Flow 9.
  3. Because the reason code is VOLUNTARY_RESIGNATION, Amount_Over_Stop_Loss is $0 and the trader is authorised for 100 % of the base Severance_Pay — Ref: BR_4.17.2.13.
  4. Payout is not automatic: it waits on a Marketing user clicking Authorize inside the Zapier Interface after the exit interview. Owned by UC_7.5 / BR_4.15.2.5.
  5. ⏳ Whether the Resignation Complete modal appends a severance / exit-interview line is not decided — Ref: §10, A-26 (inherited).

6.4 Trader is a Pod Leader or a Pod Mentee

  1. The flow is the full §5 Basic Flow, unchanged. The pod consequence is entirely back-end and is not surfaced in the friction modals.
  2. Flow 7's Pod Impact & Dispersal step branches on the trader's pod role — decrementing the mentor's Current_Count and clearing pod_leader_id for a mentee, or terminating the registry row and firing POD_LEADER_TERMINATED → Flow 15A for a leader. Ref: BR_4.17.2.11, CR-20260818-001.
  3. Flow 7's Feedback Survey Gate reads pod_leader_id. Because a LIVE trader can hold one, the Typeform exit survey link is appended to the Live_Account_Closed email and last_survey_date is updated — the one Flow 7 step that is dead in SIM and live here. Ref: BR_4.17.2.9.
  4. ⏳ Ordering is unresolved: whether mentee re-assignment completes before the leader's account is terminated, and what happens when no receiving leader exists. Ref: §10, A-55 ([RES-DEF-03], still unanswered by the client).

6.5 Founding Mentor (Role_Flag = 'Founding Mentor')

  1. The flow is the full §5 Basic Flow for everything up to Flow 7.
  2. Open. On the Hard Breach path a Founding Mentor is explicitly exempted from Digital Eviction — "Discord roles are NOT revoked, Pod assignments remain intact" (UC_4.15.2 §6). Whether that exemption also covers a voluntary resignation is not stated by any source: a breach is an involuntary risk event, whereas a resignation is the trader choosing to leave the firm, which is exactly the case Digital Eviction exists for. This document does not pick a side — Ref: §10, A-56.
  3. The Founding Mentor Dashboard overlay is a Hard Breach mechanism keyed to a breach event. It is not rendered on the resignation path — the resignation modal of §9.4 is selected by state_reason == "RESIGNATION" regardless of Role_Flag — Ref: BR_4.17.2.15.

7. Exceptional Flow

  • [If POST /resign fails with a network error, timeout or HTTP 5xx]

    • The Step 2 modal stays open and the trader remains on it.
    • The system displays Ref: TE-SYS-01.
    • The [Resign & Close Account] button is re-Enabled so the trader can retry manually. The system does not auto-retry — Ref: BR_4.17.2.6.
  • [If the session / access token has expired — HTTP 401]

    • The system displays Ref: TE-AUTH-01 and redirects to the Auth0 login.
  • [If POST /resign returns HTTP 409 — the account is already closed]

    • One condition covers every case: status IN ('Failed', 'Terminated') — Ref: BR_4.17.2.6. It fires on a double submission, a retry after an unnoticed success, a second browser tab, and on an attempt to resign an account already closed by a Hard Breach, a Stagnation timeout or an Ops termination.
    • No DB write and no webhook occur, so RESIGNATION_EXECUTED does not fire again, Flow 7 does not run twice, and no duplicate Live_Account_Closed email or second severance authorisation is created.
    • The Step 2 modal closes and Ref: TE-DASH-01 is displayed. The frontend then runs the standard state refresh — the trader lands on the Frosted Glass Dashboard, and state_reason decides which modal renders: the Resignation Complete modal (§9.4) if they had genuinely resigned, or the Hard Breach Failure Modal (UC_4.15.3 §10.1–§10.4) if the account had closed for another reason. The session is not touched.
    • In practice this path is close to unreachable from the UI, because BR_4.17.2.7 renders the [Resign Account] button Disabled in exactly these states. It remains specified as the backend authority.
  • [If the market is closed or halted when the flatten step executes]

    • The resignation is not blocked and POST /resign still returns HTTP 200. The account is switched to read-only immediately, so no new exposure can be opened.
    • Convergence on Open_Positions == 0 is reached asynchronously — Ref: BR_4.17.2.18.
  • [If a downstream Zapier step fails — Flow 20 does not fire, or Flow 7 halts mid-pipeline]

    • POST /resign has already returned HTTP 200 and the gateway is already flat and locked, so the trader's market exposure is closed regardless. No capital is at risk.
    • But the account can be left in a stuck intermediate state: order routing dead, yet users.status still 'Active_DMA', so GET /failure-state returns is_breached: false, the Dashboard renders unfrosted over a dead feed, Reset Associate Track stays Disabled and the trader has no path forward. No source specifies a reconciliation or alerting mechanism — Ref: §10, A-54.
  • [If the trader reaches the Dashboard before Flow 7 has written Terminated]

    • GET /failure-state returns is_breached: false and the Dashboard renders normally over a dead execution feed. The trader can see the state but can place no order.
    • ⏳ Not specified by any source. See A-54 for the two candidate fixes (frontend polls / re-fetches on the WebSocket state-change event, or POST /resign writes an interim state itself).

8. Business Rules

BR_4.17.2.1: Scope of This Use Case Within the Account Screen

The Account screen hosts a tab list and a persistent Controls panel; the Account Actions tab itself contains two independent sections. This use case owns only the Resign & Close Account section, its two friction modals and the post-resignation modal, on the LIVE side. Everything else is owned elsewhere:

ElementOwning UC
Account screen shell, tab list, default active tabUC_4.6.1 (Connections & Credentials) · tab list table: BR_4.6.2.1
Profile & Preferences tabUC_4.6.2
Market Data Management tab (LIVE)UC_4.17.1 (not yet documented in this repo)
Billing tab — including the severance payout line itemUC_4.6.3 (not yet documented in this repo)
Controls panel (Desk Manager / Reduce Motion)UC_4.6.4 (not yet documented in this repo)
Reset Associate Track section (same tab, above this one) — enabled by this use caseUC_4.17.3 — Ref: BR_4.17.2.16
Entry point — sidebar user chip and its dropdownUC_4.1.2
Flow 7 pipeline, Flow 7B Path B, archive_date, Case A/B provisioning, Frosted GlassUC_4.15.2 — Ref: BR_4.17.2.9
The Re-Buy Modal, its payment paths and provisioning outcomeUC_4.15.3
Severance calculation, payout routing, exit interview, ledger recordingUC_7.5 (not yet documented in this repo) — Ref: BR_4.17.2.13
Pod re-assignment / mentee dispersal after POD_LEADER_TERMINATEDFlow 15A → UC_4.14.2 — Pod Mentorship Module (not yet documented in this repo)
The SIM counterpart of this very sectionUC_4.11.2 — Ref: BR_4.17.2.19

This UC makes no statement about the display or enablement of the Reset Associate Track section beyond recording that its predicate becomes true — Ref: BR_4.17.2.16.

BR_4.17.2.2: Two-Step Friction Confirmation Is Mandatory

Resignation MUST be gated behind two sequential modals; a single confirmation is not sufficient (Source: RFQ_ Website and Dashboard Implementation V7.pdf §Part C — "which should have friction behind it"):

  • Step 1 — Warning: states that the action is immediate and irrevocable and lists its consequences. No input is collected. Ref: §9.2.
  • Step 2 — Confirmation: requires the trader to manually type a confirmation phrase before the final action becomes available. Ref: §9.3.

The two steps are separate modals that replace one another, not a single modal with swapped content. POST /resign is called only from Step 2.

The friction mechanism is identical to SIM (BR_4.11.2.1) and the client confirmed "Giống SIM" for the LIVE Trigger row (Source: QnA Stage 2 - Dashboard & Fomula (Settings).csv, category Settings: Resign Account, row Trigger). It is specified here in full rather than referenced, because this document owns the LIVE modals and their copy — Ref: §9.2§9.3.

BR_4.17.2.3: Modal Dismissal — [Cancel] Is the Only Exit

Both friction modals apply the same dismissal rules:

  • Neither modal renders a close [X] control.
  • Clicking the overlay area outside the modal does not dismiss it.
  • The Esc key does not dismiss it.
  • Consequently, [Cancel] is the only way to leave either modal without resigning.
  • [Cancel] on Step 2 exits the whole flow back to the Account Actions tab; there is no path back to Step 1.
  • The Step 2 phrase input is always empty when the modal opens. A value typed in a previous, cancelled attempt is never restored.

BR_4.17.2.4: Confirmation Phrase Matching — Case-Sensitive, Exact

  • The expected phrase is RESIGN, in full upper case. Matching is case-sensitive: Resign, resign and any other casing variant do not satisfy the condition (Source: QnA from clients — STAGE 2 Settings, [RES-TRIG-01], Adrian Stack 2026-08-12 — "Yes. Must be typed exactly in the proper case."; phrase confirmed as RESIGN by BA 2026-08-21, Ref: BR_4.11.2.3).
  • The comparison runs on every keystroke (onChange), so the CTA flips to Enabled at the exact moment the value matches.
  • A mismatch surfaces no inline error message. The Disabled CTA is the only feedback (Source: same QnA, [RES-UI-01]"Do not leave it enabled just to display error states.").
  • No lockout, no retry limit, no error overlay. There is no threshold on how many times the trader may type a wrong value and no penalty for doing so. The trader can also leave the modal and start over any number of times.
  • The input accepts pasted content; clipboard input is not blocked.
  • Leading and trailing whitespace is trimmed before the value is compared, per CR-02 §2.1. Whitespace inside the value is not altered.
  • The string is hard-coded, not configurable. The frontend validator hard-codes RESIGN and the backend validates against the same literal. It is not read from Global Variables / Table C — an Ops edit that desynchronised the two layers would leave the CTA permanently disabled and make resignation unreachable. Ref: UC_4.11.2 §10 A-37.
  • The phrase does not vary by environment. SIM and LIVE both require RESIGN; no source proposes a stronger LIVE phrase, and introducing one would fork a validator that the backend shares across both branches.
  • ⏳ Still open: the input's maximum length (BA proposal: 50 characters per CR-02 §2.2) — Ref: §10, A-16.2 (inherited).

BR_4.17.2.5: POST /resign Execution Sequence — LIVE Branch

POST /resign
Content-Type: application/json
Authorization: Bearer <JWT_Token>

{ "user_id": "UUID", "confirmation_phrase": "RESIGN" }

Returns HTTP 200 OK. The Middleware Hub executes steps 1–7 itself, synchronously; the sequence is irreversible once started.

Branch discriminator — Is_Professional, read from the decoded JWT claims (BE-1, confirmed 2026-08-25):

Is_ProfessionalEnvironmentBehaviour
FalseSIMHandled natively, no RESIGNATION_EXECUTED. End state status = 'Failed'. Owned by UC_4.11.2
TrueLIVEThe sequence below. Emits RESIGNATION_EXECUTED → Flow 20 → Flow 7. End state status = 'Terminated'

Execution sequence:

#StepOwned byDetail
1Validate confirmation_phraseThis UCExact, case-sensitive match against RESIGN — Ref: BR_4.17.2.4
2Block gateway order entry (Day 0 read-only)🔗 SharedThe brief freeze the client described — set the broker account to ReadOnly / Freeze / Admin Only "to safely cancel working orders and flatten open positions without allowing new orders to slip in" (Source: [RES-BIZ-03]). Do NOT unassign (Rithmic) or delete (MT5/TE) on Day 0 — Ref: BR_4.15.2.7
3Flatten open positions🔗 SharedMarket Close for every open position — Ref: UC_4.15.2 §5 Step 1
4Cancel working orders🔗 SharedEvery pending / working order — same reference
5Audit loggingThis UCInsert a PostgreSQL audit record: action = 'RESIGN', user_id, timestamp = NOW()
6Emit RESIGNATION_EXECUTEDThis UCWebhook to Zapier Flow 20, whose only action is to trigger Flow 7 with Reason Code = VOLUNTARY_RESIGNATION (Source: Zapier Integration V7.pdf §Flow 20) — Ref: BR_4.17.2.9
7Return HTTP 200This UCThe session is not torn down — Ref: BR_4.17.2.8
8status = 'Terminated', termination_reason, termination_date⚠️ Flow 7Written by Flow 7's Post-Termination Access Control step, not by this endpoint — Ref: BR_4.17.2.14

Step 8 is the LIVE/SIM structural difference. On SIM the middleware writes the terminal status itself, so the state is consistent the instant the endpoint returns. On LIVE the write is Zapier's, so there is a real window in which the gateway is dead but the database still says Active_DMA — Ref: §7, §10 A-54.

Per-gateway Day 0 state values are not owned anywhere on LIVE. UC_4.15.2 §5 Step 1 says only "Lock: Disable order entry via Broker API". The SIM table (UC_4.10.2 §5 Step 3) gives Rithmic Paper INACTIVE · MT5 Sim READONLY · TE Sim TRADING IS DISABLED BY RISK RULE, while the 2026-08-26 architecture note gives Rithmic Live Admin Only for the same step, matching the Rithmic Support answer recorded in _QNA_INDEX.md ("lock Account Status = Admin Only"). The values are not restated here as fact — the LIVE table belongs in UC_4.15.2 and must be written there once, for both paths. Ref: §10, A-51.

Deviation from the source, client-confirmed. RFQ_ Stack Trading Prop Tech V7.pdf and RFQ_ Website and Dashboard Implementation V7.pdf describe the last step as "logs the user out". That half is superseded by [RES-BIZ-01] (2026-08-12) — Ref: BR_4.17.2.8. The "Trigger Flow 20" half is not superseded on LIVE — CR-65 scoped that removal to SIM only.

BR_4.17.2.6: Single Execution Guarantee — Guard on status Alone

Because the sequence in BR_4.17.2.5 is destructive, it must run at most once per account:

  • Frontend: the [Resign & Close Account] button is disabled immediately on click and shows a loading state, preventing a double submission from the same modal.

  • Backend: the guard keys on status alone

    IF status IN ('Failed', 'Terminated') → HTTP 409 Conflict, halt. No DB write, no webhook.

    This covers every already-closed account in one condition: hard-breached (Terminated + Drawdown), stagnated (Terminated + STAGNATION), Ops-terminated, already resigned, and a SIM-side Failed record.

Why status alone and not the pair. By the time an account is Terminated, the Atomic Kill Switch has already blocked order routing, flattened every position and cancelled every working order. There is nothing left to resign — no live exposure, no capital at risk. Allowing a resignation on top would overwrite termination_reason (e.g. DrawdownVOLUNTARY_RESIGNATION), destroying the record of why the seat was actually lost — and on LIVE that record drives money: it decides whether Flow 9 deducts Amount_Over_Stop_Loss or pays the full base amount (BR_4.17.2.13). A second Flow 7 run would also re-post to QuickBooks, re-fire Live_Account_Closed and create a second severance authorisation task. Same rule as SIM (BR_4.11.2.5, BE-2), with materially higher stakes.

  • A second gate exists at the Flow 20 trigger — filter Is_Professional == True, so a stray RESIGNATION_EXECUTED from a SIM regression is dropped before Flow 7 can run its LIVE teardown on simulated capital. Ref: BR_4.11.2.8 (BE-6).
  • The system never retries POST /resign automatically. Any retry is an explicit user action — Ref: §7 Exceptional Flow.

BR_4.17.2.7: Resignation Is Permitted Only While the LIVE Seat Is Active

The Resign & Close Account section is available only while the trader still has a seat to resign — a LIVE account that is still running:

Account stateResign available?
Active_DMA — trading normally✅ Yes
Soft Breach — daily loss limit lockout, status still Active_DMA, Ref: UC_4.15.1✅ Yes — a trading lock, not an account state
Defense Protocol / Shadow Mode — 48-hour cooling-off, Ref: UC_4.15.4Not decided. status is SUSPENDED_DEFENSE, not Active_DMA, so the plain status gate would render the button Disabled — but a trader in a 48-hour freeze is exactly the person likely to want out, and their positions are already flat. Ref: §10, A-57
Terminated — Hard Breach, Stagnation, Ops termination or an earlier resignationNo — the seat is already gone, the account is flat and read-only
Failed❌ No

Button state. The [Resign Account] button renders Disabled whenever status IN ('Failed', 'Terminated'). The trader remains logged in after any of these events (BR_4.17.2.8) and can still reach the Account Actions tab, so the Disabled state is reachable and must be specified. The button is never hidden — the section stays visible so the trader can see the path exists. A request that still reaches the backend is rejected with HTTP 409 per BR_4.17.2.6.

The gate is a plain status check. No termination_reason lookup is needed on either the frontend or the backend.

This is the exact inverse of the section above it. Reset Associate Track is Disabled in every state except Terminated; Resign & Close Account is Enabled only while Active_DMA. Exactly one of the two is actionable at any moment, which is the client's intent: a LIVE trader must resign before they can re-buy, precisely so live market exposure is flattened through the Kill Switch rather than abandoned by a purchase. Ref: UC_4.17.3 BR_4.17.3.4, BR_4.17.2.16.

Neither the Soft Breach lockout nor the Frosted Glass overlay blocks navigation into the Account screen — Ref: UC_4.15.2 §4.

BR_4.17.2.8: The Session Survives Resignation

Three layers are affected, and they must not be conflated — this is exactly the separation the client insisted on in [RES-BIZ-03]:

  • Current session — retained. The trader is not logged out. Access tokens are not cleared, the Auth0 session is untouched and no redirect to the login page occurs (Source: [RES-BIZ-01], Adrian Stack 2026-08-12 — "Do not clear the session tokens or log the user out… so they can instantly purchase a new challenge without the friction of logging back in.").
  • Trading functionality — dead. Execution privileges are revoked at the gateway on Day 0 ("their actual trading terminal connection is dead", [RES-BIZ-03]) and the Dashboard is locked behind the Frosted Glass state. The sub-account itself stays alive, locked, until archive_date — Ref: BR_4.17.2.5, BR_4.17.2.17.
  • Dashboard login — retained permanently. "The user's web dashboard login remains active so they can access their history and purchase a Reset" ([RES-BIZ-03]). The login account survives so the trader can buy a new Associate Track.

Consequences:

  • The shared Logout mechanism (CR-20260806-001, Ref: CR Index) is not invoked by resignation. Resign and Logout are independent paths.
  • Session-scoped side effects that Logout performs — access-token clearing, redirect target, Newsquawk audio stop (Ref: BR_4.1.4.3), WebSocket closure — do not run on resignation. The trading WebSocket subscriptions are closed by the backend as part of the read-only switch, not by a session teardown.
  • The trader can still reach every non-Dashboard screen (Account, Billing, Journal) and can still log out manually from the sidebar user chip.
  • Discord access is a separate matter and is not preserved — the roles are revoked by Flow 7, Ref: BR_4.17.2.11.

BR_4.17.2.9: Post-Resignation Automation — Flow 20 → Flow 7, and the Four Branches That Differ

Rule. A LIVE resignation is routed as a termination. RESIGNATION_EXECUTED triggers Flow 20 (Trader Resignation Handler), whose sole action is to trigger Flow 7 (Financial Reporting / Recycling Logic) with Reason Code = VOLUNTARY_RESIGNATION (Source: Zapier Integration V7.pdf §Flow 20; QnA [RES-BIZ-02]"flow 20 → Flow 7"; QnA FR-21).

What fires, and where it is documented. From the moment Flow 7 picks up the event, the pipeline is the Hard Breach pipeline and is specified once, at UC_4.15.2 §5 Basic Flow. Only four branch conditions resolve differently:

Flow 7 stepOwned byBehaviour on the resignation path
Step 1 — Defense GateUC_4.15.2 §5⚠️ Diverges — skipped entirely. IF Resignation == True → proceed directly to Liquidation. Flow 4B is never triggered and Defense_Used is not consumed — Ref: BR_4.17.2.10
Step 1 — Atomic Kill Switchsame✅ Already executed synchronously by POST /resign (BR_4.17.2.5 steps 2–4). Flow 7's own pass is the confirming second pass
Step 1 — LEVEL_STOP_BREACH WebSocket eventsameNot emitted. There is no breach event to push; the frontend already holds the HTTP 200 and re-fetches state directly — Ref: BR_4.17.2.15
Step 2 — Refund Check (Market Data)same✅ Identical — Ref: BR_4.17.2.12
Step 3 — Ledger Close (POST /financial/reset-ledger, deactivate: true)same✅ Identical
Step 4 — Liquidation (second pass)same✅ Identical, and it is what closes an out-of-hours flatten — Ref: BR_4.17.2.18
Step 5 — Balance Check (Flash Crash Protection)same✅ Identical. In practice Balance < 0 is near-impossible on this path, since a resigning trader has not blown through their stop
Step 6 — Retention Gate → Flow 9 Severancesame, BR_4.15.2.5⚠️ Diverges — the deduction resolves to zero. The Severance_Pay > 0 eligibility gate is identical, but Amount_Over_Stop_Loss is $0, so the trader receives the full base amount — Ref: BR_4.17.2.13
Step 7 — Post-Termination Access Control (POST /system/set-account-state, state: "Terminated")same✅ Identical. This is the step that writes status = 'Terminated' — Ref: BR_4.17.2.14
Step 8 — Community / Digital Eviction (POST /discord/revoke-all-roles)same✅ Identical — Ref: BR_4.17.2.11. ⏳ The Founding Mentor exemption is unresolved — Ref: §6.5
Step 8a — Pod Impact & DispersalCR-20260818-001✅ Identical — Ref: BR_4.17.2.11. ⚠️ The CR is pending apply to UC_4.15.2 — Ref: §10 A-52
Step 9 — GL Posting (QuickBooks Online)UC_4.15.2 §5✅ Identical. Real capital produced real P&L, so the ledger must be closed out whatever the reason
Step 10 — Feedback Survey Gate (pod_leader_id IS NOT NULL → Typeform)same⚠️ Diverges from SIM, not from LIVE Hard Breach. A LIVE trader may hold a pod_leader_id, so this gate can actually fire — in SIM it never can (Source: [RES-ZAPF-02])
Step 11 — Notificationsame⚠️ Diverges — branch on Is_Professional. True → send Live_Account_Closed (Ref: SES-20). The Stagnation suppression gate does not apply, because Reason Code here is VOLUNTARY_RESIGNATION, not STAGNATION (Source: [RES-ZAPF-02])

Do not restate the Flow 7 mechanics in this document. If they change, they change in UC_4.15.2 and this UC inherits the change automatically. The only resignation-specific inputs to the pipeline are the Reason Code and the resulting Amount_Over_Stop_Loss = $0.

Flow 7B Path B also fires — client-confirmed, and it reverses an earlier BA decision. Flow 7B is a separate database-webhook listener, not a step of Flow 7. Its trigger was widened on 2026-08-24: "please update the trigger for Flow 7B. It must fire when an account status changes to EITHER Failed OR Terminated. This ensures every single trader who loses their seat, regardless of their level or how they lost it, gets dropped into the retention marketing funnel to buy a new evaluation" (Source: [RES-ZAPF-01]).

Hard BreachResignation
Flow 7B fires?✅ Yes, Path BYes, Path B — same trigger, same path
Klaviyo eventRetention_Offer_DiscountRetention_Offer_Discount — same event
Offered priceFounder → locked_rebuy_price · Standard, in window → Challenge_Price × (1 − Retry_Discount) · Expired → Full Challenge PriceSame routing — the pricing logic reads is_founder and the window, never the reason code. Ref: BR_4.15.3.1

⚠️ This supersedes the BA decision of 2026-08-12"a resigned LIVE trader re-enters as a new Associate Track purchase; the Scenario B In-App Re-Buy path and the Flow 7B Path B retention offer are not used on the resignation path". That decision was recorded at the time as BR_4.11.2.16 in the SIM document; it was removed in UC_4.11.2 v3.2, and on LIVE the re-entry purchase is owned by UC_4.15.3 — Scenario B: Live Failure (In-App Re-Buy), not by UC_4.11.2. A client answer of 2026-08-24 beats a BA decision of 2026-08-12, and [RES-ZAPF-01] is unambiguous that the widening exists specifically to catch resigning LIVE traders. UC_4.11.2 A-25 is answered on the email side by this document. Whether the in-app CTA price follows the same routing is a downstream question — Ref: BR_4.17.2.16, §10 A-25.

Known email collision, client-acknowledged and unresolved. A resigning LIVE trader now lands in both Flow 7 Step 11 (Live_Account_Closed — a termination letter) and Flow 7B Path B (a discounted come-back offer), roughly an hour apart. Recorded by the client's own follow-up as O-30. No suppression or delay rule has been specified — Ref: §10, A-58.

BR_4.17.2.10: Resignation Bypasses the Drawdown Defense Protocol Entirely

Rule. Flow 7 Step 1 evaluates Resignation == True before the Defense eligibility check and short-circuits directly to Liquidation (Source: Zapier Integration V7.pdf §Flow 7 Step 1; UC_4.15.2 §5 Step 1"IF Resignation == True → SKIP Defense Gate, proceed directly to Liquidation"; QnA FR-03).

Hard Breach at Level 9+, Defense_Used == FalseResignation at the same level and flag
Defense eligibility evaluated?✅ YesNo — short-circuited
Flow 4B triggered?✅ Yes, Flow 7 halts❌ No
Defense_Used consumed?✅ Set TrueUnchanged
48-hour Shadow Mode entered?✅ Yes (UC_4.15.4)❌ No
End stateSUSPENDED_DEFENSE, account survivesTerminated, account closed

Why the bypass is correct and not a loss of protection. Drawdown Defense exists to give a senior trader a second chance after an involuntary risk event. A resignation is the trader's own decision to leave the firm — there is nothing to protect them from, and forcing a 48-hour cooling-off on someone who has explicitly asked to be let go would trap them in a Shadow Mode account they no longer want.

Consequence for the UI: nothing is surfaced. Neither friction modal mentions Defense, offers it as an alternative, or warns a Level 9+ trader that they are forgoing it. No source proposes such a warning, and adding one would be inventing a requirement. Ref: §6.2.

BR_4.17.2.11: Discord Roles ARE Revoked, and the Pod Is Dispersed

Rule. Unlike SIM, a LIVE resignation runs the full community teardown. This is the path [DL-BIZ-04] was written for.

Digital Eviction (Flow 7 Step 8)POST /discord/revoke-all-roles with { user_id }:

AspectRule
What is removedEvery role — Pod Member, Pod Leader and all Title Roles — resolved through the stored discord_user_id
What is keptdiscord_user_id itself is retained, and the trader is not removed from the Discord server (Source: [DL-BIZ-04])
Why it is keptSo a later re-entry reassigns the role through /manage-discord-role without a second verification round
Failsafediscord_user_id IS NULL → drop the call and return 200 OK, so Zapier does not crash

Pod Impact & Dispersal (Flow 7 Step 8a) — inserted immediately after Digital Eviction by CR-20260818-001:

ConditionActions
Mentee exitusers.pod_leader_id IS NOT NULLDecrement Current_Count for that leader in Zapier Table E Pod_Leader_Registry · Clear pod_leader_id on the resigning trader's users record
Leader exit — the resigning user_id exists in Pod_Leader_RegistrySet registry Status = 'Terminated' · Fire the POD_LEADER_TERMINATED webhook, which natively triggers Flow 15A (mentee dispersal + IT offboarding cascade)

Why the pod step is not optional. Without it a departed mentee's seat is never released, so the mentor's pod looks permanently full; and a departed leader's mentees hang indefinitely against a terminated account. The client's own framing: "This ensures the ecosystem correctly heals itself whether a student or a teacher drops out!"

The same two steps run on the LIVE Hard Breach path (UC_4.15.2) — same Flow 7 Steps 8 / 8a, same outcome. Resignation is not a special case: on LIVE the trader is leaving the firm, and the roles represent a professional standing that no longer applies.

⚠️ Two dependencies before this rule is buildable: CR-20260818-001 is still 🔴 Active (pending apply) and has not been written into UC_4.15.2 §5 (A-52), and the Founding Mentor exemption question is open (A-56) — Ref: §10.

BR_4.17.2.12: No Refund of the Challenge Fee — the Market Data Prepay Is the Only Reversible Charge

  • The challenge purchase fee is never refunded on resignation. The trader forfeits the remainder of their engagement (Source: RFQ_ Website and Dashboard Implementation V7.pdf §Part C).

  • All unvested profits are forfeited. A LIVE trader's accrued-but-unpaid profit share does not survive resignation — this is the consequence the Step 1 warning modal exists to state (§9.2).

  • The Market Data Refund Check does run (Flow 7 Step 2), and it is the only money that can flow back:

    Rule
    ScopeNext month's prepay only. IF Next_Month_Data_Paid == TruePOST /issue-refund with { user_id, type: "MARKET_DATA" }
    Not in scopeThe current month is never prorated. CME bills per calendar month; the month in progress is consumed
    Why the step survivesIt is a chargeback failsafe — refusing to reverse a charge for a month the trader will never trade invites a dispute (Source: [MDM-BIZ-14], 2026-08-24, which reversed the earlier [MDM-BIZ-06] decision to delete this step)
    Non-reversible railsIf Gateway_Source rejects automated reversal, the middleware logs the exception to the financial ledger and raises a high-priority Freshdesk ticket with user_id, transaction_id, gateway_source, refund_amount — it never blocks Flow 7. Ref: UC_4.15.2 §5 Step 2
  • Severance is not a refund and must not be presented as one. It is a contractual payment computed from the trader's level, and it is paid regardless of whether they later re-buy — Ref: BR_4.17.2.13, BR_4.15.2.5.

BR_4.17.2.13: Severance (Flow 9) — Only the Two Resignation-Specific Inputs Are Asserted Here

The severance mechanism is not owned by this document. The eligibility gate, the deduction math, the Path A/B/C payout routing, the human authorisation step, the ActiveCampaign task, the exit interview and the Polygon + QuickBooks recording are specified at BR_4.15.2.5 and owned in full by UC_7.5 — Severance (Flow 9). Nothing about them is restated here.

What this use case does assert — two inputs, and only two:

#InputValue on the resignation pathSource
1Reason CodeVOLUNTARY_RESIGNATION — set by Flow 20 when the trader clicks the button. It is not TERMINATION_FOR_CAUSE, which is reserved for fraud, malicious activity or a chargeback dispute and is raised manually by the Operations deskZapier Integration V7.pdf §Flow 20 · QnA FR-18, FR-21
2Amount_Over_Stop_Loss$0"if a trader voluntarily resigns, they have not breached the stop loss limit, so Amount_Over_Stop_Loss defaults to $0"QnA FR-20

Consequence — the deduction resolves to zero, so an eligible trader receives 100 % of the base amount:

Authorized_Amount = Severance_Pay − (Amount_Over_Stop_Loss IF > $100)
                  = Severance_Pay − $0
                  = Severance_Pay

This is arithmetic, not a special case. No resignation-specific branch is needed in Flow 9: the same formula that deducts slippage on a breach naturally returns the full amount when there is no slippage to deduct. Ref: QnA FR-20, FR-26.

Eligibility is a dynamic lookup, never a hard-coded level.

IF Severance_Pay > 0   (Table A for Forex / Table B for Futures, by Current_Level) → Execute Flow 9
IF Severance_Pay == 0  or NULL                                                     → Skip Flow 9

⚠️ Three stale thresholds circulate in the sources and none of them is the rule. The QnA CSV row for this section says "LIVE — chỉ Level 3+"; FR-30 corrected that to "Severance now starts at Level 7"; and FR-54 then corrected both"do NOT hardcode current_level >= 7… the middleware and Zapier must evaluate the Severance_Pay value directly from the configuration matrix". The Severance_Pay > 0 test is the current, client-confirmed rule and is what BR_4.15.2.5 already implements. Any level number written into code or Zapier is a defect.

Not asserted by this document, and deliberately so:

  • The severance amount is never displayed in any screen this UC owns. The friction modals make no financial promise, and §9.4 quotes no figure — the amount is communicated by the exit-interview call, and it is not final until a Marketing user authorises it.
  • The payout appears on the trader's Billing screen, owned by UC_4.6.3 — Ref: BR_4.15.2.5.
  • [RES-FRM-02] is unanswered: what happens if Amount_Over_Stop_Loss > Severance_Pay on some other path — floor at zero or record a debt. It cannot arise on the resignation path, so it does not block this document — Ref: §10, A-59.

BR_4.17.2.14: Database Writes at Resignation vs Archive

Three separate moments write data, and they must not be merged:

  • At POST /resign (T+0), written by the middleware:

    ColumnValue
    audit.action'RESIGN' (with user_id, timestamp = NOW())

    That is all the endpoint writes to users. The status transition is Zapier's — Ref: BR_4.17.2.5 step 8.

  • At Flow 7 Step 7 (Post-Termination Access Control), written by Zapier / the middleware call it makes:

    ColumnValue
    users.status'Terminated'not 'Failed'. 'Failed' is the SIM resignation end state — Ref: BR_4.17.2.19
    users.termination_reason'VOLUNTARY_RESIGNATION'
    users.termination_dateNOW()

    This is the write the automation layer keys on: it fires Flow 7B and it is what GET /failure-state reads.

  • At archive — whichever comes first, Re-Buy or archive_date: a user_account_history snapshot is created — history_id (UUID PK), user_id (FK), email, previous_level, final_status, failure_reason, archived_at, user_snapshot (JSONB). It is written once, either when the trader re-buys (UC_4.15.3 §4) or when archive_date fires (BR_4.15.2.7 Pre-Archive Gate) — never twice.

Field-name mapping — DB column vs API field vs Zapier input. These are three names for the same fact and are frequently confused:

LayerFieldValue on a LIVE resignation
PostgreSQL userstermination_reasonVOLUNTARY_RESIGNATION
GET /failure-state responsestate_reasonRESIGNATION
Zapier Flow 20 → Flow 7Reason CodeVOLUNTARY_RESIGNATION

⚠️ LIVE keeps termination_*; SIM migrated to failure_*. CR-65 renamed termination_reasonfailure_reason and termination_datefailure_timestamp for SIM only. On LIVE the original column names stand, per [RES-ZAPF-01] ("termination_reason = 'VOLUNTARY_RESIGNATION'termination_date = NOW() giữ nguyên cho cả hai"). ⏳ Whether these are genuinely two column pairs or one pair with two names in the docs is a schema question that must be settled before implementation — Ref: §10, A-60.

Ledger lifecycle. virtual_equity is set to 0 by Flow 7 Step 3 (Ledger Close)POST /financial/reset-ledger with deactivate: true. This is the opposite of SIM, where the ledger is left frozen at the snapshot (BR_4.11.2.10) because Flow 7 does not run there. On LIVE virtual_equity is the internal balance tracker for real capital, and closing it is what makes the GL Posting of Step 9 meaningful. The Dashboard snapshot the trader sees under the frost is not virtual_equity — it is the static equity / balance / closed-trades capture taken at failure_timestamp (UC_4.15.2 §4), so zeroing the ledger does not blank the frozen view.

BR_4.17.2.15: Post-Resignation Dashboard State — GET /failure-state Contract

There is no success screen. The confirmation that the resignation executed is carried by the modal header itself (Source: [RES-BIZ-01]"Do not build a success screen… simply refresh the user's dashboard state.").

Rendering — inherited, not restated. The Frosted Glass treatment is exactly the Hard Breach treatment and is owned by BR_4.15.2.2 and UC_4.15.2 §4: Dashboard-screen-only blur over the static snapshot captured at failure_timestamp, permanent until a Re-Buy completes, notification bell still running, and every other screen rendering normally. This UC adds no rendering rule of its own — the only difference is which modal sits on top (§9.4 instead of the Hard Breach Failure Modal).

State contract — the resignation branch:

#RuleSource
1The State Check evaluates IF status == 'Failed' OR status == 'Terminated' and returns is_breached: true in both cases. No new endpoint is created[RES-BIZ-02]"Don't create another endpoint. Change the state check logic in the Get Failure State endpoint… return the exact same scheduled archival date payload." Reconfirmed as BE-3, Ref: BR_4.11.2.12
2The payload carries a discriminator state_reason: "BREACH" | "RESIGNATION", mapped from users.termination_reasonClient-confirmed 2026-08-25 — the field appears in the client's own sample payload
3archive_date is returned on the resignation branch, identical to the breach branch[RES-BIZ-02]"return the exact same scheduled archival date payload"

Response shape on the resignation branch:

{
  "is_breached": true,
  "state_reason": "RESIGNATION",
  "archive_date": "2026-08-31T23:00:00Z"
}
  • archive_date is computed by the backend per broker and returned as a finished ISO 8601 string. The frontend counts down passively and never applies the Rithmic month-end rule itself — Ref: BR_4.17.2.17, BR_4.15.2.7.
  • The frontend selects the modal from state_reason, never by inference"RESIGNATION"§9.4; "BREACH" → the Failure Modal variant matrix at BR_4.15.2.6.

The one contract gap on LIVE: who writes Terminated, and when. On SIM, POST /resign writes the status itself, so GET /failure-state is authoritative the instant the endpoint returns. On LIVE the write is Flow 7 Step 7, so the state refresh in §5 step 7.2 can land before Zapier has run and read back is_breached: false. No source specifies how the frontend bridges that window. Ref: §7, §10, A-54.

Modal behaviour.

  • The modal is non-dismissible — no [X], overlay click and Esc do nothing, and there is no secondary button — Ref: §9.4.
  • Navigation isolation is shared, not resignation-specific — the sidebar, the user chip (including Logout) and every Settings / Account tab stay interactive behind the overlay, so the trader is never trapped. Owned by UC_4.15.2 §4.
  • The modal re-renders on every Dashboard load or reload until a new Associate Track is purchased.

BR_4.17.2.16: Re-Entry After Resignation — This Action Is What Unlocks It

Rule. Completing this use case is the hard prerequisite for LIVE re-entry. Until users.status = 'Terminated' is written, the Reset Associate Track control directly above this section is Disabled"A live trader must use 'Resign & Close Account' first to safely flatten all live market exposure. The 'Start New Associate Track' button only becomes enabled once their status is Failed or Terminated" (Source: QnA [RAT-BIZ-04], Adrian Stack 2026-08-12). Ref: UC_4.17.3 BR_4.17.3.3, BR_4.17.3.4.

The two ways back in, both landing on the same modal:

Entry pointOwned byNote
[Start Associate Track] on the Resignation Complete modal (§9.4)This UC owns the button; the flow it opens does notRef: UC_4.15.3 §2 Entry Point 1
The now-Enabled Reset Associate Track button on Account ActionsUC_4.17.3Bypasses the modal and goes straight to pricing — Ref: UC_4.15.3 §2 Entry Point 2

Everything past the click is owned downstream and is not restated here:

AspectOwned by
POST /calculate-cart → Re-Buy Modal → POST /initiate-rebuyUC_4.15.3 §5
Pricing routing — founder locked_rebuy_price · standard Challenge_Price × (1 − Retry_Discount) in window · Full Challenge Price afterBR_4.15.3.1
Live → SIM rollback — archive the live ledger, unassign/delete the LIVE sub-account, provision a fresh SIM sub-account, Case A / Case BBR_4.15.2.7
Rithmic Futures Market Data re-select screenBR_4.15.2.8
Compliance state preserved — Veriff and the Rippling ICA are bypassed on the way back to LIVEUC_4.15.3 §4

LIVE has no Reset. What the returning trader buys is a Re-Buy — a brand-new evaluation on a fresh SIM sub-account, starting at Day 1 with empty data. There is no in-place reset path on LIVE at all — Ref: UC_4.17.3 BR_4.17.3.6.

Severance and re-entry are independent. "Severance is paid regardless of whether the trader chooses to execute a Re-Buy" (BR_4.15.2.5). Buying a new track does not forfeit the payout, and taking the payout does not bar a return.

What the trader is charged is not fully closed. BR_4.17.2.9 settles the email side — [RES-ZAPF-01] puts a resigned LIVE trader into the Flow 7B Path B retention funnel with the standard discount routing. Whether the in-app CTA resolves to the same product_id="REBUY" price, or to a full-price new Associate Track per the superseded BA decision of 2026-08-12, is owned downstream and still tracked as A-25 / A-47 — Ref: §10. A retention email offering a discount while the in-app button charges full price would be incoherent, which is the strongest argument for closing A-25 in favour of the discount.

BR_4.17.2.17: Retention and Archive Window — Owned by UC_4.15.2

Resignation does not wipe the dashboard immediately. The client answered this directly: "Just retain the 10 day access. flow 20 → Flow 7. Same failsafe applies here" (Source: [RES-BIZ-02]).

The retention window, the archive_date calculation, the broker-specific failsafe actions, the Pre-Archive Gate and the rationale for the Forex/Futures split are identical to the Hard Breach path and are owned by BR_4.15.2.7 and BR_4.15.2.3. Nothing about them is restated here — if a rule changes, it changes there.

Everything unique to resignation, in full:

Rule
Window startfailure_timestamp / termination_date, written by Flow 7 Step 7 — Ref: BR_4.17.2.14. (Hard Breach: written by the Atomic Kill Switch. Same column, same semantics.)
Everything elseBR_4.15.2.7archive_date formula per broker (Rithmic Min(M1, M2) · MT5 / TE M2 only), failsafe actions at the deadline, Pre-Archive Gate, Case A / Case B provisioning, post-archive_date dashboard behaviour

Two implementation constraints this UC asserts:

  • archive_date is computed by the backend and returned as a finished ISO 8601 string; the frontend counts down passively and never applies the Rithmic month-end rule itself — Ref: BR_4.17.2.15, §9.4 row 3.

  • No resignation-specific scheduled job is built. The archive + gateway purge at archive_date is the existing Hard Breach failsafe cron, which must scan on status IN ('Failed','Terminated') + time and never filter on termination_reason:

    Forex (MT5 / TE):   status IN ('Failed','Terminated') AND NOW >= termination_date + Discount_Code_Duration_Days
    Futures (Rithmic):  status IN ('Failed','Terminated') AND NOW >= Min(termination_date + Discount_Code_Duration_Days,
                                                                        23:00 UTC on the last calendar day of the month)

    Filtering on termination_reason = 'Drawdown' would skip every resigned and stagnated account forever — never unassigned (Rithmic), never hard-deleted (MT5 / TE) — and the per-user platform connection fee plus next month's CME entitlements would keep billing on dead accounts. Same rule as SIM BE-5, Ref: BR_4.11.2.13.

⚠️ The EOM failsafe timestamp is inconsistent across the sources. BR_4.15.2.7 and [RES-BIZ-03] say 23:00 UTC; [RES-BIZ-02] says "11:59 PM". This document follows 23:00 UTC — it is the value the owning BR already implements and the one that leaves a batch buffer before CME's month roll. The 59-minute discrepancy is the client's own open item O-29(b) — Ref: §10, A-61.

BR_4.17.2.18: Flatten Proceeds Even When the Market Is Closed

Flattening uses market orders, which cannot fill while the market is in a Closed or Halted state (Ref: UC_4.1.3). This does not block the resignation:

  • Order routing is blocked at the gateway at BR_4.17.2.5 step 2 before the flatten is attempted, so no new exposure can be opened even while a position is still outstanding.
  • POST /resign still returns HTTP 200 and still emits RESIGNATION_EXECUTED; the resignation is never held open waiting for a fill.
  • Convergence is closed by Flow 7 Step 4 (Liquidation second pass), which exists precisely as a confirming re-check on top of the real-time Kill Switch. The job is complete only when the gateway reports Open_Positions == 0. Ref: UC_4.15.2 §5 Step 4.
  • The LIVE sub-account stays alive and locked until archive_date (BR_4.15.2.7), so there is a full retention window in which to converge.

Why this rule exists at all. A Hard Breach fires off live market data (ACCOUNT_METRICS), so by definition the market is open when its flatten runs. A resignation can be submitted at any hour — a weekend is the obvious case — so it is the only path on which an unfilled flatten is reachable.

LIVE needs no dedicated retry queue; SIM does. SIM bypasses Flow 7, so it had to build a Middleware Redis queue to replace the second pass (BR_4.11.2.11). On LIVE the second pass is still there. ⏳ What is not specified is whether Flow 7 Step 4 itself retries at the next market open, or runs once and moves on — the source describes it as a single confirming pass. If it does not retry, a weekend resignation with an unfilled position has no closing mechanism at all. Ref: §10, A-62.

BR_4.17.2.19: This Document Is LIVE Only

The SIM counterpart is UC_4.11.2. The two share the entire frontend and diverge completely from the moment POST /resign reads Is_Professional:

SIM — UC_4.11.2LIVE — this document
DiscriminatorIs_Professional == FalseIs_Professional == True
Friction gateTwo-step modal, typed RESIGNIdentical
Webhook emitted❌ NoneRESIGNATION_EXECUTED
AutomationFlow 2 → Flow 7B Path AFlow 20 → Flow 7 (+ Flow 7B Path B in parallel)
Who writes the statusPOST /resign (middleware)Flow 7 Step 7 (Zapier)
End statestatus = 'Failed'status = 'Terminated'
Reason columnfailure_reasontermination_reason
state_reasonRESIGNATIONRESIGNATION — identical
Defense Gaten/a (no Defense in SIM)Bypassed — Ref: BR_4.17.2.10
Severance (Flow 9)❌ NeverIf Severance_Pay > 0, paid in full — Ref: BR_4.17.2.13
Discord rolesKeptAll revoked — Ref: BR_4.17.2.11
Pod dispersaln/a (a SIM trader has no pod)Runs — Ref: BR_4.17.2.11
LedgerFrozen at the snapshotClosed to 0 (Flow 7 Step 3) — Ref: BR_4.17.2.14
GL Posting (QuickBooks)❌ Never — virtual capitalRuns
EmailChallenge_Failed (Klaviyo, Path A)Live_Account_Closed (SES-20) and the Path B retention offer — Ref: BR_4.17.2.9
Exit surveypod_leader_id always NULLCan fire
SessionRetainedRetained — identical
Retention window10 days / EOM failsafeIdentical — Ref: BR_4.17.2.17
What the trader buys nextA Reset (product_id="RESET") or a new trackA Re-Buy — LIVE has no Reset — Ref: BR_4.17.2.16
Which sibling control it unlocksUC_4.11.1 — already Enabled in every stateUC_4.17.3Disabled until this UC completes

One frontend, two backends. The friction gate, the phrase, the modal structure and the post-resignation modal template are shared code; the environment is decided server-side. A frontend that branched on environment would be duplicating a decision the backend already owns.

This document closes UC_4.11.2 §9.4 row 3"⏳ Whether the retention window applies to a LIVE resignation is owned by UC_4.17.2 and not confirmed here". It does apply, per [RES-BIZ-02], and the Archive Countdown Banner therefore renders on the LIVE modal — Ref: BR_4.17.2.17, §9.4.

9. Screen Description

9.1 LIVE Account Actions tab — Resign & Close Account section

Only the Resign & Close Account row is specified here. The Reset Associate Track row above it belongs to UC_4.17.3; the tab list, the screen title and the Controls panel belong to the shell — Ref: BR_4.17.2.1.

No LIVE design frame exists. Copy is inherited from the SIM frame (UC_4.11.2 §9.1) as the working assumption — Ref: §10, A-50.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Section titleLabelDisplaying rule:- Static text: "Account Actions" (inherited). Shared with the Reset Associate Track section above — it heads the whole tab, not this section alone.- Overflow: Wrap text.
2Row titleLabelDisplaying rule:- Static text: "Resign & Close Account" (inherited).- Overflow: Wrap text.
3Row descriptionLabelDisplaying rule:- ⏳ Copy pending. The SIM string "Permanently close your account and resign from the program. This action is immediate and irrevocable." is factually incomplete on LIVE — it omits the forfeiture of unvested profits and the loss of trading-floor access, which are the consequences that distinguish a LIVE resignation. LIVE-specific copy is required and is not supplied by any source — Ref: §10, A-63.- Static regardless of the account state — the description does not change when the button's enablement does.- Overflow: Wrap text.
4[Resign Account]Button (Danger)Displaying rule:- Label: "Resign Account" (inherited from the SIM frame).- Enabled while users.status = 'Active_DMA' — normal trading and a Soft Breach daily-loss lockout included — Ref: BR_4.17.2.7.- Disabled whenever users.status IN ('Failed', 'Terminated') — the account is already closed, whatever closed it. The trader remains logged in and can still reach this tab, so the Disabled state is reachable — Ref: BR_4.17.2.7, BR_4.17.2.8.- Never hidden — the section renders in every state.- The Disabled state renders as the standard disabled state of the same Danger button, in place, same position and size. No tooltip and no helper line — the row description in row 3 is the section's only explanatory copy, matching the sibling section's pattern (UC_4.17.3 §9.1 row 4).- ⏳ The state while status = 'SUSPENDED_DEFENSE' (48-hour Defense freeze) is not decided — Ref: BR_4.17.2.7, §10 A-57.- A plain status check is sufficient; no termination_reason lookup is needed — Ref: BR_4.17.2.6.Behaviour rule:- While Disabled: no click handler fires, no request is issued.- On click while Enabled: opens the Step 1 warning modal (Ref: §9.2). No request is sent at this point — Ref: BR_4.17.2.2.Impact:- None. This click only opens a modal; no state changes until §9.3 row 6 is executed.

9.2 Step 1 modal — Resign & Close Account

Copy is shared with the SIM environment by design decision — the warning text names unvested profits and trading-floor access, which apply literally on LIVE and only nominally on SIM. Ref: UC_4.11.2 §9.2.

⚠️ The warning is incomplete for LIVE. It does not mention Discord role revocation, pod dispersal, or severance eligibility — all three are real LIVE consequences (BR_4.17.2.11, BR_4.17.2.13). Whether to extend the copy is an open item, not a silent addition — Ref: §10, A-64.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Resign & Close Account".- Overflow: Wrap text.
2Modal subtitleLabelDisplaying rule:- Static text: "This action cannot be undone".- Overflow: Wrap text.
3Warning headlineLabelDisplaying rule:- Static text: "Resignation is immediate and irrevocable."- Overflow: Wrap text.
4Warning bodyLabelDisplaying rule:- Static text: "All open positions will be flattened. All unvested profits will be forfeited. You will lose access to the trading floor immediately."- ⏳ Whether Discord / pod / severance consequences are appended for LIVE is open — Ref: §10, A-64.- Overflow: Wrap text.
5[Continue to Resign]Button (Danger)Displaying rule:- Label: "Continue to Resign".- Always Enabled — this step collects no input.Behaviour rule:- On click: closes this modal and opens the Step 2 modal (Ref: §9.3) with an empty phrase input — Ref: BR_4.17.2.3.Impact:- None. No request is sent and no state changes.
6[Cancel]Button (Secondary)Displaying rule:- Label: "Cancel".Behaviour rule:- On click: closes the modal and returns to the Account Actions tab.- This is the only dismissal path — there is no close [X] control, overlay click does not dismiss, and Esc does not dismiss. Ref: BR_4.17.2.3.

9.3 Step 2 modal — Confirm Resignation

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Confirm Resignation".- Overflow: Wrap text.
2Modal subtitleLabelDisplaying rule:- Static text: "Final step, this cannot be reversed".- Overflow: Wrap text.
3Warning headlineLabelDisplaying rule:- Static text: "You are about to permanently resign."- Overflow: Wrap text.
4Warning bodyLabelDisplaying rule:- Static text: "All open positions will be flattened and unvested profits forfeited."- Overflow: Wrap text. Same shared-copy note as §9.2.
5Confirmation phrase inputTextboxDisplaying rule:- Preceded by an instruction Label naming the required phrase RESIGN and stating that typing it enables the final button.- Placeholder: "Type here.."- Always empty when the modal opens; a value from a previous cancelled attempt is never restored — Ref: BR_4.17.2.3.- Overflow: Block input.Behaviour rule:- The value is compared to RESIGN case-sensitively on every keystroke. The string is hard-coded in the frontend validator and matched against the same literal on the backend — it is not read from Table C — Ref: BR_4.17.2.4.- A mismatch shows no inline error message; the Disabled CTA is the only feedback.- Paste is permitted; leading and trailing whitespace is trimmed before comparison, per CR-02 §2.1.- ⏳ Pending client confirmation: the Max length of the input — Ref: §10, A-16.2 (inherited).
6[Resign & Close Account]Button (Danger)Displaying rule:- Label: "Resign & Close Account".- Default state: Disabled. It becomes Enabled only while the input value matches RESIGN exactly, case-sensitively; if the value changes to a non-matching one it returns to Disabled — Ref: BR_4.17.2.4. It is never left Enabled merely to display an error state (Source: [RES-UI-01]).- ⚠️ This overrides the SIM Figma frame, which renders the button in an active state while the input still shows its placeholder.Behaviour rule:- On click: the button is disabled immediately and enters a loading state — Ref: BR_4.17.2.6. The frontend calls POST /resign with {user_id, confirmation_phrase}.- On HTTP 200: no success screen, no logout. The modal closes, the account state is re-fetched and the trader is redirected to the Dashboard, which renders in Frosted Glass with the Resignation Complete modal and its archive countdown open — Ref: §5 step 7, BR_4.17.2.15, §9.4.- On failure: Ref: §7 Exceptional Flow.Impact:- Irreversible. Blocks order routing at the execution gateway, flattens all open positions and cancels all working orders. The LIVE sub-account is not purged on Day 0 — the purge is deferred to archive_date per BR_4.15.2.7 — Ref: BR_4.17.2.5, BR_4.17.2.17.- Writes an audit record and emits RESIGNATION_EXECUTED → Flow 20 → Flow 7, which sets status = 'Terminated', termination_reason = 'VOLUNTARY_RESIGNATION', termination_date — Ref: BR_4.17.2.14.- The Drawdown Defense Protocol is skipped, whatever the level — Ref: BR_4.17.2.10.- All unvested profits are forfeited and the challenge fee is not refunded — Ref: BR_4.17.2.12.- Every Discord role is revoked and the pod is dispersed — Ref: BR_4.17.2.11.- If Severance_Pay > 0, Flow 9 authorises 100 % of the base amount and Marketing is tasked with an exit interview — Ref: BR_4.17.2.13.- The realised P&L is posted to QuickBooks and the ledger is closed to 0 — Ref: BR_4.17.2.14.- Enables the Reset Associate Track button above this section — Ref: BR_4.17.2.16.- Leaves the session intact — the trader stays logged in — Ref: BR_4.17.2.8.
7[Cancel]Button (Secondary)Displaying rule:- Label: "Cancel".Behaviour rule:- On click: closes the whole flow and returns to the Account Actions tab. It does not return to the Step 1 modal, and the typed value is discarded — Ref: BR_4.17.2.3.- This is the only dismissal path — no close [X] control, overlay click does not dismiss, Esc does not dismiss.

9.4 Post-resignation modal — Resignation Complete (LIVE)

This modal is the only visual difference between a LIVE resignation and a LIVE Hard Breach. Everything behind it — the Frosted Glass, the frozen snapshot, the archive window, the Re-Buy flow — is the Hard Breach behaviour, referenced not restated (Ref: BR_4.17.2.15, BR_4.17.2.17).

Rendered over the Frosted Glass Dashboard once GET /failure-state returns state_reason == "RESIGNATION" — where state_reason == "BREACH" the Failure Modal variant matrix (BR_4.15.2.6, rendered at UC_4.15.3 §10.1–§10.4) renders instead. Layout reuses the Failure Modal template including its Archive Countdown Banner, minus any secondary button.

Source of the copy: client-supplied modal screenshot + written flow, 2026-08-25 (the LIVE variant), recorded for continuity at UC_4.11.2 §9.4 and owned here.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Resignation Complete".- Identical to the SIM variant — the divergence is in the body only.- Overflow: Wrap text.
2BodyLabelDisplaying rule:- Static text: "We understand this is a difficult moment. Your resignation has been processed and your live trading privileges for this account have been revoked per the risk agreement. All open positions have been flattened and all unvested profits are forfeited. When you're ready to return, you can start a fresh Associate Track from Day 1."- The copy is static — it does not vary by level, by Severance_Pay, or by whether the trader was in a pod.- ⏳ Whether a severance / exit-interview line is appended, and from which level, is open — Ref: §6.3, §10 A-26.- Overflow: Wrap text.
3Archive Countdown BannerLabel (warning style, ⏱ icon)Displaying rule:- ✅ The banner IS rendered on the LIVE resignation path[RES-BIZ-02] confirms the 10-day window applies, which closes the "⏳ owned by UC_4.17.2 and not confirmed" placeholder at UC_4.11.2 §9.4 row 3.- "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 hour.- Hidden once NOW > archive_date (window expired). The modal itself remains.- Overflow: Wrap text.Behaviour rule:- Identical rule to the Failure Modal — Ref: UC_4.10.3 §10.1 row 4. The countdown is computed on the frontend from the archive_date returned by GET /failure-state.- The frontend does not compute the broker rule; the backend already applies it — for Rithmic (Futures) archive_date = Min(M1, M2), for MT5 / TraderEvolution (Forex) M2 only — Ref: BR_4.15.2.7, BR_4.17.2.17.- Dynamic: (archive_date − NOW) is computed continuously.
4[Start Associate Track]Button (Primary)Displaying rule:- Label: "Start Associate Track" — per the client screenshot of 2026-08-25. The label does not change with window state, and no price is shown on the button; pricing is presented by the modal that follows.- Always Enabled. This is the only interactive element inside the modal.Behaviour rule:- Disabled immediately on click to prevent a double submission; the modal transitions to a loading state ("Calculating regional taxes...").- On click: the frontend calls POST /calculate-cart, then opens the Re-Buy Modal with the resolved pricing — Ref: UC_4.15.3 §5 Step 1, BR_4.17.2.16. The purchase flow itself is not owned by this UC.- ⏳ The product_id on this call is not stated by any source — Ref: §10, A-47 (inherited).- On failure: Ref: §7 Exceptional Flow.Impact:- None until the purchase completes. The click only prices the purchase and opens a modal; it creates no charge and changes no status.- A purchase completed inside the Flow 7B 1-hour cool-down halts the retention email at its Purchase Check — Ref: BR_4.17.2.9.- On a successful purchase the Frosted Glass is removed and the Dashboard renders at Day 0 on a new SIM evaluation — Case A or Case B per BR_4.15.2.7.- Severance is unaffected either way — Ref: BR_4.17.2.16.

Dismissal rules — Ref: BR_4.17.2.15:

  • No [X] control, no [Cancel] button, no secondary CTA.
  • Overlay click does not dismiss; Esc does not dismiss.
  • The archive countdown banner is rendered while the retention window is open, and disappears once it expires — Ref: BR_4.17.2.17.
  • The modal re-opens on every Dashboard load or reload until a new Associate Track is purchased, and remains permanent after the window expires (only the countdown banner disappears). The sidebar navigation and the user chip (Logout) stay interactive.
  • Alternate entry to the same purchase flow: the now-Enabled Reset Associate Track button on the Account Actions tab, which bypasses this modal and goes straight to pricing calculation. That section is owned by UC_4.17.3 — Ref: BR_4.17.2.16.

10. Open Items Pending Client Confirmation

The following points sit on the main flow of this use case and are deliberately left unspecified rather than assumed. Each is tracked in QnA_init_docs.md.

QnA IDOpen itemAffected sectionBlocking?
A-54🔴 Who bridges the window between HTTP 200 and status = 'Terminated'. On LIVE the status write is Flow 7 Step 7, not POST /resign, so the state refresh in §5 step 7.2 can read is_breached: false and render an unfrosted Dashboard over a dead execution feed — with Reset Associate Track still Disabled and no path forward. The same gap makes a failed or halted Flow 7 unrecoverable: gateway dead, DB still Active_DMA. Candidates: (a) the frontend polls / re-fetches on the WebSocket state-change event; (b) POST /resign writes an interim status itself; (c) POST /resign writes Terminated directly and Flow 7 stops owning that write. No source addresses it§5 step 7, §7, BR_4.17.2.5, BR_4.17.2.15🔴 Blocks BE + FE
A-51🔴 Per-gateway Day 0 lock values are not owned anywhere on LIVE. UC_4.15.2 §5 Step 1 says only "Disable order entry via Broker API". SIM's table gives Rithmic Paper INACTIVE; the 2026-08-26 architecture note gives Rithmic Live Admin Only, matching the Rithmic Support answer in _QNA_INDEX.md. MT5 READONLY and TE TRADING IS DISABLED BY RISK RULE appear consistent across both. The LIVE table must be written once into UC_4.15.2, for both the breach and the resignation pathBR_4.17.2.5 step 2🔴 Blocks BE · Owned by UC_4.15.2
A-58🔴 Email collision — Live_Account_Closed vs the Flow 7B retention offer. Widening the Flow 7B trigger to Terminated ([RES-ZAPF-01]) means a resigning LIVE trader receives a termination letter from Flow 7 Step 11 and a discounted come-back offer from Flow 7B Path B roughly an hour apart. The client raised this themselves as O-30 and it is unresolved. CR 2026-08-16_stagnation-email-collision-flow7-4b-7b handles a different collision and does not cover this oneBR_4.17.2.9🔴 Blocks Zapier build
A-25 (inherited from UC_4.11.2 / UC_4.17.3)🟡 What a resigned LIVE trader is charged — half-answered by this document. The email side is now settled: [RES-ZAPF-01] (2026-08-24) puts every terminated trader into the Flow 7B Path B funnel with the standard Retry_Discount routing, which supersedes the BA decision of 2026-08-12 that resignation forgoes it (BR_4.17.2.9). What remains is whether the in-app CTA resolves to the same discounted product_id="REBUY" price. A discounted email plus a full-price button would be incoherent, so the BA position is that it does — but the routing lives downstream and should be confirmed rather than assumedBR_4.17.2.9, BR_4.17.2.16🟡 Owned downstream (UC_4.15.3)
A-47 (inherited from UC_4.17.3)product_id on POST /calculate-cart from the §9.4 CTA. SIM sends "RESET". LIVE Scenario B never names the product, and A-25 leaves open whether the resignation branch uses "REBUY" at all§9.4 row 4, BR_4.17.2.16🔴 Blocks BE + FE
A-57🔴 Can a trader resign while inside the 48-hour Defense freeze? status = 'SUSPENDED_DEFENSE', so the plain status gate of BR_4.17.2.7 renders the button Disabled — but the trader's positions are already flat and a 48-hour freeze is exactly when someone decides to leave. Forcing them to wait out the freeze to resign has no risk justification. BA proposal: allow it, i.e. the gate becomes status IN ('Active_DMA', 'SUSPENDED_DEFENSE')BR_4.17.2.7, §9.1 row 4🔴 Blocks FE + BE
A-56🔴 Founding Mentor — does the Digital Eviction exemption survive a voluntary resignation? UC_4.15.2 §6 exempts a Founding Mentor from Discord revocation and pod teardown on the Hard Breach path. A breach is an involuntary risk event; a resignation is the trader choosing to leave the firm, which is the case Digital Eviction exists for. No source covers the combination§6.5, BR_4.17.2.11🔴 Blocks Zapier build
A-52🟡 CR-20260818-001 is still pending apply. The Pod Impact & Dispersal step is specified in the CR and referenced by BR_4.17.2.11, but it has not been written into UC_4.15.2 §5, whose pipeline still runs Digital Eviction → GL Posting with nothing in between. The step must land in the owning UC before either path can be builtBR_4.17.2.11🟡 BA action — owned by UC_4.15.2
A-55 ([RES-DEF-03], still unanswered by the client)🟡 Pod Leader resignation — ordering and failure handling. Does Flow 15A re-assign the mentees before or after the leader's account is terminated? If no receiving leader exists, do the orphaned mentees go to a waitlist? Is the leader's registry row held open until re-assignment completes?§6.4, BR_4.17.2.11🟡
A-60🟡 Schema: termination_reason / termination_date vs failure_reason / failure_timestamp. CR-65 renamed the pair for SIM; [RES-ZAPF-01] keeps the original names for LIVE. Are these genuinely two column pairs on one table, or one pair the docs name two ways? The failsafe cron reads termination_date on LIVE and failure_timestamp on SIM against the same status IN ('Failed','Terminated') scanBR_4.17.2.14, BR_4.17.2.17🟡 Blocks BE schema
A-61 (client's own O-29(b))🟡 EOM failsafe: 23:00 UTC or 23:59. BR_4.15.2.7 and [RES-BIZ-03] say 23:00 UTC; [RES-BIZ-02] says "11:59 PM". This document follows 23:00 UTC. 59 minutes of ambiguity in a cron that exists to beat CME's month rollBR_4.17.2.17🟡 Owned by UC_4.15.2
A-62🟡 Does Flow 7 Step 4 retry an unfilled flatten at the next market open? The source describes it as a single confirming second pass. A resignation submitted over a weekend can leave a position that neither pass fills, and LIVE has no Redis retry queue equivalent to SIM's BR_4.11.2.11. If it does not retry, the position hangs until the archive_date purgeBR_4.17.2.18🟡 Blocks BE
A-63🔴 Row description copy for LIVE. The SIM string omits the forfeiture of unvested profits and the loss of trading-floor access — the two consequences that make a LIVE resignation different. LIVE copy is required§9.1 row 3🔴 Blocks FE
A-64🟡 Does the Step 1 warning list the LIVE-only consequences? The inherited copy names flattening, unvested profits and trading-floor access, but not Discord role revocation, pod dispersal, or the fact that severance may be payable. All three are real. Adding them without the client's word would be inventing copy for an irreversible action§9.2 row 4🟡
A-26 (inherited from UC_4.11.2)🟡 Does the Resignation Complete modal append a severance / exit-interview line? The level half of this question is now answered — eligibility is Severance_Pay > 0, not a level (BR_4.17.2.13) — leaving only whether the modal mentions it at all. Quoting an amount before Marketing authorises it would be a promise the system cannot keep§6.3, §9.4 row 2🟡
A-50🟡 No LIVE design frame, and the SIM frames are not committed. References/Wireframe/ has no Settings folder for any stage; the three SIM frames and the 2026-08-25 Resignation Complete screenshot are cited by Figma node / attachment only. Same gap SIM tracks as A-17 / A-23Document header, §9.1§9.4🟡 BA housekeeping
A-53🟡 Stale sentence in UC_4.15.2 §1. It still says the LIVE sub-account is "hard-deleted immediately", contradicting §4, §5 Step 7 and BR_4.15.2.7, which say it is locked Read-Only and purged at archive_date or on a Re-Buy. This document follows the latter. Duplicate of UC_4.17.3 A-48§4, BR_4.17.2.17🟡 Owned by UC_4.15.2
A-59 ([RES-FRM-02], unanswered)🟢 Amount_Over_Stop_Loss > Severance_Pay → floor at zero, or record a debt? Cannot arise on the resignation path, where the deduction is $0 by definition. Recorded for UC_7.5BR_4.17.2.13🟢 Owned by UC_7.5
A-65 ([RES-DEF-02], unanswered)🟢 What history survives a resignation into the next track — certificates, trading journal, win-rate / profit-factor statistics, community roles. The compliance fields are settled (QnA FR-01) and Discord roles are settled (BR_4.17.2.11); the performance and certificate history is not. Affects the returning trader's Dashboard, not this screenOut of scope for this UC — UC_4.15.3🟢
A-16.2 (inherited from UC_4.11.2)🟢 Max length of the confirmation phrase input (BA proposal: 50 characters)§9.3 row 5🟢

Closed by this document:

QnA IDWas openNow
UC_4.11.2 §9.4 row 3"⏳ Whether the retention window applies to a LIVE resignation is owned by UC_4.17.2 and not confirmed here"It applies. [RES-BIZ-02]"Just retain the 10 day access. flow 20 → Flow 7. Same failsafe applies here." The Archive Countdown Banner therefore renders on the LIVE modal — Ref: BR_4.17.2.17, §9.4 row 3
UC_4.11.2 §10 A-25 — email halfWhether a resigned LIVE trader forgoes the Flow 7B Path B retention offerThey do not. [RES-ZAPF-01] (2026-08-24) widened the Flow 7B trigger to Failed OR Terminated specifically so that "every single trader who loses their seat, regardless of… how they lost it, gets dropped into the retention marketing funnel" — superseding the BA decision of 2026-08-12. The in-app price half stays open as A-25 above — Ref: BR_4.17.2.9
UC_4.17.3 BR_4.17.3.4 forward reference"UC_4.17.2 … is not yet documented in this repo. It is the hard prerequisite for this use case and is referenced by ID throughout rather than by link"Documented. UC_4.17.3 can now link rather than forward-reference; its UC_4.17.2 mentions should be re-pointed at this file — Ref: BR_4.17.2.16
Severance level thresholdThree conflicting numbers in circulation — "Level 3+" (QnA CSV), "Level 7" (FR-30), "don't hardcode" (FR-54)Severance_Pay > 0, evaluated dynamically. FR-54 is the latest client correction and supersedes both level numbers. Any level constant in code or Zapier is a defect — Ref: BR_4.17.2.13

Changelog

DateVersionUpdated itemBeforeAfterNotes
2026-08-26v1Initial creationFull SRS: §1–§10, 19 Business Rules (BR_4.17.2.1BR_4.17.2.19), 4 Screen Description tables (LIVE Account Actions section · Step 1 modal · Step 2 modal · post-resignation Resignation Complete modal), plus §10 listing 20 open items and the 4 items this document closes.Written per BA instruction, 2026-08-26. Scoped as a delta document on UC_4.15.2 — the Flow 7 pipeline, Flow 7B Path B, Frosted Glass, archive_date, Case A/B provisioning and the Severance mechanism are referenced, not restated, with a §Component split table naming 11 shared components and 8 unique ones. Severance is referenced to UC_7.5; the re-entry purchase to UC_4.15.3; the sibling control this UC unlocks to UC_4.17.3. ⚠️ Three source corrections applied, each recorded in place rather than silently: (a) the Severance gate is Severance_Pay > 0, not Current_Level >= 3 or >= 7FR-54 supersedes both (BR_4.17.2.13); (b) Flow 7B Path B does fire on a resignation — [RES-ZAPF-01] of 2026-08-24 supersedes the BA decision of 2026-08-12 (recorded at the time as BR_4.11.2.16, removed in UC_4.11.2 v3.2; the LIVE re-entry purchase is owned by UC_4.15.3) (BR_4.17.2.9); (c) the Market Data Refund Check stays in Flow 7, next-month prepay only, per [MDM-BIZ-14] (BR_4.17.2.12). ⚠️ Not asserted: the per-gateway Day 0 lock values, because no LIVE document owns them (A-51); and the fix for the Terminated-write race, because no source addresses it (A-54). Both are raised instead of guessed. No new IDs were added to common_rules.md or list-toast-popup.md — the failure paths reuse the existing TE-SYS-01, TE-AUTH-01 and TE-DASH-01.

On this page

UC_4.17.2: Settings — Account Actions: Resign Account (LIVE)Document References⚠️ How to read this document — it is a delta on UC_4.15.2Component split — shared vs unique1. Overview2. Trigger3. Pre-conditions4. Post-conditions5. Basic Flow6. Alternative Flows6.1 The trader cancels at either step6.2 Level 9+ trader with Defense still available6.3 Trader eligible for severance (Severance_Pay > 0)6.4 Trader is a Pod Leader or a Pod Mentee6.5 Founding Mentor (Role_Flag = 'Founding Mentor')7. Exceptional Flow8. Business RulesBR_4.17.2.1: Scope of This Use Case Within the Account ScreenBR_4.17.2.2: Two-Step Friction Confirmation Is MandatoryBR_4.17.2.3: Modal Dismissal — [Cancel] Is the Only ExitBR_4.17.2.4: Confirmation Phrase Matching — Case-Sensitive, ExactBR_4.17.2.5: POST /resign Execution Sequence — LIVE BranchBR_4.17.2.6: Single Execution Guarantee — Guard on status AloneBR_4.17.2.7: Resignation Is Permitted Only While the LIVE Seat Is ActiveBR_4.17.2.8: The Session Survives ResignationBR_4.17.2.9: Post-Resignation Automation — Flow 20 → Flow 7, and the Four Branches That DifferBR_4.17.2.10: Resignation Bypasses the Drawdown Defense Protocol EntirelyBR_4.17.2.11: Discord Roles ARE Revoked, and the Pod Is DispersedBR_4.17.2.12: No Refund of the Challenge Fee — the Market Data Prepay Is the Only Reversible ChargeBR_4.17.2.13: Severance (Flow 9) — Only the Two Resignation-Specific Inputs Are Asserted HereBR_4.17.2.14: Database Writes at Resignation vs ArchiveBR_4.17.2.15: Post-Resignation Dashboard State — GET /failure-state ContractBR_4.17.2.16: Re-Entry After Resignation — This Action Is What Unlocks ItBR_4.17.2.17: Retention and Archive Window — Owned by UC_4.15.2BR_4.17.2.18: Flatten Proceeds Even When the Market Is ClosedBR_4.17.2.19: This Document Is LIVE Only9. Screen Description9.1 LIVE Account Actions tab — Resign & Close Account section9.2 Step 1 modal — Resign & Close Account9.3 Step 2 modal — Confirm Resignation9.4 Post-resignation modal — Resignation Complete (LIVE)10. Open Items Pending Client ConfirmationChangelog