SRS: UC_4.11.2 — Settings: Account Actions — Resign Account (SIM)
UC_4.11.2: Settings — Account Actions: Resign Account (SIM)
| Field | Value |
|---|---|
| BA in Charge | QuynhAnh12 |
| Date Created | 2026-08-11 |
| Version | v3.3 |
| Environment | SIM only. |
| Design | Figma — Resign 7878-119388 · Figma — Resign 7878-119281 |
Sources at §11, change history at §Changelog.
1. Overview
| Field | Content |
|---|---|
| ID | UC_4.11.2 |
| Use Case | Settings — Account Actions: Resign Account (SIM) |
| Description | From 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. |
| Endpoints | POST /resign · POST /discord/revoke-all-roles (called by Flow 20) · GET /get-failure-state (BR_4.11.2.12) |
| Zapier Flows | Flow 20 — Trader Resignation Handler: router. Catches RESIGNATION_EXECUTED, calls the Discord revocation, terminates. Flow 7 is not used — BR_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. |
| Tables | users (status, failure_reason, failure_timestamp) · audit (action) |
| 3rd Party | Rithmic 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
| Topic | Where 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 0 | UC_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 load | UC_4.10.2 BR_4.10.2.2 → Wireframe |
Retention window, archive_date, failsafe purge, Glacier gate, Case A / Case B provisioning | UC_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 emission | UC_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 anauditrow withaction = 'RESIGN'— BR_4.11.2.10.- Discord roles are revoked by Flow 20 — BR_4.11.2.9.
- The trader receives the Klaviyo
Challenge_Failedemail after Flow 7B's 1-hour cool-down, unless they repurchase inside it — BR_4.11.2.8. GET /get-failure-statereturnsis_breached: true,state_reason: "RESIGNATION",archive_date— BR_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
- The trader opens the
Account Actionstab. TheResign & Close Accountrow renders — §9.1. - The trader clicks [Resign Account]. The Step 1 warning modal opens — §9.2.
- The trader clicks [Continue to Resign]. Step 1 closes; the Step 2 confirmation modal opens with an empty input — §9.3.
- 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. - The trader clicks [Resign & Close Account]. The button disables and shows a loading state; the frontend calls
POST /resignwith{user_id, confirmation_phrase}. - The Middleware Hub executes the whole sequence synchronously — BR_4.11.2.4:
- Validate
confirmation_phrase. - Switch the gateway to read-only.
- Flatten all open positions.
- 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.)
- Insert the
auditrecord,action = 'RESIGN'. - Write
users.status = 'Failed',failure_reason = 'VOLUNTARY_RESIGNATION',failure_timestamp = NOW(). - Fire the
RESIGNATION_EXECUTEDwebhook to Zapier.
- Validate
- The backend returns HTTP 200 OK. The frontend:
- Closes the Step 2 modal, leaving the session untouched.
- Re-fetches
GET /get-failure-state+GET /system/status→is_breached: true,state_reason: "RESIGNATION",archive_date. - Redirects to the Command Center / Dashboard.
- Renders the Frosted Glass Dashboard with the non-dismissible Resignation Complete modal on top — §9.4.
- Asynchronously, in parallel — the trader waits on neither:
- Flow 20 catches
RESIGNATION_EXECUTED, callsPOST /discord/revoke-all-roles, and terminates — BR_4.11.2.8, BR_4.11.2.9. - The
status → 'Failed'database change triggers Flow 7B Path A: 1-hour cool-down → purchase check → pricing route → KlaviyoChallenge_Failed. Refer to UC_4.10.2 §5 Step 8.
- Flow 20 catches
[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
| Aspect | Rule |
|---|---|
| Expected value | RESIGN, upper case throughout |
| Matching | Case-sensitive and exact. Resign, resign and every other casing variant fail |
| Evaluation | On every keystroke (onChange); the CTA flips to Enabled the moment the value matches. Pure frontend check |
| Mismatch feedback | None. No inline error, no error overlay. The disabled CTA is the only feedback |
| Retry limit | None. No lockout, no threshold, no penalty. The trader may retype or re-enter the flow any number of times |
| Paste | Allowed; clipboard input is not blocked |
| Whitespace | Leading and trailing whitespace is trimmed before comparison (CR-02 §2.1). Internal whitespace is not altered |
| Configurability | Hard-coded in both the frontend validator and the backend — not read from Global Variables / Table C |
| Max length | 50 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.
| # | Step | Detail |
|---|---|---|
| 1 | Validate confirmation_phrase | Exact, case-sensitive match against RESIGN — BR_4.11.2.3 |
| 2 | Gateway read-only (Day 0 lock) | Per-gateway state values and the no purge on Day 0 rule → UC_4.10.2 §5 Step 3 |
| 3 | Flatten open positions | → UC_4.10.2 §5 Step 3 |
| 4 | Cancel working orders | → UC_4.10.2 §5 Step 3 |
| 5 | Audit log | PostgreSQL audit row: action = 'RESIGN', user_id, timestamp = NOW() |
| 6 | Write status | users.status = 'Failed' · users.failure_reason = 'VOLUNTARY_RESIGNATION' · users.failure_timestamp = NOW() |
| 7 | Fire RESIGNATION_EXECUTED | Webhook 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.status | Resign 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
| Layer | Outcome |
|---|---|
| Current session | Retained. 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 functionality | Disabled. 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 login | Retained. 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.
| # | Component | Action |
|---|---|---|
| 1 | Flow 20 — Trader Resignation Handler | Catches 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 |
| 2 | Flow 7B Path A — Retention & Retargeting | Triggered 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.
| Aspect | Rule |
|---|---|
| Roles removed | All of them — on this path, the Associate Trader role and any private community channel permissions |
discord_user_id | Kept. The account link survives |
| Server membership | Kept. The trader is not removed from the Discord server |
| On repurchase | The role is reassigned via /manage-discord-role — no second verification required |
| Caller | Flow 20, not Flow 7B |
BR_4.11.2.10: Database Writes at Resignation
Written by the middleware inside POST /resign:
| Column | Value |
|---|---|
users.status | 'Failed' |
users.failure_reason | 'VOLUNTARY_RESIGNATION' |
users.failure_timestamp | NOW() |
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.
| Aspect | Rule |
|---|---|
| Trigger | The gateway rejects the flatten because the market is closed or halted |
| Mechanism | The Middleware Hub enqueues a retry job (Redis queue) owned by POST /resign. Zapier is not involved |
| Retry timing | Re-issued at the next market-open tick for that instrument's session |
| Completion | Marked complete only when the middleware verifies Open_Positions == 0 on the gateway — not when the retry is merely dispatched |
| Deadline | The 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"
}| Field | Rule |
|---|---|
is_breached | true 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_date | Computed 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:
| Topic | Reference |
|---|---|
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 behaviour | UC_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 fires | UC_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 Accountrow is specified here.
| No. | Field Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Section title | Label | Displaying rule:- Static text: "Account Actions".- Overflow: Wrap text. |
| 2 | Row title | Label | Displaying rule:- Static text: "Resign & Close Account".- Overflow: Wrap text. |
| 3 | Row description | Label | Displaying 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 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."- 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 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."- Same shared-copy note as §9.2. |
| 5 | Confirmation phrase input | Textbox | Displaying 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 /resign — BR_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 /resignreturns 200, selected bystate_reason == "RESIGNATION"; wherestate_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 Name | Field Type | Displaying rule / Behaviour rule |
|---|---|---|---|
| 1 | Modal title | Label | Displaying rule:- Static text: "Resignation Complete".- Overflow: Wrap text. |
| 2 | Body | Label | Displaying 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'. |
| 3 | Archive Countdown Banner | Label (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 rules — BR_4.11.2.12:
- No
[X], no [Cancel], no secondary CTA. Overlay click andEscdo 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
| # | Source | 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 copy, Step 2 manual phrase entry, POST /resign |
| 2 | RFQ_ Stack Trading Prop Tech V7.pdf | §Endpoint table — POST /resign, input {user_id, confirmation_phrase} → HTTP 200 OK · §Get Failure State |
| 3 | Zapier Integration V7.pdf | §Flow 20 — Trader Resignation Handler · §Flow 7B Path A — Retention & Retargeting · §Flow 1 Step 4 (Current_Level) |
| 4 | UC_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) |
| 5 | UC_4.10.3 — Scenario A: Sim Reset (In-App) | The purchase flow entered from the §9.4 CTA |
| 6 | QnA 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 |
| 7 | Client architectural answers, 2026-08-25 → 2026-09-03 | End 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 |
| 8 | Design set, 2026-08-11 + client modal screenshot, 2026-08-25 | 3 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
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-09-03 | v3.4 | 6 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 prose | All 6 links now target UC_4.10.2 §5 Step 3, with a "was BR_4.10.2.9" note where useful | Editorial — no rule of this UC changed. Fixed during git pull merge conflict resolution; check-links.js confirmed no remaining broken links |
| 2026-09-03 | v3.3 | All 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, §10 | Six 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-state → GET /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 characters | Client 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-03 | v3.2 | Redundancy pass on BA feedback — 5 rules deleted, 5 sections trimmed, all BR IDs renumbered without gaps | 13 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 window | Deleted: 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 gaps | BA 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-03 | v3.1 | BR_4.11.2.12 (Flow 7 not used) removed | A rule plus a §4 bullet and a diagram footer listed what does not happen | The one fact that had to survive — the source chains Flow 20 into Flow 7 — became a note on Flow 20's row | — |
| 2026-09-03 | v3.0 | Full rewrite for readability + client answer on Flow 7 and Digital Eviction | Flow 20 wrote the status, A-45 open; Discord roles were kept; ~15 "corrected on date X" annotations across 830 lines | The 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 changelog | Client: "SIM resignations skip Flow 7. Flow 20 will act as the router, and Flow 7B handles the SIM communication." |
| 2026-09-03 | v2.6 | Document scoped strictly to SIM | 20 refs to other-environment UCs; a LIVE copy-variant table in §9.4 | All removed | A-25 / A-26 need re-raising in the LIVE use case's own backlog |
| 2026-09-03 | v2.4–v2.5 | Flow shape corrected; status stated as 'Failed' only | Flow 20 was a pass-through that triggered Flow 7 | Flow 7 out of the path | Client routing instruction |
| 2026-09-03 | v2.0–v2.3 | Flow 20 restored as the ingress; residual CR-65 statements swept | CR-65 had declared Flow 20 LIVE-only | Flow 20 is the ingress, per V7 RFQ + confirmed QnA | CR-65's "bypass Flow 20" clause reversed |
| 2026-09-03 | v2.1 | Resign button disable rule confirmed | — | Enabled only while the evaluation is live | Client answer on Hard Breach → Resign |
| 2026-08-28 | v1.9 | Flow 2 removed from the path | Flow 2 described as a router | Flow 2 is a per-trade Trade_Closed monitor | — |
| 2026-08-26 | v1.8 | De-duplication pass — shared mechanisms refer to UC_4.10.2 | Day-0 gateway table and Flow 7B mechanics were restated here | Referred to, not restated | — |
| 2026-08-25 | v1.5–v1.7 | Architecture change: resignation became a 'Failed' state; six backend decisions confirmed | status = 'Terminated', termination_reason, termination_date; no email | status = 'Failed', failure_reason, failure_timestamp; Klaviyo Challenge_Failed via Flow 7B; phrase fixed to RESIGN; Redis retry queue | CR-65 |
| 2026-08-22 | v1.4 | Day-0 no-purge, gateway-specific states | Hard delete at Day 0 | Sub-account kept assigned; purge deferred to archive_date | Client flow of 2026-08-22 |
| 2026-08-21 | v1.3 | Retention window applies to Resign; GET /get-failure-state extended; phrase fixed to RESIGN | Phrase was Resign; end state described as ReadOnly | Phrase RESIGN all caps | Client clarification |
| 2026-08-12 | v1.2 | Client answers [RES-TRIG-01], [RES-UI-01], [RES-BIZ-01] | Session was terminated and the trader logged out | Session retained; no success screen; post-resignation modal added | — |
| 2026-08-11 | v1–v1.1 | Initial creation | — | Full SRS: §1–§10, 14 Business Rules, 3 screen tables | Init flow (Auditor → Challenger → Architect) |
QnA Init Docs — UC_4.11.2: Settings — Account Actions: Resign Account (SIM)
Câu hỏi và giả định phát sinh trong Init Flow (Agent 1 Auditor + Agent 2 Challenger) cho UC_4.11.2 — SIM Resign & Close Account
UC_4.7.1 — Notification Center: Bell & Dropdown
Notification Center: Bell & badge, dropdown panel — SIM