StackTrading Docs

SRS: UC_4.11.2 — Settings: Account Actions — Resign Account (SIM)

UC_4.11.2: Settings — Account Actions: Resign Account (SIM)

FieldValue
BA in ChargeQuynhAnh12
Date Created2026-08-11
Versionv3.3
EnvironmentSIM only.
DesignFigma — Resign 7878-119388 · Figma — Resign 7878-119281

Sources at §11, change history at §Changelog.


1. Overview

FieldContent
IDUC_4.11.2
Use CaseSettings — Account Actions: Resign Account (SIM)
DescriptionFrom the Account Actions tab of the Account screen, a trader voluntarily and permanently abandons their evaluation. The action sits behind a two-step friction barrier (warning modal → typed confirmation phrase) and is irreversible.POST /resign is handled natively by the Node.js middleware: it switches the gateway to read-only, cancels working orders, flattens open positions, writes an audit record, sets users.status = 'Failed' with failure_reason = 'VOLUNTARY_RESIGNATION', and fires the RESIGNATION_EXECUTED webhook.Zapier Flow 20 catches that webhook and acts as a router: it calls POST /discord/revoke-all-roles, then terminates. Flow 7B Path A triggers independently off the 'Failed' status change and sends the Klaviyo Challenge_Failed retargeting email after a 1-hour cool-down.From the status write onward the Dashboard behaves exactly as it does after a Hard Breach — Frosted Glass, retention window, archive_date, reset pricing. Those are specified in UC_4.10.2 and referred to here, not repeated. The only visual difference is the modal on top (§9.4).This UC covers the Resign & Close Account section, its two friction modals and the post-resignation modal. It ends when the trader clicks [Start Associate Track] on that modal — the purchase that follows is UC_4.10.3.
EndpointsPOST /resign · POST /discord/revoke-all-roles (called by Flow 20) · GET /get-failure-state (BR_4.11.2.12)
Zapier FlowsFlow 20 — Trader Resignation Handler: router. Catches RESIGNATION_EXECUTED, calls the Discord revocation, terminates. Flow 7 is not usedBR_4.11.2.8.Flow 7B Path A — Retention & Retargeting: triggered by the status → 'Failed' database change. Refer to UC_4.10.2 §5 Step 8.
Tablesusers (status, failure_reason, failure_timestamp) · audit (action)
3rd PartyRithmic Paper (Futures) / MT5 Sim / TraderEvolution Sim (Forex) — read-only on Day 0, purge deferred to archive_date · Discord (role revocation) · Klaviyo (Challenge_Failed email)

Referred to, not repeated here

TopicWhere it is specified
Day 0 gateway lock and liquidation — Rithmic INACTIVE · MT5 READONLY · TE TRADING IS DISABLED BY RISK RULE; flatten all, cancel all, no purge on Day 0UC_4.10.2 §5 Step 3 (was BR_4.10.2.9, folded back into §5 Step 3 in v1.3+)
Frosted Glass overlay — Dashboard-only blur, metrics frozen at failure_timestamp, permanent until repurchase, re-summoned on every Dashboard loadUC_4.10.2 BR_4.10.2.2Wireframe
Retention window, archive_date, failsafe purge, Glacier gate, Case A / Case B provisioningUC_4.10.2 BR_4.10.2.7, BR_4.10.2.3
Flow 7B Path A mechanics — cool-down, purchase check, pricing route, Klaviyo emissionUC_4.10.2 §5 Step 8
The purchase flow after [Start Associate Track]UC_4.10.3

2. Trigger

The trader clicks [Resign Account] in the Resign & Close Account row of the Account Actions tab (§9.1).

Navigation: sidebar user chip → Settings → the Account screen opens → the trader selects the Account Actions tab.

3. Pre-conditions

  • The trader is authenticated and inside the Dashboard shell.
  • users.status = 'Active_SIM'BR_4.11.2.6.
  • Is_Professional == False.
  • A trading sub-account exists on the execution gateway (Rithmic Paper, MT5 Sim or TraderEvolution Sim).

