StackTrading Docs

SRS: UC_9.2 — Flow 13: Time-Off Management (W-2 DTO & International Hiatus)

FieldValue
BA in Chargelinh.nguyen34
Date Created2026-08-20
Versionv2.7
Last Updated2026-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 ReferencesCR-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_IDUse Case NameBusiness Description
UC_9.2Time-Off ManagementHandles 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

FieldContent
IDUC_9.2
Use CaseTime-Off Management
DescriptionProcesses 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 FlowFlow 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 TableTable A / Table B (DTO_Days column — max paid time-off days by level)
3rd PartyRippling (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)
ReleaseRelease 2 (client sheet F13-01, 2026-11-04)

2. Trigger

Two entry channels — the channel determines the path (CR-20261027-001):

Trader typeWhere the trader requests leaveTrigger into Flow 13Path
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 13Path A
International Contractor (Level 6+)Native Dashboard "Request Time Off" formForm submit → JSON webhook → Zapier Flow 13Path 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_date registered in Rippling, via a Zapier delay_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 >= 6 only. 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):

Request Time Off modal (International Contractor)

Figma: Request Time Off modal

ElementTypeRule
TitleText"Request Time Off"
DescriptionText (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 DateDate picker, MM/DD/YYYYMandatory. First day of hiatus.
End DateDate picker, MM/DD/YYYYMandatory. Must be ≥ Start Date.
Requested DaysRead-only textAuto-calculated from Start Date and End Date; shows _ until both dates are selected.
ReasonTextareaSee Q-4 (mandatory / max length not confirmed).
SendPrimary buttonSubmits the form.
CancelSecondary 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:

FieldDescription
user_id (or registered email)Trader identity — used to look up Current_Level, Employment_Type, KYC-verified country, and DB record
Start_DateFirst day of hiatus (from form)
DTO_Hiatus_End_DateEnd Date from form — Zapier maps this directly into the delay_until action for the Return Protocol
Requested_DaysAuto-calculated days — used to extend stagnation_deadline (Step B-3)
ReasonFree 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 to BPS_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 channelPath
Rippling Time Off Request Approved webhookPath A — USA W-2 Paid DTO
Dashboard "Request Time Off" formPath 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 to BPS_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_deadline twice.
  • 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 with delay_until = leave_start_date (from the Rippling payload) and continues with Step A-3 on that date. Until then the trader trades normally; trader_status is 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/record with metric_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.
  • 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_deadline already 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_Notice email 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 Dots POST /payees and 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_deadline by Requested_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.
  • Post-gateway DB writes (after HTTP 200 from all active gateways):
    • trader_status = 'On_Leave'
    • is_professional = TRUE (if trader is on DMA)
    • stagnation_deadline already 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_Notice email 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_until timer, flow control and step sequencing after resumption, the flag/database check logic, and routing the DTO_Welcome_Back notification.
  • Middleware owns: Safety Check execution (queries PostgreSQL Users and blacklist), calling POST /system/set-account-state on 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_Flagged is not a stored field — it is evaluated from existing data:
    • IF any of the following is true:
      1. The user's email has a matching row in the blacklist table (blacklist.email = Users.email AND blacklist.is_active = TRUE — same check as UC_2.6.2 Blacklist Check);
      2. Users.status ∈ {Banned_Chargeback, Failed, Terminated};
      3. Users.payout_status ≠ 'Approved' (e.g. Hold / Flagged set 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.
    • ELSE: Proceed to Step R-2.

(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_Level from 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_Level at 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_Back email 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 flow

Blocked actions during leave (applies to both triggers):

  • POD_LEADER_TERMINATED webhook: never fired
  • Flow 15C (Pod dissolution, carry forfeiture, Discord/Workspace offboarding): never invoked
  • Pending_Carry_Balance zeroing: 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

ResourceActiveOn_LeaveTerminated (Flow 15C)
Trading accountActiveLocked (same as all Traders)Disabled
Google Workspace @stacktrading.comActiveActive — preserved (keeps receiving Wednesday AI Brief)Deleted / Suspended
Pod_Leader_Registry.StatusActiveOn_Leave — see §4.1.4Terminated
Discord channel pod-[leader_name]ActiveActive — not archivedArchived
Discord Role Pod LeaderAssignedAssigned — preservedRevoked
Pod_Leader_Registry.Pending_Carry_BalanceAccruing / vestingAccruing / vesting — unchangedForfeited ($0.00)
Pod mentee listLinked to pod_idPreserved — no re-assignmentDispersed (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 in On_Leave is automatically excluded from new mentee matching. This does NOT trigger the Flow 15A Suspended pod-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

IDPre-condition
P1Path 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.
P2Current_Level >= 6 in Users table.
P3Trader's account_status = 'Active_DMA' (not already Locked, Terminated, or Banned). Level is held in current_level.
P4For Path A: Rippling worker record exists and is linked to the trader's user_id; Employment_Type = 'W-2'.
P5For Path B: Dots retainer schedule is active for this trader.

6. Post-conditions

OutcomePost-condition
Path A processedstagnation_deadline extended; trading account Locked; DTO_Approval_Notice sent. (Time-off already recorded/approved in Rippling; Flow 35 logs the ledger entry.)
Path B processedstagnation_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 — cleanTrading account re-enabled; Dots retainer resumed (Path B); DTO_Welcome_Back sent.
Return — Safety Check failedAccount 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_deadline further by the newly approved days and updates DTO_Hiatus_End_Date.
  • Re-calling POST /system/set-account-state with state = "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_deadline further by additional Requested_Days. Re-suspending Dots retainer (is_retainer_paused = TRUE) is idempotent — flag already set, no change.
  • The Return Protocol (Zapier delay_until) monitors the updated DTO_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-state with state = "Active" after resolving the compliance/chargeback issue — must be executed via BPS Admin Console (enforces Level_2+/Admin RBAC gate, mandatory reason + transcript_url, logs to BPS_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 adjust stagnation_deadline if 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, or Employment_Type != 'W-2'.
  • Do not extend stagnation_deadline; do not lock. Log to BPS_Audit_Log for Ops review. No trader notification.

Exc-2 — Rippling webhook arrives after the leave start date (Path A):

  • Case 1 — Today between leave_start_date and leave_end_date: lock immediately for the remainder of the leave; extend stagnation_deadline by the full approved Requested_Days; send a routine Slack notification to #ops-general noting the late approval.
  • Case 2 — Today already past leave_end_date: do NOT lock; Flow 35 still logs the PTO on the ledger; extend stagnation_deadline by 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 than On_Leave: SIM traders → Users.status = 'Banned_Chargeback'; Live traders → dispute hold sets Users.payout_status ≠ 'Approved'.
  • The account MUST NOT be automatically re-enabled on the scheduled Return_Date until 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 IDRuleSource
BR_9.2.1Only 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.2Path 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.3DTO_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.4stagnation_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.5The 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.6For 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.7Return 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.8Flow 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.9The 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.10The 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.11Request 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.12POST /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.13Consecutive 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.14Current_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.15Before 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.16The 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.17DB 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.18Discord 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.19Founding 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.21Path 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

IDScenarioExpected Result
AC-9.2-01Trader with Current_Level = 5 — International: does not see the "Request Time Off" button; W-2: Rippling webhook received for a Level 5 workerNo DB change. No email sent. Path A: audit log entry only.
AC-9.2-02USA W-2 trader (Current_Level = 6) requests 5 days in Rippling; Rippling approves and sends the Time Off Request Approved webhookPath 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-03USA 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-04International Contractor trader (Current_Level = 7) submits the Dashboard "Request Time Off" formPath B: Dots retainer suspended; stagnation_deadline extended; account locked; DTO_Approval_Notice sent.
AC-9.2-05Return 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-06Return 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-07Return 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-08Rippling webhook received for a worker with Employment_Type != 'W-2' or not mapped to any user_idNot processed; no lock; no stagnation_deadline change; BPS_Audit_Log entry written.
AC-9.2-09POST /system/set-account-state fails during leave approvalAccount NOT locked. SEV-1 Slack alert to Ops for manual lock.
AC-9.2-10Flow 35 fires after Rippling approves PTO for Path A traderPOST /api/ledger/record called with metric_category = "Corporate Benefits", metric_value = "[Days_Approved] Days PTO Approved (Paid Time Off)".
AC-9.2-15USA 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-16Rippling redelivers the same Time Off Request Approved webhook (same Rippling Request ID)Ignored — stagnation_deadline not extended twice; lock unchanged.
AC-9.2-17International Contractor already on hiatus submits a second hiatus requestRequest 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-18Trader was Level 7 at leave approval; demoted to Level 4 during leave; return date reached with clean Safety CheckAccount 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-19Trader 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-20International Contractor (Level 8) clicks "Request Time Off" in Career & HR Widget, selects Start Date + End Date (Requested Days auto-filled), enters Reason, clicks SendModal closes; payload (user_id, Start_Date, DTO_Hiatus_End_Date, Requested_Days, Reason) dispatched to Zapier; flow proceeds to Path B.
AC-9.2-21International Contractor opens "Request Time Off" and clicks Cancel (or closes the modal) without clicking SendNo webhook dispatched; no DB state change; trader remains in current state.
AC-9.2-22Path A/B approved — trader has open positionsAll open orders / positions are closed; execution gateway lock proceeds only after the account has no open positions.
AC-9.2-23Path A approved — execution gateway lock succeeds (HTTP 200 all gateways); DB writes executetrader_status = 'On_Leave'; is_professional = TRUE (if DMA) written to Users.
AC-9.2-24International Contractor (Path B, Live) — a Flow 14 dispute hold is applied mid-leave; return date reachesSafety 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-25W-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-26International Contractor selects End Date earlier than Start DateValidation error; Send does not submit; Requested Days not calculated.
AC-9.2-27International Contractor selects Start Date and End DateRequested Days displays the auto-calculated value (calculation rule per Q-4).
AC-9.2-28Return 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-29Rippling webhook arrives while Today is between leave start and end dateAccount locked; stagnation_deadline + full Requested_Days; Slack #ops-general late-approval notice.
AC-9.2-30Rippling webhook arrives after leave_end_dateNo lock; stagnation_deadline extended; Flow 35 ledger entry written; Slack #ops-general notice.
AC-9.2-31Pod Leader on approved leave; 1st of month reachedFlow 17 vests Pending_Carry_Balance normally (not skipped).
AC-9.2-32Rippling webhook received on 01 Dec; leave_start_date = 10 DecBefore 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-33Same as AC-9.2-32, trader places an order on 05 DecOrder accepted — account is not locked before leave_start_date.

10.1 Open Questions (CR-20261027-001)

IDQuestionCurrent assumption
Q-1Does 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-2If 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-3Rippling webhook delayed past the leave start date → late lock. Alert Ops?✅ Answered 2026-11-04 — see Exc-2.
Q-4Form: 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

DateVersionUpdated SectionBeforeAfterReason
2026-11-05v2.6 → v2.7Header; §2.2 modal (screenshot, Cancel row, note); §9 BR_9.2.20; §10 AC-9.2-21; §10.1 Q-4No screenshot; no Cancel button (closing via Q-4 only)Screenshot embedded; Cancel button to be added — closes modal without submittingDesign review 2026-11-05
2026-11-05v2.5 → v2.6Header; §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 webhookPath A actions start on the Rippling leave_start_date (Zapier delay_until); approval email and Flow 35 still on receipt; Path B unchangedLeave starts on the date registered in Rippling
2026-11-05v2.4 → v2.5Header; §4 Steps A-3.5, B-3.5; §8 Exc-3; §9 BR_9.2.15, BR_9.2.19; §10 AC-9.2-22TRIM_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 specifiedFlow 13 only states closing positions; Zapier Integration V7.pdf §Flow 13
2026-11-04v2.3 → v2.4Header; §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-3Safety 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 2Client sheet Adam/Adrian 2026-11-04 (QnA [BG-002]–[BG-009], [BG-017]; [POD-XF-18])
2026-10-30v2.2 → v2.3Header; §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 leaveSources → 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_BalanceClient reply 2026-10-30 (F13-10, F13-11, F13-14)
2026-10-28v2.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-23A-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-27v2.0 → v2.1§5 P3; §9 BR_9.2.14; §10 AC-9.2-18account_status written as Active_L[N]_DMA / Active_Lx_DMA / Active_L4_DMA (level encoded in status)account_status = 'Active_DMA' (flat enum) + current_levelClient 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-27v1.9 → v2.0Header; 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 QuestionsOne 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 DateW-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-01v1.8 → v1.9Add §4.1 Special Case Pod Leader / Founding Mentor: Failsafe Anti-Termination Gate, resource preservation table, carry balance freeze, Acting Cover mechanismNo 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 coverageRFQ_ Stack Trading Prop Tech V7.pdf §Time-Off & Hiatus Management Engine
2026-09-19v1.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–24No 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 undocumentedTRIM_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-09v1.6 → v1.7Step R-2/R-3 + BR_9.2.14 + AC-9.2-18/19Return Protocol re-enabled trader to original level; edge case of Level drop during leave not addressedStep 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-09v1.5 → v1.6§7 Alternative Flows (Alt-3/Alt-4 added) + BR_9.2.13 + AC-9.2-15/16/17No behavior documented for consecutive time-off requests while trader is already on leaveAlt-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-22v1.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-22v1.2 → v1.3Return Protocol — Trigger mechanism + BR_9.2.10Trigger: "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-22v1.1 → v1.2BR_9.2.8 — OPEN closed[⚠️ OPEN] — Flow 12 bypass for leave traders undefinedFlow 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-21v1.0 → v1.1Step B-2; Alt-2; BR_9.2.6; BR_9.2.7Step 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-20v1.0Initial creation—Full SRS for UC_9.2 (Flow 13)First authoring pass. Source: Zapier Integration V7.pdf §Flow 13 + §Flow 35.

On this page