SRS: UC_9.2 — Flow 13: Time-Off Management (W-2 DTO & International Hiatus)
| Field | Value |
|---|---|
| BA in Charge | linh.nguyen34 |
| Date Created | 2026-08-20 |
| Version | v2.7 |
| Last Updated | 2026-11-05 — §2.2 Request Time Off modal: screenshot added; note to add a Cancel button. Earlier the same day: Path A: stagnation extension, position close and account lock start on the Rippling leave_start_date; trader trades normally until then. Earlier the same day: Steps A-3.5/B-3.5: close all open positions before lock — TRIM_TO_COMPLIANCE algorithm no longer specified. Previous: 2026-11-04 — Client sheet (Adam/Adrian): Safety Check rewritten on existing data (blacklist table, Users.status, Users.payout_status — no Compliance_Flagged field); late-webhook handling (2 cases); PTO cancel/shorten → Ops manual; Pod Leader carry keeps vesting during leave; Flow 13 = Release 2. |
| Document References | CR-20261027-001 (Flow 13 hybrid — overrides V7 §Flow 13 trigger + Path A Action 1) · QnA_STAGE2_SETTINGS_CAREER_VIRAL.md [HR-DEF-01] · References/Wireframe/Dashboard/Flow 13_Request Time Off modal (International).jpg · Zapier Integration V7.pdf (§Flow 13: Time-Off Management lines 1949–1982; §Flow 6: International L6 retainer trigger line 1635; §Flow 35: Rippling PTO Approval lines 2535–2548; §Flow 36: Retainer Execution lines 2549–2561; §Table A DTO_Days column lines 2952–3004; §Table B DTO_Days column lines 3005–3031; §POST /system/set-account-state lines 136–140) · RFQ_ Stack Trading Prop Tech V7.pdf (§BPS Endpoints lines 2721–2867; §Support Action Audit Trail line 3349; §Break-Glass procedure line 3379) · QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-15] [POD-XF-16] [POD-XF-17] [POD-JOIN-19] [POD-SLA-08] [POD-AUDIT-10] [POD-DISP-08] |
UC Index
| UC_ID | Use Case Name | Business Description |
|---|---|---|
| UC_9.2 | Time-Off Management | Handles time-off and trading hiatus requests for Level 6+ traders. Two entry channels (CR-20261027-001): USA W-2 Paid DTO path (trader requests leave inside Rippling → Rippling approval webhook → extend stagnation deadline → lock trading account) or International Contractor Unpaid Hiatus path (Dashboard "Request Time Off" form → suspend Dots retainer → extend stagnation deadline → lock trading account). On hiatus end, Safety Check gate prevents re-enablement if the trader matches the blacklist table, has Users.status ∈ {Banned_Chargeback, Failed, Terminated}, or payout_status ≠ Approved; otherwise restores trading access and resumes payments. |
<a id="UC_9.2"></a>
UC_9.2 — Flow 13: Time-Off Management (W-2 DTO & International Hiatus)
1. Overview
| Field | Content |
|---|---|
| ID | UC_9.2 |
| Use Case | Time-Off Management |
| Description | Processes time-off requests from Level 6+ traders through two entry channels (CR-20261027-001): USA W-2 traders request and get approval inside Rippling — the Rippling approval webhook triggers Path A (Paid DTO); International Contractors submit the native Dashboard form — triggers Path B (Unpaid Hiatus). KYC-verified country / Employment_Type are kept as guards. Locks the trading account, extends stagnation_deadline, and manages payment suspension/resumption. On return, enforces a Safety Check before restoring trading access. |
| Zapier Flow | Flow 13 (Time-Off Management — includes delay_until for Return Protocol) · Flow 35 (Rippling PTO Approval — Ledger Sync) · Flow 36 (Retainer Execution — Ledger Sync, for resumed retainer) |
| Zapier Table | Table A / Table B (DTO_Days column — max paid time-off days by level) |
| 3rd Party | Rippling (USA W-2: owns time-off request, DTO balance and approval; Time Off Request Approved webhook triggers Path A and Flow 35 PTO ledger sync) · Dots (International: retainer suspension and resumption) · AWS SES (DTO_Approval_Notice, DTO_Welcome_Back emails) |
| Release | Release 2 (client sheet F13-01, 2026-11-04) |
2. Trigger
Two entry channels — the channel determines the path (CR-20261027-001):
| Trader type | Where the trader requests leave | Trigger into Flow 13 | Path |
|---|---|---|---|
| USA W-2 (Level 6+) | Inside Rippling (Rippling app/UI). The Dashboard does not provide a time-off request UI for W-2 traders — the Career & HR Widget only shows the CTA "View in Rippling" ([HR-DEF-01]). | Rippling webhook Time Off Request Approved → Zapier Flow 13 | Path A |
| International Contractor (Level 6+) | Native Dashboard "Request Time Off" form | Form submit → JSON webhook → Zapier Flow 13 | Path B |
(Source: CR-20261027-001 — client: "W2 traders can use Rippling" · "Create a very simple request form on the unified Dashboard for international contractors"; QnA [HR-DEF-01] 2026-08-15)
2.1 Path A trigger — Rippling Time Off Request Approved webhook
- Rippling owns the W-2 request, DTO balance and manager approval. Flow 13 starts only after Rippling has approved the request.
- On webhook receipt the Zap only validates and stores the request. The leave actions (Steps A-3 → A-4) run on the
leave_start_dateregistered in Rippling, via a Zapierdelay_until— the same mechanism the Return Protocol uses for the end date. - The same webhook also triggers Flow 35 — PTO Ledger Sync (UC_9.12). Flow 13 Path A and Flow 35 run independently on the same event.
- Fields consumed from the payload: Rippling worker →
user_id; Rippling Request ID; leave start date; leave end date (→DTO_Hiatus_End_Date); approved days (→Requested_Days).
2.2 Path B trigger — Dashboard "Request Time Off" form (International Contractor only)
UI Entry Point (UC_4.16.2 — Career & HR Widget):
- Button: "Request Time Off" — top-right of the Employment Status section within the Career & HR Widget.
- Visibility condition: International Contractor with
Current_Level >= 6only. Hidden for W-2 traders (Employment_Type = 'W-2') and for traders below Level 6. - Design:
References/Wireframe/Dashboard/Flow 13_Request Time Off modal (International).jpg· Figma — Request Time Off modal.
Modal "Request Time Off" (approved design):