4. Post-conditions

  • The gateway is read-only, all open positions are flattened and all working orders cancelled. The sub-account stays assigned and connected — no purge on Day 0 (UC_4.10.2 §5 Step 3, was BR_4.10.2.9).
  • users.status = 'Failed', users.failure_reason = 'VOLUNTARY_RESIGNATION', users.failure_timestamp = NOW(), plus an audit row with action = 'RESIGN'BR_4.11.2.10.
  • Discord roles are revoked by Flow 20 — BR_4.11.2.9.
  • The trader receives the Klaviyo Challenge_Failed email after Flow 7B's 1-hour cool-down, unless they repurchase inside it — BR_4.11.2.8.
  • GET /get-failure-state returns is_breached: true, state_reason: "RESIGNATION", archive_dateBR_4.11.2.12.
  • The Dashboard renders in Frosted Glass with the Resignation Complete modal on top — §9.4.
  • The trader stays logged in — BR_4.11.2.7.

5. Basic Flow

  1. The trader opens the Account Actions tab. The Resign & Close Account row renders — §9.1.
  2. The trader clicks [Resign Account]. The Step 1 warning modal opens — §9.2.
  3. The trader clicks [Continue to Resign]. Step 1 closes; the Step 2 confirmation modal opens with an empty input — §9.3.
  4. The trader types RESIGN. The value is compared case-sensitively on every keystroke; the CTA stays disabled until it matches exactly — BR_4.11.2.3.
  5. The trader clicks [Resign & Close Account]. The button disables and shows a loading state; the frontend calls POST /resign with {user_id, confirmation_phrase}.
  6. The Middleware Hub executes the whole sequence synchronously — BR_4.11.2.4:
    1. Validate confirmation_phrase.
    2. Switch the gateway to read-only.
    3. Flatten all open positions.
    4. Cancel all working orders. (If the market is closed, the flatten is queued for retry rather than blocking the response — BR_4.11.2.11.)
    5. Insert the audit record, action = 'RESIGN'.
    6. Write users.status = 'Failed', failure_reason = 'VOLUNTARY_RESIGNATION', failure_timestamp = NOW().
    7. Fire the RESIGNATION_EXECUTED webhook to Zapier.
  7. The backend returns HTTP 200 OK. The frontend:
    1. Closes the Step 2 modal, leaving the session untouched.
    2. Re-fetches GET /get-failure-state + GET /system/statusis_breached: true, state_reason: "RESIGNATION", archive_date.
    3. Redirects to the Command Center / Dashboard.
    4. Renders the Frosted Glass Dashboard with the non-dismissible Resignation Complete modal on top — §9.4.
  8. Asynchronously, in parallel — the trader waits on neither:
    1. Flow 20 catches RESIGNATION_EXECUTED, calls POST /discord/revoke-all-roles, and terminates — BR_4.11.2.8, BR_4.11.2.9.
    2. The status → 'Failed' database change triggers Flow 7B Path A: 1-hour cool-down → purchase check → pricing route → Klaviyo Challenge_Failed. Refer to UC_4.10.2 §5 Step 8.
[POST /resign — Node.js middleware, synchronous]
   gateway read-only → flatten → cancel → audit
   DB: status = 'Failed', failure_reason = 'VOLUNTARY_RESIGNATION'

        ├──▶ 200 OK ──▶ redirect to Dashboard ──▶ Frosted Glass + §9.4 modal

        ├──▶ RESIGNATION_EXECUTED ──▶ [Flow 20 — router]
        │                                  └─ POST /discord/revoke-all-roles → terminate

        └──▶ DB state change 'Failed' ──▶ [Flow 7B Path A]
                                              ├─ Cool-Down (1 hour)
                                              ├─ Purchase Check
                                              └─ Klaviyo "Challenge_Failed"

6. Alternative Flow

[Trader cancels at Step 1] — the modal closes and returns to the Account Actions tab. No request is sent.

[Trader cancels at Step 2] — the whole flow closes and returns to the Account Actions tab; it does not return to Step 1, and the typed value is discarded. Re-entering starts again from Basic Flow step 2 with an empty input.

7. Exceptional Flow

[POST /resign fails — network error, timeout or HTTP 5xx] The Step 2 modal stays open, TE-SYS-01 is displayed, and the CTA is re-enabled so the trader can retry manually. The system does not auto-retry.

