SRS: UC_4.17.2 — Settings: Account Actions — Resign Account (LIVE)
UC_4.17.2: Settings — Account Actions: Resign Account (LIVE)
| Field | Value |
|---|---|
| BA in Charge | QuynhAnh12 |
| Date Created | 2026-08-26 |
| Version | v1 |
| Document References | QnA 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 Document | Key Sections Used |
|---|---|---|
| 1 | RFQ_ 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) |
| 2 | RFQ_ 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 |
| 3 | Zapier 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) |
| 4 | QnA 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 |
| 4a | QnA 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 |
| 4b | QnA 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 |
| 4c | QnA 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 |
| 4d | QnA 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 |
| 5 | QnA from clients — QnA_STAGE2_FAILURE_AND_RECOVERY.md | FR-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 |
| 6 | QnA 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 |
| 7 | CR-20260818-001 | New 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 |
| 8 | UC_4.15.2 — Hard Breach: Level Stop (LIVE) — primary reference document | Everything 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) |
| 9 | UC_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 Actionstab, 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 toReferences/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 component | Owner |
|---|---|---|
| 1 | Gateway 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 0 | UC_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 |
| 2 | Order liquidation — flatten every open position, cancel every working order, converge on Open_Positions == 0 | UC_4.15.2 §5 Step 1 (Kill Switch) + Flow 7 Step 4 (confirming second pass) |
| 3 | Frosted Glass overlay — Dashboard-only blur/desaturation, metrics frozen at the exact millisecond, permanent until a Re-Buy completes | BR_4.15.2.2, UC_4.15.2 §4 |
| 4 | Navigation isolation — sidebar, user chip/Logout and every Account / Settings tab stay interactive; the trader is never trapped | UC_4.15.2 §4 ("All other screens render normally"), BR_4.10.2.2 |
| 5 | Failure-state API engine — one consolidated GET /failure-state, same JSON shape, evaluating Failed and Terminated | BR_4.17.2.15 (the resignation branch of the contract) + UC_4.11.2 BR_4.11.2.12 (the shared contract, BE-3) |
| 6 | Delayed purge policy (10-day / EOM failsafe) — archive_date per broker, Pre-Archive Gate (PostgreSQL + S3 Glacier), failsafe actions | BR_4.15.2.7 |
| 7 | Flow 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, Notification | UC_4.15.2 §5 — the four branch conditions that differ on resignation are listed at BR_4.17.2.9 |
| 8 | Flow 7B Path B — 1-hour cool-down, purchase check, pricing route, Klaviyo Retention_Offer_Discount | UC_4.15.2 §5 Flow 7B block |
| 9 | Severance Protocol (Flow 9) — eligibility gate, deduction math, Path A/B/C payout routing, human authorisation | BR_4.15.2.5 → full ownership at UC_7.5 |
| 10 | Re-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-select | UC_4.15.3, BR_4.15.2.7, BR_4.15.2.8 |
| 11 | Permanent compliance preservation — identity_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 ICA | UC_4.15.3 §4 (Source: QnA FR-01) |
🔨 Unique to LIVE resignation — custom build, specified in full here.
| # | Unique component | Specified at |
|---|---|---|
| 1 | Friction gate in Settings — two-step modal, case-sensitive typed RESIGN (all caps), CTA disabled until an exact match, no lockout or retry limit | BR_4.17.2.2–BR_4.17.2.4, §9.1–§9.3 |
| 2 | POST /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 20 | BR_4.17.2.5 |
| 3 | Defense Gate bypass — Resignation == True short-circuits the Level 9+ Drawdown Defense check; a resigning trader never enters Flow 4B | BR_4.17.2.10 |
| 4 | Full severance, no deduction — Amount_Over_Stop_Loss is inherently $0, so an eligible trader receives 100 % of the base Severance_Pay | BR_4.17.2.13 |
| 5 | Modal 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 |
| 6 | Out-of-hours flatten — a resignation can be submitted while the market is closed; a Hard Breach never can | BR_4.17.2.18 |
| 7 | Session preservation on a user-initiated close — the Auth0 session is kept alive to bypass Passwordless OTP friction on re-entry | BR_4.17.2.8 |
| 8 | This action is the hard prerequisite that enables Reset Associate Track — until it completes, the LIVE button above this section stays Disabled | BR_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
| Field | Content |
|---|---|
| ID | UC_4.17.2 |
| Use Case | Settings — Account Actions: Resign Account (LIVE) |
| Description | From 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 Flow | Flow 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 Table | users (status, termination_reason, termination_date) · audit (action) · user_account_history (archive snapshot) · Table A (Forex) / Table B (Futures) — Severance_Pay, Retry_Discount · Table C — Discount_Code_Duration_Days · Table J — Full Challenge Price / locked_rebuy_price · Table E — Pod_Leader_Registry (Current_Count, Status) · invoices (market-data refund lookup) — Ref: BR_4.17.2.14 |
| 3rd Party | Rithmic 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:
- 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.
- The
Accountscreen opens on its default active tabConnections & Credentials. Ref: BR_4.6.1.1. - The trader selects the
Account Actionstab, which renders theReset Associate Tracksection (UC_4.17.3) above theResign & Close Accountsection (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 Accountis Enabled andReset Associate Trackis 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 running —
users.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 instatus 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_Levelmust not be used, because a SIM account is provisioned atCurrent_Level1, 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 anauditrecord withaction = 'RESIGN'is written — Ref: BR_4.17.2.14.- The Drawdown Defense Protocol never runs, whatever the trader's level and whatever
Defense_Usedholds. Flow 4B is not reached — Ref: BR_4.17.2.10. - If
Severance_Pay > 0for the trader'sCurrent_Level, Flow 9 pays the full base amount with no deduction, becauseAmount_Over_Stop_Lossis$0on 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-statereturnsis_breached: true,state_reason: "RESIGNATION"and the samearchive_datepayload as a breach; the frontend usesstate_reasonto 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 Trackcontrol above this section becomes Enabled, because its predicateusers.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-condition | Where 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 normally | UC_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 deadline | BR_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 frost | UC_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 provisioning | BR_4.15.3.1, BR_4.15.2.7 |
| Compliance state preserved — the returning trader bypasses Veriff and the Rippling ICA | UC_4.15.3 §4 |
| Dashboard login never expires; the trader can return at any time | UC_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_dateor 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_datepasses or a Re-Buy completes (Source: QnAFR-54,FR-31).
5. Basic Flow
-
The trader opens the
Account Actionstab. TheResign & Close Accountrow renders with [Resign Account] Enabled — Ref: §9.1, BR_4.17.2.7. -
The trader clicks [Resign Account]. The Step 1 warning modal opens — Ref: §9.2, BR_4.17.2.2.
-
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.
-
The trader types the confirmation phrase
RESIGNinto 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. -
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 /resignwith{user_id, confirmation_phrase}. -
The Middleware Hub executes the LIVE resignation sequence synchronously — Ref: BR_4.17.2.5:
- Validates
confirmation_phrase. - Reads
Is_Professionalfrom the decoded JWT claims →True→ LIVE branch. - 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.
- Inserts an
auditrecord withaction = 'RESIGN'. - Emits the
RESIGNATION_EXECUTEDwebhook to Zapier Flow 20. The dashboard session itself is not torn down — Ref: BR_4.17.2.8.
- Validates
-
The backend returns HTTP 200 OK. The frontend then, without showing any success screen — Ref: BR_4.17.2.15:
- Closes the Step 2 modal and leaves the session untouched (no token clearing, no logout, no redirect to login).
- Re-fetches the account state (
GET /failure-state), which now returnsis_breached: true,state_reason: "RESIGNATION"andarchive_date. - 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. - 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 byPOST /resign, soGET /failure-statemay still readActive_DMAwhen the frontend calls it milliseconds after the HTTP 200. Ref: BR_4.17.2.15, §10 A-54. -
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. -
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 → KlaviyoRetention_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 offer6. 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 Actionstab. No request is sent. - Clicking [Cancel] on the Step 2 modal closes the entire flow and returns the trader to the
Account Actionstab — 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
- The trader is at
Current_Level >= 9withDefense_Used == False— i.e. they would be eligible for the 48-hour Drawdown Defense cooling-off if they had breached (UC_4.15.4). - 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.
- Flow 7 Step 1 evaluates
Resignation == Truebefore the eligibility check and short-circuits straight to Liquidation.Defense_Usedis not consumed and Flow 4B is never triggered — Ref: BR_4.17.2.10.
6.3 Trader eligible for severance (Severance_Pay > 0)
- 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.
- Flow 7 Step 6 (Retention Gate) looks up
Severance_Payfrom Table A/B byCurrent_Level, finds it> 0, and executes Flow 9. - Because the reason code is
VOLUNTARY_RESIGNATION,Amount_Over_Stop_Lossis$0and the trader is authorised for 100 % of the baseSeverance_Pay— Ref: BR_4.17.2.13. - 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. - ⏳ 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
- The flow is the full §5 Basic Flow, unchanged. The pod consequence is entirely back-end and is not surfaced in the friction modals.
- Flow 7's
Pod Impact & Dispersalstep branches on the trader's pod role — decrementing the mentor'sCurrent_Countand clearingpod_leader_idfor a mentee, or terminating the registry row and firingPOD_LEADER_TERMINATED→ Flow 15A for a leader. Ref: BR_4.17.2.11, CR-20260818-001. - 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 theLive_Account_Closedemail andlast_survey_dateis updated — the one Flow 7 step that is dead in SIM and live here. Ref: BR_4.17.2.9. - ⏳ 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')
- The flow is the full §5 Basic Flow for everything up to Flow 7.
- ⏳ 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.
- 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 ofRole_Flag— Ref: BR_4.17.2.15.
7. Exceptional Flow
-
[If
POST /resignfails 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 /resignreturns 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_EXECUTEDdoes not fire again, Flow 7 does not run twice, and no duplicateLive_Account_Closedemail 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_reasondecides 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.
- One condition covers every case:
-
[If the market is closed or halted when the flatten step executes]
- The resignation is not blocked and
POST /resignstill returns HTTP 200. The account is switched to read-only immediately, so no new exposure can be opened. - Convergence on
Open_Positions == 0is reached asynchronously — Ref: BR_4.17.2.18.
- The resignation is not blocked and
-
[If a downstream Zapier step fails — Flow 20 does not fire, or Flow 7 halts mid-pipeline]
POST /resignhas 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.statusstill'Active_DMA', soGET /failure-statereturnsis_breached: false, the Dashboard renders unfrosted over a dead feed,Reset Associate Trackstays 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-statereturnsis_breached: falseand 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 /resignwrites 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:
| Element | Owning UC |
|---|---|
Account screen shell, tab list, default active tab | UC_4.6.1 (Connections & Credentials) · tab list table: BR_4.6.2.1 |
Profile & Preferences tab | UC_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 item | UC_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 case | UC_4.17.3 — Ref: BR_4.17.2.16 |
| Entry point — sidebar user chip and its dropdown | UC_4.1.2 |
Flow 7 pipeline, Flow 7B Path B, archive_date, Case A/B provisioning, Frosted Glass | UC_4.15.2 — Ref: BR_4.17.2.9 |
| The Re-Buy Modal, its payment paths and provisioning outcome | UC_4.15.3 |
| Severance calculation, payout routing, exit interview, ledger recording | UC_7.5 (not yet documented in this repo) — Ref: BR_4.17.2.13 |
Pod re-assignment / mentee dispersal after POD_LEADER_TERMINATED | Flow 15A → UC_4.14.2 — Pod Mentorship Module (not yet documented in this repo) |
| The SIM counterpart of this very section | UC_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
Triggerrow (Source: QnAStage 2 - Dashboard & Fomula (Settings).csv, categorySettings: Resign Account, rowTrigger). 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
Esckey 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 Actionstab; 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,resignand 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 asRESIGNby 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
RESIGNand 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_Professional | Environment | Behaviour |
|---|---|---|
False | SIM | Handled natively, no RESIGNATION_EXECUTED. End state status = 'Failed'. Owned by UC_4.11.2 |
True | LIVE | The sequence below. Emits RESIGNATION_EXECUTED → Flow 20 → Flow 7. End state status = 'Terminated' |
Execution sequence:
| # | Step | Owned by | Detail |
|---|---|---|---|
| 1 | Validate confirmation_phrase | This UC | Exact, case-sensitive match against RESIGN — Ref: BR_4.17.2.4 |
| 2 | Block gateway order entry (Day 0 read-only) | 🔗 Shared | The 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 |
| 3 | Flatten open positions | 🔗 Shared | Market Close for every open position — Ref: UC_4.15.2 §5 Step 1 |
| 4 | Cancel working orders | 🔗 Shared | Every pending / working order — same reference |
| 5 | Audit logging | This UC | Insert a PostgreSQL audit record: action = 'RESIGN', user_id, timestamp = NOW() |
| 6 | Emit RESIGNATION_EXECUTED | This UC | Webhook 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 |
| 7 | Return HTTP 200 | This UC | The session is not torn down — Ref: BR_4.17.2.8 |
| 8 | status = 'Terminated', termination_reason, termination_date | ⚠️ Flow 7 | Written 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 SimREADONLY· TE SimTRADING IS DISABLED BY RISK RULE, while the 2026-08-26 architecture note gives Rithmic LiveAdmin Onlyfor the same step, matching the Rithmic Support answer recorded in_QNA_INDEX.md("lockAccount 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.pdfandRFQ_ Website and Dashboard Implementation V7.pdfdescribe 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
statusalone —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-sideFailedrecord.
Why
statusalone and not the pair. By the time an account isTerminated, 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 overwritetermination_reason(e.g.Drawdown→VOLUNTARY_RESIGNATION), destroying the record of why the seat was actually lost — and on LIVE that record drives money: it decides whether Flow 9 deductsAmount_Over_Stop_Lossor pays the full base amount (BR_4.17.2.13). A second Flow 7 run would also re-post to QuickBooks, re-fireLive_Account_Closedand 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 strayRESIGNATION_EXECUTEDfrom 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 /resignautomatically. 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 state | Resign 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.4 | ⏳ Not 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 resignation | ❌ No — 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
statuscheck. Notermination_reasonlookup is needed on either the frontend or the backend.
This is the exact inverse of the section above it.
Reset Associate Trackis Disabled in every state exceptTerminated;Resign & Close Accountis Enabled only whileActive_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, untilarchive_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 step | Owned by | Behaviour on the resignation path |
|---|---|---|
| Step 1 — Defense Gate | UC_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 Switch | same | ✅ 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 event | same | ❌ Not 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 Severance | same, 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 & Dispersal | CR-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 — Notification | same | ⚠️ 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 Codeand the resultingAmount_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 Breach | Resignation | |
|---|---|---|
| Flow 7B fires? | ✅ Yes, Path B | ✅ Yes, Path B — same trigger, same path |
| Klaviyo event | Retention_Offer_Discount | Retention_Offer_Discount — same event |
| Offered price | Founder → locked_rebuy_price · Standard, in window → Challenge_Price × (1 − Retry_Discount) · Expired → Full Challenge Price | Same 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.16in 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 asO-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 == False | Resignation at the same level and flag | |
|---|---|---|
| Defense eligibility evaluated? | ✅ Yes | ❌ No — short-circuited |
| Flow 4B triggered? | ✅ Yes, Flow 7 halts | ❌ No |
Defense_Used consumed? | ✅ Set True | ❌ Unchanged |
| 48-hour Shadow Mode entered? | ✅ Yes (UC_4.15.4) | ❌ No |
| End state | SUSPENDED_DEFENSE, account survives | Terminated, 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 }:
| Aspect | Rule |
|---|---|
| What is removed | Every role — Pod Member, Pod Leader and all Title Roles — resolved through the stored discord_user_id |
| What is kept | discord_user_id itself is retained, and the trader is not removed from the Discord server (Source: [DL-BIZ-04]) |
| Why it is kept | So a later re-entry reassigns the role through /manage-discord-role without a second verification round |
| Failsafe | discord_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:
| Condition | Actions |
|---|---|
Mentee exit — users.pod_leader_id IS NOT NULL | Decrement 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_Registry | Set 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 Scope Next month's prepay only. IF Next_Month_Data_Paid == True→POST /issue-refundwith{ user_id, type: "MARKET_DATA" }Not in scope The current month is never prorated. CME bills per calendar month; the month in progress is consumed Why the step survives It 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 rails If Gateway_Sourcerejects automated reversal, the middleware logs the exception to the financial ledger and raises a high-priority Freshdesk ticket withuser_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:
| # | Input | Value on the resignation path | Source |
|---|---|---|---|
| 1 | Reason Code | VOLUNTARY_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 desk | Zapier Integration V7.pdf §Flow 20 · QnA FR-18, FR-21 |
| 2 | Amount_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_PayThis 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-30corrected that to "Severance now starts at Level 7"; andFR-54then corrected both — "do NOT hardcodecurrent_level >= 7… the middleware and Zapier must evaluate theSeverance_Payvalue directly from the configuration matrix". TheSeverance_Pay > 0test 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
Billingscreen, owned by UC_4.6.3 — Ref: BR_4.15.2.5. - ⏳
[RES-FRM-02]is unanswered: what happens ifAmount_Over_Stop_Loss > Severance_Payon 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:Column Value audit.action'RESIGN'(withuser_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:
Column Value users.status'Terminated'— not'Failed'.'Failed'is the SIM resignation end state — Ref: BR_4.17.2.19users.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-statereads. -
At archive — whichever comes first, Re-Buy or
archive_date: auser_account_historysnapshot 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 whenarchive_datefires (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:
| Layer | Field | Value on a LIVE resignation |
|---|---|---|
PostgreSQL users | termination_reason | VOLUNTARY_RESIGNATION |
GET /failure-state response | state_reason | RESIGNATION |
| Zapier Flow 20 → Flow 7 | Reason Code | VOLUNTARY_RESIGNATION |
⚠️ LIVE keeps
termination_*; SIM migrated tofailure_*. CR-65 renamedtermination_reason→failure_reasonandtermination_date→failure_timestampfor SIM only. On LIVE the original column names stand, per[RES-ZAPF-01]("termination_reason = 'VOLUNTARY_RESIGNATION'và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:
| # | Rule | Source |
|---|---|---|
| 1 | The 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 |
| 2 | The payload carries a discriminator state_reason: "BREACH" | "RESIGNATION", mapped from users.termination_reason | Client-confirmed 2026-08-25 — the field appears in the client's own sample payload |
| 3 | archive_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_dateis 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 /resignwrites the status itself, soGET /failure-stateis 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 backis_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 andEscdo 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/Accounttab 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 point | Owned by | Note |
|---|---|---|
| [Start Associate Track] on the Resignation Complete modal (§9.4) | This UC owns the button; the flow it opens does not | Ref: UC_4.15.3 §2 Entry Point 1 |
The now-Enabled Reset Associate Track button on Account Actions | UC_4.17.3 | Bypasses 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:
| Aspect | Owned by |
|---|---|
POST /calculate-cart → Re-Buy Modal → POST /initiate-rebuy | UC_4.15.3 §5 |
Pricing routing — founder locked_rebuy_price · standard Challenge_Price × (1 − Retry_Discount) in window · Full Challenge Price after | BR_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 B | BR_4.15.2.7 |
| Rithmic Futures Market Data re-select screen | BR_4.15.2.8 |
| Compliance state preserved — Veriff and the Rippling ICA are bypassed on the way back to LIVE | UC_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 sameproduct_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 start | failure_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 else | ↳ BR_4.15.2.7 — archive_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_dateis 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_dateis the existing Hard Breach failsafe cron, which must scan onstatus IN ('Failed','Terminated')+ time and never filter ontermination_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 itemO-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 /resignstill returns HTTP 200 and still emitsRESIGNATION_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.2 | LIVE — this document | |
|---|---|---|
| Discriminator | Is_Professional == False | Is_Professional == True |
| Friction gate | Two-step modal, typed RESIGN | Identical |
| Webhook emitted | ❌ None | ✅ RESIGNATION_EXECUTED |
| Automation | Flow 2 → Flow 7B Path A | Flow 20 → Flow 7 (+ Flow 7B Path B in parallel) |
| Who writes the status | POST /resign (middleware) | Flow 7 Step 7 (Zapier) |
| End state | status = 'Failed' | status = 'Terminated' |
| Reason column | failure_reason | termination_reason |
state_reason | RESIGNATION | RESIGNATION — identical |
| Defense Gate | n/a (no Defense in SIM) | Bypassed — Ref: BR_4.17.2.10 |
| Severance (Flow 9) | ❌ Never | ✅ If Severance_Pay > 0, paid in full — Ref: BR_4.17.2.13 |
| Discord roles | ✅ Kept | ❌ All revoked — Ref: BR_4.17.2.11 |
| Pod dispersal | n/a (a SIM trader has no pod) | ✅ Runs — Ref: BR_4.17.2.11 |
| Ledger | Frozen at the snapshot | Closed to 0 (Flow 7 Step 3) — Ref: BR_4.17.2.14 |
| GL Posting (QuickBooks) | ❌ Never — virtual capital | ✅ Runs |
Challenge_Failed (Klaviyo, Path A) | Live_Account_Closed (SES-20) and the Path B retention offer — Ref: BR_4.17.2.9 | |
| Exit survey | ❌ pod_leader_id always NULL | ✅ Can fire |
| Session | Retained | Retained — identical |
| Retention window | 10 days / EOM failsafe | Identical — Ref: BR_4.17.2.17 |
| What the trader buys next | A Reset (product_id="RESET") or a new track | A Re-Buy — LIVE has no Reset — Ref: BR_4.17.2.16 |
| Which sibling control it unlocks | UC_4.11.1 — already Enabled in every state | UC_4.17.3 — Disabled 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 Accountrow is specified here. TheReset Associate Trackrow above it belongs to UC_4.17.3; the tab list, the screen title and theControlspanel 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 Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Section title | Label | Displaying 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. |
| 2 | Row title | Label | Displaying rule:- Static text: "Resign & Close Account" (inherited).- Overflow: Wrap text. |
| 3 | Row description | Label | Displaying 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 Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Modal title | Label | Displaying rule:- Static text: "Resign & Close Account".- Overflow: Wrap text. |
| 2 | Modal subtitle | Label | Displaying rule:- Static text: "This action cannot be undone".- Overflow: Wrap text. |
| 3 | Warning headline | Label | Displaying rule:- Static text: "Resignation is immediate and irrevocable."- Overflow: Wrap text. |
| 4 | Warning body | Label | Displaying 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 Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Modal title | Label | Displaying rule:- Static text: "Confirm Resignation".- Overflow: Wrap text. |
| 2 | Modal subtitle | Label | Displaying rule:- Static text: "Final step, this cannot be reversed".- Overflow: Wrap text. |
| 3 | Warning headline | Label | Displaying rule:- Static text: "You are about to permanently resign."- Overflow: Wrap text. |
| 4 | Warning body | Label | Displaying rule:- Static text: "All open positions will be flattened and unvested profits forfeited."- Overflow: Wrap text. Same shared-copy note as §9.2. |
| 5 | Confirmation phrase input | Textbox | Displaying 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-statereturnsstate_reason == "RESIGNATION"— wherestate_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 Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Modal title | Label | Displaying rule:- Static text: "Resignation Complete".- Identical to the SIM variant — the divergence is in the body only.- Overflow: Wrap text. |
| 2 | Body | Label | Displaying 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. |
| 3 | Archive Countdown Banner | Label (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;
Escdoes 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 Trackbutton on theAccount Actionstab, 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 ID | Open item | Affected section | Blocking? |
|---|---|---|---|
| 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 path | BR_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 one | BR_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 assumed | BR_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 built | BR_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') scan | BR_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 roll | BR_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 purge | BR_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-23 | Document 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.5 | BR_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 screen | Out 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 ID | Was open | Now |
|---|---|---|
| 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 half | Whether a resigned LIVE trader forgoes the Flow 7B Path B retention offer | ✅ They 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 threshold | Three 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
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-08-26 | v1 | Initial creation | — | Full SRS: §1–§10, 19 Business Rules (BR_4.17.2.1 → BR_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 >= 7 — FR-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. |
QnA Init Docs — UC_4.17.2: Settings — Account Actions: Resign Account (LIVE)
Previous Page
UC_4.17.3 — Settings: Account Actions — Reset Associate Track (LIVE)
SRS for the LIVE Reset Associate Track control — Disabled until status = 'Terminated'; resignation (UC_4.17.2) is a hard prerequisite, and once enabled the flow hands off to the LIVE Re-Buy path (UC_4.15.2)