Figma: Request Time Off modal
| Element | Type | Rule |
|---|---|---|
| Title | Text | "Request Time Off" |
| Description | Text (static) | "As an international contractor, you may request an unpaid hiatus of any duration. Your account and monthly retainer will be paused during this time without penalty." |
| Start Date | Date picker, MM/DD/YYYY | Mandatory. First day of hiatus. |
| End Date | Date picker, MM/DD/YYYY | Mandatory. Must be ≥ Start Date. |
| Requested Days | Read-only text | Auto-calculated from Start Date and End Date; shows _ until both dates are selected. |
| Reason | Textarea | See Q-4 (mandatory / max length not confirmed). |
| Send | Primary button | Submits the form. |
| Cancel | Secondary button | ⚠️ To be added — not in the current design. Closes the modal without submitting: no webhook, no DB state change. |
⚠️ Note: add a Cancel button to the design (currently only Send). Other closing behaviour (X / click outside / Esc) — see Q-4.
Form tool: Native Dashboard form — NOT a third-party tool (e.g. Typeform or Google Forms).
Webhook payload dispatched to Zapier Flow 13 on Send:
| Field | Description |
|---|---|
user_id (or registered email) | Trader identity — used to look up Current_Level, Employment_Type, KYC-verified country, and DB record |
Start_Date | First day of hiatus (from form) |
DTO_Hiatus_End_Date | End Date from form — Zapier maps this directly into the delay_until action for the Return Protocol |
Requested_Days | Auto-calculated days — used to extend stagnation_deadline (Step B-3) |
Reason | Free text from form |
Trigger type: Form submission → JSON webhook → Zapier catch-hook endpoint → Flow 13.
2.3 Entry gate (both channels)
Current_Level >= 6 — checked when the Rippling webhook (Path A) or the form submission (Path B) is received.
- If
Current_Level < 6→ reject / ignore. No further processing. Path A: log toBPS_Audit_Log(see Exc-1).
Reason: Level 6 is the minimum threshold for a W-2 employment contract (USA) or a retainer-based independent contractor agreement (International). Traders below Level 6 operate on an on-demand bonus model and are not eligible for this policy. (Source: Zapier Integration V7.pdf §Flow 13 lines 1949–1951; client confirmed 2026-08-22)
3. Path Router
The path is determined by the trigger channel:
| Trigger channel | Path |
|---|---|
| Rippling Time Off Request Approved webhook | Path A — USA W-2 Paid DTO |
| Dashboard "Request Time Off" form | Path B — International Contractor Unpaid Hiatus |
Guard (consistency check): KYC-verified country (takes precedence over billing_country per CR-20260812-005) and Employment_Type must match the channel:
- Rippling webhook for a trader who is not
Employment_Type = 'W-2'→ do not process; log toBPS_Audit_Log(Exc-1). - Dashboard form submitted by a W-2 trader (button should be hidden — defence in depth) → reject; no state change.
(Source: CR-20261027-001; Zapier Integration V7.pdf §Flow 13 — "Path Router" line 1951)
4. Basic Flow
Path A — USA W-2 Paid DTO
Step A-1. Receive Rippling Approval Webhook
- Zapier receives the Rippling Time Off Request Approved webhook (§2.1).
- Resolve the Rippling worker to
user_id; apply the entry gate (Current_Level >= 6) and the W-2 guard (§3). Fail → Exc-1. - Dedup on Rippling Request ID — a redelivered webhook must not extend
stagnation_deadlinetwice. - No DTO Balance Check and no Rippling API call by Stack Trading. Rippling owns the DTO balance and approval; Flow 13 only acts on approved requests.
Requested_Days= approved days from the payload.
(Source: QnA_STAGE2_SETTINGS_CAREER_VIRAL.md [HR-DEF-01] — PTO request, balance and approval owned by Rippling)
Step A-1.5. Wait Until the Leave Start Date
- Today <
leave_start_date: the Zap pauses withdelay_until=leave_start_date(from the Rippling payload) and continues with Step A-3 on that date. Until then the trader trades normally;trader_statusis not changed. - Today ≥
leave_start_date: continue immediately — late webhooks are handled by Exc-2 (Case 1 / Case 2). - Step A-2 (Flow 35 ledger) and Step A-5 (
DTO_Approval_Notice) are not delayed — they run on webhook receipt.
Step A-2. PTO Ledger Sync (Flow 35 — parallel, not part of this Zap)
- The same Rippling webhook triggers Flow 35 (UC_9.12), which calls
POST /api/ledger/recordwithmetric_category = "Corporate Benefits",metric_value = "[Days_Approved] Days PTO Approved (Paid Time Off)",receipt_hash = [Rippling Request ID].
(Source: Zapier Integration V7.pdf §Flow 35 lines 2535–2548)
Step A-3. Extend Stagnation Deadline
- Execute SQL update:
UPDATE Users SET stagnation_deadline = stagnation_deadline + INTERVAL '[Requested_Days] days' WHERE user_id = [trader_id]; - This ensures Flow 12 (Zombie Protocol) and Flow 19 (Stagnation Monitor) do not penalise the trader for inactivity during the approved leave period.
(Source: Zapier Integration V7.pdf §Flow 13 line 1961)
Step A-3.5. Close All Open Positions
Before locking the account, Middleware closes all of the trader's open orders / positions. The account lock in Step A-4 executes only after the account has no open positions.
(Source: Zapier Integration V7.pdf §Flow 13 — "Disable Trading Account via Middleware (Lock)")
Step A-4. Lock Trading Account
- Call
POST /system/set-account-state:{ "user_id": "[trader_id]", "state": "Locked", "context": "DTO" } - Middleware sends platform-specific lock commands after confirming the account is flat (Step A-3.5):
- Rithmic: R|API+
Suspend Trading. - MT5: YourBourse Contest Stop Out Plugin API (POST) — sets account to Read-Only; freezes Target Profit / Stop Loss values in RAM.
- TraderEvolution: Admin API — sets account to
Lock/Read-Only.
- Rithmic: R|API+
- Post-gateway DB writes (executed only after receiving HTTP 200 from all active gateways):
trader_status = 'On_Leave'is_professional = TRUE(if trader is on DMA)stagnation_deadlinealready updated in Step A-3
(Source: Zapier Integration V7.pdf §Flow 13 line 1961; §POST /system/set-account-state lines 136–140; Supplement §3.2)
Step A-5. Notify Trader
- Sent on webhook receipt (not delayed by Step A-1.5). Send
DTO_Approval_Noticeemail via AWS SES confirming leave approval, start date, and expected return date. - Discord notification: Push a leave-status notification into the Redis memory queue. Zapier/Bot batches messages from the queue (max 5 messages / 5 seconds) before dispatching to Discord to avoid rate-limit violations.
(Source: Zapier Integration V7.pdf §Flow 13 line 1963; Supplement §3.4)
Path B — International Contractor Unpaid Hiatus
Step B-1. Validation
- No DTO day limit applies. Proceed immediately without a balance check.
(Source: Zapier Integration V7.pdf §Flow 13 line 1965)
Step B-2. Suspend Dots Retainer
- The monthly retainer for International Contractors is managed by a Middleware cron job (Node.js, runs monthly) that calls the Dots payout API. It is NOT a Zapier step and cannot be paused via Zapier.
- Dots API itself does not have a native "suspend retainer" endpoint — Dots only handles individual payout requests on demand.
- Mechanism: Middleware sets a DB flag (e.g.
is_retainer_paused = TRUE) on the trader's Users record. The monthly retainer cron checks this flag before calling DotsPOST /payeesand skips any record where the flag is set. - The exact field name is an implementation decision for dev; the business requirement is: no retainer payment is dispatched to Dots while the trader is on hiatus.
- On return (Step R-3), Middleware clears the flag (
is_retainer_paused = FALSE) to resume normal monthly payments.
(Source: Zapier Integration V7.pdf §Flow 13 lines 1966–1968; §Flow 6 line 1635 — "Update the recurring backend trigger for the new Dots monthly retainer"; client confirmed 2026-08-21)
Step B-3. Extend Stagnation Deadline
- Same SQL update as Path A Step A-3: extend
stagnation_deadlinebyRequested_Days.
(Source: Zapier Integration V7.pdf §Flow 13 line 1969)
Step B-3.5. Close All Open Positions
- Same as Path A Step A-3.5: close all open orders / positions.
- Account lock in Step B-4 executes only after the account has no open positions.
(Source: Zapier Integration V7.pdf §Flow 13 — "Disable Trading Account via Middleware (Lock)")
Step B-4. Lock Trading Account
- Call
POST /system/set-account-state:{ "user_id": "[trader_id]", "state": "Locked", "context": "Hiatus" } - Middleware sends platform-specific lock commands after confirming the account is flat (Step B-3.5):
- Rithmic: R|API+
Suspend Trading. - MT5: YourBourse Contest Stop Out Plugin API (POST) — sets account to Read-Only; freezes Target Profit / Stop Loss in RAM.
- TraderEvolution: Admin API — sets account to
Lock/Read-Only.
- Rithmic: R|API+
- Post-gateway DB writes (after HTTP 200 from all active gateways):
trader_status = 'On_Leave'is_professional = TRUE(if trader is on DMA)stagnation_deadlinealready updated in Step B-3
(Source: Zapier Integration V7.pdf §Flow 13 line 1970; Supplement §3.2)
Step B-5. Notify Trader
- Send
DTO_Approval_Noticeemail via AWS SES. - Discord notification: Push leave-status notification into the Redis memory queue. Zapier/Bot batches (max 5 messages / 5 seconds) before dispatching to Discord.
(Source: Zapier Integration V7.pdf §Flow 13 line 1972; Supplement §3.4)
Return Protocol (Applies to Both Paths)
Trigger: The original Flow 13 Zap (the same Zap that processed the leave approval) resumes execution via a Zapier delay_until action set to the DTO/Hiatus End Date — Path A: leave end date from the Rippling webhook payload; Path B: End Date from the Dashboard form. This is NOT a separate backend cron job — the Zap pauses mid-execution at the point of leave approval and automatically resumes on the specified end date.
(Source: Zapier Integration V7.pdf §Flow 13; client confirmed 2026-08-22)
Ownership model:
- Zapier owns: the
delay_untiltimer, flow control and step sequencing after resumption, the flag/database check logic, and routing theDTO_Welcome_Backnotification. - Middleware owns: Safety Check execution (queries PostgreSQL
Usersandblacklist), callingPOST /system/set-account-stateon a clean pass, pushing the Restore Trading command directly to broker servers (Rithmic / MT5 / TraderEvolution), and resuming the Dots retainer trigger (Path B).
Step R-1. Safety Check
- Middleware queries PostgreSQL for
user_id.Compliance_Flaggedis not a stored field — it is evaluated from existing data:- IF any of the following is true:
- The user's email has a matching row in the
blacklisttable (blacklist.email = Users.email AND blacklist.is_active = TRUE— same check as UC_2.6.2 Blacklist Check); Users.status∈ {Banned_Chargeback,Failed,Terminated};Users.payout_status≠'Approved'(e.g.Hold/Flaggedset by BPS Apply Payout Hold, a Dots payout-profile webhook, or a Flow 14 Live trader dispute hold).
- HALT all re-enablement. Do NOT unlock trading account. Do NOT resume payments.
- Send immediate Slack alert to Head of Ops for manual review.
- Terminate flow.
- The user's email has a matching row in the
- ELSE: Proceed to Step R-2.
- IF any of the following is true:
(Source: Zapier Integration V7.pdf §Flow 13 lines 1974–1977; client confirmed 2026-08-22; QnA_BACKGROUND_MECHANISMS_CRON.md [BG-005] [BG-006] [BG-007] — client sheet 2026-11-04; blacklist schema per UC_2.6.2 / CHR-17)
Step R-2. Re-enable Trading Account
- Middleware calls
POST /system/set-account-state:{ "user_id": "[trader_id]", "state": "Active", "context": "DTO_Return" } - Middleware reads the trader's current
Current_Levelfrom PostgreSQL at this moment (not the level at the time of leave approval — demotion during leave is reflected here). - Middleware then pushes the Restore Trading command to the broker execution platform with risk parameters matching the trader's current level: Rithmic 'Enable Trading' / MT5 'Enable' / TraderEvolution equivalent — including the correct Notional, Daily Loss Limit, and Level Stop for
Current_Levelat return.
(Source: Zapier Integration V7.pdf §Flow 13 line 1978; client confirmed 2026-08-22, 2026-09-09)
Step R-3. Resume Retainer (Path B only)
- Middleware resumes the scheduled recurring Dots payout retainer trigger (clears
is_retainer_paused = FALSE). - Flow 36 (Retainer Execution — Ledger Sync) fires on the next retainer payment cycle and logs the immutable ledger entry.
- If the trader was demoted during leave: the retainer resumes at the retainer rate corresponding to their current (lower)
Current_Level, not the level at leave approval.
(Source: Zapier Integration V7.pdf §Flow 13 line 1980; client confirmed 2026-08-22, 2026-09-09)
Step R-4. Notify Trader
- Send
DTO_Welcome_Backemail via AWS SES.
(Source: Zapier Integration V7.pdf §Flow 13 line 1982)
4.1 Special Case: Pod Leader & Founding Mentor Handling (Level 7+)
This section governs all special-case behaviors that apply exclusively when the Trader has is_pod_leader = TRUE or role_flag = 'Founding_Mentor'.
4.1.1 Failsafe Anti-Termination Gate
Before executing any leave action (Steps A-1/B-1), Middleware MUST check role flags:
IF users.is_pod_leader = TRUE OR users.role_flag = 'Founding_Mentor':
→ MUST block: do NOT fire POD_LEADER_TERMINATED webhook
→ MUST NOT invoke Flow 15C (offboarding cascade)
→ Proceed with leave processing (soft-lock, stagnation extension, etc.)
ELSE:
→ Standard Trader flowBlocked actions during leave (applies to both triggers):
POD_LEADER_TERMINATEDwebhook: never fired- Flow 15C (Pod dissolution, carry forfeiture, Discord/Workspace offboarding): never invoked
Pending_Carry_Balancezeroing: never executed- Google Workspace deletion/suspension: never triggered
- Discord channel archival / Role revocation: never triggered
(Source: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-15] — client confirmed 2026-10-30: approved leave is temporary time off, NOT Drawdown Defense (Flow 4B) or Termination (Flow 15C))
4.1.2 Resources Preserved During On_Leave
| Resource | Active | On_Leave | Terminated (Flow 15C) |
|---|---|---|---|
| Trading account | Active | Locked (same as all Traders) | Disabled |
Google Workspace @stacktrading.com | Active | Active — preserved (keeps receiving Wednesday AI Brief) | Deleted / Suspended |
Pod_Leader_Registry.Status | Active | On_Leave — see §4.1.4 | Terminated |
Discord channel pod-[leader_name] | Active | Active — not archived | Archived |
Discord Role Pod Leader | Assigned | Assigned — preserved | Revoked |
Pod_Leader_Registry.Pending_Carry_Balance | Accruing / vesting | Accruing / vesting — unchanged | Forfeited ($0.00) |
| Pod mentee list | Linked to pod_id | Preserved — no re-assignment | Dispersed (Flow 15C) |
Note on Founding Mentors: per BR_9.2.19 and the Defense Bypass rule, their trading account IS locked during On_Leave — the Founding Mentor exception covers Administrative Roles only (Pod/Discord), not the trading account lock.
(Source: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-15], [POD-XF-16] — client confirmed 2026-10-30; RFQ_ Stack Trading Prop Tech V7.pdf §Founding Mentor Defense Bypass)
4.1.3 Carry Balance Behavior
Pending_Carry_Balance continues to accrue and vest normally during approved leave. The monthly vest run (Flow 17, 1st of month) MUST include Pod Leaders in Pod_Leader_Registry.Status = 'On_Leave' — no freeze, no skip. Applies equally to regular Pod Leaders and Founding Mentors. Carry is only frozen or forfeited on Drawdown Defense suspension or Termination (Flow 15C).
Other payments during leave: W-2 base salary (Path A) continues via Rippling payroll; International retainer (Path B) is suspended (Step B-2) and resumed at R-3; trading performance payouts (Flow 5) earned before the leave are processed normally — no new target can be hit while the account is locked.
(Source: QnA_BACKGROUND_MECHANISMS_CRON.md [BG-008] [BG-009]; QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-18] — client sheet 2026-11-04)
4.1.4 Pod_Leader_Registry Status During Leave
- At Step A-4 / B-4 (after gateway lock succeeds), Middleware sets
Pod_Leader_Registry.Status = 'On_Leave'for the leader. - Flow 10 matching only selects
Status == 'Active'[POD-JOIN-19] → a leader inOn_Leaveis automatically excluded from new mentee matching. This does NOT trigger the Flow 15ASuspendedpod-dissolution logic. - At Return Protocol Step R-2 (on successful re-enable), Middleware sets
Pod_Leader_Registry.Status = 'Active'.
(Source: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-16] — client confirmed 2026-10-30)
4.1.5 Pod SLAs During Leave
Pod SLA timers are paused while the leader is on leave — no Acting Cover, no mentee re-match:
- Flow 10.2 SLA Enforcement cron excludes users in
Inactive_Hold(Flow 12) or Locked via DTO/Hiatus (Flow 13) [POD-SLA-08]. - Flow 10.5 Daily Engagement Audit excludes leaders Locked via DTO/Hiatus [POD-AUDIT-10].
- Flow 10.1B Calendar Compliance Auditor: leaders on DTO/Hiatus are exempt [POD-DISP-08].
(Source: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-17] — client confirmed 2026-10-30)
5. Pre-conditions
| ID | Pre-condition |
|---|---|
| P1 | Path A: Rippling has approved a time-off request for the trader and emitted the Time Off Request Approved webhook. Path B: International Contractor submits the Dashboard "Request Time Off" form. |
| P2 | Current_Level >= 6 in Users table. |
| P3 | Trader's account_status = 'Active_DMA' (not already Locked, Terminated, or Banned). Level is held in current_level. |
| P4 | For Path A: Rippling worker record exists and is linked to the trader's user_id; Employment_Type = 'W-2'. |
| P5 | For Path B: Dots retainer schedule is active for this trader. |
6. Post-conditions
| Outcome | Post-condition |
|---|---|
| Path A processed | stagnation_deadline extended; trading account Locked; DTO_Approval_Notice sent. (Time-off already recorded/approved in Rippling; Flow 35 logs the ledger entry.) |
| Path B processed | stagnation_deadline extended; trading account Locked; Dots retainer suspended; DTO_Approval_Notice sent. |
| Rejected (Level gate) | No state changes. |
| Rejected (DTO exhausted) | Path A: handled inside Rippling — no approval, no webhook, Flow 13 not triggered. Path B: N/A (no day limit). |
| Return — clean | Trading account re-enabled; Dots retainer resumed (Path B); DTO_Welcome_Back sent. |
| Return — Safety Check failed | Account remains Locked; Head of Ops alerted; no automated re-enablement. |
7. Alternative Flows
Alt-1 — DTO balance exhausted (Path A):
- Handled entirely inside Rippling (Rippling policy configured by Ops per
DTO_Days, Table A/B). A rejected request never produces a Time Off Request Approved webhook — Flow 13 is not triggered. See Q-1.
Alt-3 — Second time-off approved in Rippling while trader is already on leave (Path A):
- Each additional Rippling approval webhook (new Rippling Request ID) extends
stagnation_deadlinefurther by the newly approved days and updatesDTO_Hiatus_End_Date. - Re-calling
POST /system/set-account-statewithstate = "Locked"is idempotent — account is already locked, no nested flags or duplicate lock created. - Quota enforcement is Rippling's responsibility (no balance re-check by Stack Trading).
Alt-4 — Second hiatus request submitted while trader is already on leave (Path B):
- No day limit for International Contractor. Always approve — extend
stagnation_deadlinefurther by additionalRequested_Days. Re-suspending Dots retainer (is_retainer_paused = TRUE) is idempotent — flag already set, no change. - The Return Protocol (Zapier
delay_until) monitors the updatedDTO_Hiatus_End_Date. Only one Return Protocol execution occurs on the final extended end date.
(Source: Zapier Integration V7.pdf pp. 21, 228-230, 392-394; client confirmed 2026-09-09)
Alt-2 — Trader's return date passes while Safety Check flags are set:
- Flow triggers Return Protocol automatically on the scheduled end date.
- Safety Check catches the flag → HALT. The account remains Locked indefinitely until Ops manually resolves and triggers re-enablement.
- Manual re-enablement path: Ops calls
POST /system/set-account-statewithstate = "Active"after resolving the compliance/chargeback issue — must be executed via BPS Admin Console (enforcesLevel_2+/AdminRBAC gate, mandatoryreason+transcript_url, logs toBPS_Audit_Log). The endpoint itself is ungated; the Console is the RBAC enforcement point (see BR_9.2.12). (Source: RFQ_ Stack Trading Prop Tech V7.pdf §BPS Endpoints lines 2721–2867; client confirmed 2026-08-27)
Alt-5 — W-2 trader cancels or shortens an approved PTO in Rippling (Path A):
- No automated recalculation. Send a Slack alert to
#ops-general(or create a Freshdesk ticket) so Ops can manually verify, re-enable the trading account and adjuststagnation_deadlineif needed. - No corrective ledger entry (Flow 35).
- If the PTO is cancelled before
leave_start_date, the waiting Zap (Step A-1.5) will still lock the account on that date — Ops must cancel the pending Zap run or unlock the account manually.
(Source: QnA_BACKGROUND_MECHANISMS_CRON.md [BG-002], [BG-017] — client sheet 2026-11-04)
8. Exception Flows
Exc-1 — Rippling webhook does not pass the entry gate / guard (Path A, Step A-1):
- Worker cannot be mapped to a
user_id,Current_Level < 6, orEmployment_Type != 'W-2'. - Do not extend
stagnation_deadline; do not lock. Log toBPS_Audit_Logfor Ops review. No trader notification.
Exc-2 — Rippling webhook arrives after the leave start date (Path A):
- Case 1 — Today between
leave_start_dateandleave_end_date: lock immediately for the remainder of the leave; extendstagnation_deadlineby the full approvedRequested_Days; send a routine Slack notification to#ops-generalnoting the late approval. - Case 2 — Today already past
leave_end_date: do NOT lock; Flow 35 still logs the PTO on the ledger; extendstagnation_deadlineby the approved days; send a routine Slack notification to#ops-general. No Return Protocol scheduled.
(Source: QnA_BACKGROUND_MECHANISMS_CRON.md [BG-003] — client sheet 2026-11-04)
Exc-3 — POST /system/set-account-state call fails OR execution gateway API returns error/timeout:
- Trading account NOT locked as expected. High risk: trader can continue trading during leave.
- Gateway failure handling: Middleware retries up to 3 times with exponential backoff. If all retries exhausted → log to
BPS_Audit_Log+ send SEV-1 Slack alert to Ops (#ops-it) for manual lock. (Source: Zapier Integration V7.pdf §Flow 13)
Exc-4 — Safety Check alert delivery fails (Head of Ops notification):
- The HALT decision itself is still valid — do not re-enable the account regardless.
- Log the alert failure. Route to secondary alert channel (e.g., Freshdesk ticket, email fallback).
Exc-5 — Trader has an active Flow 14 (Payment Dispute / Chargeback) while on leave:
- If a dispute is raised while
trader_status = 'On_Leave', the dispute state takes higher priority thanOn_Leave: SIM traders →Users.status = 'Banned_Chargeback'; Live traders → dispute hold setsUsers.payout_status≠'Approved'. - The account MUST NOT be automatically re-enabled on the scheduled
Return_Dateuntil Admin manually resolves the dispute. - Safety Check (Step R-1) catches both (conditions 2 and 3) and halts return — this exception documents the scenario where the dispute arises mid-leave so test data setup is clear.
(Source: QnA_BACKGROUND_MECHANISMS_CRON.md [BG-005] [BG-006] — client sheet 2026-11-04)
9. Business Rules
| Rule ID | Rule | Source |
|---|---|---|
| BR_9.2.1 | Only traders with Current_Level >= 6 may submit a time-off or hiatus request. Requests from lower levels are rejected without creating any state change. | Zapier Integration V7.pdf §Flow 13 |
| BR_9.2.2 | Path routing is determined by the trigger channel: Rippling Time Off Request Approved webhook → Path A (USA W-2 Paid DTO); Dashboard "Request Time Off" form → Path B (International Contractor Unpaid Hiatus via Dots). KYC-verified country (takes precedence over billing_country per CR-20260812-005) and Employment_Type are used as a consistency guard only. | CR-20261027-001; CR-20260812-005 |
| BR_9.2.3 | DTO_Days allowance is sourced from Table A (Futures) or Table B (Forex) for the trader's Current_Level. The allowance is enforced inside Rippling (time-off policy configured by Ops); Stack Trading does not check Used_DTO and only processes requests Rippling has already approved. | Zapier Integration V7.pdf §Table A / Table B; CR-20261027-001 |
| BR_9.2.4 | stagnation_deadline MUST be extended by Requested_Days for both paths. This prevents Flow 12 (Zombie Protocol) and Flow 19 (Stagnation Monitor) from penalising the trader during approved leave. | Zapier Integration V7.pdf §Flow 13; calendar days, no business-day math — QnA [BG-004] client sheet 2026-11-04 |
| BR_9.2.5 | The trading account MUST be locked via POST /system/set-account-state (state = "Locked"). Path A: the lock is executed on the leave_start_date registered in Rippling (Step A-1.5). Path B: locked on form submission. The lock must be enforced at the execution platform level (Rithmic Suspend Trading or MT5 Disable/Read-Only). | Zapier Integration V7.pdf §Flow 13; §POST /system/set-account-state |
| BR_9.2.6 | For Path B, the Dots retainer recurring payment MUST be suspended on leave approval and resumed on successful return. Mechanism: Middleware sets a DB flag (e.g. is_retainer_paused = TRUE) on the trader's Users record; the monthly retainer cron skips records where this flag is set before calling Dots POST /payees. The Dots API itself has no native suspend endpoint — the cron job is owned entirely by Middleware. On return, the flag is cleared to resume normal payments. Field name is an implementation decision. | Zapier Integration V7.pdf §Flow 13 lines 1966–1968; §Flow 6 line 1635; client confirmed 2026-08-21 |
| BR_9.2.7 | Return Protocol Safety Check MUST run before any re-enablement action. If any Step R-1 condition is true (blacklist match on email with is_active = TRUE; Users.status ∈ {Banned_Chargeback, Failed, Terminated}; Users.payout_status ≠ 'Approved'), the account MUST remain locked and Head of Ops MUST be notified. No automated re-enablement occurs in this state. Manual re-enablement by Ops via POST /system/set-account-state requires Admin JWT (Level_2 or Admin role) — enforced upstream at the BPS Admin Console layer, not by the endpoint itself (see BR_9.2.12). All actions log to BPS_Audit_Log. | Zapier Integration V7.pdf §Flow 13 lines 1974–1977; RFQ_ Stack Trading Prop Tech V7.pdf §BPS Endpoints lines 2721–2867; client confirmed 2026-08-27; QnA [BG-006] [BG-007] client sheet 2026-11-04 |
| BR_9.2.8 | Flow 12 (Zombie Protocol) daily scan uses last_trade_date < (Today - 30). A trader on approved leave will have their stagnation_deadline extended (BR_9.2.4), which protects them from Flow 19 (Stagnation Monitor). Flow 12 does NOT bypass for leave-status traders — this is confirmed behavior. If a trader's last_trade_date exceeds 30 days (including days on approved leave), Flow 12 will fire and deactivate market data as normal. The stagnation_deadline extension (BR_9.2.4) protects against Flow 19 termination only — it does not suppress Flow 12. Leave days are NOT subtracted from the 30-day Zombie Protocol inactivity counter. Traders on extended leave should be aware that market data may be deactivated by Flow 12 during their absence. | Zapier Integration V7.pdf §Flow 12; §Flow 13; client confirmed 2026-08-22 |
| BR_9.2.9 | The immutable ledger sync for PTO (Flow 35) fires automatically from Rippling's approval webhook — the same webhook that triggers Flow 13 Path A. Flow 35 is a separate Zap and logs: metric_category = "Corporate Benefits", metric_value = "[Days_Approved] Days PTO Approved (Paid Time Off)", receipt_hash = [Rippling Request ID]. | Zapier Integration V7.pdf §Flow 35 |
| BR_9.2.10 | The Return Protocol is triggered by a Zapier delay_until action within the original Flow 13 Zap — NOT a separate backend cron job or scheduled webhook. The Zap pauses mid-execution at leave approval and automatically resumes on the DTO/Hiatus End Date. Return Protocol execution is co-owned: Zapier handles orchestration, flow control, and the DTO_Welcome_Back notification; Middleware executes the Safety Check, calls POST /system/set-account-state, pushes the Restore Trading command to broker servers (Rithmic / MT5 / TraderEvolution), and resumes the Dots retainer trigger (Path B). | Zapier Integration V7.pdf §Flow 13; client confirmed 2026-08-22 |
| BR_9.2.11 | Request channel per trader type. USA W-2 traders request time off inside Rippling — the Dashboard must not provide a W-2 time-off request UI (Career & HR Widget shows "View in Rippling" only). International Contractors L6+ request via the native Dashboard "Request Time Off" form (not a third-party tool); on Send the Dashboard dispatches a JSON webhook to Zapier's catch-hook with user_id (or registered email), Start_Date, DTO_Hiatus_End_Date, Requested_Days, Reason. | CR-20261027-001; QnA [HR-DEF-01]; client confirmed 2026-08-27 |
| BR_9.2.12 | POST /system/set-account-state is an internal system endpoint — it does NOT self-enforce a Human RBAC gate. It is designed to be called by Zapier automation bus and background workers without per-call JWT authorization. Human RBAC is enforced upstream at the BPS Admin Console layer: Level_2+ or Admin role required to invoke any manual Ops action; Level_1 callers receive HTTP 403 Forbidden at the Console layer before the call reaches the endpoint. Security for machine callers (Zapier, background workers) is enforced via Zapier JWT Signature and VPC/VPN network isolation. Manual Ops must always go through BPS Admin Console, which applies the RBAC gate, enforces mandatory reason + transcript_url fields, and writes to BPS_Audit_Log. BPS Admin Console then calls down to POST /system/set-account-state only after the RBAC check passes. | RFQ_ Stack Trading Prop Tech V7.pdf §BPS Endpoints lines 2721–2867; client confirmed 2026-08-27 |
| BR_9.2.13 | Consecutive time-off/hiatus requests while already on leave are handled as idempotent extensions, not stacking locks. Path A: each additional Rippling approval (new Rippling Request ID) extends stagnation_deadline by the newly approved days; quota enforcement is Rippling's (no re-check). A redelivered webhook with the same Rippling Request ID is ignored. Path B: always approve (no day limit) → extend stagnation_deadline. In both paths: re-calling POST /system/set-account-state with state = "Locked" is idempotent (no nested flags); Dots retainer flag (is_retainer_paused = TRUE) is already set (idempotent). The Return Protocol fires exactly once on the final extended DTO_Hiatus_End_Date. | Zapier Integration V7.pdf pp. 21, 228-230, 392-394; client confirmed 2026-09-09 |
| BR_9.2.14 | Current_Level >= 6 is an entry gate only — checked when the Rippling webhook (Path A) or form submission (Path B) is received, not at return. The Return Protocol's sole re-enablement gate is the Safety Check (Step R-1: blacklist / Users.status / Users.payout_status). If a trader is demoted below Level 6 during leave, the Return Protocol runs normally on the scheduled end date. On re-enablement, Middleware reads the trader's current Current_Level from PostgreSQL at that moment and pushes risk parameters (Notional, Daily Loss Limit, Level Stop) matching the demoted level to the broker gateway. All Live DMA accounts from Level 1-24 carry account_status = 'Active_DMA' (flat enum; level is held in current_level) — demotion changes current_level only and does not invalidate Live account status. For Path B, the monthly retainer resumes at the demoted level's retainer rate. | Zapier Integration V7.pdf; client confirmed 2026-09-09; client confirmed 2026-09-14 (UC_5.8 BR_5.8.9) |
| BR_9.2.15 | Before locking the trading account (Steps A-4/B-4), Middleware MUST close all open orders / positions. The Execution Gateway lock fires only after the account has no open positions. | Zapier Integration V7.pdf §Flow 13 |
| BR_9.2.16 | The Execution Gateway lock sequence is: Rithmic — R|API+ Suspend Trading; MT5 — YourBourse Contest Stop Out Plugin API (POST) sets account to Read-Only and freezes Target Profit / Stop Loss in RAM; TraderEvolution — Admin API sets account to Lock/Read-Only. All three gateway calls MUST succeed (HTTP 200) before the post-gateway DB writes are executed. | Supplement §3.2 |
| BR_9.2.17 | DB writes are sequenced after gateway confirmation. The following fields are written to the Users table only after receiving HTTP 200 from all active broker gateways: trader_status = 'On_Leave'; is_professional = TRUE (if trader is on DMA). stagnation_deadline is extended in a prior step (A-3/B-3) — not gated on gateway response. | Supplement §3.3 |
| BR_9.2.18 | Discord leave-status notifications MUST be pushed to a Redis memory queue rather than sent directly to Discord. Zapier/Bot drains the queue with a rate cap of max 5 messages per 5 seconds before dispatching to Discord, to prevent rate-limit violations on the Discord platform. | Supplement §3.4 |
| BR_9.2.19 | Founding Mentor exception scope: The Founding_Mentor flag protects Administrative Roles only — specifically, exemption from Digital Eviction (Pod Leader role and Discord Pod channel are not removed when the trading account is locked or in violation). It does NOT exempt the trading account from lock during leave or Hard Breach. During On_Leave or Banned_Chargeback states, the Founding Mentor's trading account is locked and all open positions are closed, identically to any other trader. | Supplement §6 — BR 4 |
| BR_9.2.20 | "Request Time Off" form (Path B). Visible only to International Contractors with Current_Level >= 6. Fields per approved design: Start Date (mandatory), End Date (mandatory, ≥ Start Date), Requested Days (read-only, auto-calculated from the two dates), Reason (textarea); Send button and a Cancel button (Cancel to be added to the design). Static description text is fixed as in the approved design. | CR-20261027-001; References/Wireframe/Dashboard/Flow 13_Request Time Off modal (International).jpg |
| BR_9.2.21 | Path A timing. stagnation_deadline extension (A-3), closing open positions (A-3.5), account lock and trader_status = 'On_Leave' (A-4) all happen together on the Rippling leave_start_date. Between approval and leave_start_date the trader trades normally and is not On_Leave. | §2.1; Step A-1.5 |
10. Acceptance Criteria
| ID | Scenario | Expected Result |
|---|---|---|
| AC-9.2-01 | Trader with Current_Level = 5 — International: does not see the "Request Time Off" button; W-2: Rippling webhook received for a Level 5 worker | No DB change. No email sent. Path A: audit log entry only. |
| AC-9.2-02 | USA W-2 trader (Current_Level = 6) requests 5 days in Rippling; Rippling approves and sends the Time Off Request Approved webhook | Path A: stagnation_deadline extended by 5 days; account_status = "Locked"; DTO_Approval_Notice sent; no Rippling API call made by Stack Trading. |
| AC-9.2-03 | USA W-2 trader's request is rejected inside Rippling (e.g. DTO exhausted) | No webhook; Flow 13 not triggered; no state changes. |
| AC-9.2-04 | International Contractor trader (Current_Level = 7) submits the Dashboard "Request Time Off" form | Path B: Dots retainer suspended; stagnation_deadline extended; account locked; DTO_Approval_Notice sent. |
| AC-9.2-05 | Return date reached via Zapier delay_until — trader is clean (no flags) | POST /system/set-account-state called with state = "Active"; broker Restore Trading command executed; DTO_Welcome_Back sent; Dots retainer resumed (Path B only). |
| AC-9.2-06 | Return date reached via Zapier delay_until — trader has Users.status = 'Banned_Chargeback' | Account remains Locked. No DTO_Welcome_Back sent. Head of Ops alerted. |
| AC-9.2-07 | Return date reached via Zapier delay_until — trader has Users.payout_status = 'Hold' (BPS Apply Payout Hold) | Same as AC-9.2-06. |
| AC-9.2-08 | Rippling webhook received for a worker with Employment_Type != 'W-2' or not mapped to any user_id | Not processed; no lock; no stagnation_deadline change; BPS_Audit_Log entry written. |
| AC-9.2-09 | POST /system/set-account-state fails during leave approval | Account NOT locked. SEV-1 Slack alert to Ops for manual lock. |
| AC-9.2-10 | Flow 35 fires after Rippling approves PTO for Path A trader | POST /api/ledger/record called with metric_category = "Corporate Benefits", metric_value = "[Days_Approved] Days PTO Approved (Paid Time Off)". |
| AC-9.2-15 | USA W-2 trader already on leave gets a second time-off approved in Rippling (new Rippling Request ID) | stagnation_deadline extended further by the newly approved days; DTO_Hiatus_End_Date updated; account lock unchanged (idempotent). |
| AC-9.2-16 | Rippling redelivers the same Time Off Request Approved webhook (same Rippling Request ID) | Ignored — stagnation_deadline not extended twice; lock unchanged. |
| AC-9.2-17 | International Contractor already on hiatus submits a second hiatus request | Request approved — stagnation_deadline extended further by additional Requested_Days; is_retainer_paused remains TRUE (idempotent); account lock unchanged; Return Protocol fires once on the final extended DTO_Hiatus_End_Date. |
| AC-9.2-18 | Trader was Level 7 at leave approval; demoted to Level 4 during leave; return date reached with clean Safety Check | Account re-enabled: account_status = 'Active_DMA', current_level = 4; broker gateway loaded with Level 4 risk parameters (Notional, Daily Loss Limit, Level Stop); Path B retainer resumes at Level 4 retainer rate. |
| AC-9.2-19 | Trader was Level 7 at leave approval; demoted to Level 4 during leave; return date reached with Users.payout_status = 'Flagged' | Return Protocol halted at Safety Check — account remains Locked; Head of Ops alerted; Level of demotion irrelevant (gate is flag status, not Level). |
| AC-9.2-20 | International Contractor (Level 8) clicks "Request Time Off" in Career & HR Widget, selects Start Date + End Date (Requested Days auto-filled), enters Reason, clicks Send | Modal closes; payload (user_id, Start_Date, DTO_Hiatus_End_Date, Requested_Days, Reason) dispatched to Zapier; flow proceeds to Path B. |
| AC-9.2-21 | International Contractor opens "Request Time Off" and clicks Cancel (or closes the modal) without clicking Send | No webhook dispatched; no DB state change; trader remains in current state. |
| AC-9.2-22 | Path A/B approved — trader has open positions | All open orders / positions are closed; execution gateway lock proceeds only after the account has no open positions. |
| AC-9.2-23 | Path A approved — execution gateway lock succeeds (HTTP 200 all gateways); DB writes execute | trader_status = 'On_Leave'; is_professional = TRUE (if DMA) written to Users. |
| AC-9.2-24 | International Contractor (Path B, Live) — a Flow 14 dispute hold is applied mid-leave; return date reaches | Safety Check catches Users.payout_status ≠ 'Approved'; account remains Locked; Head of Ops alerted; no automated re-enablement until dispute resolved by Admin. |
| AC-9.2-25 | W-2 trader (Level 8) opens the Career & HR Widget | "Request Time Off" button is not displayed; only "View in Rippling" CTA is shown. |
| AC-9.2-26 | International Contractor selects End Date earlier than Start Date | Validation error; Send does not submit; Requested Days not calculated. |
| AC-9.2-27 | International Contractor selects Start Date and End Date | Requested Days displays the auto-calculated value (calculation rule per Q-4). |
| AC-9.2-28 | Return date reached; trader's email has an active row in the blacklist table (is_active = TRUE) | Same as AC-9.2-06. |
| AC-9.2-29 | Rippling webhook arrives while Today is between leave start and end date | Account locked; stagnation_deadline + full Requested_Days; Slack #ops-general late-approval notice. |
| AC-9.2-30 | Rippling webhook arrives after leave_end_date | No lock; stagnation_deadline extended; Flow 35 ledger entry written; Slack #ops-general notice. |
| AC-9.2-31 | Pod Leader on approved leave; 1st of month reached | Flow 17 vests Pending_Carry_Balance normally (not skipped). |
| AC-9.2-32 | Rippling webhook received on 01 Dec; leave_start_date = 10 Dec | Before 10 Dec: no lock, stagnation_deadline unchanged, trader_status unchanged; DTO_Approval_Notice sent on 01 Dec. On 10 Dec: positions closed, account locked, stagnation_deadline extended, trader_status = 'On_Leave'. |
| AC-9.2-33 | Same as AC-9.2-32, trader places an order on 05 Dec | Order accepted — account is not locked before leave_start_date. |
10.1 Open Questions (CR-20261027-001)
| ID | Question | Current assumption |
|---|---|---|
| Q-1 | Does Rippling block requests above DTO_Days (Table A/B) by policy, or must Middleware re-check on webhook receipt? | Rippling policy configured by Ops; no re-check. |
| Q-2 | If a W-2 trader cancels / shortens an approved time-off in Rippling, is there a webhook, and should the account be unlocked early / stagnation_deadline reduced? | ✅ Answered 2026-11-04 — see Alt-5. |
| Q-3 | Rippling webhook delayed past the leave start date → late lock. Alert Ops? | ✅ Answered 2026-11-04 — see Exc-2. |
| Q-4 | Form: is Reason mandatory, max length? Requested Days = calendar days inclusive of both dates? Start Date allowed in the past? Besides the Cancel button (to be added), can the modal also be closed via X / click outside / Esc? | Reason optional ≤ 500 chars; calendar days inclusive; Start Date ≥ today; close via X / click outside / Esc. |
11. Update History
| Date | Version | Updated Section | Before | After | Reason |
|---|---|---|---|---|---|
| 2026-11-05 | v2.6 → v2.7 | Header; §2.2 modal (screenshot, Cancel row, note); §9 BR_9.2.20; §10 AC-9.2-21; §10.1 Q-4 | No screenshot; no Cancel button (closing via Q-4 only) | Screenshot embedded; Cancel button to be added — closes modal without submitting | Design review 2026-11-05 |
| 2026-11-05 | v2.5 → v2.6 | Header; §2.1; §4 Step A-1.5 (new), Step A-5; §7 Alt-5; §9 BR_9.2.5, BR_9.2.21 (new); §10 AC-9.2-32/33 (new) | Path A locked and extended stagnation_deadline immediately on approval webhook | Path A actions start on the Rippling leave_start_date (Zapier delay_until); approval email and Flow 35 still on receipt; Path B unchanged | Leave starts on the date registered in Rippling |
| 2026-11-05 | v2.4 → v2.5 | Header; §4 Steps A-3.5, B-3.5; §8 Exc-3; §9 BR_9.2.15, BR_9.2.19; §10 AC-9.2-22 | TRIM_TO_COMPLIANCE algorithm (sort by size, sequential Market Close, ExecutionReport listener, 2,000 ms Hard Liquidation failsafe) — source "Supplement §3.1 / §7" (not in References) | Close all open orders / positions before lock; lock only after account has no open positions; no algorithm specified | Flow 13 only states closing positions; Zapier Integration V7.pdf §Flow 13 |
| 2026-11-04 | v2.3 → v2.4 | Header; §1 (Release row); Return Protocol ownership + Step R-1; §4.1.2 carry row; §4.1.3 (rewritten); §7 Alt-5 (new); §8 Exc-2, Exc-5; §9 BR_9.2.4 source, BR_9.2.7; §10 AC-9.2-07/19/24, AC-9.2-28–31 (new); UC Index + BR_9.2.14 Safety Check wording; §10.1 Q-2/Q-3 | Safety Check on Trader_Status ∈ {Banned_Chargeback, Compliance_Flagged}; Exc-2 lock on receipt, no alert; no rule for PTO cancel/shorten; carry frozen during leave, Flow 17 skips On_Leave; Exc-5 source "Supplement §7" | Safety Check = blacklist match OR Users.status ∈ {Banned_Chargeback, Failed, Terminated} OR payout_status ≠ Approved (PostgreSQL only); Exc-2 split into 2 cases with Slack #ops-general; Alt-5 Ops manual; carry keeps vesting for all Pod Leaders incl. Founding Mentor; Release 2 | Client sheet Adam/Adrian 2026-11-04 (QnA [BG-002]–[BG-009], [BG-017]; [POD-XF-18]) |
| 2026-10-30 | v2.2 → v2.3 | Header; §4.1.1 source; §4.1.2 (Workspace row, new Registry status row, Pending_Carry_Balance row label, source); §4.1.4, §4.1.5 (new) | §4.1.1/§4.1.2 cited non-existent "RFQ V7 §Time-Off & Hiatus Management Engine"; no rule for Pod_Leader_Registry.Status during leave; no rule for pod SLAs during leave | Sources → client confirmation [POD-XF-15/16]; Pod_Leader_Registry.Status = 'On_Leave' set at A-4/B-4, back to 'Active' at R-2, excluded from Flow 10 matching; pod SLA timers paused (SLA cron / Daily Audit / Calendar Auditor); "Table E" label dropped — field named Pod_Leader_Registry.Pending_Carry_Balance | Client reply 2026-10-30 (F13-10, F13-11, F13-14) |
| 2026-10-28 | v2.1 → v2.2 | §4 Steps A-4/B-4 post-gateway DB writes; §4.1.4 (removed); §9 BR_9.2.17; §10 AC-9.2-23 | A-4/B-4, BR_9.2.17, AC-9.2-23 wrote credentials_last_rotated_at = NOW() on leave lock (source "Supplement §3.3"); §4.1.4 Acting Cover mechanism for mentee SLA coverage (source "RFQ V7 §Time-Off & Hiatus Management Engine") | Both removed — no traceable source in References (V7 sets credentials_last_rotated_at only when credentials are issued/rotated, Flow 3H; Acting_Cover in V7 exists only as a Flow 15A status) | Source audit 2026-10-28 |
| 2026-10-27 | v2.0 → v2.1 | §5 P3; §9 BR_9.2.14; §10 AC-9.2-18 | account_status written as Active_L[N]_DMA / Active_Lx_DMA / Active_L4_DMA (level encoded in status) | account_status = 'Active_DMA' (flat enum) + current_level | Client confirmed 2026-09-14 — account_status is a flat enum; level is held in current_level (UC_5.8 BR_5.8.9) |
| 2026-10-27 | v1.9 → v2.0 | Header; UC Index; §1; §2 (rewritten: 2 channels, 2.1–2.3); §3 Path Router; §4 Steps A-1/A-2; Return Protocol trigger; §5 P1/P4; §6; §7 Alt-1/Alt-3; §8 Exc-1/Exc-2; §9 BR_9.2.2/3/9/11/13/14, BR_9.2.20 (new); §10 AC-9.2-01/02/03/04/08/15/16/20/21, AC-9.2-25/26/27 (new), §10.1 Open Questions | One Dashboard form for all L6+ traders; Path A did Rippling DTO Balance Check (A-1) + "Log Time Off in Rippling API" (A-2); path routed by KYC country; button shown to W-2 and International; form fields Request Date + Start Date | W-2 requests in Rippling → Rippling approval webhook triggers Path A (A-1 = receive webhook + gate + dedup; A-2 = Flow 35 in parallel; no Rippling API call). International uses approved Dashboard form (Start/End Date, Requested Days auto, Reason, Send) → Path B. Routing by trigger channel; KYC/Employment_Type as guard. Old Exc-1/Exc-2 removed. | CR-20261027-001 (client chose Option B Hybrid, 2026-10-27); [HR-DEF-01]; approved form design |
| 2026-10-01 | v1.8 → v1.9 | Add §4.1 Special Case Pod Leader / Founding Mentor: Failsafe Anti-Termination Gate, resource preservation table, carry balance freeze, Acting Cover mechanism | No Pod Leader / Founding Mentor special-case section; BR_9.2.19 mentioned Founding Mentor exception in scope only | §4.1 added: 4 sub-sections covering anti-termination gate (blocks POD_LEADER_TERMINATED + Flow 15C), On_Leave resource preservation matrix, carry freeze vs forfeiture distinction, Acting Cover temporary SLA coverage | RFQ_ Stack Trading Prop Tech V7.pdf §Time-Off & Hiatus Management Engine |
| 2026-09-19 | v1.7 → v1.8 | §2 Trigger (UI Entry Point); §4 Steps A-3.5/B-3.5/A-4/B-4/A-5/B-5; §8 Exc-3/Exc-5; §9 BR_9.2.15–19; §10 AC-9.2-20–24 | No TRIM_TO_COMPLIANCE step before lock; lock step mentioned only Rithmic/MT5 generically; no post-gateway DB write spec; A-5/B-5 had no Discord batching; B-5 had no Dots compliance link; no UI entry point defined; Exc-3 had no retry spec; no Flow 14 conflict documented; Founding Mentor exception undocumented | TRIM_TO_COMPLIANCE (loop & close + 2,000 ms Hard Liquidation failsafe) added as Step A-3.5/B-3.5. Lock step expanded: MT5 YourBourse Contest Stop Out Plugin + TraderEvolution Admin API. Post-gateway DB writes added: trader_status='On_Leave', is_professional=TRUE, credentials_last_rotated_at=NOW(). "Request Time Off" button at UC_4.16.2 Career & HR Widget documented (required fields: Request Date, Start Date). Discord notification via Redis queue (max 5 msg/5 s). B-5 email amended with Dots white-labeled compliance link. Exc-3 expanded with 3× retry + exponential backoff. Exc-5 added: Flow 14 dispute pre-empts On_Leave return. BRs 9.2.15–19 and ACs 9.2-20–24 added. | Technical supplement 2026-09-19 |
| 2026-09-09 | v1.6 → v1.7 | Step R-2/R-3 + BR_9.2.14 + AC-9.2-18/19 | Return Protocol re-enabled trader to original level; edge case of Level drop during leave not addressed | Step R-2: Middleware now reads current Current_Level at return time and pushes risk parameters for the demoted level. Step R-3: Path B retainer resumes at demoted level's rate. BR_9.2.14: Current_Level >= 6 confirmed as entry gate only — not re-checked at return. Safety Check is the sole return gate. All Live DMA accounts Level 1-24 carry valid Active_Lx_DMA state. AC-9.2-18 (clean return, demoted) and AC-9.2-19 (Safety Check halt, demoted) added. | Client confirmed 2026-09-09; closes Q11 |
| 2026-09-09 | v1.5 → v1.6 | §7 Alternative Flows (Alt-3/Alt-4 added) + BR_9.2.13 + AC-9.2-15/16/17 | No behavior documented for consecutive time-off requests while trader is already on leave | Alt-3 (Path A: DTO balance re-check → extend or reject) and Alt-4 (Path B: always extend) added. BR_9.2.13 formalises idempotent state machine behavior (POST /system/set-account-state idempotent; Dots flag idempotent; single Return Protocol on final end date). AC-9.2-15/16/17 added. | Client confirmed 2026-09-09; closes Q9 |
| 2026-08-22 | v1.3 → v1.4 | §2 Trigger rewritten + BR_9.2.11 added | §2: "Trader submits a Time-Off / Hiatus Request Form. Trigger type: Form submission webhook." No form tool, no field list, no payload definition. | Form confirmed as native Dashboard form (not 3rd-party). Webhook payload defined: user_id/Requested_Days/DTO_Hiatus_End_Date. Path Router queries AC/PostgreSQL for billing_country. BR_9.2.11 added. | Client confirmed 2026-08-22; closes Q2 from audited-v1.md |
| 2026-08-22 | v1.2 → v1.3 | Return Protocol — Trigger mechanism + BR_9.2.10 | Trigger: "DTO/Hiatus end date reached (date-based cron or scheduled webhook)." Steps R-1/R-2/R-3/R-4 silent on ownership. | Return Protocol triggered by Zapier delay_until on original Flow 13 Zap (not a cron). Co-owned: Zapier (orchestration/flow/email) + Middleware (Safety Check execution, POST /system/set-account-state, broker Restore Trading, Dots retainer resumption). Added BR_9.2.10. Updated AC-9.2-05/06/07 trigger description. | Client confirmed 2026-08-22; closes Q1 from audited-v1.md |
| 2026-08-22 | v1.1 → v1.2 | BR_9.2.8 — OPEN closed | [⚠️ OPEN] — Flow 12 bypass for leave traders undefined | Flow 12 confirmed to fire normally during approved leave. Market data deactivated when last_trade_date > 30 days. Leave days NOT subtracted from 30-day inactivity counter. stagnation_deadline extension (BR_9.2.4) protects Flow 19 only. | Client confirmed 2026-08-22 |
| 2026-08-21 | v1.0 → v1.1 | Step B-2; Alt-2; BR_9.2.6; BR_9.2.7 | Step B-2: [OPEN] — mechanism unspecified. Alt-2: [OPEN] — no RBAC details. BR_9.2.6/7: generic. | Step B-2: confirmed DB flag mechanism (is_retainer_paused) + Middleware cron — not Zapier, not Dots API. Alt-2: BPS RBAC confirmed (Level_2/Admin JWT, BPS_Audit_Log); POST /system/set-account-state RBAC gate still [OPEN]. | Client confirmed 2026-08-21 |
| 2026-08-20 | v1.0 | Initial creation | — | Full SRS for UC_9.2 (Flow 13) | First authoring pass. Source: Zapier Integration V7.pdf §Flow 13 + §Flow 35. |