[POST /resign returns HTTP 409 — the account is already Failed] Covers a double submission, a retry after an unnoticed success and a second browser tab. No DB write and no webhook occur. The modal closes, TE-DASH-01 is displayed, and the standard state refresh runs. The session is untouched.

[The market is closed or halted when the flatten executes] The resignation is not blocked and POST /resign still returns 200. The account is read-only immediately, so no new exposure can open. The middleware queues a retry and re-issues the flatten at the next market-open tick, completing only once Open_Positions == 0 is verified — BR_4.11.2.11.

8. Business Rules

BR_4.11.2.1: Two-Step Friction Confirmation Is Mandatory

Resignation must be gated behind two sequential modals; one confirmation is not enough.

  • Step 1 — Warning. States that the action is immediate and irrevocable and lists its consequences. Collects no input. §9.2
  • Step 2 — Confirmation. Requires the trader to type a confirmation phrase before the final action becomes available. §9.3

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

BR_4.11.2.2: [Cancel] Is the Only Exit

Both friction modals apply the same rules: no [X] control, overlay click does not dismiss, Esc does not dismiss. [Cancel] is therefore the only way out without resigning. [Cancel] on Step 2 exits the whole flow — there is no path back to Step 1 — and the phrase input is always empty when Step 2 opens.

BR_4.11.2.3: Confirmation Phrase — RESIGN, Case-Sensitive, Exact

AspectRule
Expected valueRESIGN, upper case throughout
MatchingCase-sensitive and exact. Resign, resign and every other casing variant fail
EvaluationOn every keystroke (onChange); the CTA flips to Enabled the moment the value matches. Pure frontend check
Mismatch feedbackNone. No inline error, no error overlay. The disabled CTA is the only feedback
Retry limitNone. No lockout, no threshold, no penalty. The trader may retype or re-enter the flow any number of times
PasteAllowed; clipboard input is not blocked
WhitespaceLeading and trailing whitespace is trimmed before comparison (CR-02 §2.1). Internal whitespace is not altered
ConfigurabilityHard-coded in both the frontend validator and the backend — not read from Global Variables / Table C
Max length50 characters (CR-02 §2.2)

BR_4.11.2.4: POST /resign Execution Sequence

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

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

Returns HTTP 200 OK. The Middleware Hub executes every step itself, synchronously; the sequence is irreversible once started.

#StepDetail
1Validate confirmation_phraseExact, case-sensitive match against RESIGNBR_4.11.2.3
2Gateway read-only (Day 0 lock)Per-gateway state values and the no purge on Day 0 rule → UC_4.10.2 §5 Step 3
3Flatten open positionsUC_4.10.2 §5 Step 3
4Cancel working ordersUC_4.10.2 §5 Step 3
5Audit logPostgreSQL audit row: action = 'RESIGN', user_id, timestamp = NOW()
6Write statususers.status = 'Failed' · users.failure_reason = 'VOLUNTARY_RESIGNATION' · users.failure_timestamp = NOW()
7Fire RESIGNATION_EXECUTEDWebhook to Zapier Flow 20, payload {user_id, is_professional}

The status write is made inside the request, before the 200 OK, so GET /get-failure-state reports the closed state on the frontend's very next call and the Frosted Glass renders with no wait on Zapier.

Branch key — Is_Professional, read from the decoded JWT claims. False is the branch this document specifies. It is the only field stable across the whole account lifecycle: written False at provisioning, flipped to True only when the trader signs the Live agreement at Flow 3E. Current_Level is not a valid key — it is set to 1, 2 or 5 at provisioning from the purchased product_id (Eval_1 / Eval_2 / Eval_5) — and status is not a valid key because it is volatile.

BR_4.11.2.5: Single Execution Guarantee

The sequence is destructive, so it must run at most once per account.

  • Frontend: the CTA disables on click and shows a loading state, preventing a double submission from the same modal.

  • Backend:

    IF status = 'Failed' → HTTP 409 Conflict, halt.
    No DB write, no webhook.

Once the account is 'Failed' the gateway has already blocked order routing, flattened every position and cancelled every working order — there is nothing left to resign. A second resignation would overwrite failure_reason, destroying the record of why the evaluation ended, and would re-fire the status change → a second Flow 7B run → a duplicate Challenge_Failed email.

The system never retries POST /resign automatically. Any retry is an explicit user action (§7).

BR_4.11.2.6: Resignation Is Permitted Only While the Evaluation Is Live

users.statusResign available?
'Active_SIM'✅ Yes
'Failed'❌ No

The [Resign Account] button is Enabled only while users.status = 'Active_SIM' and Disabled once it is 'Failed'. A trader whose account has already failed still reaches this tab — the Frosted Glass covers the Dashboard only — so the Disabled state is on-screen and must be built. A request that still reaches the backend is rejected with 409 (BR_4.11.2.5).

BR_4.11.2.7: The Session Survives Resignation

LayerOutcome
Current sessionRetained. The trader is not logged out, access tokens are not cleared, the Auth0 session is untouched, no redirect to login. The purpose is to let the trader buy a new evaluation without re-authenticating
Trading functionalityDisabled. Execution privileges revoked at the gateway on Day 0; the Dashboard is locked behind Frosted Glass. The sub-account stays alive until archive_date
Dashboard loginRetained. The login account survives so a new evaluation can be purchased

The source phrasing "logs the user out" does not apply: the trader is not logged out of the dashboard. Confirmed 2026-09-03.

BR_4.11.2.8: Post-Resignation Automation — Flow 20 Routes, Flow 7B Communicates

Two things run in parallel after the 200 OK, and the trader waits on neither.

#ComponentAction
1Flow 20 — Trader Resignation HandlerCatches RESIGNATION_EXECUTED, calls POST /discord/revoke-all-roles, then terminates. It writes no database columns and sends no email.⚠️ Flow 7 is not used. Zapier Integration V7.pdf §Flow 20 chains onward into Flow 7 — on this path Flow 20 must stop after the Discord call
2Flow 7B Path A — Retention & RetargetingTriggered independently by the status → 'Failed' database change, not by a call from Flow 20. 1-hour cool-down → purchase check → pricing route → Klaviyo Challenge_Failed. Refer to UC_4.10.2 §5 Step 8

Klaviyo payload. The emitted Challenge_Failed event carries failure_reason = 'VOLUNTARY_RESIGNATION' alongside user_name and Pricing_Logic_Amount. Emitting that field is the Sotatek scope. What Klaviyo does with it — one template with a conditional block, or two templates under the same event — is a Stack Trading marketing-ops configuration and is not specified here.

BR_4.11.2.9: Discord Roles Are Revoked by Flow 20

Flow 20 calls POST /discord/revoke-all-roles.

AspectRule
Roles removedAll of them — on this path, the Associate Trader role and any private community channel permissions
discord_user_idKept. The account link survives
Server membershipKept. The trader is not removed from the Discord server
On repurchaseThe role is reassigned via /manage-discord-role — no second verification required
CallerFlow 20, not Flow 7B

BR_4.11.2.10: Database Writes at Resignation

Written by the middleware inside POST /resign:

ColumnValue
users.status'Failed'
users.failure_reason'VOLUNTARY_RESIGNATION'
users.failure_timestampNOW()
audit.action'RESIGN'

The status transition is what triggers Flow 7B (BR_4.11.2.8).

virtual_equity is not touched. It stays frozen at the resignation snapshot for the whole retention window — this is the P&L and Balance the Frosted Glass Dashboard renders so the trader can review their history.

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

Flattening uses market orders, which cannot fill while the market is Closed or Halted. This does not block the resignation: order routing is blocked at the gateway before the flatten is attempted, so no new exposure can open, and the status write and everything downstream proceed regardless.

AspectRule
TriggerThe gateway rejects the flatten because the market is closed or halted
MechanismThe Middleware Hub enqueues a retry job (Redis queue) owned by POST /resign. Zapier is not involved
Retry timingRe-issued at the next market-open tick for that instrument's session
CompletionMarked complete only when the middleware verifies Open_Positions == 0 on the gateway — not when the retry is merely dispatched
DeadlineThe sub-account stays alive until archive_date, so the queue has the full retention window to converge

The failure mode this prevents. A trader can click Resign at any hour — a weekend is the obvious case. Without the queue the flatten is rejected once and never retried, so the position hangs until the purge sweeps the sub-account away, closing the evaluation with open exposure on the books for the whole window.

BR_4.11.2.12: Post-Resignation Dashboard State — GET /get-failure-state

There is no success screen. The frontend refreshes the dashboard state and the modal header carries the confirmation.

Rendering. The Frosted Glass treatment is exactly the Hard Breach treatment — refer to UC_4.10.2 BR_4.10.2.2 and UC_4.10.2 §4 for the full display and re-summon rules → Wireframe: Dashboard - Day 0 + Hard breach.png. This UC adds no rendering rule of its own; the only difference is which modal sits on top.

API contract:

{
  "is_breached": true,
  "state_reason": "RESIGNATION",
  "archive_date": "2026-08-31T23:00:00Z"
}
FieldRule
is_breachedtrue for status = 'Failed'. GET /get-failure-state stays a single shared endpoint — no new one is created
state_reason"BREACH" | "RESIGNATION". The frontend selects the resignation modal (§9.4) from this field, never by inference. Maps from users.failure_reason
archive_dateComputed by the backend per broker and returned as a finished ISO 8601 string. The frontend counts down passively and never applies the month-end rule itself

Modal behaviour. Non-dismissible — no [X], overlay click and Esc do nothing, no secondary button. It re-renders on every Dashboard load or reload until a new Associate Track is purchased. The sidebar, the user chip and every Settings/Account tab stay interactive behind the overlay, so the trader is never trapped.

BR_4.11.2.13: Retention and Archive Window

The window starts at failure_timestamp, written by POST /resign (BR_4.11.2.10).

Everything after that is identical to the Hard Breach path. Refer to:

TopicReference
archive_date formula per broker, failsafe actions at the deadline, PostgreSQL + AWS S3 Glacier pre-deletion gate, Case A / Case B provisioning, post-archive_date dashboard behaviourUC_4.10.2 BR_4.10.2.7
Discount_Code_Duration_Days (Table C)UC_4.10.2 BR_4.10.2.3
Window behaviour from T+0 to archive_date, and after it firesUC_4.10.2 §4

No resignation-specific scheduled job is built — the archive and gateway purge at archive_date are handled by the existing Hard Breach failsafe cron.

9. Screen Description

9.1 Account Actions tab — Resign & Close Account section

Only the Resign & Close Account row is specified here.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Section titleLabelDisplaying rule:- Static text: "Account Actions".- Overflow: Wrap text.
2Row titleLabelDisplaying rule:- Static text: "Resign & Close Account".- Overflow: Wrap text.
3Row descriptionLabelDisplaying rule:- Static text: "Permanently close your account and resign from the program. This action is immediate and irrevocable."- Overflow: Wrap text.
4[Resign Account]Button (Danger)Displaying rule:- Label: "Resign Account".- Enabled only while users.status is an active trading status — 'Active_SIM', Soft Breach lockout included.- Disabled for every other status. A Hard-Breach-Failed trader can still reach this tab, so the Disabled state is on-screen and must be built — BR_4.11.2.6.Behaviour rule:- On click: opens the Step 1 modal (§9.2).

9.2 Step 1 modal — Resign & Close Account

The warning copy is a shared string by design decision: it mentions unvested profits and trading-floor access, neither of which applies to this account type — the account trades virtual capital and holds no profit share. It is displayed verbatim regardless — QnA_init_docs.md A-02.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Resign & Close Account".- Overflow: Wrap text.
2Modal subtitleLabelDisplaying rule:- Static text: "This action cannot be undone".- Overflow: Wrap text.
3Warning headlineLabelDisplaying rule:- Static text: "Resignation is immediate and irrevocable."- Overflow: Wrap text.
4Warning bodyLabelDisplaying rule:- Static text: "All open positions will be flattened. All unvested profits will be forfeited. You will lose access to the trading floor immediately."- 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 Step 2 (§9.3) with an empty input.
6[Cancel]Button (Secondary)Displaying rule:- Label: "Cancel".Behaviour rule:- On click: closes the modal and returns to the Account Actions tab.- Only dismissal path — no [X], overlay click and Esc do nothing — BR_4.11.2.2.

9.3 Step 2 modal — Confirm Resignation

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Confirm Resignation".- Overflow: Wrap text.
2Modal subtitleLabelDisplaying rule:- Static text: "Final step, this cannot be reversed".- Overflow: Wrap text.
3Warning headlineLabelDisplaying rule:- Static text: "You are about to permanently resign."- Overflow: Wrap text.
4Warning bodyLabelDisplaying rule:- Static text: "All open positions will be flattened and unvested profits forfeited."- Same shared-copy note as §9.2.
5Confirmation phrase inputTextboxDisplaying rule:- Preceded by an instruction Label naming the required phrase RESIGN.- Placeholder: "Type here.."- Always empty when the modal opens; a value from a cancelled attempt is never restored.- Max length: 50 characters.Behaviour rule:- Matched on onChange, case-sensitive; paste allowed; leading/trailing whitespace trimmed — BR_4.11.2.3.
6[Resign & Close Account]Button (Danger)Displaying rule:- Label: "Resign & Close Account".- Default state: Disabled. Enabled only while the input matches RESIGN exactly; reverts to Disabled if the value changes to a non-match.Behaviour rule:- On click: disables immediately, shows a loading state, calls POST /resignBR_4.11.2.5.
7[Cancel]Button (Secondary)Displaying rule:- Label: "Cancel".Behaviour rule:- On click: closes the whole flow and returns to the Account Actions tab. Does not return to Step 1; the typed value is discarded.- Only dismissal path — no [X], overlay click and Esc do nothing.

9.4 Post-resignation modal — Resignation Complete

This modal is the only visual difference between a resignation and a Hard Breach. Everything behind it — the Frosted Glass, the frozen snapshot, the archive window, the reset flow — is Hard Breach behaviour, referenced not restated (BR_4.11.2.12).

Rendered over the Frosted Glass Dashboard immediately after POST /resign returns 200, selected by state_reason == "RESIGNATION"; where state_reason == "BREACH" the Hard Breach Popup (UC_4.10.3 §10.1) renders instead. Layout reuses the Hard Breach Popup template. Copy, banner and CTA label come from the client-supplied screenshot of 2026-08-25.

No.Field NameField TypeDisplaying rule / Behaviour rule
1Modal titleLabelDisplaying rule:- Static text: "Resignation Complete".- Overflow: Wrap text.
2BodyLabelDisplaying rule:- Static text: "Your Associate Track evaluation has been closed at your request. All open positions have been flattened and your simulation account is now terminated. When you're ready to trade again, you can start a fresh Associate Track from Day 1."- The word "terminated" here is plain English, not the database value status = 'Terminated'.
3Archive Countdown BannerLabel (warning style, ⏱ icon)Displaying rule:- "Data will be archived in X days" while (archive_date − NOW) >= 24 hours.- "Data will be archived in Y hours" while 1 hour <= (archive_date − NOW) < 24 hours.- "Data will be archived in less than 1 hour" below that.- Disappears once the retention window expires.- archive_date is computed by the backend and returned as ISO 8601; the frontend counts down passively — BR_4.11.2.12.
4[Start Associate Track]Button (Primary)Displaying rule:- Label: "Start Associate Track" — per the client screenshot. The label does not change with window state, and no price is shown on the button; pricing is presented by the modal that follows.- The label deliberately differs from the Hard Breach Popup, which reads "Reset Associate Track": the two modals are different states and are not meant to read alike.Behaviour rule:- On click: hands off to the purchase flow in UC_4.10.3. Nothing further is handled by this use case.

Dismissal rulesBR_4.11.2.12:

  • No [X], no [Cancel], no secondary CTA. Overlay click and Esc do not dismiss.
  • 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).
  • Sidebar navigation and the user chip (Logout) stay interactive.

10. Open Items

None. Every item on this use case was confirmed by the client on 2026-09-03: the trader is not logged out of the dashboard · users.status = 'Active_SIM' is the correct in-progress value · Current_Level is 1, 2 or 5 · the modal CTA is [Start Associate Track] and is intended to differ from the Hard Breach Popup · the endpoint is GET /get-failure-state · the confirmation-phrase input accepts 50 characters.


11. Document References

#SourceSections used
1RFQ_ Website and Dashboard Implementation V7.pdf§Part C — "There is also a red 'Resign & Close Account Button' which should have friction behind it." → Step 1 warning copy, Step 2 manual phrase entry, POST /resign
2RFQ_ Stack Trading Prop Tech V7.pdf§Endpoint table — POST /resign, input {user_id, confirmation_phrase} → HTTP 200 OK · §Get Failure State
3Zapier Integration V7.pdf§Flow 20 — Trader Resignation Handler · §Flow 7B Path A — Retention & Retargeting · §Flow 1 Step 4 (Current_Level)
4UC_4.10.2 — Hard Breach: Level Stop (SIM)§4 Post-conditions · §5 Step 8 (Flow 7B Path A) · BR_4.10.2.2 (Frosted Glass) · BR_4.10.2.3 · BR_4.10.2.7 (archive / failsafe) · §5 Step 3 (Day 0 gateway contract, was BR_4.10.2.9)
5UC_4.10.3 — Scenario A: Sim Reset (In-App)The purchase flow entered from the §9.4 CTA
6QnA from clients — STAGE 2 (Settings)[RES-TRIG-01] confirmation phrase · [RES-UI-01] CTA disabled until an exact match · [RES-BIZ-01] no success screen, no logout · [RES-BIZ-02] retention window applies · [RES-BIZ-03] dashboard login remains active · [RES-ZAPF-01] end status · [DL-BIZ-04] Discord revocation behaviour
7Client architectural answers, 2026-08-25 → 2026-09-03End state 'Failed' with failure_reason = 'VOLUNTARY_RESIGNATION' · GET /get-failure-state returns state_reason · Flow 7 skipped · Flow 20 routes and calls the Discord revocation · Flow 7B handles the communication
8Design set, 2026-08-11 + client modal screenshot, 2026-08-253 frames — Account Actions tab · Step 1 modal · Step 2 modal (§9.1§9.3). The post-resignation modal (§9.4) comes from the client screenshot

Design frames are not yet committed to References/Wireframe/Stage 2/Settings/; this document cites the Figma nodes until the BA commits them.


Changelog

DateVersionUpdated itemBeforeAfterNotes
2026-09-03v3.46 dangling #BR_4.10.2.9 anchor links repointed (Document References §, §4 Post-conditions, §5 Basic Flow ×3, §11 Document References)Links targeted UC_4.10.2#BR_4.10.2.9, an anchor removed when UC_4.10.2 v1.3 folded that BR back into §5 Step 3 proseAll 6 links now target UC_4.10.2 §5 Step 3, with a "was BR_4.10.2.9" note where usefulEditorial — no rule of this UC changed. Fixed during git pull merge conflict resolution; check-links.js confirmed no remaining broken links
2026-09-03v3.3All six open items closed by the client — §10 is now empty. BR_4.11.2.3, BR_4.11.2.4, BR_4.11.2.7, BR_4.11.2.12, §3, §9.3, §9.4, §10Six items carried a ⏳ marker: A-43 (logout), A-41 (Active_SIM naming), A-39 (Current_Level), A-36 (CTA label), A-38 (endpoint spelling), A-16.2 (input max length)A-38 changes the spec: the endpoint is renamed GET /failure-stateGET /get-failure-state in all 9 places, to match UC_4.10.2. The other five are now stated as plain rules: the trader is not logged out; users.status = 'Active_SIM' is correct; Current_Level is 1/2/5; the CTA is [Start Associate Track] and is intended to differ from the Hard Breach Popup; the phrase input accepts 50 charactersClient answers, 2026-09-03. ⚠️ QnA_init_docs.md has not been synced — it still shows 10 items as ⏳ that are closed, and does not contain A-39 / A-41 / A-43 at all
2026-09-03v3.2Redundancy pass on BA feedback — 5 rules deleted, 5 sections trimmed, all BR IDs renumbered without gaps13 BRs (.1.11, .13.17, gap at .12), 567 lines. Included: a scope table listing seven other UCs' components; the allow-list narrative naming Terminated / Locked / ReadOnly; Soft Breach and Frosted Glass navigation notes; a "consequences" list of Logout side effects that do not run; a Klaviyo email-tone table; a no-refund rule; a 10-row table explaining why each Flow 7 step is unnecessary; the user_account_history snapshot; a three-name field-mapping table; a virtual-ledger lifecycle table; a full repurchase-flow rule; and a restated retention/archive windowDeleted: old BR_4.11.2.1 (scope of other UCs), .11 (no refund), .16 (repurchase flow — now a pointer to UC_4.10.3), the Flow 7 justification table, the archive snapshot, the field-mapping table and the ledger lifecycle table.Trimmed: the 409 guard to IF status = 'Failed'; the button table to Active_SIM / Failed; BR_4.11.2.7 to the three session layers; BR_4.11.2.8 to the payload field only; BR_4.11.2.13 to a pure reference table.Renumbered .1.13 with no gapsBA feedback, 2026-09-03. No business rule changed — every deletion was a negative statement, another UC's content, or a restatement of something already referenced. BR ID map: old .2.1, .3.2, .4.3, .5.4, .6.5, .7.6, .8.7, .9.8, .10.9, .13.10, .14.11, .15.12, .17.13
2026-09-03v3.1BR_4.11.2.12 (Flow 7 not used) removedA rule plus a §4 bullet and a diagram footer listed what does not happenThe one fact that had to survive — the source chains Flow 20 into Flow 7 — became a note on Flow 20's row
2026-09-03v3.0Full rewrite for readability + client answer on Flow 7 and Digital EvictionFlow 20 wrote the status, A-45 open; Discord roles were kept; ~15 "corrected on date X" annotations across 830 linesThe middleware writes status = 'Failed' inside POST /resign (A-45 closed). Discord roles ARE revoked — Flow 20 calls POST /discord/revoke-all-roles. Every rule states the confirmed decision once; history moved to this changelogClient: "SIM resignations skip Flow 7. Flow 20 will act as the router, and Flow 7B handles the SIM communication."
2026-09-03v2.6Document scoped strictly to SIM20 refs to other-environment UCs; a LIVE copy-variant table in §9.4All removedA-25 / A-26 need re-raising in the LIVE use case's own backlog
2026-09-03v2.4–v2.5Flow shape corrected; status stated as 'Failed' onlyFlow 20 was a pass-through that triggered Flow 7Flow 7 out of the pathClient routing instruction
2026-09-03v2.0–v2.3Flow 20 restored as the ingress; residual CR-65 statements sweptCR-65 had declared Flow 20 LIVE-onlyFlow 20 is the ingress, per V7 RFQ + confirmed QnACR-65's "bypass Flow 20" clause reversed
2026-09-03v2.1Resign button disable rule confirmedEnabled only while the evaluation is liveClient answer on Hard Breach → Resign
2026-08-28v1.9Flow 2 removed from the pathFlow 2 described as a routerFlow 2 is a per-trade Trade_Closed monitor
2026-08-26v1.8De-duplication pass — shared mechanisms refer to UC_4.10.2Day-0 gateway table and Flow 7B mechanics were restated hereReferred to, not restated
2026-08-25v1.5–v1.7Architecture change: resignation became a 'Failed' state; six backend decisions confirmedstatus = 'Terminated', termination_reason, termination_date; no emailstatus = 'Failed', failure_reason, failure_timestamp; Klaviyo Challenge_Failed via Flow 7B; phrase fixed to RESIGN; Redis retry queueCR-65
2026-08-22v1.4Day-0 no-purge, gateway-specific statesHard delete at Day 0Sub-account kept assigned; purge deferred to archive_dateClient flow of 2026-08-22
2026-08-21v1.3Retention window applies to Resign; GET /get-failure-state extended; phrase fixed to RESIGNPhrase was Resign; end state described as ReadOnlyPhrase RESIGN all capsClient clarification
2026-08-12v1.2Client answers [RES-TRIG-01], [RES-UI-01], [RES-BIZ-01]Session was terminated and the trader logged outSession retained; no success screen; post-resignation modal added
2026-08-11v1–v1.1Initial creationFull SRS: §1–§10, 14 Business Rules, 3 screen tablesInit flow (Auditor → Challenger → Architect)

On this page