StackTrading Docs

Bản dịch: UC_8.2.9 → UC_8.2.13

Tổng hợp bản dịch tiếng Việt cho 5 use case thuộc nhóm UC_8.2.x. File gốc tiếng Anh không bị thay đổi. Mọi mã UC, field name, API endpoint, business rule ID, status value giữ nguyên tiếng Anh. Cập nhật 2026-11-05: đồng bộ theo bản tiếng Anh hiện tại và QnA khách trả lời mới nhất (POD-XF-15…18, BG-008) — UC_8.2.9 (v1.6), UC_8.2.10 (v1.9), UC_8.2.11 (v1.4), UC_8.2.12 (v1.7), UC_8.2.13 (v2.9); bỏ nhãn "Table E", dùng Pod_Leader_Registry.


UC_8.2.9 — Luồng 15: Phân công lại Pod & Quản lý

TrườngGiá trị
UC_IDUC_8.2.9
Phiên bảnv1.6
Cập nhật lần cuối2026-10-30
BA PiClinh.nguyen34
Danh mụcGIAI ĐOẠN 6: LỘ TRÌNH NGHỀ NGHIỆP & CHUYÊN NGHIỆP HÓA
Mô-đunHệ thống Pod
Chức năngLuồng 15 — Phân công lại Pod & Quản lý
Tài liệu tham chiếuZapier Integration V7.pdf (§Flow 15 lines 2007–2038; §Pod_Leader_Registry lines 777–790 — chỉ là tham chiếu tên gọi, Pod_Leader_Registry là bảng PostgreSQL native, không phải Zapier Table live, nhắc lại POD-JOIN-02; §POST /admin-pod-reassignment lines 2788–2800) · RFQ_ Stack Trading Prop Tech V7.pdf (§Admin Pod Reassignment endpoint lines 2788–2800; §Manage Discord Role lines 2335–2350; §Archive Pod Channel lines 2280–2292; §BPS Audit Log lines 2724–2761)
TrườngGiá trị
Use CasePhân công lại Pod & Quản lý
Mô tảXử lý tất cả các tình huống cần chuyển mentee sang Pod Leader khác hoặc loại khỏi pod. Ba trigger độc lập: phân công lại tự động theo hệ thống (khi trạng thái lãnh đạo thay đổi), ghi đè thủ công qua BPS Admin, và thu hồi điều kiện tham gia. Mỗi luồng cập nhật SQL registry, đồng bộ Discord role, thông báo các bên liên quan, và — nếu áp dụng — thanh lý số dư carry đang chờ.
Zapier FlowFlow 15 (Pod Re-Assignment & Management) — 3 đường trigger (A/B/C)
Zapier TablePod_Leader_Registry (bảng PostgreSQL native)
3rd PartyDiscord Bot API · AWS SES
BPS EndpointPOST /admin-pod-reassignment

Các Trigger

Luồng 15 có ba đường trigger độc lập. Mỗi đường loại trừ nhau ở điểm vào; tất cả hội tụ ở các bước đồng bộ Discord và cập nhật registry.

TriggerĐiều kiệnĐường
Trigger APod_Status của Pod Leader thay đổi thành Suspended hoặc Terminated. Ba nguồn: (1) BPS Admin thay đổi trạng thái thủ công; (2) webhook POD_LEADER_TERMINATED từ Flow 7 (UC_9.10 — Pod Impact & Dispersal); (3) Flow 4B (Drawdown Defense Re-Activation) — khi is_pod_leader == True, Middleware đặt Pod_Leader_Registry.Status = 'Suspended' sau khi 48h Defense freeze hoàn tấtCascade phân công lại tự động
Trigger BWebhook nhận từ Middleware POST /admin-pod-reassignmentBPS Admin ghi đè thủ công
Trigger COps đánh dấu Pod Leader là Permanently_Ineligible trong Pod_Leader_RegistryThu hồi điều kiện tham gia

Phạm vi release (Xác nhận client 2026-10-30) — xem BR_8.2.9.11:

TriggerReleaseGhi chú
Trigger APhase 1 (Go-Live)Tự động giải thể Pod, ghép lại mentee qua Flow 10, lưu trữ Discord role/channel. Nguồn (1) "BPS Admin thay đổi trạng thái thủ công": Phase 1 — thực hiện qua backend script; Phase 2 (Release 2) — thực hiện qua giao diện BPS Admin Portal. Nguồn (2) webhook Flow 7 và (3) luồng Flow 4B Defense được tự động hóa trong Phase 1.
Trigger BPhase 2 (Release 2)Phase 2: triển khai qua BPS Admin Portal (POST /admin-pod-reassignment). Phase 1: các trường hợp phân công lại thủ công hiếm gặp được xử lý bằng backend script.
Trigger CPhase 2 (Release 2)Phase 2: triển khai qua BPS Admin Portal (POST /api/bps/mentor/revoke). Phase 1: các thao tác bật cờ Permanent Ineligibility hiếm gặp được xử lý bằng backend script.

Điều kiện tiên quyết

IDĐiều kiện tiên quyết
P1Với Trigger A: Pod_Status = 'Suspended' hoặc Pod_Status = 'Terminated' được đặt trên bản ghi Pod_Leader_Registry — bởi BPS Admin thủ công, qua webhook POD_LEADER_TERMINATED từ Flow 7 (UC_9.10), hoặc qua luồng Flow 4B Defense khi is_pod_leader == True (xem BR_8.2.9.10)
P2Với Trigger B: payload của POST /admin-pod-reassignment chứa đầy đủ các trường bắt buộc (user_id, new_pod_id (nullable), admin_id, reason, transcript_url, request_id (UUID))
P3Với Trigger C: Admin đã cập nhật thủ công Pod_Leader_Registry.Status = 'Permanently_Ineligible' qua BPS
P4Kiểm tra Cooldown (chỉ Trigger B): pod_reassignment_date của user_id mục tiêu phải ≥ 30 ngày trước, hoặc NULL

Hậu điều kiện

TriggerHậu điều kiện
Trigger ATất cả mentee đang hoạt động của leader thất bại được phân công lại (hoặc vào danh sách chờ). Pod_Leader_Status đặt thành Acting_Cover (tạm thời) hoặc Reassigned (vĩnh viễn). Discord role được cập nhật. Email Pod_Reassigned_Notification được gửi. Nếu là Termination: Pending_Carry_Balance được thanh lý về Stack General Account.
Trigger Bpod_leader_id cập nhật trong bảng Users. pod_reassignment_date đặt về hôm nay. Discord role đồng bộ (cũ bị xóa, mới được gán). Pod_Reassigned_Notification gửi cho trader + Slack alert đến Pod Leader cũ/mới. Bản ghi audit log được ghi.
Trigger CPod_Leader_Registry.Status = 'Permanently_Ineligible'. Webhook POD_LEADER_TERMINATED được kích hoạt. Tất cả mentee đang hoạt động được ghép lại qua Flow 10 (hoặc vào Waitlist). Discord offboarding được thực thi (kênh bị lưu trữ, role Pod Leader bị thu hồi). Pending_Carry_Balance bị tịch thu về Stack General Account. Pod_Reassigned_Notification được gửi đến các mentee bị ảnh hưởng. Leader bị loại vĩnh viễn khỏi tất cả các truy vấn matching của Flow 10 trong tương lai.

Luồng cơ bản

Trigger A — Thay đổi trạng thái lãnh đạo (Cascade tự động)

Bước A-1. Phát hiện thay đổi trạng thái

  • Zapier bắt sự kiện thay đổi trạng thái trên Pod_Leader_Registry khi Pod_Status IN ('Suspended', 'Terminated').
  • Sự kiện này kích hoạt từ ba nguồn:
    • BPS Admin thủ công — Admin đặt Pod_Status trực tiếp qua BPS.
    • Webhook POD_LEADER_TERMINATED từ Flow 7 — Flow 7 (UC_9.10 — Pod Impact & Dispersal) kích hoạt webhook này ở Condition B (leader bị terminated giữa chu kỳ). Khi nhận, Middleware tự động thực thi UPDATE Pod_Leader_Registry SET Pod_Status = 'Terminated' trước khi khởi động cascade phân công lại. (Source: CR-20260818-001)
    • Luồng Flow 4B Defense — Khi Flow 4B (Drawdown Defense Re-Activation) kích hoạt và phát hiện Users.is_pod_leader == True: (1) tài khoản vào 48h Defense freeze (bị khóa ngay lập tức); (2) sau freeze, Middleware đặt Pod_Leader_Registry.Status = 'Suspended'; (3) Users.stagnation_deadline = Today + 60 Days (bộ đếm Performance Improvement Plan — theo CR-64); (4) pod bị giải thể và cascade Trigger A này thực thi. Trader bị cấm tham gia mọi hoạt động pod trong suốt 60 ngày PIP. Đường tái kích hoạt sau khi vượt qua PIP: Flow 15B (UC_8.2.10). (Source: CR-64)
  • Truy vấn: Tìm tất cả mentee đang hoạt động có Pod_Leader_ID = [Failed_Leader_ID].

Bước A-2. Phân công lại mentee

  • Lặp qua danh sách mentee → chạy Flow 10 Matching Script (Python) đối chiếu với Pod_Leader_Registry cho từng mentee.
  • Waterfall tiêu chí (theo Flow 10): 1. Asset Match (Nghiêm ngặt) → 2. Style Match → 3. Fallback: Lowest Current_Count.
  • Nếu tìm được: gán trong DB, tăng Current_Count của leader mới.
  • Nếu không có (tất cả leader đạt Max_Capacity = 7): đặt Pod_Status = 'Pod_Waitlist' cho mentee.

Bước A-3. Đặt trạng thái lãnh đạo

  • Pod_Status = 'Acting_Cover' nếu lý do trigger = Suspended (tạm thời).
  • Pod_Status = 'Reassigned' nếu lý do trigger = Terminated (vĩnh viễn).

Bước A-4. Thao tác Discord (Archive-First Pattern)

Để tránh race condition và tương tác "mồ côi" trong các kênh pod đang hoạt động, các lời gọi PHẢI tuân theo trình tự archive-first.

  • Bước A-4.1 — Lưu trữ kênh (luôn thực hiện trước tiên):

    • Gọi POST /archive-pod-channel với pod_leader_id: [Failed_Leader_ID].
    • Bot lập tức thu hồi quyền đọc/ghi của tất cả thành viên pod (leader + tất cả mentee), đổi tên kênh từ pod-[leader_name] thành archived-pod-[leader_name], xóa channel_url trong Pod_Leader_Registry.
    • Lý do: kênh bị đóng băng đồng thời với mọi người trước khi có bất kỳ thay đổi role nào, loại bỏ khoảng thời gian kênh vẫn hoạt động nhưng không có leader.
  • Bước A-4.2 — Thu hồi role Leader:

    • Gọi POST /manage-discord-role với action: "REMOVE", role_name: "Pod Leader", user_id: [Failed_Leader_ID].
  • Bước A-4.3 — Full Digital Eviction (chỉ khi Termination — Trigger A qua Flow 7 hoặc Flow 15C):

    • Gọi POST /discord/revoke-all-roles để gỡ toàn bộ Title Roles (Associate / Trader / Senior), Pod Roles, và Special Roles khỏi tài khoản của leader bị terminated.
    • Tài khoản người dùng vẫn ở lại server với tư cách thành viên thông thường/chưa xác minh — KHÔNG bị kick hay ban trừ khi Admin thực hiện thêm thao tác thủ công.
    • Bước này bị bỏ qua khi Suspension; chỉ áp dụng A-4.1 + A-4.2.
  • Bước A-4.4 — Đồng bộ lại cho Mentee (sau khi Flow 10 phân công lại ở Bước A-2):

    • Với mỗi mentee được phân công lại cho Pod Leader mới: thu hồi quyền truy cập kênh pod cũ (đã được lưu trữ), cấp quyền truy cập kênh pod mới, đồng bộ các role Mentee cho pod mới.
    • Gọi POST /manage-discord-role cho từng mentee để cấp quyền truy cập kênh pod mới.

Bước A-5. Thông báo

  • Gửi email Pod_Reassigned_Notification đến từng mentee được phân công lại ("Gặp gỡ mentor mới của bạn").

Bước A-6. Thanh lý số dư Carry (chỉ khi Termination)

  • NẾU lý do trigger = Terminated: Thanh lý Pending_Carry_Balance → Stack General Account (mất trắng). Đặt Pending_Carry_Balance = $0.00.

Trigger B — BPS Admin ghi đè thủ công

Bước B-1. Nhận Webhook

  • Zapier bắt webhook từ Middleware POST /admin-pod-reassignment.
  • Payload bắt buộc: user_id, new_pod_id (nullable — null = xóa khỏi pod mà không phân công lại), admin_id, reason, transcript_url, request_id (UUID — bắt buộc để đảm bảo idempotency).
  • Trường payload tùy chọn: force_override (boolean, mặc định false) — khi true, bỏ qua kiểm tra cooldown 30 ngày.
  • Nếu thiếu trường bắt buộc → Middleware trả 400 Bad Request trước khi webhook kích hoạt. Zapier không bao giờ nhận payload bị lỗi.

Bước B-1.5. Kiểm tra Idempotency (Cổng chống trùng lặp)

  • Middleware kiểm tra request_id trong Redis Cache (key: pod-reassign:{request_id}, TTL: 24h).
  • Lần gọi đầu tiên (chưa có key): Lưu key vào Redis → tiếp tục Bước B-2.
  • Lần gọi trùng lặp (key đã tồn tại — ví dụ: Zapier retry): Trả ngay 200 OK đã cache. Không ghi DB, không gọi Discord API, không gửi email. Luồng kết thúc tại đây.
  • Lý do: cooldown 30 ngày bảo vệ trước ý định admin lặp lại qua nhiều ngày/tháng; idempotency key bảo vệ trước các lần Zapier retry do network timeout trong cùng một khoảng thời gian thao tác.

(Nguồn: Bổ sung client 2026-10-06 — Q20(a) cơ chế chống trùng lặp Trigger B)

Bước B-2. Kiểm tra Cooldown

  • Middleware truy vấn pod_reassignment_date cho user_id.
  • NẾU force_override = true → bỏ qua cooldown; tiếp tục. Middleware phải ghi override vào BPS_Audit_Log và kích hoạt Slack alert tự động đến kênh Operations #ops-it, bao gồm admin_id, reason, transcript_url, và cờ override.
  • NẾU force_override = false (hoặc vắng mặt) VÀ lần chuyển cuối < 30 ngày → trả 429 Too Many Requests (Cooldown Active). Luồng kết thúc.
  • NẾU NULL hoặc ≥ 30 ngày → tiếp tục.

Bước B-3. Đồng bộ Discord

  • Gọi Discord Bot API: Xóa role của old_pod_id. Gán role của new_pod_id (bỏ qua nếu new_pod_id là null).

Bước B-4. Cập nhật Registry

  • Cập nhật pod_leader_id trong bảng Users. Đặt pod_reassignment_date = Today. Cập nhật Current_Count của cả Pod Leader cũ và mới trong Pod_Leader_Registry để duy trì theo dõi năng lực chính xác.

Bước B-5. Thông báo

  • Gửi email Pod_Reassigned_Notification đến trader. Gửi Slack alert đến Pod Leader cũ và mới.

Trigger C — Leader mất điều kiện tham gia

Bước C-1. Nhận cờ

  • BPS Admin gọi POST /api/bps/mentor/revoke để đánh dấu leader mất điều kiện tham gia vĩnh viễn.
  • Middleware thực thi: UPDATE Pod_Leader_Registry SET Status = 'Permanently_Ineligible'.

Bước C-2. Kích hoạt Webhook Offboarding

  • Middleware kích hoạt sự kiện webhook POD_LEADER_TERMINATED đến Zapier.
  • Điều này kích hoạt cùng Mentee Dispersal Cascade như Trigger A (đường Termination).

Bước C-3. Mentee Dispersal Cascade (kế thừa hành vi Flow 15A/15C)

  • Truy vấn tất cả mentee đang hoạt động có pod_leader_id = [Ineligible_Leader_ID].
  • Chạy lại Flow 10 Matching Engine cho từng mentee → gán cho leader đang hoạt động mới hoặc vào FIFO Waitlist.
  • Discord offboarding (archive-first pattern):
    • Gọi POST /archive-pod-channel — kênh bị khóa và đổi tên thành archived-pod-[leader_name].
    • Gọi POST /manage-discord-role với action: "REMOVE", role_name: "Pod Leader".
  • Số dư carry: tịch thu Pending_Carry_Balance = $0.00 về Stack General Account (xử lý giống Termination).
  • Gửi email Pod_Reassigned_Notification đến từng mentee bị ảnh hưởng.

Bước C-4. Loại trừ vĩnh viễn trong tương lai

  • Matching Flow 10 lọc theo Status = 'Active' AND Current_Count < Max_Capacity. Bản ghi Permanently_Ineligible tự động bị loại khỏi tất cả các chu kỳ matching trong tương lai.

Luồng thay thế

Alt-1 — Không có Pod Leader nào có thể nhận mentee được phân công lại:

  • Flow 10 không trả kết quả (tất cả leader đạt Max_Capacity = 7).
  • Mentee vào hàng đợi FIFO Pod_Waitlist. Email Pod_Waitlist_Notification được gửi.
  • Đóng băng SLA Plan_Due: Khi mentee vào Pod_Waitlist, mốc thời gian Plan_Due (thời hạn nộp kế hoạch giao dịch 72 giờ) bị tạm dừng. Đồng hồ 72 giờ reset và chỉ bắt đầu chạy lại sau khi hệ thống ghép thành công mentee với Pod Leader mới. Mentee không thể nộp kế hoạch giao dịch khi chưa có mentor được phân công.
  • Mentee quay lại hàng đợi matching khi Current_Count giảm (trigger Flow 11).

Alt-2 — Pod Leader bị suspended (không phải terminated) — xử lý Pending_Carry_Balance:

  • Pending_Carry_Balance bị đóng băng (tạm giữ) — KHÔNG bị tịch thu. Số dư được giữ nguyên trong database.
  • Vesting tiếp tục khi trạng thái leader trở về Active.
  • Tịch thu vào Stack General Account chỉ áp dụng khi Termination vĩnh viễn (Bước A-6).

Alt-3 — Suspension do Defense: tái kích hoạt sau PIP:

  • Sau khi Flow 4B đặt Pod_Leader_Registry.Status = 'Suspended', trader vào giai đoạn PIP 60 ngày (stagnation_deadline = Today + 60 Days theo CR-64).
  • Trong PIP: Pending_Carry_Balance bị đóng băng (BR_8.2.9.3), trader không đủ điều kiện tham gia mọi hoạt động pod (không thể đăng ký hoặc được ghép là Pod Leader).
  • Nếu trader vượt qua PIP: tái kích hoạt theo Flow 15B (UC_8.2.10) — Pod Leader Opt-In & Provisioning. stagnation_deadline reset về Today + 90 Days khi tái kích hoạt.
  • Nếu trader trượt PIP (bị terminated): Pending_Carry_Balance bị tịch thu theo BR_8.2.9.3.

Luồng ngoại lệ

Exc-1 — discord_user_id là NULL khi gọi POST /manage-discord-role:

  • Middleware ghi log mã cảnh báo DISCORD_USER_NOT_LINKED, bỏ qua lời gọi Discord API và trả 200 OK cho Zapier.
  • Tự động hóa Zapier KHÔNG bị crash. Cập nhật DB và registry diễn ra bình thường.

Exc-2 — POST /archive-pod-channel thất bại:

  • Thử lại nội bộ: Middleware thử lại tối đa 3× với Exponential Backoff khi gặp HTTP 429, HTTP 404, hoặc Timeout.
  • Sau 3 lần thất bại: Ghi log vào bps_audit_logs với severity = WARN. Đặt channel_url = NULL trong Pod_Leader_Registry — trạng thái pod được xóa bất kể kết quả Discord. Slack alert đến #dev_ops. Middleware trả HTTP 200 OK với thông tin cảnh báo.
  • Hành vi Zapier: Nhận 200 OK → tiếp tục không chặn sang bước tiếp theo (phân công lại mentee).

Exc-3 — Payload Trigger B thiếu trường bắt buộc:

  • Middleware validate trước khi kích hoạt webhook. Trả 400 Bad Request. Zapier flow không được kích hoạt. Bản ghi audit log được ghi bởi Middleware.

Đặc tả Quản lý Truy cập & Role Discord

Phần này tổng hợp toàn bộ đặc tả tích hợp Discord cho Flow 15A (phân công lại) và Flow 15C (offboarding). Đây là tham chiếu chính thức cho tất cả lời gọi Discord API được kích hoạt bởi thay đổi trạng thái Pod Leader.

A. Hành động Offboarding cho Leader bị Terminated / Suspended

Hành độngSuspensionTermination (Flow 7 / Flow 15C)
POST /manage-discord-role — REMOVE role "Pod Leader"✅✅
POST /archive-pod-channel✅✅
POST /discord/revoke-all-roles (toàn bộ Title + Pod + Special roles)❌ Bỏ qua✅ Bắt buộc

Các bước chi tiết:

  1. Thu hồi role Leader: Gọi POST /manage-discord-role với action: "REMOVE", role_name: "Pod Leader".
  2. Lưu trữ kênh Pod: Gọi POST /archive-pod-channel:
    • Xóa quyền đọc/ghi của tất cả thành viên pod cũ.
    • Đổi tên kênh từ pod-[leader_name] thành archived-pod-[leader_name].
    • Xóa channel_url trong Pod_Leader_Registry.
  3. Full Digital Eviction — chỉ khi Termination: Gọi POST /discord/revoke-all-roles để gỡ toàn bộ Title Roles (Associate / Trader / Senior), Pod Roles, và Special Roles. Tài khoản người dùng vẫn ở lại server với tư cách thành viên thông thường/chưa xác minh với quyền truy cập bị hạn chế. Việc kick/ban do vi phạm phải được Admin thực hiện thủ công — không tự động hóa.

B. Failsafe — discord_user_id là NULL

Nếu discord_user_id IS NULL trong bảng Users khi bất kỳ lời gọi Discord API nào được thực hiện, Middleware PHẢI:

  • Ghi log mã cảnh báo DISCORD_USER_NOT_LINKED.
  • Bỏ qua hoàn toàn lời gọi API.
  • Trả HTTP 200 OK để bảo toàn tính toàn vẹn của luồng thực thi.

Luồng không được crash hay dừng lại do thiếu liên kết Discord.

C. Đồng bộ lại cho Mentee bị phân tán

Khi phân công lại thành công cho Pod Leader mới (qua Flow 10):

  • Thu hồi quyền truy cập của Mentee vào kênh Discord old_pod_id.
  • Cấp quyền truy cập kênh Discord new_pod_id.
  • Đồng bộ các role Mentee liên quan cho pod mới.

(Nguồn: Bổ sung client 2026-10-05 — §3.8 Discord Access & Role Management Specification)

Quy tắc nghiệp vụ

BR_8.2.9.1: Waterfall Matching — Asset Match là bắt buộc (Strict) Khi phân công lại mentee qua logic matching Flow 10, Asset Class (Futures vs. Forex) là bộ lọc cứng — không phải ưu tiên. Trader Futures không thể được gán cho Pod Leader Forex bất kể năng lực.

BR_8.2.9.2: Cooldown — Giới hạn chuyển 30 ngày mỗi trader (Trigger B) + Break-glass Force Override Admin manual re-assignment qua POST /admin-pod-reassignment bị giới hạn cooldown 30 ngày mỗi user_id. Nếu pod_reassignment_date trong 30 ngày, Middleware trả 429 Too Many Requests. Break-glass override: Admin có thể truyền force_override = true để bỏ qua cooldown. Khi cờ này được đặt, Middleware phải: (1) bỏ qua kiểm tra cooldown; (2) ghi bản ghi BPS_Audit_Log bắt buộc đánh dấu override; (3) kích hoạt Slack alert tự động đến kênh Operations với admin_id, reason, transcript_url, và cờ override. Cooldown không áp dụng cho Trigger A (tự động theo hệ thống) hay Trigger C (cờ điều kiện tham gia).

BR_8.2.9.3: Số dư Carry — Đóng băng khi Suspension, Tịch thu khi Termination

  • Suspension: Pending_Carry_Balance bị đóng băng (tạm giữ) — KHÔNG tịch thu. Vesting tiếp tục khi Pod_Leader_Status trở về Active.
  • Termination: Pending_Carry_Balance lập tức bị thanh lý về Stack General Account và reset về $0.00. Không có thời gian ân hạn hay vesting từng phần.

BR_8.2.9.4: Loại bỏ Permanently_Ineligible khỏi Matching Bản ghi Pod_Leader_Registry với Status = 'Permanently_Ineligible' phải bị loại khỏi tất cả truy vấn matching Flow 10. Đây là cờ vĩnh viễn, không thể đảo ngược từ góc nhìn của thuật toán matching.

BR_8.2.9.5: BPS Audit Log bắt buộc cho thao tác Admin Tất cả thao tác Trigger B phải ghi admin_id, reason, và transcript_url vào bảng BPS_Audit_Log. Thao tác không có audit trail đầy đủ là không tuân thủ.

BR_8.2.9.6: Discord Resiliency — NULL user_id không được crash luồng POST /manage-discord-role phải trả 200 OK khi discord_user_id IS NULL trong database PostgreSQL. Middleware Node.js bỏ qua thao tác Discord im lặng. Điều này ngăn tự động hóa Zapier bị crash khi trader chưa liên kết tài khoản Discord.

BR_8.2.9.7: Plan_Due SLA bị đóng băng trong thời gian Pod_Waitlist Khi mentee được đặt vào Pod_Waitlist (không có Pod Leader nào có thể nhận tại thời điểm phân công lại), mốc thời gian Plan_Due (SLA nộp kế hoạch giao dịch 72 giờ) phải bị tạm dừng trong database. Đồng hồ 72 giờ không chạy khi mentee chưa có mentor được phân công. Đồng hồ reset và tiếp tục chỉ sau khi hệ thống ghép thành công mentee với Pod Leader mới.

BR_8.2.9.8: Full Digital Eviction — Chỉ khi Termination Khi Pod Leader bị terminated vĩnh viễn (qua Flow 7 / Flow 15C), Middleware PHẢI gọi POST /discord/revoke-all-roles để gỡ toàn bộ Discord role (Title Roles: Associate / Trader / Senior; Pod Roles; Special Roles), bên cạnh các lời gọi tiêu chuẩn POST /manage-discord-role REMOVE "Pod Leader" và POST /archive-pod-channel. Trình tự ba lời gọi này chỉ dành riêng cho Termination. Suspension chỉ kích hoạt hai lời gọi đầu (xóa role + lưu trữ kênh) — POST /discord/revoke-all-roles bị bỏ qua với leader bị suspended. Tài khoản Discord của người dùng bị terminated KHÔNG tự động bị kick hay ban khỏi server. Người dùng giữ tư cách thành viên thông thường/chưa xác minh. Việc kick hoặc ban yêu cầu Admin thao tác thủ công.

(Nguồn: Bổ sung client 2026-10-05 — §3.8A Full Digital Eviction)

BR_8.2.9.9: Đồng bộ lại Discord cho Mentee khi phân công lại Khi Mentee được phân công lại thành công cho Pod Leader mới qua Flow 10, việc đồng bộ Discord PHẢI: (1) thu hồi quyền truy cập của Mentee vào kênh Discord của pod cũ (old_pod_id); (2) cấp quyền truy cập kênh Discord của pod mới (new_pod_id); (3) đồng bộ các role Mentee liên quan cho pod mới. Việc đồng bộ lại này là một phần của trình tự chuyển giao Flow 15 → Flow 10, không phải bước thủ công riêng.

(Nguồn: Bổ sung client 2026-10-05 — §3.8C Re-Sync for Dispersed Mentees)

BR_8.2.9.10: Luồng Suspension Pod Leader do Defense

Khi Flow 4B (Drawdown Defense Re-Activation) kích hoạt và Users.is_pod_leader == True, trình tự sau là bắt buộc:

  1. 48h Defense Freeze ngay lập tức: Tài khoản bị khóa. Không được phép thực hiện bất kỳ hoạt động giao dịch hay quản lý pod nào.
  2. Ghi trạng thái Suspended: Sau 48h freeze, Middleware đặt Pod_Leader_Registry.Status = 'Suspended'.
  3. Bộ đếm PIP: Users.stagnation_deadline = Today + 60 Days (vô điều kiện — theo CR-64). Trader không đủ điều kiện tham gia mọi hoạt động pod trong suốt 60 ngày PIP.
  4. Giải thể Pod: Cascade Flow 15A Trigger A thực thi — pod bị giải thể, mentee được phân công lại qua Flow 10, Discord offboarding theo archive-first pattern.
  5. Số dư Carry: Pending_Carry_Balance bị đóng băng (KHÔNG tịch thu) theo BR_8.2.9.3 — là Suspension, không phải Termination.
  6. Tái kích hoạt: Nếu trader vượt qua PIP → Flow 15B (UC_8.2.10) tái cấp phép danh tính Pod Leader. Nếu trader trượt PIP (bị Terminated) → Pending_Carry_Balance bị tịch thu.

(Source: CR-64; user spec 2026-10-09 §3 — Drawdown Defense ↔ Pod Mentorship Engine closed-loop spec)

BR_8.2.9.11: Triển khai theo giai đoạn — Trigger A ở Phase 1; Trigger B & C ở Phase 2 (Release 2)

  • Phase 1 (Go-Live): Chỉ Trigger A được triển khai — tự động giải thể Pod, ghép lại mentee qua Flow 10, và lưu trữ Discord role/channel.
  • Phase 2 (Release 2): Trigger B (BPS Admin phân công lại mentee thủ công) và Trigger C (BPS Admin bật cờ Permanent Ineligibility thủ công) được hoãn sang Phase 2 cùng với đợt triển khai BPS Admin Portal. Nguồn (1) "BPS Admin thay đổi trạng thái thủ công" của Trigger A cũng chuyển từ backend script sang giao diện BPS Admin Portal ở Phase 2. Các AC của Trigger B/C (AC-8.2.9-04, -05, -06, -07, -09) thuộc phạm vi kiểm thử Phase 2.
  • Ghi đè thủ công ở Phase 1: Các trường hợp ghi đè thủ công hiếm gặp được xử lý bằng backend script, không qua giao diện BPS Admin.
  • Rào chắn carry đối với Trigger A: Pending_Carry_Balance chỉ bị tịch thu (đặt về $0.00) khi Pod Leader bị Terminated vĩnh viễn (Flow 7 Termination / Flow 15C). Khi Pod Leader bị Suspended tạm thời do Drawdown Defense (Flow 4B), Pod bị giải thể và mentee được phân công lại, nhưng Pending_Carry_Balance bị đóng băng — được giữ trong database cho đến khi leader vượt qua PIP và trở về Active — không bị tịch thu (BR_8.2.9.3).

(Nguồn: Xác nhận client 2026-10-30 — bao gồm rào chắn carry tại Stage 6 Pod Leader sheet Row 10)

Bảng trạng thái — Pod Leader qua chu kỳ Defense

TrườngLeader đang hoạt độngDefense Hit (48h freeze)PIP 60 ngàyVượt PIP + Đăng ký lại
Users.stagnation_deadlineToday + 90d48h lock (tài khoản bị khóa)Today + 60d (CR-64)Today + 90d
Pod_Leader_Registry.StatusActive→ Suspended (sau 48h)SuspendedActive
Pod_Leader_Registry.Current_Count1–70 (pod bị giải thể)00 (hàng chờ mới)
Pod_Leader_Registry.Pending_Carry_BalanceĐang tích lũyĐóng băng — giữ nguyên số dư (không tịch thu)Đóng băng — giữ nguyên số dưGiải phóng — vesting tiếp tục khi trở về Active
Kênh Discordpod-[leader_name]archived-pod-[leader_name]archived-pod-[leader_name]pod-[leader_name] (mới)
Discord RolePod LeaderĐã xóa (archive-first)Đã xóaPod Leader (cấp lại qua Flow 15B)

(Source: user spec 2026-10-09 §5 — Defense ↔ Pod state machine)

Tiêu chí chấp nhận

AC_IDLuồngCho rằngThìLoại
AC-8.2.9-01Trigger APod_Status của Pod Leader được đặt thành Terminated; leader có 3 mentee đang hoạt độngCả 3 mentee được phân công lại qua waterfall Flow 10; Pod_Reassigned_Notification được gửi; Pending_Carry_Balance được thanh lý về Stack General AccountIntegration
AC-8.2.9-02Trigger APod_Status của Pod Leader được đặt thành SuspendedMentee được phân công lại; Pending_Carry_Balance KHÔNG bị tịch thu; Pod_Leader_Status = 'Acting_Cover'Integration
AC-8.2.9-03Trigger A — không có leaderTất cả Pod Leader đạt Current_Count = Max_Capacity khi phân công lạiMentee vào Pod_Waitlist; Pod_Waitlist_Notification được gửiIntegration
AC-8.2.9-04Trigger B (Phase 2)Payload POST /admin-pod-reassignment hợp lệ; pod_reassignment_date là NULLpod_leader_id được cập nhật; pod_reassignment_date = Today; Discord role đồng bộ; Pod_Reassigned_Notification + Slack alert được gửi; audit log được ghiIntegration
AC-8.2.9-05Trigger B — cooldown (Phase 2)pod_reassignment_date trong 30 ngày quaMiddleware trả 429 Too Many Requests; không cập nhật DB; không đồng bộ DiscordIntegration
AC-8.2.9-06Trigger B — thiếu trường (Phase 2)POST /admin-pod-reassignment được gọi thiếu reasonMiddleware trả 400 Bad Request; Zapier webhook không được kích hoạtIntegration
AC-8.2.9-07Trigger C (Phase 2)Ops đặt Status = 'Permanently_Ineligible'Bản ghi bị loại khỏi tất cả truy vấn matching Flow 10 tiếp theoIntegration
AC-8.2.9-08Discord NULLdiscord_user_id IS NULL; POST /manage-discord-role được gọiMiddleware trả 200 OK; không crash; cập nhật DB hoàn tất bình thườngIntegration
AC-8.2.9-09force_override (Phase 2)POST /admin-pod-reassignment với force_override = true; lần chuyển cuối 10 ngày trướcCooldown bị bỏ qua; phân công lại thực thi; bản ghi BPS_Audit_Log được ghi với cờ override; Slack alert kích hoạt đến #ops-itIntegration
AC-8.2.9-10Đóng băng Plan_DueMentee vào Pod_Waitlist trong cascade phân công lạiMốc thời gian Plan_Due bị tạm dừng trong DB; đồng hồ 72 giờ không đếm ngược trong khi mentee ở trên waitlistIntegration
AC-8.2.9-11Đóng băng carry — suspensionTrigger A kích hoạt do Suspension (không phải Termination)Pending_Carry_Balance không thay đổi trong DB (không bị xóa, không bị tịch thu)Integration
AC-8.2.9-12Full Digital EvictionTrigger A kích hoạt do Termination (qua Flow 7 hoặc Flow 15C)POST /manage-discord-role REMOVE "Pod Leader" + POST /archive-pod-channel + POST /discord/revoke-all-roles đều được gọi; toàn bộ Title / Pod / Special roles bị gỡ; người dùng vẫn ở lại server (không bị kick)Integration
AC-8.2.9-13Không eviction khi suspensionTrigger A kích hoạt do SuspensionPOST /discord/revoke-all-roles KHÔNG được gọi; chỉ thực thi xóa role + lưu trữ kênhIntegration
AC-8.2.9-14Đồng bộ lại Discord cho menteeFlow 10 phân công lại thành công một Mentee cho Pod Leader mớiQuyền truy cập kênh old_pod_id của Mentee bị thu hồi; quyền truy cập kênh new_pod_id được cấp; các role Mentee được đồng bộ cho pod mớiIntegration
AC-8.2.9-15Trigger A — luồng Flow 4B DefenseFlow 4B kích hoạt; Users.is_pod_leader == True; leader có 2 mentee đang hoạt độngSau 48h freeze: Pod_Leader_Registry.Status = 'Suspended'; stagnation_deadline = Today + 60d; pod bị giải thể; 2 mentee được phân công lại qua Flow 10; Pending_Carry_Balance bị đóng băng (không tịch thu); Discord archive-first sequence thực thiIntegration
AC-8.2.9-16Cấm hoạt động pod trong PIPPod_Leader_Registry.Status = 'Suspended' qua luồng Defense; trong cửa sổ PIP 60 ngàyTrader bị loại khỏi tất cả luồng đăng ký pod; bị loại khỏi tất cả truy vấn matching Pod Leader Flow 10Integration
AC-8.2.9-17Tái kích hoạt sau vượt qua PIPTrader vượt qua PIP sau khi bị suspended do Defense; đăng ký lại qua Flow 15BPod_Leader_Registry.Status = 'Active'; kênh Discord pod-[leader_name] mới được cấp phép; stagnation_deadline = Today + 90dIntegration

UC_8.2.10 — Luồng 15B: Pod Leader Đăng ký & Cấp phép

TrườngGiá trị
UC_IDUC_8.2.10
Phiên bảnv1.9
Cập nhật lần cuối2026-11-04
BA PiClinh.nguyen34
Danh mụcGIAI ĐOẠN 6: LỘ TRÌNH NGHỀ NGHIỆP & CHUYÊN NGHIỆP HÓA
Mô-đunHệ thống Pod
Chức năngLuồng 15B — Pod Leader Đăng ký & Cấp phép
Tài liệu tham chiếuZapier Integration V7.pdf (§Flow 15B lines 2039–2052; §Table C: Global_Variables Min_Pod_Leader_Level = 7 line 217; §Pod_Leader_Registry lines 777–790 — chỉ là tham chiếu tên gọi, xem ghi chú tại mục Trigger) · RFQ_ Stack Trading Prop Tech V7.pdf (§Create Pod Channel lines 2268–2280; §Manage Discord Role lines 2335–2350)
TrườngGiá trị
Use CasePod Leader Đăng ký & Cấp phép
Mô tảKhi trader đạt Min_Pod_Leader_Level (Level 7) nhấn nút đăng ký trong email Pod_Leader_Invite, luồng này cấp phép danh tính Pod Leader: tạo bản ghi registry, cấp phép tài khoản Google Workspace @stacktrading.com, tạo kênh Discord riêng tư có tên pod-[leader_name], ghi URL kênh vào hồ sơ người dùng, gán Discord role 'Pod Leader', và gửi email chào mừng kèm link Typeform thiết lập hồ sơ bắt buộc.
Zapier FlowFlow 15B (Pod Leader Opt-In & Provisioning)
Zapier TablePod_Leader_Registry (bảng PostgreSQL native) · Table C: Min_Pod_Leader_Level
3rd PartyGoogle Workspace Admin Directory API · Discord Bot API · AWS SES

Trigger

Sự kiện: Webhook nhận được từ nút nhấn đăng ký trong email Pod_Leader_Invite.

Email Pod_Leader_Invite được gửi phía trước bởi Flow 6 (L6 Transition / UC_8.1) khi New_Level của trader đạt Min_Pod_Leader_Level = 7 (lấy từ Table C: Global_Variables).

Ghi chú PostgreSQL-native: Pod_Leader_Registry ("Table E" trong tài liệu đặc tả Zapier gốc) được xây dựng native trên PostgreSQL làm nguồn dữ liệu chuẩn duy nhất — KHÔNG phải là Zapier Table live. Tên "Table E" chỉ được giữ lại trong các trích dẫn nguồn như một quy ước đặt tên/tham chiếu chéo đến mục RFQ gốc. (Nhắc lại POD-JOIN-02.)

Điều kiện tiên quyết

IDĐiều kiện tiên quyết
P1Trader đã nhận được email Pod_Leader_Invite (gửi bởi Flow 6 khi New_Level = Min_Pod_Leader_Level)
P2Trader nhấn nút đăng ký một lần trong email, kích hoạt webhook đến Zapier
P3Min_Pod_Leader_Level = 7 (lấy từ Table C — không được hardcode)

Hậu điều kiện

#Hậu điều kiện
1user_id và leader_name của trader được chèn vào Pod_Leader_Registry với Status = 'Active', Current_Count = 0, Pending_Carry_Balance = $0.00
2Tài khoản Google Workspace @stacktrading.com được cấp phép; changePasswordAtNextLogin: true; MFA cấp OU được áp dụng qua orgUnitPath = /Pod Leaders
3google_workspace_email được ghi vào bảng Users và Pod_Leader_Registry
4Kênh Discord text và voice riêng tư được tạo, đặt tên pod-[leader_name]
5channel_url được ghi vào bản ghi SQL của trader
6Discord role 'Pod Leader' được gán cho trader
7Email Pod_Leader_Welcome được gửi đến trader (email cá nhân — bao gồm link kích hoạt Workspace + URL kênh Discord + link Typeform thiết lập hồ sơ bắt buộc)
8(Sau khi submit Typeform) Trading_Style được ghi vào Pod_Leader_Registry; Is_Profile_Complete = TRUE; Pod Leader trở nên hiển thị với Flow 10 Matching Engine

Luồng cơ bản

Bước 1. Nhận Webhook

  • Zapier bắt webhook đăng ký từ nút trong email Pod_Leader_Invite.
  • Đăng ký chỉ là một lần nhấn nút — không hiển thị form nào và không thu thập dữ liệu hồ sơ ở bước này. Trading_Style chỉ được thu thập bởi Typeform ở Bước 7.1; Asset_Class không bao giờ được chọn (kế thừa từ Users.asset_class ở Bước 2).
  • Payload chứa: user_id, leader_name.

Bước 2. Chèn vào Pod_Leader_Registry

  • Chèn bản ghi vào Pod_Leader_Registry (bảng PostgreSQL native) qua SQL SELECT-INSERT để kế thừa asset_class trực tiếp từ bảng Users:
    • Leader_ID = user_id
    • Leader_Name = leader_name
    • Asset_Class — kế thừa từ Users.asset_class (KHÔNG phải từ form nhập)
    • Trading_Style = NULL — chỉ được ghi ở Bước 7.1 (Typeform)
    • Is_Profile_Complete = FALSE
    • Status = 'Active'
    • Current_Count = 0
    • Pending_Carry_Balance = $0.00
    • Max_Capacity = 7 (từ Table C Pod_Max_Capacity)
    • google_workspace_email — được ghi tại đây sau khi Bước 3 hoàn tất (hoặc được cập nhật ở Bước 3)

Bước 3. Cấp phép tài khoản Google Workspace

  • Gọi Google Workspace Admin Directory API:
    • Endpoint: POST /admin/directory/v1/users
    • Trường quan trọng: primaryEmail = [firstname].[lastname]@stacktrading.com, orgUnitPath: /Pod Leaders, changePasswordAtNextLogin: true
    • Định dạng handle: firstname.lastname@stacktrading.com (chữ thường, không dấu).
    • MFA cấp OU được áp dụng (Google Authenticator bắt buộc trước khi truy cập Workspace).
  • Xử lý email collision (atomic loop): WHILE GET /users/{handle}@stacktrading.com → 200: thêm 1, 2, 3, ... cho đến khi tìm được địa chỉ duy nhất (ví dụ: john.doe1@stacktrading.com). Không dùng suffix user_id hay pattern khác.
  • Khởi tạo Google Standard Invite Flow → link kích hoạt gửi đến user_email cá nhân; không có mật khẩu nào được tạo hoặc lưu trữ bởi Middleware.
  • Ghi DB:
    • UPDATE Users SET google_workspace_email = '{handle}@stacktrading.com'
    • UPDATE Pod_Leader_Registry SET google_workspace_email = '{handle}@stacktrading.com'

Bước 4. Pod_Leader_Registry & Tự động cấp phép Discord — Tạo kênh Discord

  • Gọi POST /create-pod-channel:
    • Input: user_id, leader_name
    • Middleware slug hóa tên kênh trước khi gọi Discord Bot:
      • Chuyển về chữ thường.
      • Thay khoảng trắng bằng dấu gạch ngang.
      • Bỏ toàn bộ dấu tiếng Việt và ký tự đặc biệt.
      • Để tránh trùng tên giữa các leader cùng tên: thêm 4 ký tự đầu của leader_id vào cuối slug. Ví dụ: pod-john-doe-a7b2.
    • Discord Bot tạo kênh text và voice riêng tư với tên đã slug hóa.
    • Đặt quyền cho các thành viên pod được phân công.
    • Quyền truy cập kênh của leader (quyền theo từng người dùng): NẾU discord_user_id IS NOT NULL của leader → Bot cấp cho leader quyền truy cập kênh ngay khi tạo. NẾU discord_user_id IS NULL → kênh vẫn được tạo; quyền truy cập của leader được cấp khi leader chạy /link (BR_8.2.10.11). Quyền truy cập không bao giờ được cấp qua role dùng chung Pod Leader.
    • Trả JSON: { "channel_id": "string", "channel_url": "URL_string" }
  • Zapier chờ phản hồi JSON chứa channel_url.

Bước 5. Ghi channel_url vào hồ sơ người dùng

  • Cập nhật bản ghi SQL của trader: ghi channel_url từ phản hồi Bước 4 vào hồ sơ trader.

Bước 6. Gán Discord Role

  • Gọi POST /manage-discord-role: Input: user_id, add_role = 'Pod Leader'
  • Nếu discord_user_id IS NULL → endpoint trả 200 OK và bỏ qua thao tác (BR_8.2.10.4). Role và quyền truy cập kênh được áp dụng khi leader chạy /link sau đó (BR_8.2.10.11).

Bước 7. Gửi email chào mừng

  • Gửi email Pod_Leader_Welcome đến email cá nhân của trader (user_email — KHÔNG phải @stacktrading.com).
  • Nội dung: bộ chào mừng bao gồm:
    • Handle tài khoản Google Workspace @stacktrading.com.
    • Link kích hoạt Google Workspace (từ Bước 3).
    • URL kênh Discord riêng tư (channel_url).
    • Link truy cập lịch.
    • Link Typeform bắt buộc để thiết lập hồ sơ Trading Style (xem Bước 7.1): https://form.stacktrading.com/mentor-profile-setup?leader_id={{user_id}}&email={{user_email}} (Hidden Fields được tự động chèn để nhận dạng người dùng tự động).

Bước 7.1. Đồng bộ hồ sơ Pod_Leader_Registry — Trading_Style (Typeform Webhook)

  • Trigger: New Entry Submitted từ Typeform được liên kết ở Bước 7.
  • Pod Leader khai báo:
    • Trading_Style — multi-select: Scalping, Day Trading, Swing Trading, Algorithmic Trading (bắt buộc)
    • Asset_Class — chỉ hiển thị để tham khảo (được điền sẵn từ Users.asset_class; read-only; Pod Leader không thể thay đổi)
  • Webhook kích hoạt từ Typeform → Middleware (Zapier Flow 15B.1):
    UPDATE Pod_Leader_Registry
    SET
        Trading_Style       = '{{typeform.trading_style}}',
        Is_Profile_Complete = TRUE,
        Status              = 'Active',
        Updated_At          = NOW()
    WHERE Leader_ID = '{{typeform.leader_id}}';
  • Lưu ý: Asset_Class KHÔNG được ghi từ Typeform — đã được kế thừa từ Users.asset_class khi chèn ở Bước 2.
  • Ảnh hưởng đến Flow 10: Bản ghi Pod_Leader_Registry chỉ hiển thị với Mentee Matching Engine sau khi Is_Profile_Complete = TRUE được ghi. Cho đến khi Bước 7.1 hoàn tất, Pod Leader không được ghép với mentee.
  • Trigger Flow 11 (Waitlist Processor): ngay sau khi Is_Profile_Complete = TRUE được ghi, Middleware kích hoạt Zap Flow 11: Waitlist Processor cho Leader_ID này để lấp các slot trống của pod mới từ Pod_Waitlist (FIFO, cùng Asset_Class). Chính sự kiện này — không phải thao tác chèn registry ở Bước 2 — là sự kiện "new leader" của UC_8.2.8 BR_8.2.8.1 #2.

Luồng ngoại lệ

Exc-1 — POST /create-pod-channel trả lỗi hoặc timeout:

  • channel_url không được trả về. Bước 5 (ghi DB) và Bước 6 (Discord role) không thể tiến hành.
  • Hành vi đã xác nhận (Option A — Retry + Alert): KHÔNG rollback bản ghi Pod_Leader_Registry đã chèn ở Bước 2. Middleware thử lại POST /create-pod-channel 3 lần với exponential backoff. Nếu tất cả retry thất bại → SEV-1 Slack alert đến #ops-it để Ops tạo kênh thủ công và cập nhật channel_url trong DB.
  • Lý do: Flow 15B được trigger bởi nút nhấn trong email — không có UI dashboard đang hoạt động để hiển thị lỗi; rollback DB sẽ để trader trong trạng thái không thể phục hồi.
  • (Nguồn: Xác nhận client 2026-10-07)

Exc-2 — Cấp phép Google Workspace thất bại (Bước 3):

  • Hành vi đã xác nhận (Option A — Tiếp tục): Cho phép luồng tiếp tục các Bước 4–7 (tạo kênh Discord, gán Discord role, gửi email chào mừng đến email cá nhân). Ghi log WORKSPACE_PROVISIONING_FAILED + gửi SEV-2 alert đến #ops-it để Ops cấp phép Workspace thủ công sau.
  • Sau khi Ops cấp phép Workspace thủ công, một log entry là đủ — Middleware không cần gửi email thứ hai. Ops kích hoạt email chào mừng Workspace gốc trực tiếp từ Google Admin console.
  • (Nguồn: Xác nhận client 2026-10-07)

Exc-3 — discord_user_id là NULL khi gọi POST /manage-discord-role:

  • Middleware bỏ qua thao tác Discord và trả 200 OK.
  • Các thao tác ghi DB (Bước 2, 3, và 5) vẫn được commit. Email (Bước 7) vẫn được gửi.

Exc-4 — Đăng ký trùng lặp (trader nhấn nút hai lần):

  • ⚠️ Hành vi idempotency chưa được chỉ định trong nguồn. Giả định BA: kiểm tra Pod_Leader_Registry xem đã có Leader_ID với Status = 'Active' chưa trước khi chèn; bỏ qua nếu đã tồn tại. Hành vi response (200 OK no-op vs 409 Conflict) chờ xác nhận dev.

Quy tắc nghiệp vụ

BR_8.2.10.1: Min_Pod_Leader_Level lấy từ Table C Ngưỡng đủ điều kiện đăng ký Pod Leader là Min_Pod_Leader_Level, đọc từ Table C: Global_Variables. Giá trị hiện tại = 7. Giá trị này không bao giờ được hardcode trong logic ứng dụng — luôn đọc từ Table C để cho phép cấu hình mà không cần deploy code.

BR_8.2.10.2: Đặt tên kênh Discord — Slug hóa + Phòng tránh trùng tên Tên kênh của mỗi Pod Leader phải được tạo bằng cách slug hóa leader_name:

  1. Chuyển về chữ thường.
  2. Thay khoảng trắng bằng dấu gạch ngang.
  3. Bỏ toàn bộ dấu tiếng Việt và ký tự đặc biệt.
  4. Thêm 4 ký tự đầu của leader_id để phòng tránh trùng tên khi hai leader có tên giống nhau (ví dụ: pod-john-doe-a7b2). Việc slug hóa phải được thực thi bởi Middleware trong POST /create-pod-channel trước khi gọi Discord Bot API.

BR_8.2.10.3: Current_Count phải phản ánh số lượng phân công thực tế Pod_Leader_Registry.Current_Count phải được tăng mỗi khi mentee được gán cho leader (qua Flow 10 Bước 4). Khi cấp phép (luồng này), Current_Count được khởi tạo là 0. Độ chính xác của trường này rất quan trọng cho logic fallback năng lực của waterfall matching Flow 10.

BR_8.2.10.4: Discord Resiliency — NULL discord_user_id POST /manage-discord-role phải trả 200 OK khi discord_user_id IS NULL. Luồng không được crash. Các thao tác ghi DB và gửi email diễn ra bất kể.

BR_8.2.10.5: Asset Class phải khớp 100% — Không cho phép Pod Leadership chéo loại tài sản Asset_Class của Pod Leader (Futures hoặc Forex) phải khớp chính xác với loại tài sản của tất cả mentee được gán vào pod. Trader Forex không thể là Pod Leader cho trader Futures, và ngược lại. Tiêu chí matching Flow 10 áp dụng "Asset Match (Strict)" như cổng lọc đầu tiên — năng lực và phong cách chỉ được xem xét sau khi asset class đã được xác nhận.

BR_8.2.10.6: Cấp phép Google Workspace — Regular Pod Leaders Mỗi Regular Pod Leader được cấp phép qua Flow 15B PHẢI nhận tài khoản Google Workspace @stacktrading.com. Tài khoản được tạo dưới orgUnitPath = /Pod Leaders. Chính sách cấp OU áp dụng MFA (Google Authenticator) trước khi bất kỳ truy cập Workspace nào được cấp — Middleware không triển khai logic MFA trực tiếp.

  • Định dạng handle: firstname.lastname@stacktrading.com (chữ thường, không dấu).
  • Xử lý collision: thêm chỉ số tuần tự (1, 2, ...) qua atomic loop (ví dụ: john.doe1@stacktrading.com).
  • Link kích hoạt gửi đến user_email cá nhân qua Google Standard Invite Flow. Không có mật khẩu nào được tạo hoặc lưu trữ bởi Middleware.
  • google_workspace_email được ghi vào cả bảng Users và Pod_Leader_Registry (bảng PostgreSQL native).

BR_8.2.10.7: Kế thừa Asset_Class — Regular Pod Leaders không được chọn lại Regular Pod Leaders (Level 7+) KHÔNG được nhắc chọn Asset_Class ở bất kỳ đâu trong luồng này. Asset_Class được tự động kế thừa từ Users.asset_class khi ghi vào DB (Bước 2) và được hiển thị read-only trên Typeform ở Bước 7.1. Điều này ngăn mismatch giữa loại tài sản giao dịch thực tế của trader và danh tính Pod của họ. Founding Mentors (Flow 1.5) được miễn trừ quy tắc này — họ có thể là nhân viên tuyển dụng bên ngoài không có bản ghi Users.asset_class và vì vậy PHẢI khai báo Asset_Class rõ ràng qua Typeform (UC_8.2.13 Bước 9).

BR_8.2.10.8: Đồng bộ Typeform Profile — Cần xác nhận Trading_Style trước khi Flow 10 Matching Mỗi Regular Pod Leader được cấp phép qua Flow 15B PHẢI hoàn thành thiết lập hồ sơ Typeform (Bước 7.1) trước khi hiển thị với Flow 10 Mentee Matching Engine. Is_Profile_Complete được khởi tạo là FALSE khi chèn ở Bước 2 và chỉ được đặt thành TRUE bởi webhook Typeform. Pod Leaders với Is_Profile_Complete = FALSE bị loại khỏi các truy vấn matching Flow 10. Asset_Class được hiển thị trong Typeform chỉ để tham khảo — read-only và được điền sẵn từ Users.asset_class. Pod Leader không thể thay đổi Asset_Class qua Typeform.

BR_8.2.10.9: Lỗi kênh Discord — Không rollback DB; Thử lại 3× rồi SEV-1 Nếu POST /create-pod-channel thất bại hoặc timeout, bản ghi Pod_Leader_Registry đã chèn ở Bước 2 KHÔNG ĐƯỢC rollback. Middleware thử lại với exponential backoff (3 lần). Nếu tất cả thất bại, kích hoạt SEV-1 alert đến #ops-it để Ops tạo kênh thủ công và cập nhật channel_url trong DB. Flow 15B được trigger bởi nút nhấn trong email — không có dashboard để hiển thị lỗi, rollback DB là ngõ cụt không phục hồi được. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.10.10: Lỗi Google Workspace — Không chặn; Cascade tiếp tục Nếu cấp phép Google Workspace thất bại ở Bước 3, luồng KHÔNG ĐƯỢC dừng lại. Các Bước 4–7 (kênh Discord, Discord role, email chào mừng) tiếp tục bình thường. Ops được thông báo qua SEV-2 alert đến #ops-it và cấp phép Workspace thủ công. Sau khi Ops cấp phép, Ops kích hoạt email chào mừng Workspace gốc từ Google Admin console — Middleware không gửi email thứ hai. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.10.11: Late-Linking — Role Pod Leader + Quyền truy cập kênh riêng khi /link Khi người dùng chạy /link và Pod_Leader_Registry có bản ghi với Leader_ID = user_id VÀ Status NOT IN ('Terminated', 'Permanently_Ineligible'), bot PHẢI (1) gán role Pod Leader và (2) cấp cho người dùng đó quyền truy cập theo từng người dùng vào kênh pod của chính họ (Users.channel_url). Quyền truy cập kênh pod không bao giờ được cấp qua role dùng chung Pod Leader, vì vậy leader không thể xem các pod khác. Cùng quy tắc với UC_8.2.13 BR_8.2.13.27 (Founding Mentors). Chạy cùng với đồng bộ level-title (UC_8.1.1) và đồng bộ Pod Member (UC_8.2.1 A-04). ⚠️ UC_8.1.1 (handler /link, BA owner Huyen Dinh) chưa được cập nhật nhánh này. (Nguồn: QnA_Level_Promotion §3.3 nguyên tắc late-linking, 2026-09-30; Quyết định BA 2026-10-30 — quyền truy cập kênh được cấp tại thời điểm link)

Tiêu chí chấp nhận

AC_IDLuồngCho rằngThìLoại
AC-8.2.10-01Luồng cơ bảnTrader nhấn nút đăng ký trong email Pod_Leader_Invite (không có form)Bản ghi registry được tạo với Asset_Class kế thừa từ Users, Trading_Style = NULL, Is_Profile_Complete = FALSE; tài khoản Google Workspace được cấp phép; kênh Discord pod-[leader_name] được tạo; channel_url ghi vào hồ sơ; role 'Pod Leader' được gán; email Pod_Leader_Welcome được gửiIntegration
AC-8.2.10-02Ngưỡng level tối thiểuMin_Pod_Leader_Level trong Table C thay đổi thành 8Email invite không được gửi bởi Flow 6 cho trader Level 7; Flow 15B không bao giờ được kích hoạtIntegration
AC-8.2.10-03discord_user_id NULLdiscord_user_id IS NULL ở Bước 5POST /manage-discord-role trả 200 OK; luồng không crash; ghi DB và email hoàn tấtIntegration
AC-8.2.10-04Ghi channel URLPOST /create-pod-channel trả channel_url hợp lệchannel_url ghi vào bản ghi SQL của trader; khớp với giá trị trong Pod_Leader_RegistryIntegration
AC-8.2.10-05Slug hóaTên leader là "Nguyễn Văn A"Kênh được tạo là pod-nguyen-van-a-[4chars]; dấu tiếng Việt bị bỏ; khoảng trắng thành dấu gạch ngangIntegration
AC-8.2.10-06Trùng tênHai leader đều tên "John Doe"Mỗi người có kênh riêng: pod-john-doe-a7b2 và pod-john-doe-c3d4 (suffix leader_id khác nhau)Integration
AC-8.2.10-07Ngưỡng asset classTrader Forex (Level 7) đăng ký; chỉ có Pod Leader Futures trong registryTrader Forex không thể được gán vào bất kỳ Pod Leader Futures nào; nằm trong waitlist cho đến khi có leader ForexIntegration
AC-8.2.10-08Kế thừa asset classTrader Futures (Level 7) đăng kýPod_Leader_Registry.Asset_Class = 'Futures' kế thừa từ Users.asset_class; không có selector Asset_Class ở bất kỳ đâu — chỉ hiển thị read-only trên Typeform ở Bước 7.1Integration
AC-8.2.10-09Handle WorkspaceTên Pod Leader là "John Doe" và john.doe@stacktrading.com đã tồn tạijohn.doe1@stacktrading.com được cấp phép; link kích hoạt gửi đến email cá nhânIntegration
AC-8.2.10-10Đồng bộ hồ sơ TypeformPod Leader submit Typeform Bước 7.1Pod_Leader_Registry.Trading_Style được ghi; Is_Profile_Complete = TRUE; Pod Leader trở nên hiển thị với Flow 10 Matching EngineIntegration
AC-8.2.10-11Asset_Class chỉ hiển thị trong TypeformPod Leader mở TypeformTrường Asset_Class được điền sẵn và read-only; Pod Leader không thể thay đổiIntegration
AC-8.2.10-12Cổng hiển thị Flow 10Pod Leader được cấp phép nhưng chưa submit TypeformPod Leader KHÔNG hiển thị trong các truy vấn matching Flow 10 (Is_Profile_Complete = FALSE)Integration
AC-8.2.10-13Exc-1 retry Discord channelPOST /create-pod-channel thất bại lần đầu; retry thành công ở lần 2Bản ghi Pod_Leader_Registry không bị rollback; channel được tạo thành công khi retry; luồng tiếp tục bình thườngIntegration
AC-8.2.10-14Exc-2 Workspace không chặnPOST /workspace/provision-account trả lỗi ở Bước 3Các Bước 4–7 tiếp tục bình thường (Discord channel, role, email chào mừng đều hoàn tất); SEV-2 alert gửi tới #ops-it; Ops cấp phép thủ công; Google Admin gửi email chào mừng gốcIntegration
AC-8.2.10-15Quyền truy cập của leader — đã liên kếtLeader có discord_user_id khi đăng kýLeader được cấp quyền truy cập kênh của mình ở Bước 4; role Pod Leader được gán ở Bước 6Integration
AC-8.2.10-16Late-linkingLeader đăng ký khi chưa liên kết, sau đó chạy /linkRole Pod Leader được gán; quyền truy cập kênh của mình được cấp; không nhìn thấy các pod khácIntegration
AC-8.2.10-17Flow 11 khi hoàn tất hồ sơLeader nộp Typeform Bước 7.1; Pod_Waitlist có trader cùng Asset_ClassFlow 11 được kích hoạt cho Leader_ID này; trader cùng loại tài sản chờ lâu nhất trong waitlist được mời. Flow 11 KHÔNG được kích hoạt khi chèn ở Bước 2Integration

§7.1 Chính sách Nghỉ phép & Hiatus cho Regular Pod Leaders (Tích hợp Flow 13)

Tham chiếu chéo: UC_9.2 — Flow 13 (Time-Off Management) quản lý toàn bộ pipeline nghỉ phép. Phần này ghi lại các quy tắc đặc thù cho Pod Leader áp dụng khi Flow 13 xử lý yêu cầu nghỉ phép của Regular Pod Leader (Level 7+).

§7.1.1 Nghỉ phép không thu hồi role Pod Leader

Nghỉ phép hợp lệ được phê duyệt qua Flow 13 KHÔNG hủy role Pod Leader. BPS Admin KHÔNG ĐƯỢC kích hoạt thủ công POST /api/bps/mentor/terminate trong thời gian nghỉ phép đã phê duyệt.

Tất cả tài nguyên Pod được bảo toàn trong trạng thái On_Leave:

Tài nguyênTrong On_LeaveGhi chú
Google Workspace @stacktrading.comHoạt động — bảo toàn quyền truy cậpKhông gọi Google Admin API
Kênh Discord pod-[leader_name]Hoạt động — không lưu trữKhông gọi POST /archive-pod-channel
Discord Role Pod LeaderĐược gán — không bị thu hồiKhông gọi POST /manage-discord-role xóa
Danh sách mentee của Pod (liên kết pod_id)Bảo toàn — pod không bị giải thểKhông phân công lại mentee
Pod_Leader_Registry.Pending_Carry_BalanceTích lũy / vesting — không thay đổiFlow 17 vest bình thường; không bao giờ reset về $0.00

(Nguồn: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-15] client xác nhận 2026-10-30; [POD-XF-18] client sheet 2026-11-04)

§7.1.2 Ma trận trạng thái Pod_Leader_Registry

StatusTrạng thái nghiệp vụTài khoản giao dịchEmail & DiscordPending_Carry_Balance
ActiveĐang làm việc bình thườngActiveHoạt độngTích lũy / vesting bình thường
On_LeaveĐang nghỉ phép được phê duyệt (Flow 13) — bị loại khỏi matching Flow 10LockedHoạt động (bảo toàn)Tích lũy / vesting bình thường
TerminatedBị sa thải / Hard Breach (Flow 15C)DisabledĐã xóa / Thu hồiBị tịch thu ($0.00)

(Nguồn: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-16] client xác nhận 2026-10-30; [POD-XF-18] client sheet 2026-11-04)

§7.1.3 Hành vi số dư Carry trong thời gian nghỉ phép

Pending_Carry_Balance tiếp tục tích lũy và vesting bình thường trong thời gian nghỉ phép được phê duyệt. Lần chạy vest hàng tháng (Flow 17, ngày 1 hàng tháng) PHẢI bao gồm các bản ghi có Pod_Leader_Registry.Status = 'On_Leave' — không đóng băng, không bỏ qua. Carry chỉ bị đóng băng khi bị suspension do Drawdown Defense (UC_8.2.9 BR_8.2.9.3) hoặc bị tịch thu khi Termination (Flow 15C).

(Nguồn: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-18]; QnA_BACKGROUND_MECHANISMS_CRON.md [BG-008] — client sheet 2026-11-04)


UC_8.2.11 — Luồng 15C: Cascade Offboarding khi Pod Leader bị sa thải

TrườngGiá trị
UC_IDUC_8.2.11
Phiên bảnv1.4
Cập nhật lần cuối2026-10-05
BA PiClinh.nguyen34
Danh mụcGIAI ĐOẠN 6: LỘ TRÌNH NGHỀ NGHIỆP & CHUYÊN NGHIỆP HÓA
Mô-đunHệ thống Pod
Chức năngLuồng 15C — Cascade Offboarding khi Pod Leader bị sa thải
Tài liệu tham chiếuZapier Integration V7.pdf (§Flow 15C lines 2053–2070) · RFQ_ Stack Trading Prop Tech V7.pdf (§Terminate Pod Leadership BPS endpoint lines 3004–3023; §Archive Pod Channel lines 2280–2292; §Revoke All Roles lines 2308–2322; §Manage Discord Role lines 2335–2350; §BPS Audit Log lines 2724–2761)
TrườngGiá trị
Use CaseCascade Offboarding khi Pod Leader bị sa thải
Mô tảCascade offboarding đầy đủ về IT và cộng đồng khi Pod Leader bị sa thải qua BPS. BPS Admin gọi /api/bps/mentor/terminate → Middleware thu hồi Discord role, cập nhật registry, xóa số dư carry, ghi audit log, rồi kích hoạt webhook POD_LEADER_TERMINATED → Zapier thực hiện cascade 5 hành động: lưu trữ kênh, xác định mentee, phân công lại mentee, gửi email chào mừng mentor mới + tạo Google Meet link mới, xóa tài khoản Google Workspace.
Zapier FlowFlow 15C (Pod Leader Termination Offboarding Cascade)
Zapier TablePod_Leader_Registry
3rd PartyDiscord Bot API · Google Workspace Admin API · AWS SES
BPS EndpointPOST /api/bps/mentor/terminate

Trigger

Sự kiện: Webhook POD_LEADER_TERMINATED được Zapier nhận, kích hoạt từ BPS Admin endpoint POST /api/bps/mentor/terminate.

BPS endpoint thực hiện các hành động phía server sau trước khi kích hoạt Zapier webhook:

  1. Thu hồi Discord role 'Pod Leader' khỏi Global_User_ID của leader.
  2. Đặt Pod_Leader_Registry.Status = 'Terminated'.
  3. Xóa Pending_Carry_Balance trong DB ledger (các tranche chưa vested bị mất).
  4. Ghi bản ghi vào BPS_Audit_Log (Admin ID, Action, Timestamp, Reason).
  5. Kích hoạt webhook POD_LEADER_TERMINATED đến Zapier để thực hiện phân tán mentee và offboarding IT.

Điều kiện tiên quyết

IDĐiều kiện tiên quyết
P1BPS Admin đã gọi POST /api/bps/mentor/terminate với user_id hợp lệ (Pod Leader)
P2Middleware đã hoàn thành các bước phía server (role bị thu hồi, registry được cập nhật, carry bị xóa, audit được ghi) trước khi kích hoạt webhook
P3Webhook POD_LEADER_TERMINATED được Zapier nhận với pod_id trong payload

Hậu điều kiện

#Hậu điều kiện
1Kênh Discord được lưu trữ: đổi tên thành archived-pod-[leader_name], thu hồi toàn bộ quyền người dùng, xóa channel_url trong registry
2Tất cả mentee đang hoạt động của leader bị sa thải được phân công lại cho Pod Leader khác hoặc vào danh sách chờ
3Email Pod_Reassigned_Notification / chào mừng mentor mới được gửi đến mentee được phân công lại
4Google Meet link định kỳ mới được tạo cho mentee được phân công lại qua Master Calendar
5Tài khoản Google Workspace (@stacktrading.com): bị xóa đối với Regular Pod Leader; bị tạm dừng đối với Founding Mentor trong trường hợp BPS Admin terminate thủ công; bảo toàn đối với Founding Mentor trong trường hợp Hard Breach tự động (Administrative Bypass)
6Pod_Leader_Registry.Status = 'Terminated' (đặt bởi Middleware trước webhook)
7Pending_Carry_Balance = $0.00 (xóa bởi Middleware trước webhook)

Luồng cơ bản

Bước 1. Discord Offboarding

  • Lưu trữ kênh Pod — Gọi POST /archive-pod-channel:
    • Input: pod_leader_id
    • Discord Bot định vị kênh gắn với pod_leader_id, xóa toàn bộ quyền truy cập của người dùng, đổi tên kênh thành archived-pod-[leader_name], xóa channel_url trong SQL Registry.
    • Trả: 200 OK.
  • Full Digital Eviction — Gọi POST /discord/revoke-all-roles:
    • Input: user_id = [terminated_leader_id]
    • Gỡ toàn bộ Title Roles (Associate / Trader / Senior), Pod Roles, và Special Roles khỏi tài khoản Discord của leader bị sa thải.
    • Tài khoản Discord của leader vẫn ở lại server với tư cách thành viên thông thường/chưa xác minh — KHÔNG tự động bị kick hay ban. Trường hợp vi phạm cần Admin thao tác thủ công.
    • Trả: 200 OK.

Bước 2. Xác định Mentee đang hoạt động

  • Truy vấn SQL database để tìm tất cả mentee đang hoạt động có pod_leader_id = [terminated_leader_id].

Bước 3. Phân công lại Mentee

  • Thực hiện logic matching Flow 10 cho mỗi mentee:
    • Waterfall Tiêu chí: 1. Asset Match (Nghiêm ngặt) → 2. Style Match → 3. Fallback: Lowest Current_Count.
    • Nếu tìm được: gán cho Pod Leader mới trong DB; tăng Current_Count của leader mới.
    • Nếu không có (tất cả leader đạt Max_Capacity = 7): đặt mentee vào danh sách chờ FIFO.
  • Đồng bộ lại Discord cho mỗi mentee được phân công lại thành công:
    • Thu hồi quyền truy cập của Mentee vào kênh Discord old_pod_id.
    • Cấp quyền truy cập kênh Discord new_pod_id.
    • Đồng bộ các role Mentee liên quan cho pod mới.

Bước 4. Thông báo Mentee + Tạo Google Meet Link

  • Gửi email chào mừng mentor đến mentee được phân công lại thành công (giới thiệu Pod Leader mới).
  • Tạo Google Meet link định kỳ mới sử dụng Zapier Google Calendar Integration (hành động Zapier gốc):
    • Zapier tạo sự kiện lịch định kỳ.
    • Zapier tự động chèn Google Meet link đã tạo vào payload email.
    • Tự động mời notetaker@stacktrading.com qua Master Calendar.
  • Không có script Google Calendar API tùy chỉnh trong Middleware — bước này được xử lý hoàn toàn bởi tích hợp Zapier Google Calendar gốc để tránh code middleware tùy chỉnh.

Bước 5. Xóa / Tạm dừng tài khoản Google Workspace

  • Thực hiện hành động trên tài khoản Google Workspace dựa trên Role_Flag:

    Regular Pod Leader (Role_Flag != 'Founding_Mentor'):

    • Gọi DELETE /admin/directory/v1/users/{google_workspace_email} để xóa vĩnh viễn tài khoản @stacktrading.com.

    Founding Mentor (Role_Flag = 'Founding_Mentor'):

    • Chỉ Hard Breach tự động: Workspace được bảo toàn. Administrative Bypass bảo vệ Workspace và carry của Founding Mentor ngay cả khi tài khoản giao dịch cá nhân vi phạm.
    • BPS Admin terminate thủ công (POST /api/bps/mentor/terminate): Tài khoản Workspace bị tạm dừng (PUT với suspended: true) hoặc xóa, tùy theo hướng dẫn của admin.
  • Nếu google_workspace_email IS NULL (leader chưa bao giờ được cấp phép Workspace): bỏ qua Bước 5 dưới dạng no-op.

Các hành động Middleware trước Webhook (Thực hiện bởi BPS, KHÔNG phải Zapier)

BướcHành độngNguồn
M-1Thu hồi Discord role 'Pod Leader' khỏi Global_User_IDRFQ_ V7 §Terminate Pod Leadership
M-2Đặt Pod_Leader_Registry.Status = 'Terminated'RFQ_ V7 §Terminate Pod Leadership
M-3Xóa Pending_Carry_Balance trong DB ledger (các tranche chưa vested bị mất)RFQ_ V7 §Terminate Pod Leadership
M-4Ghi bản ghi BPS_Audit_Log (Admin ID, Action, Timestamp, Reason)RFQ_ V7 §Terminate Pod Leadership
M-5Kích hoạt webhook POD_LEADER_TERMINATED đến ZapierRFQ_ V7 §Terminate Pod Leadership

Luồng thay thế

Alt-1 — Không có Pod Leader nào có thể nhận mentee được phân công lại (Bước 3):

  • Tất cả Pod Leader đạt Max_Capacity = 7.
  • Mentee vào hàng đợi FIFO Pod_Waitlist; email Pod_Waitlist_Notification được gửi.
  • Mentee quay lại hàng đợi matching khi Current_Count giảm (trigger Flow 11).

Luồng ngoại lệ

Exc-1 — discord_user_id là NULL khi thao tác Discord được gọi:

  • Middleware ghi log mã cảnh báo DISCORD_USER_NOT_LINKED, bỏ qua lời gọi Discord API và trả 200 OK.
  • Cascade tiếp tục. Luồng không bị crash.
  • Áp dụng cho cả POST /archive-pod-channel và POST /discord/revoke-all-roles.

Exc-2 — POST /archive-pod-channel thất bại (Bước 1):

  • Thử lại nội bộ: Middleware thử lại tối đa 3× với Exponential Backoff khi gặp HTTP 429, HTTP 404, hoặc Timeout.
  • Sau 3 lần thất bại: Ghi log vào bps_audit_logs với severity = WARN. Đặt channel_url = NULL trong Pod_Leader_Registry. Slack alert đến #dev_ops. Middleware trả HTTP 200 OK không chặn.
  • Hành vi Zapier: Nhận 200 OK → tiếp tục không chặn sang Bước 2 (xác định mentee).

Exc-3 — Thao tác trên tài khoản Google Workspace thất bại (Bước 5):

  • Không chặn — lỗi xóa/tạm dừng Workspace KHÔNG ĐƯỢC dừng cascade.
  • Khi thất bại: Ghi log mã lỗi WORKSPACE_DELETION_FAILED kèm đầy đủ stack trace → kích hoạt SEV-2 alert đến Slack #ops-it → đẩy job xóa vào hàng chờ retry async (hoặc Ops xóa thủ công qua Google Admin Console) → cascade tiếp tục.
  • Rủi ro khoảng trống (Window Gap Hazard): Leader vẫn giữ quyền truy cập email @stacktrading.com cho đến khi Ops xử lý xong. Rủi ro thấp — tại thời điểm này leader đã bị gỡ Discord role, quyền truy cập BPS/Dashboard, và kênh pod. Workspace đã được cô lập khỏi toàn bộ dữ liệu Mentee và hoạt động giao dịch.

Exc-4 — Tạo Google Meet link thất bại (Bước 4):

  • Không chặn — lỗi Meet link KHÔNG ĐƯỢC chặn email thông báo cho mentee.
  • Khi thất bại: Gửi email Pod_Reassigned_Notification kèm thông tin Pod Leader mới và ghi chú "Your Google Meet link will be updated on your calendar shortly" → đưa job tạo Meet link vào hàng chờ retry exponential backoff → thông báo Ops nếu hết số lần retry.

Quy tắc nghiệp vụ

BR_8.2.11.1: BPS Endpoint thực hiện các bước Middleware trước Webhook Endpoint POST /api/bps/mentor/terminate không phải là trigger Zapier thuần túy. Nó thực hiện các hành động Middleware (thu hồi role, cập nhật registry, xóa carry, audit log) đồng bộ và chỉ kích hoạt Zapier webhook như bước cuối cùng. Trách nhiệm của Zapier bắt đầu từ Bước 1 của UC này — lưu trữ kênh Discord và phân tán mentee.

BR_8.2.11.2: Mất số dư Carry là ngay lập tức và không thể đảo ngược Khi POST /api/bps/mentor/terminate được gọi, Pending_Carry_Balance bị xóa ngay lập tức trong DB ledger. Các tranche carry chưa vested bị mất vào Stack General Account. Không có thời gian ân hạn hay vesting từng phần khi sa thải.

BR_8.2.11.3: Discord Resiliency — NULL discord_user_id Tất cả Middleware endpoint tương tác Discord phải trả 200 OK khi discord_user_id IS NULL, bỏ qua thao tác im lặng. Điều này ngăn tự động hóa Zapier bị crash khi leader chưa liên kết tài khoản Discord.

BR_8.2.11.4: notetaker@stacktrading.com được tự động mời vào Google Meet Các Google Meet link định kỳ mới được tạo ở Bước 4 phải tự động mời notetaker@stacktrading.com qua Master Calendar. Điều này nhất quán với pattern đã thiết lập trong Flow 10.1B (lên lịch Induction Sync).

BR_8.2.11.5: BPS Audit Log bắt buộc Tất cả thao tác sa thải phải tạo bản ghi BPS_Audit_Log với admin_id, reason, action, và timestamp. Ghi bởi Middleware ở cấp BPS endpoint, trước khi Zapier webhook kích hoạt.

BR_8.2.11.6: Full Digital Eviction — Bắt buộc cho mọi trường hợp sa thải qua Flow 15C Flow 15C chỉ là luồng Termination. Bước 1 PHẢI gọi cả POST /archive-pod-channel VÀ POST /discord/revoke-all-roles. Khác với Flow 15 (UC_8.2.9) có phân nhánh Suspension vs. Termination, Flow 15C không bao giờ xử lý Suspension — Full Digital Eviction (gỡ toàn bộ Title + Pod + Special roles) luôn bắt buộc tại đây. Tài khoản Discord của leader bị sa thải KHÔNG tự động bị xóa khỏi server. Việc kick/ban do vi phạm phải được Admin thực hiện thủ công.

BR_8.2.11.7: Đồng bộ lại Discord cho Mentee khi phân công lại Với mỗi mentee được phân công lại thành công ở Bước 3, quyền truy cập Discord phải được cập nhật: thu hồi quyền truy cập kênh pod cũ, cấp quyền truy cập kênh pod mới, đồng bộ các role Mentee cho pod mới. Việc đồng bộ lại này là một phần của quá trình thực thi Bước 3, không phải bước trì hoãn hay tùy chọn.

BR_8.2.11.8: Thực thi không chặn — Lỗi SaaS bên ngoài không được dừng offboarding cốt lõi Lỗi trong các lời gọi API SaaS bên ngoài (Google Workspace Admin Directory API, Google Calendar API) KHÔNG ĐƯỢC chặn việc thực thi các bước offboarding cốt lõi. Chỉ báo chính của việc sa thải là Pod_Leader_Registry.Pod_Status = 'Terminated' trong PostgreSQL, có hiệu lực ngay lập tức bất kể trạng thái hoàn tất của API bên thứ ba. Các tác vụ cốt lõi (cập nhật trạng thái DB, phân công lại Mentee qua Flow 10, Discord eviction) mang tính giao dịch và phải thành công. Các tác vụ phụ (xóa Workspace, tạo Meet link) chạy trong các khối Try-Catch cô lập — khi thất bại, chúng ghi log, gửi alert, và đưa vào hàng chờ retry async mà không throw lỗi hay hủy cascade.

Tiêu chí chấp nhận

AC_IDLuồngCho rằngThìLoại
AC-8.2.11-01Luồng cơ bảnAdmin gọi POST /api/bps/mentor/terminate với user_id hợp lệ (Regular Pod Leader)Kênh Discord được lưu trữ; POST /discord/revoke-all-roles được gọi (toàn bộ Title + Pod + Special roles bị gỡ); leader vẫn ở lại server (không bị kick); tất cả mentee đang hoạt động được phân công lại; email chào mừng được gửi; Meet link mới được tạo; tài khoản Google Workspace @stacktrading.com bị xóa; Pending_Carry_Balance = $0.00; bản ghi BPS_Audit_Log được ghiIntegration
AC-8.2.11-01bLuồng cơ bản — Founding Mentor (BPS terminate)Admin gọi POST /api/bps/mentor/terminate với user_id hợp lệ (Founding Mentor)Cascade giống AC-8.2.11-01 bao gồm POST /discord/revoke-all-roles; tài khoản Workspace bị tạm dừng (không xóa)Integration
AC-8.2.11-01cFounding Mentor Hard Breach (tự động)Tài khoản giao dịch của Founding Mentor kích hoạt luồng Hard Breach tự độngDiscord, Workspace, Carry, Pod KHÔNG bị terminate — Administrative Bypass bảo vệ; Role_Flag = 'Founding_Mentor' chặn offboarding tự độngIntegration
AC-8.2.11-02Mentee trên waitlistTất cả Pod Leader đạt Max_Capacity khi phân công lạiMentee vào danh sách chờ FIFO; Pod_Waitlist_Notification được gửiIntegration
AC-8.2.11-03Mất carryLeader có Pending_Carry_Balance = $500.00 khi bị sa thảiPending_Carry_Balance = $0.00 ngay sau khi gọi endpoint; số dư được ghi vào Stack General AccountIntegration
AC-8.2.11-04Discord NULLdiscord_user_id IS NULL đối với leader bị sa thảiDISCORD_USER_NOT_LINKED được ghi log; tất cả thao tác Discord bị bỏ qua; 200 OK trả về; cascade tiếp tục không crashIntegration
AC-8.2.11-05Audit logSa thải hợp lệ được thực hiệnBản ghi BPS_Audit_Log có admin_id, action = 'Terminate Pod Leadership', timestamp, reasonIntegration
AC-8.2.11-06Google MeetBước 4 tạo Meet link mớinotetaker@stacktrading.com được tự động mời vào mỗi link định kỳ mớiIntegration
AC-8.2.11-07Đồng bộ lại Discord cho menteeBước 3 phân công lại thành công một Mentee cho Pod Leader mớiQuyền truy cập kênh old_pod_id của Mentee bị thu hồi; quyền truy cập kênh new_pod_id được cấp; các role Mentee được đồng bộ cho pod mớiIntegration
AC-8.2.11-08Xóa Workspace thất bại (Exc-3)Google Admin Directory API trả 500 trong Bước 5WORKSPACE_DELETION_FAILED được ghi log; SEV-2 alert gửi tới #ops-it; cascade hoàn tất bình thường (mentee được phân công lại, Discord eviction thực thi, email được gửi); tài khoản @stacktrading.com của leader vẫn tồn tại cho đến khi Ops dọn dẹp thủ côngIntegration
AC-8.2.11-09Tạo Meet link thất bại (Exc-4)Hành động Zapier Google Calendar thất bại trong Bước 4Email Pod_Reassigned_Notification được gửi kèm thông tin Pod Leader mới và ghi chú Meet link đang chờ; job retry được đưa vào hàng chờ; việc gửi email không bị chặnIntegration

UC_8.2.12 — Luồng 17: Chi trả Vesting cho Pod Leader

TrườngGiá trị
UC_IDUC_8.2.12
Phiên bảnv1.7
Cập nhật lần cuối2026-11-05
BA PiClinh.nguyen34
Danh mụcGIAI ĐOẠN 6: LỘ TRÌNH NGHỀ NGHIỆP & CHUYÊN NGHIỆP HÓA
Mô-đunHệ thống Pod
Chức năngLuồng 17 — Chi trả Vesting cho Pod Leader
TrườngGiá trị
Use CaseChi trả Vesting cho Pod Leader
Mô tảVào ngày 1 hàng tháng, Zapier kích hoạt lịch trình gọi POST /process-pod-vesting. Middleware truy vấn tất cả Pod Leader có Pending_Carry_Balance > 0, định tuyến từng khoản thanh toán qua Dots (quốc tế) hoặc Rippling Off-Cycle Payroll API (US W2), ghi lại từng giao dịch trên blockchain qua contract.recordMetric(), đẩy một QuickBooks Online Journal Entry cho mỗi khoản thanh toán định tuyến qua Dots (CHR-139), sau đó xóa số dư đã xử lý. Zapier gửi Slack alert đến Head of Ops và email Pod_Leader_Vesting_Paid đến tất cả leader được xử lý.
Zapier FlowFlow 17 (Pod Leader Vesting Payout)
Zapier TablePod_Leader_Registry (trường Pending_Carry_Balance)
3rd PartyDots API · Rippling Off-Cycle Payroll API · QuickBooks Online API (chỉ các khoản thanh toán định tuyến qua Dots — CHR-139) · Polygon PoS blockchain (Ethers.js) · AWS SES · Slack

Trigger

Sự kiện: Lịch trình — hàng tháng, kích hoạt vào ngày 1 mỗi tháng (00:00:00 UTC).

Zapier chỉ là scheduler trong luồng này. Nó gọi một endpoint duy nhất và chờ phản hồi JSON. Toàn bộ logic batch thực thi bên trong Middleware.

Điều kiện tiên quyết

IDĐiều kiện tiên quyết
P1Lịch trình kích hoạt vào ngày 1 của tháng
P2Ít nhất một Pod Leader có Pending_Carry_Balance > 0 trong Pod_Leader_Registry
P3Middleware có credentials hợp lệ cho Dots API và Rippling API
P4Ví Ethers.js được khởi tạo và contract.recordMetric() khả dụng

Hậu điều kiện

#Hậu điều kiện
1Tất cả Pod Leader có Pending_Carry_Balance > 0 đã nhận khoản thanh toán qua Dots hoặc Rippling
2Mỗi khoản thanh toán đã được ghi trên Polygon PoS blockchain: metric_category = "Pod Leader Vesting", metric_value = "Carry Payout Cleared", receipt_hash = [Dots/Rippling Transaction ID]
3Pending_Carry_Balance = $0.00 cho tất cả leader đã được xử lý
4Slack alert được gửi đến Head of Ops: "Pod Vesting Complete. Processed [processed_count] leaders."
5Email Pod_Leader_Vesting_Paid được gửi đến mảng Pod Leader đã được xử lý

Luồng cơ bản

Bước 1. Lịch trình kích hoạt (Zapier)

  • Trigger lịch trình hàng tháng kích hoạt lúc 00:00:00 UTC vào ngày 1 mỗi tháng. UTC là timezone duy nhất được sử dụng — không phụ thuộc timezone địa phương.
  • Zapier gọi POST /process-pod-vesting với input: cycle_date = Today (Middleware xử lý thành ngày UTC ISO 8601).

Bước 2. Truy vấn Leader đủ điều kiện (Middleware)

  • Middleware truy vấn Pod_Leader_Registry để tìm tất cả bản ghi có Pending_Carry_Balance > 0.
  • Cổng trạng thái:
    • Status = 'Active': đủ điều kiện — tiếp tục định tuyến thanh toán.
    • Status = 'Suspended' (tạm dừng tạm thời, ví dụ Flow 4B Drawdown Defense): bỏ qua — số dư carry bị đóng băng (giữ trong database), không bị tịch thu và không được vest. Flow 17 không được thực hiện bất kỳ khoản thanh toán nào cho leader này. Vesting tiếp tục khi leader vượt qua PIP và trở về Status = 'Active'. (Xác nhận client 2026-10-30; tham chiếu chéo UC_8.2.9 BR_8.2.9.3 / BR_8.2.9.11)
    • Status = 'On_Leave' (nghỉ phép đã được duyệt, Flow 13): đủ điều kiện — xử lý như Active; carry tiếp tục tích lũy và vest trong thời gian nghỉ, tiếp tục định tuyến thanh toán. (Tham chiếu chéo: UC_8.2.10 §7.1.3; QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-18] — client sheet 2026-11-04)
    • Status = 'Terminated' (bị sa thải qua Flow 7 / Flow 15C): không đủ điều kiện — carry chưa vested lập tức bị tịch thu. Đặt Pending_Carry_Balance = $0.00 cho các leader này mà không thực hiện thanh toán nào. Không gọi Dots hay Rippling.
  • Ngưỡng Min_Payout_Threshold: Chỉ áp dụng cho leader đủ điều kiện (không phải Terminated). Nếu Pending_Carry_Balance < $100 (lấy từ Table C: Min_Payout_Threshold), leader bị loại khỏi chu kỳ hiện tại. Số dư của họ không bị xóa — nó được chuyển sang và tích lũy đến lần chạy tiếp theo khi đạt ngưỡng.

Bước 3. Định tuyến thanh toán mỗi Leader (Middleware — vòng lặp)

  • Với mỗi leader đủ điều kiện, đánh giá billing_country, current_level, và compensation_track:
    • Đường A — Dots API: billing_country != 'US' (tất cả level) HOẶC billing_country == 'US' AND current_level < 6. Gọi POST /v2/payouts với payee_id, amount = Pending_Carry_Balance, memo = "Monthly Pod Leader Carry Vesting - [Month/Year]".
    • Đường B — Rippling Off-Cycle Payroll: billing_country == 'US' AND current_level >= 6 AND compensation_track IN ('Standard', 'Flex'). Gọi POST /api/v1/payroll/off-cycle-payruns với employee_id, earning_type = "DISCRETIONARY_BONUS", amount = Pending_Carry_Balance.
      • Vì sao dùng Off-Cycle (không phải payroll thường kỳ): Thưởng carry là khoản thưởng hiệu suất biến đổi được quyết toán vào ngày 1 hàng tháng, độc lập với lịch payroll W-2 cố định. Off-Cycle API chi trả ngay mà không cần chờ kỳ payroll thường kỳ tiếp theo.
      • Vì sao dùng DISCRETIONARY_BONUS: Carry được phân loại là US Supplemental Wages theo quy định của IRS. Rippling tự động áp dụng đúng mức khấu trừ thuế bổ sung — tách biệt với lương thường kỳ giúp tránh xử lý thuế W-2 sai cho nhân viên.

Bước 4. Ghi blockchain (Middleware — trong vòng lặp)

  • Sau khi mỗi lời gọi API thanh toán hoàn tất:
    • Khởi tạo ví Ethers.js.
    • Gọi contract.recordMetric() với:
      • metric_category = "Pod Leader Vesting"
      • metric_value = "[Amount] USD Cleared"
      • receipt_hash = [Dots hoặc Rippling Transaction ID]

Bước 4a. QuickBooks Online Journal Entry (Middleware — trong vòng lặp, chỉ Đường A) — CHR-139

  • Chỉ kích hoạt sau khi Dots API trả transaction ID thành công cho leader.
  • Bút toán riêng lẻ — không gộp: đẩy một QuickBooks Journal Entry riêng cho mỗi Pod Leader / Founding Mentor trong vòng lặp. Không bao giờ gộp nhiều leader vào một Journal Entry.
  • Chỉ Dots: áp dụng cho các khoản thanh toán định tuyến qua Đường A (International Contractors, và US 1099 Contractors / Founding Mentors không thuộc payroll W-2). Với Đường B (US Level 6+ W-2 qua Rippling Off-Cycle Payroll API), bỏ qua việc đẩy QuickBooks — Rippling tự đồng bộ payroll W-2 sang QuickBooks.
  • Ánh xạ tài khoản (số tiền thanh toán tuyệt đối ở cả hai dòng):
PostingTypeAccountAmount
Debit5016 POD Leader Bonus ContractorSố tiền thanh toán tuyệt đối
Credit1102 DOTSSố tiền thanh toán tuyệt đối

(Nguồn: CHR-139; QuickBooks Integration Specification §4.B "Pod Leader Carry/Commission - Flow 17 - Contractors"; Xác nhận client 2026-10-30)

Bước 5. Xóa số dư (Middleware — trong vòng lặp)

  • Đặt Pod_Leader_Registry.Pending_Carry_Balance = $0.00 cho leader đã được xử lý.
  • Đặt Pod_Leader_Registry.last_vesting_payout_at = NOW().
  • Ngăn thanh toán trùng lặp ở chu kỳ tiếp theo.

Bước 6. Trả JSON (Middleware → Zapier)

  • Middleware trả JSON cho Zapier:
    {
      "processed_count": <int>,
      "processed_users": ["email@example.com", ...]
    }
  • Zapier chờ phản hồi này trước khi tiếp tục.

Bước 7. Thông báo Ops (Zapier)

  • Kích hoạt Slack alert đến #finance-ops (Head of Ops):
    • "Monthly Pod Vesting Complete: Processed [X] leaders, Total Paid: $[Y], Polygon Tx: [Hash]"

Bước 8. Thông báo Leader (Zapier)

  • Gửi email Pod_Leader_Vesting_Paid đến mảng email trong processed_users.
  • Nội dung: thông báo xác nhận các khoản carry đã được thanh toán vào kênh ngân hàng.

Tham chiếu tích lũy Carry (Cách Pending_Carry_Balance được tích lũy)

Carry được tích lũy bởi Middleware trong Flow 6 (Level Transition) — được kích hoạt bởi việc thăng level của mentee, không phải level của chính Pod Leader. Khi một Mentee (trader trong Pod) thăng lên level đủ điều kiện, hệ thống ghi có cho Pod Leader trực tiếp quản lý mentee đó như sự ghi nhận cho công tác coaching:

Level mới của MenteeSố tiền Carry cộng vào Pending_Carry_Balance của Pod Leader
Level 3+$250
Level 5+$500
Level 7+$1,500
Level khác (L1, L2, L4, L6, L8+)$0

Carry tích lũy qua tất cả các sự kiện thăng cấp từ tất cả mentee trong pod của leader. Lần chạy thanh toán Flow 17 hàng tháng chi trả toàn bộ Pending_Carry_Balance đã tích lũy và reset về $0.00 sau mỗi chu kỳ.

Ví dụ: Nếu Pod Leader có 3 mentee và trong một tháng Mentee A đạt L3 (+$250) và Mentee B đạt L5 (+$500), Pending_Carry_Balance của leader tăng thêm $750 trước chu kỳ thanh toán tiếp theo.

Luồng ngoại lệ

Exc-1 — Không có leader nào có Pending_Carry_Balance > 0:

  • Middleware trả { "processed_count": 0, "processed_users": [] }.
  • Zapier gửi Slack alert: "Pod Vesting Complete. Processed 0 leaders."
  • Không gửi email (mảng processed_users rỗng).

Exc-2 — Lời gọi Dots hoặc Rippling API thất bại cho một leader cụ thể:

  • Leader thất bại bị bỏ qua cho chu kỳ hiện tại. Vòng lặp tiếp tục sang leader tiếp theo — một lỗi không dừng toàn bộ batch.
  • Pending_Carry_Balance của leader thất bại KHÔNG bị xóa — được bảo toàn và sẽ được đưa vào lần chạy chu kỳ tiếp theo.
  • Một lỗi được kích hoạt đến Slack #ops-treasury: cảnh báo bao gồm leader_id, số tiền, và lỗi API.
  • Tất cả leader khác trong batch được xử lý bình thường.

Exc-3 — Lời gọi blockchain contract.recordMetric() thất bại SAU KHI thanh toán đã được gửi:

  • KHÔNG đảo ngược khoản thanh toán. Giao dịch tiền pháp định là off-chain và đã được quyết toán qua Dots/Rippling. Pending_Carry_Balance vẫn được reset về $0.00 — khôi phục lại sẽ có nguy cơ thanh toán trùng lặp ở chu kỳ tiếp theo.
  • Lưu bản ghi audit cục bộ vào PostgreSQL với Dots/Rippling Transaction ID; đặt trạng thái polygon_tx_hash là PENDING_BLOCKCHAIN_SYNC hoặc FAILED.
  • Đưa payload log blockchain vào hàng chờ retry async với exponential backoff.
  • Gửi Slack alert đến #dev_ops với Leader ID và Payout Transaction ID để Ops/DevOps theo dõi.

Exc-4 — Middleware timeout trước khi trả phản hồi cho Zapier:

  • Zapier tự động retry POST /process-pod-vesting với cùng cycle_date = Today (Zapier Company Tier exponential retry).
  • Ba lớp idempotency phòng tránh thanh toán trùng lặp:
    • Lớp 1 — Bộ lọc trạng thái DB: Middleware truy vấn lại Pending_Carry_Balance > 0. Leader đã được thanh toán trong lần chạy trước có Pending_Carry_Balance = $0.00 và được bỏ qua tự động.
    • Lớp 2 — Khóa idempotency gateway thanh toán: Với mỗi lời gọi thanh toán, Middleware truyền Idempotency-Key: VESTING_{leader_id}_{cycle_date} (ví dụ: VESTING_USR_98765_2026-10-01) cho Dots/Rippling. Nếu khoản thanh toán đã hoàn tất, Dots/Rippling trả HTTP 409 — không có giao dịch mới được tạo.
    • Lớp 3 — Neo blockchain: contract.recordMetric() với receipt_hash = transaction ID gốc cung cấp audit trail on-chain; Ops có thể đối chiếu bất kỳ khoảng trống nào ngay lập tức.

Quy tắc nghiệp vụ

BR_8.2.12.1: Zapier chỉ là Scheduler — Không có logic Middleware trong Zapier Với Flow 17, công việc duy nhất của Zapier là kích hoạt trigger lịch trình và gọi endpoint POST /process-pod-vesting duy nhất. Toàn bộ xử lý batch — truy vấn leader, định tuyến thanh toán, ghi blockchain, xóa số dư — được thực thi bên trong Middleware. Không có vòng lặp Zapier theo từng leader.

BR_8.2.12.2: Định tuyến Chi trả Carry — Dots vs. Rippling Định tuyến thanh toán được xác định bằng cách đánh giá ba trường trong bảng Users: billing_country, current_level, và compensation_track.

Đường A — Dots API (thanh toán một lần):

  • billing_country != 'US' — tất cả leader quốc tế (tất cả level 1–24)
  • HOẶC billing_country == 'US' AND current_level < 6 — contractor junior Mỹ (trước W2)
  • Payload: POST /v2/payouts — payee_id, amount, memo

Đường B — Rippling Off-Cycle Payroll API:

  • billing_country == 'US' AND current_level >= 6 AND compensation_track IN ('Standard', 'Flex')
  • compensation_track được đặt trong quá trình chuyển Level 6 (Flow 6)
  • Payload: POST /api/v1/payroll/off-cycle-payruns — employee_id, earning_type = "DISCRETIONARY_BONUS", amount
  • Lý do dùng Off-Cycle (không phải payroll thường kỳ): Carry là khoản thưởng hiệu suất biến đổi được quyết toán vào ngày 1 hàng tháng, độc lập với lịch payroll W-2 cố định. Off-Cycle API quyết toán ngay mà không cần chờ kỳ payroll thường kỳ tiếp theo.
  • Lý do dùng earning type DISCRETIONARY_BONUS: Carry được xếp vào US Supplemental Wages theo quy định của IRS. Định tuyến qua Off-Cycle API với earning type này giúp Rippling tự động áp dụng đúng mức khấu trừ thuế bổ sung — tách biệt với lương thường kỳ để tránh xử lý thuế W-2 sai cho nhân viên.

Ngưỡng thanh toán tối thiểu: Nếu Pending_Carry_Balance < $100 (Min_Payout_Threshold trong Table C), chu kỳ bị bỏ qua cho leader đó và số dư chuyển sang tháng sau để tránh rò rỉ phí giao dịch.

Founding Mentors (Role_Flag = 'Founding_Mentor'): Tuân theo các quy tắc định tuyến giống hệt Pod Leader thông thường (US vs. quốc tế, theo level). Pending_Carry_Balance của họ tiếp tục vesting bình thường ngay cả khi tài khoản giao dịch cá nhân kích hoạt vi phạm drawdown — vesting carry không bị chặn bởi drawdown defense.

BR_8.2.12.3: Receipt Hash Blockchain = Payout Transaction ID Mỗi khoản thanh toán được xử lý trong chu kỳ vesting phải được ghi trên Polygon PoS blockchain qua contract.recordMetric(). Trường receipt_hash phải được đặt bằng transaction ID Dots hoặc Rippling từ phản hồi API thanh toán. Đây là bằng chứng thanh toán bất biến.

BR_8.2.12.4: Xóa số dư là bắt buộc sau mỗi khoản thanh toán Pending_Carry_Balance phải được đặt về $0.00 cho mỗi leader ngay sau khi khoản thanh toán của họ được xác nhận. Điều này ngăn thanh toán trùng lặp ở chu kỳ hàng tháng tiếp theo. Việc xóa phải xảy ra trong cùng vòng lặp xử lý Middleware với lời gọi thanh toán.

BR_8.2.12.5: Số tiền Carry cố định tại thời điểm tích lũy, không phải tại thời điểm thanh toán Số tiền carry được tích lũy tại thời điểm thăng level của mentee (Flow 6): L3 = $250, L5 = $500, L7 = $1,500. Khoản thanh toán vesting hàng tháng không tính lại các số tiền này — chỉ đơn giản là thanh toán bất kỳ Pending_Carry_Balance tích lũy nào tồn tại tại thời điểm thanh toán. Không có điều chỉnh hồi tố.

BR_8.2.12.6: Thông báo Ops là bắt buộc Slack alert đến Head of Ops phải được kích hoạt sau mỗi lần chạy vesting (dù có hay không có leader được xử lý). Alert phải bao gồm processed_count từ phản hồi Middleware. Đây là cơ chế giám sát Ops cho chu kỳ thanh toán hàng tháng.

BR_8.2.12.7: Min_Payout_Threshold lấy từ Table C — Không được hardcode Số dư carry tối thiểu cần thiết để đủ điều kiện cho chu kỳ thanh toán là Min_Payout_Threshold, đọc từ Table C: Global_Variables. Giá trị hiện tại = $100. Nếu Pending_Carry_Balance < $100 của leader vào ngày 1 của tháng, họ bị bỏ qua — số dư không bị xóa, nó chuyển sang chu kỳ tiếp theo. Giá trị này không bao giờ được hardcode trong Middleware; luôn đọc từ Table C.

BR_8.2.12.8: Lỗi thanh toán — Cách ly vòng lặp, Bảo toàn số dư, Alert đến #ops-treasury Nếu lời gọi Dots hoặc Rippling thất bại cho một leader cụ thể:

  1. Leader thất bại bị bỏ qua; vòng lặp batch tiếp tục sang leader tiếp theo.
  2. Pending_Carry_Balance của leader thất bại KHÔNG bị xóa — tích lũy và được retry ở chu kỳ hàng tháng tiếp theo.
  3. Slack error alert kích hoạt đến #ops-treasury (không phải #ops-it) với leader_id, số tiền, và chi tiết lỗi API.
  4. Các leader còn lại trong batch không bị ảnh hưởng.

BR_8.2.12.9: Leader bị Terminated — Carry bị tịch thu khi kiểm tra chu kỳ, không thực hiện thanh toán Khi bước kiểm tra điều kiện ở Bước 2 gặp leader có Status = 'Terminated' và Pending_Carry_Balance > 0, carry chưa vested lập tức bị tịch thu: Pending_Carry_Balance được đặt về $0.00 mà không gọi Dots hay Rippling. Điều này tương ứng với việc xóa carry ngay lập tức do BPS termination endpoint thực hiện (Flow 15C / UC_8.2.11 M-3), và xử lý bất kỳ số dư còn sót nào có thể đã tích lũy giữa sự kiện sa thải và chu kỳ thanh toán tiếp theo.

BR_8.2.12.10: QuickBooks Journal Entry — Một bút toán cho mỗi khoản thanh toán Dots, bỏ qua Rippling W-2 (CHR-139) POST /process-pod-vesting phải tuân theo ba quy tắc đối với QuickBooks Online:

  1. Bút toán riêng lẻ (không gộp): một Journal Entry riêng cho mỗi Pod Leader / Founding Mentor, được đẩy khi Dots API trả transaction ID thành công. Không bao giờ gộp nhiều leader vào một Journal Entry.
  2. Chỉ Dots (bỏ qua Rippling W-2): Journal Entry chỉ được đẩy cho các khoản thanh toán định tuyến qua Dots API (Đường A). Các khoản thanh toán qua Rippling Off-Cycle Payroll API (Đường B — US Level 6+ W-2) bị bỏ qua, vì Rippling tự đồng bộ payroll W-2 sang QuickBooks.
  3. Ánh xạ tài khoản: Debit 5016 POD Leader Bonus Contractor / Credit 1102 DOTS, cả hai đều bằng số tiền thanh toán tuyệt đối.

(Nguồn: CHR-139; QuickBooks Integration Specification §4.B "Pod Leader Carry/Commission - Flow 17 - Contractors"; Xác nhận client 2026-10-30)

Tiêu chí chấp nhận

AC_IDLuồngCho rằngThìLoại
AC-8.2.12-01Luồng cơ bảnTrigger hàng tháng kích hoạt vào ngày 1; 3 leader có Pending_Carry_Balance > 0Cả 3 leader được thanh toán qua provider đúng (Dots/Rippling); bản ghi blockchain được tạo với receipt_hash = transaction ID; số dư bị xóa; Slack alert gửi với processed_count = 3; email Pod_Leader_Vesting_Paid gửi cho 3 leaderIntegration
AC-8.2.12-02Không có leader đủ điều kiệnTrigger kích hoạt; không có leader nào có Pending_Carry_Balance > 0Middleware trả processed_count = 0; Slack alert: "Processed 0 leaders"; không gửi emailIntegration
AC-8.2.12-03Định tuyến — quốc tếLeader có phân loại non-USThanh toán định tuyến qua Dots APIIntegration
AC-8.2.12-04Định tuyến — US W2Leader có phân loại US W2Thanh toán định tuyến qua Rippling Off-Cycle Payroll APIIntegration
AC-8.2.12-05Ghi blockchainThanh toán leader được xử lýcontract.recordMetric() được gọi với metric_category = "Pod Leader Vesting", metric_value = "[Amount] USD Cleared", receipt_hash = [transaction ID]Integration
AC-8.2.12-06Phòng tránh thanh toán trùngCùng leader được xử lý trong chu kỳ NPending_Carry_Balance = $0.00 ngay sau thanh toán; số dư KHÔNG xuất hiện lại ở chu kỳ N+1 trừ khi carry mới được tích lũyIntegration
AC-8.2.12-07Zapier gọi một lầnFlow 17 thực thiZapier thực hiện đúng 1 lời gọi đến Middleware; không có vòng lặp theo từng leader trong ZapierIntegration
AC-8.2.12-08Min_Payout_Threshold — bỏ quaLeader có Pending_Carry_Balance = $75.00 vào ngày 1 thángLeader bị loại khỏi chu kỳ hiện tại; Pending_Carry_Balance vẫn là $75.00; không thanh toán, không xóa; số dư chuyển sang chu kỳ tiếp theoIntegration
AC-8.2.12-09Min_Payout_Threshold — đủ điều kiệnLeader có Pending_Carry_Balance = $100.00 vào ngày 1 thángLeader được đưa vào chu kỳ; thanh toán được xử lý bình thườngIntegration
AC-8.2.12-10Exc-2 cách ly vòng lặpAPI thanh toán thất bại cho Leader A; Leader B và C trong cùng batchB và C được thanh toán bình thường; A bị bỏ qua; số dư A được bảo toàn; Slack alert đến #ops-treasury với leader_id của A và lỗiIntegration
AC-8.2.12-11Tịch thu khi TerminatedLeader có Status = 'Terminated' và Pending_Carry_Balance = $300 khi chu kỳ chạyPending_Carry_Balance được đặt về $0.00; không gọi Dots/Rippling; số dư không được chi trảIntegration
AC-8.2.12-12Đóng băng khi SuspendedLeader có Status = 'Suspended' và Pending_Carry_Balance = $500Leader bị bỏ qua; Pending_Carry_Balance vẫn là $500 (đóng băng — không bị xóa, không được chi trả, không bị tịch thu); không gọi Dots/Rippling; vesting tiếp tục sau khi vượt qua PIP và trở về ActiveIntegration
AC-8.2.12-13On_Leave vẫn vestLeader có Status = 'On_Leave' và Pending_Carry_Balance = $400 khi chu kỳ chạyLeader được xử lý như Active; khoản thanh toán được gửi qua Dots/Rippling; Pending_Carry_Balance về 0 sau khi chi trảIntegration
AC-8.2.12-14QBO — một JE cho mỗi leader (CHR-139)3 leader được thanh toán qua Dots trong cùng chu kỳ3 QuickBooks Journal Entry riêng biệt được đẩy, mỗi bút toán sau khi transaction ID Dots tương ứng được trả về; không có bút toán gộpIntegration
AC-8.2.12-15QBO — bỏ qua Rippling (CHR-139)Leader là US Level 6+ W-2, được thanh toán qua Rippling Off-Cycle PayrollKhông có QuickBooks Journal Entry nào được đẩy cho leader nàyIntegration
AC-8.2.12-16QBO — ánh xạ tài khoản (CHR-139)Khoản thanh toán Dots $250 thành côngJournal Entry: Debit 5016 POD Leader Bonus Contractor $250 / Credit 1102 DOTS $250Integration
AC-8.2.12-17QBO — Dots thất bại (CHR-139)Lời gọi thanh toán Dots thất bại cho một leader (Exc-2)Không có QuickBooks Journal Entry nào được đẩy cho leader đóIntegration

UC_8.2.13 — Luồng 1.5: Khởi tạo Founding Mentor

TrườngGiá trị
UC_IDUC_8.2.13
Phiên bảnv2.9
Cập nhật lần cuối2026-11-04
BA PiClinh.nguyen34
Danh mụcGIAI ĐOẠN 6: LỘ TRÌNH NGHỀ NGHIỆP & CHUYÊN NGHIỆP HÓA
Mô-đunHệ thống Pod
Chức năngLuồng 1.5 — Khởi tạo Founding Mentor
Tài liệu tham chiếuZapier Integration V7.pdf (§Flow 1.5 lines 1007–1025) · RFQ_ Stack Trading Prop Tech V7.pdf (§Task: Founding Mentor Defense Bypass lines 3141–3145; §Global Entity & Duplicate Check lines 888–889) · Xác nhận client 2026-09-18 (cơ chế Veriff session; spec Google Workspace Admin Directory API + security) · Xác nhận client 2026-09-20 (Signwell thay Rippling; mọi quốc tịch đủ điều kiện; Dots cho payout setup; public checkout qua coupon 100%; quy tắc email collision) · CHR-78 (Flow 1.5 Bước 1–8) · CHR-145 (Bước 9 đồng bộ hồ sơ Typeform + kiểm tra Asset Class / EVAL_L1 tại checkout)
TrườngGiá trị
Use CaseKhởi tạo Founding Mentor
Mô tảLuồng onboarding cho Founding Pod Leader thuộc bất kỳ quốc tịch nào. Được trigger bởi Signwell webhook khi Founding Pod Leader Agreement được ký. Middleware upsert bản ghi người dùng (Role_Flag = 'Founding_Mentor', is_pod_leader = TRUE, contract_pod_leader = 'Signed'), rồi gửi link Veriff KYC trước (smart-gated: bỏ qua nếu identity_status = 'Approved'); sau khi identity_status = 'Approved', gửi link setup payout Dots (smart-gated: bỏ qua nếu payout_status = 'Approved'). Tuần tự KYC → Payouts — giống Stage 3 Live Onboarding — KHÔNG đồng thời. Provisioning gate chờ CẢ HAI trạng thái là 'Approved' trước khi cấp phép tài khoản Google Workspace @stacktrading.com (với changePasswordAtNextLogin: true và MFA cấp OU), tạo coupon Amplify 100% (chỉ EVAL_L1), và gửi email Pod_Founding_Leader_Welcome.
Zapier FlowFlow 1.5 (Founding Mentor Initialization)
3rd PartySignwell (webhook source — thực thi hợp đồng) · Veriff API (smart-gated) · Dots (payout setup — smart-gated) · Google Workspace Admin Directory API · AWS SES

Trigger

Sự kiện: Webhook nhận từ Signwell — loại sự kiện: Document Signed (Founding Pod Leader Agreement).

Rippling không được sử dụng là nền tảng thực thi hợp đồng cho luồng này. Signwell thay thế Rippling cho mục đích ký hợp đồng và trigger webhook. Founding Mentors có thể đến từ bất kỳ quốc gia nào — quốc tịch không phải ràng buộc điều kiện tham gia.

Điều kiện tiên quyết

IDĐiều kiện tiên quyết
P1Founding Pod Leader đã ký tài liệu Founding Pod Leader Agreement trong Signwell
P2Signwell kích hoạt webhook đến Zapier với user_email của người ký trong payload
P3Middleware có credentials hợp lệ cho Veriff API, Google Workspace Admin Directory API, Dots API
P4Chữ ký HMAC-SHA256 trên Signwell webhook được validate trước khi bất kỳ xử lý nào bắt đầu

Hậu điều kiện

#Hậu điều kiện
1Global_User_ID được upsert với Role_Flag = 'Founding_Mentor', is_pod_leader = TRUE, contract_pod_leader = 'Signed'
2Veriff KYC session được tạo và email khởi tạo được gửi (hoặc bỏ qua nếu identity_status = 'Approved')
3Link setup payout Dots được gửi (hoặc bỏ qua nếu payout_status = 'Approved')
4(Sau provisioning gate) Cả identity_status = 'Approved' VÀ payout_status = 'Approved' — gate có thể resolve async (qua webhooks) hoặc đồng bộ (nếu cả hai đã Approved tại thời điểm trigger)
5(Sau provisioning gate) Tài khoản Google Workspace @stacktrading.com được cấp phép; changePasswordAtNextLogin: true; MFA cấp OU được áp dụng
6(Sau provisioning gate) Coupon Amplify 100% được tạo (chỉ EVAL_L1)
7(Sau provisioning gate) Email Pod_Founding_Leader_Welcome được gửi với coupon + link kích hoạt Workspace + link Typeform thiết lập hồ sơ
8Asset_Class và Trading_Style được ghi vào Pod_Leader_Registry sau khi nộp Typeform (Bước 9); Founding Mentor trở nên khả dụng trong Flow 10 Matching Engine
9Role_Flag = 'Founding_Mentor' kích hoạt bypass Drawdown Defense cấp hệ thống (liên tục, phía server)
10(Sau provisioning gate) Kênh Discord text và voice riêng tư được tạo qua POST /create-pod-channel (slug theo BR_8.2.10.2, ví dụ: pod-john-doe-a7b2); channel_url được ghi vào bản ghi SQL của Founding Mentor; role Discord Pod Leader được gán qua POST /manage-discord-role — hoặc, nếu discord_user_id IS NULL, role và quyền truy cập kênh được hoãn đến khi /link (BR_8.2.13.27)
11(Sau provisioning gate) discord_link_token có sẵn (được tạo mới hoặc tái sử dụng) và được đưa vào Pod_Founding_Leader_Welcome, trừ khi discord_user_id đã tồn tại

Luồng cơ bản

Bước 1. Nhận Signwell Webhook [CHR-78]

  • Zapier bắt Signwell webhook: document_completed — Founding Pod Leader Agreement.
  • Payload chứa: user_email của người ký.
  • Middleware validate chữ ký HMAC-SHA256 trước khi xử lý (BR_8.2.13.10).

Bước 2. Upsert Global_User_ID [CHR-78]

  • Truy vấn PostgreSQL để tìm bản ghi hiện có theo user_email.
  • Nếu không có bản ghi: tạo Global_User_ID mới.
  • Upsert bản ghi với:
    • Role_Flag = 'Founding_Mentor'
    • is_pod_leader = TRUE
    • contract_pod_leader = 'Signed'
  • Tất cả trường hiện có (lịch sử giao dịch, trạng thái challenge, v.v.) được bảo toàn — không bao giờ tạo hàng trùng lặp.

Bước 3. Smart Gating — Gửi KYC [CHR-78]

  • Kiểm tra identity_status trên bản ghi đã upsert:
    • Người dùng hoàn toàn mới HOẶC identity_status != 'Approved': Gọi Veriff API POST /v1/sessions → nhận { "sessionId": "string", "verification_url": "URL" }. Gửi email khởi tạo KYC với verification_url. Đặt identity_status = 'Pending'.
    • Trader hiện có với identity_status = 'Approved': Bỏ qua Veriff hoàn toàn — KYC đã được xác minh (smart gate bypass).

Bước 4. Smart Gating — Gửi Payout Dots [CHR-78]

  • Kiểm tra payout_status trên bản ghi đã upsert:
    • payout_status != 'Approved' VÀ dots_payee_id IS NULL: Gửi link setup payout Dots đến user_email để đăng ký ngân hàng + W-9/W-8BEN.
    • payout_status = 'Approved' HOẶC dots_payee_id IS NOT NULL: Bỏ qua Dots — hồ sơ payout đã được cấu hình (smart gate bypass).
  • Bước 3 và 4 độc lập — bypass một phần là hợp lệ (ví dụ: chỉ bypass KYC, hoặc chỉ bypass Dots).

Bước 5. Provisioning Gate [CHR-78]

  • Middleware kiểm tra: identity_status = 'Approved' VÀ payout_status = 'Approved'.
  • Case A — Một hoặc cả hai trạng thái vẫn đang Pending (async): Middleware đăng ký là async webhook listener. Gate mở khi CẢ HAI callback Veriff (identity_status = 'Approved') VÀ callback Dots (payout_status = 'Approved') được nhận. Bước 6–8 không thực thi cho đến khi cả hai được nhận.
  • Case B — Cả hai trạng thái đã Approved (đồng bộ): Gate đánh giá là TRUE ngay lập tức sau khi Bước 3 và 4 hoàn tất (cả hai smart gate bypass đều kích hoạt). Middleware KHÔNG chờ bất kỳ webhook nào — kích hoạt Bước 6–8 ngay lập tức.
  • Chỉ một điều kiện không đủ để trigger provisioning.

Bước 6. Cấp phép tài khoản Google Workspace [CHR-78]

  • Gọi Google Workspace Admin Directory API:
    • Endpoint: POST /admin/directory/v1/users
    • Trường quan trọng: primaryEmail = [firstname].[lastname]@stacktrading.com, orgUnitPath: /Founding Mentors, changePasswordAtNextLogin: true
    • MFA cấp OU được áp dụng (Google Authenticator bắt buộc trước khi truy cập Workspace)
  • Xử lý email collision (atomic loop): WHILE GET /users/{handle}@stacktrading.com → 200: thêm .1, .2, .3, ... cho đến khi tìm được địa chỉ duy nhất.
  • Khởi tạo Google Standard Invite Flow → link kích hoạt gửi đến email cá nhân; không có mật khẩu nào được tạo hoặc lưu trữ bởi Middleware.
  • UPDATE Users SET google_workspace_email = '{handle}@stacktrading.com'

Bước 6.5. Tạo kênh Discord Pod [CHR-78]

  • Gọi Middleware endpoint POST /create-pod-channel với:
    • user_id: Global_User_ID của Founding Mentor
    • leader_name: trích từ google_workspace_email — bỏ hậu tố @stacktrading.com (ví dụ: john.doe@stacktrading.com → john.doe). Ghi leader_name = 'john.doe' vào Pod_Leader_Registry.Leader_Name.
  • Middleware slug hóa tên kênh trước khi gọi Discord Bot — cùng quy tắc với Flow 15B (BR_8.2.10.2):
    • Chuyển về chữ thường; thay khoảng trắng và dấu . bằng dấu gạch ngang; bỏ toàn bộ dấu và ký tự đặc biệt.
    • Thêm 4 ký tự đầu của leader_id vào cuối (ví dụ: john.doe → pod-john-doe-a7b2).
  • Discord Bot tạo kênh text và voice riêng tư với tên đã slug hóa và đặt quyền cho các thành viên pod được phân công.
  • Quyền truy cập kênh của leader (quyền theo từng người dùng): NẾU discord_user_id IS NOT NULL → Bot cấp cho Founding Mentor quyền truy cập kênh ngay khi tạo. NẾU discord_user_id IS NULL → kênh vẫn được tạo; quyền truy cập của leader được cấp khi mentor chạy /link (BR_8.2.13.27). Quyền truy cập không bao giờ được cấp qua role dùng chung Pod Leader.
  • Trả JSON: { "channel_id": "string", "channel_url": "URL_string" }. Zapier chờ phản hồi chứa channel_url.
  • leader_name PHẢI được dẫn xuất từ handle Workspace, KHÔNG phải từ legal_name của Veriff (xem BR_8.2.13.17).
  • Bước này thực thi ngay sau Bước 6 (cấp phép Workspace) và trước Bước 7 (tạo coupon Amplify).
  • Khi thất bại: Thử lại 3× với exponential backoff; không rollback Pod_Leader_Registry; SEV-1 alert nếu tất cả retry thất bại. Bước 7 và 8 vẫn tiếp tục. Xem Exc-5.

Bước 6.6. Ghi channel_url vào hồ sơ người dùng

  • Cập nhật bản ghi SQL người dùng: ghi channel_url từ phản hồi Bước 6.5 vào hồ sơ Founding Mentor.

Bước 6.7. Gán Discord Role

  • Gọi POST /manage-discord-role với user_id, add_role = 'Pod Leader'.
  • Nếu discord_user_id IS NULL → endpoint trả 200 OK và bỏ qua thao tác (BR_8.2.10.4). Luồng tiếp tục.
  • Role và quyền truy cập kênh bị bỏ qua sẽ được áp dụng khi mentor chạy /link sau đó (BR_8.2.13.27).

Bước 7. Tạo coupon Amplify 100% (chỉ EVAL_L1) [CHR-78]

  • Tạo coupon giảm giá 100% Amplify giới hạn cho EVAL_L1 (Associate Track, $650 — không thể áp dụng cho Reset, Accelerated, Advanced, hoặc phí Live).

Bước 7.5. Discord Link Token

  • NẾU discord_user_id IS NOT NULL → bỏ qua; không cần token (đã liên kết).
  • NGƯỢC LẠI NẾU discord_link_token IS NOT NULL (trader hiện có, chưa liên kết) → tái sử dụng token hiện có. KHÔNG tạo lại.
  • NGƯỢC LẠI → tạo UUID, UPDATE Users SET discord_link_token = '{uuid}'.
  • Chạy sau provisioning gate, trước Bước 8. Không bị chặn bởi lỗi ở Bước 6.5.
  • Token không bao giờ bị ghi đè bởi các bước sau, bao gồm checkout [CHR-91] khi mentor sử dụng coupon (BR_8.2.13.28).

Bước 8. Gửi email Pod_Founding_Leader_Welcome [CHR-78]

  • Đến: user_email (email cá nhân — KHÔNG phải @stacktrading.com)
  • Nội dung:
    • Mã coupon Amplify 100%.
    • Link kích hoạt Google Workspace (từ Bước 6).
    • Hướng dẫn onboarding.
    • Link Typeform để thiết lập hồ sơ (xem Bước 9): https://form.stacktrading.com/mentor-profile-setup?leader_id={{user_id}}&email={{user_email}} (Hidden Fields được tự động chèn).
    • Khối Discord (chỉ khi discord_user_id IS NULL): Discord invite URL + hướng dẫn "Join the server and type /link [discord_link_token] in #verify" kèm token từ Bước 7.5.
    • Không bao gồm: Link Veriff KYC (gửi riêng ở Bước 3), bất kỳ mật khẩu Workspace nào.
  • Mentor dùng coupon tại public checkout ($0.00) → Level 0 SIM, vốn khởi điểm tiêu chuẩn. Không cần BPS Admin cấp phép thủ công.

Bước 9. Đồng bộ hồ sơ Pod_Leader_Registry — Asset_Class & Trading_Style (Typeform Webhook) [CHR-145]

  • Trigger: webhook New Entry Submitted từ Typeform được liên kết ở Bước 8 — bất đồng bộ, kích hoạt độc lập sau khi mentor hoàn thành form hồ sơ.
  • Founding Mentor khai báo:
    • Asset_Class — Futures hoặc Forex (bắt buộc; Founding Mentors có thể là nhân viên tuyển dụng bên ngoài không có bản ghi Users.asset_class)
    • Trading_Style — multi-select: Scalping, Day Trading, Swing Trading, Algorithmic Trading
  • Webhook kích hoạt từ Typeform → Middleware (Zapier Flow 1.5.1):
    UPDATE Pod_Leader_Registry
    SET
        Asset_Class         = '{{typeform.asset_class}}',
        Trading_Style       = '{{typeform.trading_style}}',
        Is_Profile_Complete = TRUE,
        Status              = 'Active',
        Updated_At          = NOW()
    WHERE Leader_ID = '{{typeform.leader_id}}';
  • Ảnh hưởng đến Flow 10: Bản ghi Pod_Leader_Registry chỉ hiển thị với Mentee Matching Engine sau khi bước này ghi Asset_Class không null. Cho đến khi Bước 9 hoàn tất, Founding Mentor chưa sẵn sàng nhận phân công mentee.
  • Trigger Flow 11 (Waitlist Processor): ngay sau khi ghi hồ sơ thành công (Status = 'Active' VÀ Is_Profile_Complete = TRUE), Middleware kích hoạt Zap Flow 11: Waitlist Processor cho Leader_ID này để lấp các slot trống (Current_Count < Max_Capacity) từ Pod_Waitlist (FIFO, cùng Asset_Class). Kích hoạt một lần cho mỗi lần nộp Typeform; lần nộp lại không làm Is_Profile_Complete chuyển từ FALSE sang TRUE sẽ không kích hoạt lại. Đây là sự kiện "new leader" của UC_8.2.8 BR_8.2.8.1 #2 đối với Founding Mentors.
  • Ảnh hưởng đến Checkout [CHR-145]: Pod_Leader_Registry.Asset_Class trở thành loại tài sản bắt buộc khi Founding Mentor checkout bằng coupon 100%. Tại checkout Bước 5 (email onBlur), asset_class trong giỏ hàng phải khớp với Pod_Leader_Registry.Asset_Class và product_id trong giỏ hàng phải là EVAL_L1; nếu không, checkout bị chặn và mentor phải chọn lại. Nếu Bước 9 chưa hoàn tất (Asset_Class IS NULL), checkout bị chặn cho đến khi Typeform được nộp. Xem BR_8.2.13.25 / BR_8.2.13.26 (banner BN-18/19/20).

Cấp hệ thống: Founding Mentor Defense Bypass (Liên tục)

Đây không phải là bước Zapier flow — đây là quy tắc bảo vệ phía server liên tục được kích hoạt bởi Role_Flag = 'Founding_Mentor'.

Logic: Bất kỳ Global_User_ID nào có Role_Flag = 'Founding_Mentor' đều được bảo vệ qua biến hệ thống khỏi các trigger tạm dừng tự động (ví dụ: Drawdown Defense) mà nếu không sẽ ảnh hưởng đến trạng thái mentorship của họ.

Sự bảo vệ này tồn tại miễn là Role_Flag = 'Founding_Mentor' được đặt trên bản ghi.

Carry balance trong thời gian tạm dừng: Kịch bản này không áp dụng cho Founding Mentors. Do quy tắc Defense Bypass miễn trừ Founding Mentors khỏi các trigger tạm dừng tự động, Pending_Carry_Balance của họ không bao giờ bị tự động đóng băng bởi Drawdown Defense hay sự kiện DTO/Hiatus. (Lưu ý: Đối với Pod Leaders tiêu chuẩn, Pending_Carry_Balance bị tạm thời đóng băng cho đến khi họ trở lại từ tạm dừng.)

(Source: RFQ_ Stack Trading Prop Tech V7.pdf §Task: Founding Mentor Defense Bypass lines 3141–3145; Xác nhận client 2026-09-30 — carry balance freeze N/A cho Founding Mentors)

§6.1 Quản trị Hiatus & Nghỉ phép (Tích hợp Flow 13)

Tham chiếu chéo: UC_9.2 — Flow 13 (Time-Off Management) quản lý toàn bộ pipeline xử lý nghỉ phép. Phần này ghi lại các quy tắc đặc thù cho Founding Mentor áp dụng khi Flow 13 được kích hoạt cho Founding Mentor.

Nguyên tắc bảo toàn vai trò tuyệt đối

Nghỉ phép tạm thời (DTO hoặc Hiatus qua Flow 13) KHÔNG ĐƯỢC coi là từ bỏ vai trò đối với Founding Mentor. Tất cả đặc quyền quản trị và tài nguyên dưới đây được bảo toàn 100% trong suốt trạng thái On_Leave:

Tài nguyênHành vi trong On_Leave
Tài khoản Google WorkspaceGiữ nguyên — không bị xóa hay tạm dừng
Pod & Mentee assignmentpod_id của Mentee vẫn liên kết với Founding Mentor; không được reassign
Discord channelGiữ nguyên — không bị archive
Discord Role Pod LeaderĐược gán — không bị thu hồi; không gọi POST /manage-discord-role để xóa
Pod_Leader_Registry.Pending_Carry_BalanceTích lũy / vesting — không thay đổi — Flow 17 vest bình thường; không bị tịch thu

Carry trong thời gian nghỉ phép là như nhau đối với Founding Mentor và Pod Leader tiêu chuẩn: không có Pod Leader nào bị đóng băng Pending_Carry_Balance trong thời gian nghỉ phép được phê duyệt — số dư tiếp tục vesting qua Flow 17. (Thay thế cách diễn đạt trước đây, khi bảng ghi "Frozen" còn đoạn văn ghi "exempted entirely".)

(Source: QnA_STAGE6_POD_SYSTEM_FLOW10_11.md [POD-XF-15] client xác nhận 2026-10-30; [POD-XF-18] client sheet 2026-11-04; RFQ_ Stack Trading Prop Tech V7.pdf §Founding Mentor Defense Bypass)

Luồng ngoại lệ

Exc-0 — Nhận webhook document_id trùng lặp (Bước 1):

  • Kiểm tra idempotency: nếu contract_pod_leader = 'Signed' đã tồn tại cho user_email này → HTTP 200 No-Op; cảnh báo được ghi log. Không upsert trùng, không gửi KYC, không provisioning.

Exc-1 — Tạo Veriff session thất bại (Bước 3):

  • POST /v1/sessions trả non-200.
  • 3 lần retry với exponential backoff (30s → 5min → 15min); sau tất cả đều thất bại: HALT — provisioning bị hoãn. SEV-2 → #dev_ops.

Exc-2 — Global_User_ID đã tồn tại với Role_Flag khác (Bước 3):

  • Middleware khớp theo email và áp dụng upsert: Role_Flag = 'Founding_Mentor', is_pod_leader = TRUE, contract_pod_leader = 'Signed'. Tất cả trường khác được bảo toàn trên cùng Global_User_ID — không tạo hàng mới.
  • Sub-case A — tài khoản hiện có là Active_Challenge hoặc Active_DMA: Role_Flag = 'Founding_Mentor' được áp dụng ngay lập tức; tài khoản giao dịch hiện có tiếp tục bình thường. Nếu mentor cố gắng sử dụng coupon 100% Amplify để mua thêm tài khoản tại checkout, hệ thống chặn giao dịch và trả: "You already have an active account."
  • Sub-case B — tài khoản hiện có là Failed hoặc Terminated: Role_Flag = 'Founding_Mentor' được áp dụng. Khi mentor sử dụng coupon 100% tại public checkout với email đã đăng ký, hệ thống lưu trữ lịch sử tài khoản thất bại/terminated trước vào user_account_history, reset số liệu, và cấp phép SIM challenge mới dưới cùng Global_User_ID.

Exc-3 — Cấp phép Google Workspace thất bại (Bước 6):

  • Hành vi đã xác nhận (Option A — Tiếp tục): Cho phép luồng tiếp tục tạo coupon (Bước 7) và gửi email Pod_Founding_Leader_Welcome (Bước 8) đến email cá nhân.
  • Ghi log lỗi; gửi SEV-2 Slack alert đến #ops-it. Ops cấp phép Workspace thủ công sau thông qua Google Admin console — Middleware KHÔNG gửi email chào mừng Workspace thứ hai; Ops kích hoạt email chào mừng gốc từ Google Admin.
  • (Nguồn: Xác nhận client 2026-10-07)

Exc-4 — Tạo coupon Amplify thất bại (Bước 7):

  • Hành vi đã xác nhận (Option A — Giữ email): GIỮ email Pod_Founding_Leader_Welcome — KHÔNG gửi mà thiếu coupon. Gửi coupon mà không có coupon làm phát sinh ticket hỗ trợ.
  • Gửi alert Ops để tạo coupon thủ công; gửi lại email khi coupon sẵn sàng.
  • Coupon Founding Mentor KHÔNG có TTL cứng hoặc ngày hết hạn (khác với coupon retention Flow 7B có thời hạn 10 ngày).
  • (Nguồn: Xác nhận client 2026-10-07)

Exc-5 — Tạo kênh Discord pod thất bại (Bước 6.5):

  • POST /create-pod-channel trả non-200 hoặc connection timeout.
  • channel_url không được trả về → Bước 6.6 (ghi DB) và Bước 6.7 (Discord role) không thể tiến hành.
  • Hành vi (giống UC_8.2.10 Exc-1): KHÔNG rollback bản ghi Pod_Leader_Registry. Middleware thử lại POST /create-pod-channel 3 lần với exponential backoff. Nếu tất cả retry thất bại → ghi log DISCORD_CHANNEL_CREATION_FAILED kèm user_id và leader_name + SEV-1 Slack alert đến #ops-it; Ops tạo kênh thủ công và cập nhật channel_url trong DB (BR_8.2.13.29).
  • Bước 7, 7.5 và 8 vẫn tiếp tục. KHÔNG giữ lại email chào mừng.

Quy tắc nghiệp vụ

BR_8.2.13.1: Veriff sử dụng link dựa trên Session, không phải URL tĩnh Flow 1.5 tạo Veriff session mới qua POST /v1/sessions cho mỗi Founding Mentor. verification_url là duy nhất cho mỗi session và được giới hạn trong sessionId đó. Tuyệt đối không gửi link tĩnh hoặc tái sử dụng — đây là ràng buộc cấp hệ thống của Veriff, nhất quán với Flow 3A (Live Onboarding).

BR_8.2.13.2: Mật khẩu Workspace không bao giờ được gửi qua email Khi cấp phép tài khoản Google Workspace (Bước 6), changePasswordAtNextLogin: true phải được đặt. Middleware không được tạo, lưu trữ, hoặc truyền mật khẩu. Người dùng tự đặt mật khẩu qua Google's Standard Invite Flow khi đăng nhập lần đầu. Quy tắc này áp dụng cho email Pod_Founding_Leader_Welcome và mọi liên lạc trong tương lai.

BR_8.2.13.3: MFA được áp dụng bởi chính sách OU, không phải code ứng dụng SSO/MFA enforcement không được triển khai trong logic ứng dụng Middleware. Nó được áp dụng bởi chính sách Organizational Unit (OU) Google Workspace @stacktrading.com, yêu cầu kích hoạt Google Authenticator / MFA trước khi bất kỳ truy cập Workspace nào được cấp phép. Code ứng dụng chỉ đảm bảo người dùng được tạo trong OU đúng.

BR_8.2.13.4: Role_Flag = 'Founding_Mentor' kích hoạt Defense Bypass vĩnh viễn Đặt Role_Flag = 'Founding_Mentor' trên bản ghi Global_User_ID (Bước 3) không phải là thẩm mỹ — nó kích hoạt sự bảo vệ liên tục, phía server, miễn trừ người dùng khỏi tất cả trigger tạm dừng tự động ảnh hưởng đến trạng thái mentorship (ví dụ: Drawdown Defense). Sự bảo vệ này là cấp hệ thống và tồn tại suốt vòng đời bản ghi.

BR_8.2.13.5: Email chào mừng chỉ chứa Coupon + Link kích hoạt Email Pod_Founding_Leader_Welcome phải chứa chính xác: mã coupon Amplify 100% cho Associate Track, link kích hoạt Google Workspace, hướng dẫn onboarding, link Typeform hồ sơ, và — khi discord_user_id IS NULL — Discord invite URL kèm hướng dẫn /link [discord_link_token]. Không được chứa: bất kỳ mật khẩu Workspace nào, bất kỳ link Veriff KYC nào (link KYC được gửi trong email riêng từ bước Veriff session).

BR_8.2.13.6: Email Workspace Collision — Chỉ số tuần tự Nếu địa chỉ Workspace dẫn xuất [firstname].[lastname]@stacktrading.com đã tồn tại, Middleware phải thêm chỉ số số học tuần tự (ví dụ: john.doe1, john.doe2) cho đến khi tìm được địa chỉ duy nhất. KHÔNG sử dụng suffix user_id hoặc pattern khác.

BR_8.2.13.7: Dots Payout Setup được gửi bởi Middleware — Cùng sequence với Stage 3 Flow 1.5 sử dụng cùng sequence KYC → Payouts như Stage 3 Live Onboarding. Sau khi nhận Signwell webhook, Middleware gửi link setup payout Dots đến Founding Mentor (Bước 4 — smart-gated: bỏ qua nếu payout_status = 'Approved'). Mentor không cần tự onboard Dots độc lập — việc gửi được khởi tạo bởi hệ thống. Rippling không được sử dụng ở bất kỳ điểm nào trong luồng này.

BR_8.2.13.8: Cấp phép tài khoản Trading qua Public Checkout, không phải BPS Admin Founding Mentors không được cấp phép tài khoản giao dịch thủ công qua BPS Admin. Họ phải sử dụng coupon Amplify giảm giá 100% được tạo ở Bước 7 để mua Associate Track qua website public. Họ bắt đầu ở Level 0 trong môi trường SIM với vốn khởi điểm tiêu chuẩn cho tier đã chọn. Không có đường cấp phép đặc biệt nào cho tài khoản giao dịch của Founding Mentors.

BR_8.2.13.9: contract_pod_leader ≠ contract_status — Hai State Machine riêng biệt contract_pod_leader theo dõi Founding Pod Leader Agreement (luồng này) và hợp đồng đăng ký Standard Pod Leader (Flow 15B). contract_status được dành riêng cho Trader ICA được ký trong Flow 3E (Live Onboarding). Đây là các trường độc lập trên bảng Users và không bao giờ được hợp nhất hay tạo alias.

BR_8.2.13.10: Signwell Webhook phải được validate HMAC-SHA256 Middleware phải validate chữ ký HMAC-SHA256 trên mỗi Signwell webhook inbound trước khi bất kỳ xử lý nào bắt đầu (Bước 1). Các yêu cầu không qua validate chữ ký phải bị từ chối với HTTP 400 và không được trigger bất kỳ upsert, gửi KYC, hoặc provisioning nào.

BR_8.2.13.11: Provisioning Gate — Cả KYC và Payout phải được Approved trước Workspace + Coupon Cấp phép Google Workspace (Bước 6) và tạo coupon Amplify + email chào mừng (Bước 7 và 8) không được thực thi cho đến khi CẢ HAI điều kiện sau được đáp ứng trên bản ghi người dùng:

  • identity_status = 'Approved'
  • payout_status = 'Approved'

Case A (async): Nếu một trong hai trạng thái vẫn đang Pending sau Bước 3 và 4, Middleware đăng ký là async webhook listener và kích hoạt provisioning chỉ khi cả hai callback được nhận. Một trạng thái một mình không trigger provisioning.

Case B (đồng bộ): Nếu cả hai trạng thái đã là 'Approved' khi Bước 3 và 4 thực thi (cả hai smart gate bypass đều kích hoạt), gate đánh giá là TRUE ngay lập tức — Middleware không chờ bất kỳ webhook nào và kích hoạt provisioning đồng bộ.

BR_8.2.13.12: Đường downstream sau SIM — Flow 3A Branch C (UC_5.1) Sau khi Founding Mentor hoàn thành provisioning Flow 1.5 và sử dụng coupon 100% để vào môi trường SIM, đường tiếp theo khi qua đánh giá SIM là Flow 3A (UC_5.1) Branch C — Returning Trader. Tại điểm đó cả identity_status = 'Approved' và payout_status = 'Approved' đã được đặt trên bản ghi người dùng (thiết lập trong luồng này). Flow 3A tự nhiên định tuyến Branch C và bỏ qua các bước KYC và gửi Dots — không cần xác minh hoặc bước payout thừa. Middleware không được thêm kiểm tra KYC hoặc Dots bổ sung khi xử lý sự kiện SIM pass của Founding Mentor.

BR_8.2.13.13: Coupon Founding Mentor — Không chuyển nhượng, Không hết hạn, Chỉ EVAL_L1 Coupon Amplify 100% được tạo cho Founding Mentors bị ràng buộc bởi user_email của người nhận (không chuyển nhượng). Coupon chỉ áp dụng cho EVAL_L1 (Associate Track $650) — không áp dụng cho các track khác. Coupon KHÔNG có TTL cứng hoặc ngày hết hạn (khác với coupon retention Flow 7B có thời hạn 10 ngày). Coupon từ Everflow "Viral Reward" có thể chuyển nhượng và hoạt động như gift card — khác biệt với coupon Founding Mentor. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.13.14: Coupon chỉ giao qua Email — Không có Dashboard UI Coupon Founding Mentor được giao qua email Pod_Founding_Leader_Welcome. Không có dashboard UI hoặc module quản lý coupon trong giai đoạn ra mắt Day 1. Founding Mentor phải truy cập email để lấy mã coupon. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.13.15: Lỗi Google Workspace — Không chặn; Cascade tiếp tục đến Bước 7 và 8 Nếu cấp phép Google Workspace thất bại ở Bước 6, luồng KHÔNG ĐƯỢC dừng lại. Bước 7 (tạo coupon Amplify) và Bước 8 (gửi email chào mừng) tiếp tục bình thường. Ops được thông báo qua SEV-2 alert đến #ops-it và cấp phép Workspace thủ công sau. Sau khi Ops cấp phép, Ops kích hoạt email chào mừng Workspace gốc từ Google Admin console — Middleware không gửi email thứ hai. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.13.16: Coupon Amplify thất bại — Giữ email; Không gửi thiếu coupon Nếu POST /amplify/create-coupon thất bại ở Bước 7, email Pod_Founding_Leader_Welcome PHẢI ĐƯỢC GIỮ LẠI — KHÔNG gửi mà thiếu coupon. Lý do: gửi email chào mừng mà không có coupon tạo ra kỳ vọng không thể đáp ứng và phát sinh ticket hỗ trợ. Ops được alert để tạo coupon thủ công; email được gửi lại khi coupon sẵn sàng. (Nguồn: Xác nhận client 2026-10-07)

BR_8.2.13.17: leader_name PHẢI được dẫn xuất từ handle Workspace — KHÔNG phải từ legal_name của Veriff Trích leader_name từ google_workspace_email bằng cách bỏ @stacktrading.com (ví dụ: john.doe@stacktrading.com → john.doe). KHÔNG dùng legal_name của Veriff. Lý do: (1) Discord API chỉ chấp nhận chữ thường ASCII/chữ số/dấu gạch ngang — tên từ Veriff thường chứa dấu/khoảng trắng gây lỗi HTTP 400; (2) vòng lặp xử lý collision của Workspace đảm bảo handle là duy nhất, và tính duy nhất này tự động được leader_name trong Pod_Leader_Registry và Discord kế thừa; (3) danh tính pháp lý (KYC/thuế) được tách biệt khỏi danh tính nghiệp vụ (Discord/Workspace). Slug kênh Discord tuân theo BR_8.2.10.2 (chữ thường, ./khoảng trắng → -, bỏ dấu/ký tự đặc biệt, thêm 4 ký tự đầu của leader_id — ví dụ: pod-john-doe-a7b2). (Nguồn: Bổ sung client 2026-10-19; Quyết định BA 2026-10-29 — slug thống nhất với Flow 15B)

BR_8.2.13.18: Cron dọn dẹp Guest PHẢI loại trừ Founding Mentors [CHR-145] Cron job tự động xóa Guest sau 30 ngày phải bao gồm AND role_flag != 'Founding_Mentor' (hoặc tương đương AND role_flag IS NULL) trong mệnh đề WHERE. Bản ghi Founding Mentor không bao giờ được tự động xóa bởi cron dọn dẹp Guest bất kể thời gian không hoạt động. Lý do: Founding Mentors sử dụng coupon Amplify tại public checkout với tư cách Guest/người dùng ẩn danh trước khi Role_Flag được lan truyền đầy đủ — nếu không có điều kiện loại trừ này, cron có thể xóa các bản ghi Founding Mentor hợp lệ trong khoảng thời gian giữa Signwell trigger và khi hoàn tất checkout. (Nguồn: Xác nhận client 2026-10-22)

BR_8.2.13.19: Promo Code — Phase 1: Chỉ EVAL_L1, không có logic đặc biệt Trong Phase 1, cơ chế validate promo code 1-1 EVAL_L1 hiện có được giữ nguyên cho tất cả Founding Mentors — bao gồm cả Founding Mentor quay lại (Exc-2 Sub-case B). Không viết logic promo code đặc biệt hay tùy chỉnh nào cho luồng này. Áp dụng cho nhiều sản phẩm, coupon dùng được cho reset, và mọi tính linh hoạt khác về promo được hoãn sang Phase 2 (Day 2) để bảo vệ tiến độ ra mắt. Điều này xác nhận phạm vi hiện có của BR_8.2.13.13 — chỉ EVAL_L1, không chuyển nhượng, không hết hạn — mà không bổ sung logic xử lý promo đặc biệt. (Nguồn: Xác nhận client 2026-10-22)

BR_8.2.13.20: Quy tắc thuế $0.00 — Bỏ qua Quaderno API khi số tiền cuối cùng bằng 0 Thuế luôn được tính trên số tiền ròng sau chiết khấu. Khi Final_Amount == 0 (tức là coupon 100% chi trả toàn bộ giá checkout): (1) Tự động đặt Tax = $0.00; (2) KHÔNG gọi API tính thuế Quaderno — bỏ qua hoàn toàn lời gọi API. Không có request Quaderno nào được thực hiện cho đơn hàng $0.00. (Nguồn: Xác nhận client 2026-10-22)

BR_8.2.13.21: Checkout $0.00 — Bỏ qua mọi cổng thanh toán; Ghi nhận nội bộ; Tạo biên nhận PDF trên S3 Khi Final_Amount == 0 sau khi áp dụng coupon Founding Mentor 100%: (1) KHÔNG gửi giao dịch đến bất kỳ bộ xử lý thanh toán nào (NMI, ForumPay, T365, Dusupay, PayRetailers, hoặc bất kỳ cổng nào khác); (2) Ghi nhận giao dịch $0.00 nội bộ trong database hệ thống; (3) Tạo biên nhận PDF $0.00 trên S3 và gửi cho Founding Mentor; (4) Định tuyến trực tiếp đến Flow 1 Account Activation mà không qua bước xác nhận của bộ xử lý thanh toán. Checkout $0.00 không phải là trạng thái lỗi — đây là kết quả hợp lệ, được dự kiến đối với Founding Mentor sử dụng coupon Amplify 100%. (Nguồn: Xác nhận client 2026-10-22)

BR_8.2.13.22: QuickBooks — Loại trừ đơn hàng $0.00 khỏi Journal Entry KHÔNG gửi đơn hàng $0.00 sang QuickBooks. API journal entry của QuickBooks chỉ được kích hoạt khi total_amount > 0. Khi total_amount == 0 (tức là checkout $0.00 của Founding Mentor), bỏ qua hoàn toàn tích hợp QuickBooks — không tạo journal entry, không gọi QBO API. (Nguồn: Xác nhận client 2026-10-22; CHR-139 — QuickBooks logging)

BR_8.2.13.23: Không hard-lock Dashboard trong thời gian SIM Overlay onboarding hard-lock (UC_5.1 BR_5.1.3 / BR_5.1.8) chỉ áp dụng cho Flow 3 (chuyển SIM sang Live sau Passed_Challenge) và Flow 6 (chuyển Level 6). Khi một trader SIM hiện có ở Level 0 được đưa vào Flow 1.5 và identity_status = 'Pending' / payout_status = 'Pending' được đặt, dashboard KHÔNG ĐƯỢC hiển thị overlay chặn cứng. Trader tiếp tục giao dịch tài khoản SIM mà không bị gián đoạn. Cổng: overlay bị ẩn khi Role_Flag = 'Founding_Mentor' và trader vẫn đang ở SIM (bước KYC + Dots ban đầu này). Sau khi Founding Mentor vượt qua SIM (Passed_Challenge → Flow 3A Branch C, BR_8.2.13.12), overlay được hiển thị như bình thường. (Nguồn: Xác nhận client 2026-10-30; UC_5.1 BR_5.1-F1.5.8)

BR_8.2.13.24: Link Veriff KYC và link setup Dots — Chỉ qua Email, không có Banner Dashboard Link Veriff KYC (Bước 2) và link setup payout Dots (Bước 4) chỉ được gửi qua các email onboarding của Flow 1.5. Không xây dựng banner dashboard hay lời nhắc trong ứng dụng mới nào cho Flow 1.5. (Nguồn: Xác nhận client 2026-10-30)

BR_8.2.13.25: Checkout — Kiểm tra hồ sơ & Asset Class của Founding Mentor [CHR-145] Tại checkout Bước 5 (email onBlur, Duplicate Account Check — UC_2.6.2), khi bản ghi Users khớp theo email có Role_Flag = 'Founding_Mentor', kiểm tra này chạy trước các nhánh status tiêu chuẩn: (1) Nếu Pod_Leader_Registry.Asset_Class IS NULL (Typeform Bước 9 chưa được nộp) → HTTP 409 từ POST /capture-lead; không ghi bản ghi Users; nút [Next] bị vô hiệu hóa; banner BN-20. (2) Nếu asset_class trong giỏ hàng (Bước 1) ≠ Pod_Leader_Registry.Asset_Class đã khai báo trong Typeform Bước 9 → HTTP 409; không ghi bản ghi Users; nút [Next] bị vô hiệu hóa; banner BN-18. Mentor phải chọn lại loại tài sản khớp. (3) Khớp → tiếp tục BR_8.2.13.26. Mô phỏng theo UC_2.6.2 BR_2.6.2.11 (BN-16). (Nguồn: CHR-145)

BR_8.2.13.26: Checkout — Gói của Founding Mentor phải là EVAL_L1 [CHR-145] Được đánh giá ngay sau khi BR_8.2.13.25 thông qua. product_id trong giỏ hàng (Bước 2) phải là EVAL_L1 (Associate Track — sản phẩm duy nhất mà coupon Founding Mentor áp dụng, BR_8.2.13.13). Nếu không → HTTP 409 từ POST /capture-lead; không ghi bản ghi Users; nút [Next] bị vô hiệu hóa; banner BN-19. Mentor phải chọn lại Associate Track. Khớp → tiếp tục các nhánh status tiêu chuẩn của Duplicate Account Check. Mô phỏng theo UC_2.6.2 BR_2.6.2.12 (BN-17). ⚠️ UC_2.6.2 (tài liệu checkout, BA owner Huyen Dinh) chưa được cập nhật nhánh này. (Nguồn: CHR-145)

BR_8.2.13.27: Late-Linking — Role Pod Leader + Quyền truy cập kênh riêng khi /link Khi người dùng chạy /link và Pod_Leader_Registry có bản ghi với Leader_ID = user_id VÀ Status NOT IN ('Terminated', 'Permanently_Ineligible'), bot PHẢI (1) gán role Pod Leader và (2) cấp cho người dùng đó quyền truy cập theo từng người dùng vào kênh pod của chính họ (Users.channel_url). Áp dụng cho cả Founding Mentors (Flow 1.5) và Pod Leader thông thường (Flow 15B — BR_8.2.10.11). Chạy cùng với đồng bộ level-title (UC_8.1.1) và đồng bộ Pod Member (UC_8.2.1 A-04). ⚠️ UC_8.1.1 (handler /link, BA owner Huyen Dinh) chưa được cập nhật nhánh này. (Nguồn: QnA_Level_Promotion §3.3 nguyên tắc late-linking, 2026-09-30; Quyết định BA 2026-10-30 — quyền truy cập kênh được cấp tại thời điểm link)

BR_8.2.13.28: Discord Token của Founding Mentor — Được tạo trong Flow 1.5, không bao giờ bị ghi đè Token từ Bước 7.5 là token mà mentor nhận được trong email chào mừng. Bất kỳ bước tạo token nào sau đó (ví dụ: checkout [CHR-91] khi mentor sử dụng coupon) KHÔNG ĐƯỢC ghi đè discord_link_token đã tồn tại. Nếu không, token đã gửi qua email sẽ mất hiệu lực. ⚠️ UC_2.7-2.8 (checkout [CHR-91], BA owner Huyen Dinh) chưa được cập nhật điều kiện bảo vệ này. (Nguồn: Quyết định BA 2026-10-30; QnA [DL-EP-02])

BR_8.2.13.29: Lỗi kênh Discord — Không rollback DB; Thử lại 3× rồi SEV-1 Cùng quy tắc với BR_8.2.10.9. Nếu POST /create-pod-channel thất bại hoặc timeout, bản ghi Pod_Leader_Registry KHÔNG ĐƯỢC rollback. Middleware thử lại với exponential backoff (3 lần); nếu tất cả thất bại, kích hoạt SEV-1 alert đến #ops-it để Ops tạo kênh thủ công và cập nhật channel_url trong DB. Bước 7, 7.5 và 8 không bị chặn. (Nguồn: Quyết định BA 2026-10-29 — thống nhất với Flow 15B)

Mô hình dữ liệu

Bảng Users (các trường liên quan được thêm/cập nhật bởi luồng này)

TrườngKiểuMô tả
Role_FlagVARCHARĐặt thành 'Founding_Mentor' bởi luồng này. Kích hoạt Defense bypass (BR_8.2.13.4).
is_pod_leaderBOOLEANĐặt thành TRUE bởi luồng này.
contract_pod_leaderENUM('Pending', 'Signed', 'Expired')Theo dõi trạng thái ký của Founding Pod Leader Agreement (luồng này). Khác với contract_status (Trader ICA — được đặt bởi Flow 3E). Sử dụng cho cả Founding Mentors (Flow 1.5) và Standard Pod Leaders L7+ (Flow 15B). Đặt thành 'Signed' khi nhận Signwell webhook.
google_workspace_emailVARCHAR(255)Địa chỉ @stacktrading.com được gán bởi Bước 6. Lưu để tham chiếu và offboarding (UC_8.2.11 Bước 5).
channel_urlVARCHARURL kênh Discord pod được trả về bởi POST /create-pod-channel. Được ghi ở Bước 6.6.
discord_link_tokenUUIDĐược tạo mới hoặc tái sử dụng ở Bước 7.5 khi chưa liên kết (BR_8.2.13.28). Bị bot xóa khi /link.

Bảng Pod_Leader_Registry — các trường được ghi bởi luồng này

TrườngGiá trị khi chènThời điểm cập nhật
Leader_IDuser_idĐặt ở Bước 6 (cấp phép Workspace) — thao tác chèn Pod_Leader_Registry được kích hoạt sau khi provisioning gate thông qua
Leader_NameHandle từ google_workspace_email (ví dụ: john.doe)Đặt ở Bước 6.5 — dẫn xuất bằng cách bỏ hậu tố @stacktrading.com; dùng làm nguồn tên kênh Discord
google_workspace_email{handle}@stacktrading.comĐặt ở Bước 6
Status'Active'Đặt ở Bước 9 (đồng bộ Typeform)
Asset_ClassTừ Typeform — 'Futures' | 'Forex'Đặt ở Bước 9
Trading_StyleTừ Typeform — multi-selectĐặt ở Bước 9
Max_Capacity7Đặt khi chèn ở Bước 6
Current_Count0Đặt khi chèn ở Bước 6
Pending_Carry_Balance$0.00Đặt khi chèn ở Bước 6

Tham chiếu API

EndpointPhương thứcInputOutputServerMô tả
POST /v1/sessionsPOSTuser_email + các tham số Veriff session tiêu chuẩn{ "sessionId": "string", "verification_url": "URL" }Veriff APITạo xác minh danh tính dựa trên session. Trả URL trang xác minh hosted duy nhất cho session này.
POST /admin/directory/v1/usersPOSTprimaryEmail, changePasswordAtNextLogin: true, OU assignment200 OK + user objectGoogle Workspace Admin Directory APICấp phép tài khoản Workspace @stacktrading.com. Chính sách OU áp dụng MFA khi đăng nhập đầu tiên.
POST /admin/directory/v1/users/{userKey}/sendWelcomeEmailPOSTuserKey200 OKGoogle Workspace Admin Directory APIKích hoạt Google Standard Invite Flow — gửi link kích hoạt đến email cá nhân của người dùng; không truyền mật khẩu.
POST /create-pod-channelPOSTuser_id, leader_name{ "channel_id": "string", "channel_url": "URL_string" }Middleware / Discord BotTạo kênh Discord text + voice riêng tư (slug theo BR_8.2.10.2). Chỉ cấp quyền truy cập cho leader nếu discord_user_id tồn tại. Trả URL kênh. Được gọi ở Bước 6.5. Thử lại 3× rồi SEV-1 khi thất bại.
POST /manage-discord-rolePOSTuser_id, add_role = 'Pod Leader'200 OKMiddleware / Discord BotGán role Discord Pod Leader. Trả 200 OK và bỏ qua thao tác nếu discord_user_id IS NULL. Được gọi ở Bước 6.7.

Template Email

Template KeyTriggerNgười nhậnNội dung
Email khởi tạo KYCBước 3 — sau khi tạo Veriff sessionFounding Mentorverification_url (Veriff Hosted Verification Page)
Pod_Founding_Leader_WelcomeBước 8 — sau khi cấp phép Workspace + tạo couponFounding MentorMã coupon Amplify 100% + link kích hoạt Google Workspace + link Typeform thiết lập hồ sơ + hướng dẫn onboarding + (nếu chưa liên kết) Discord invite URL và hướng dẫn /link [discord_link_token]

Tiêu chí chấp nhận

AC_IDLuồngCho rằngThìLoại
AC-8.2.13-01Luồng cơ bảnSignWell kích hoạt webhook document_completed (Founding Pod Leader Agreement đã ký)Veriff session được tạo; email KYC với verification_url được gửi; Global_User_ID trong PostgreSQL với Role_Flag = 'Founding_Mentor', is_pod_leader = TRUE, contract_pod_leader = 'Signed'; Workspace được cấp phép; email Pod_Founding_Leader_Welcome được gửi với coupon + link kích hoạtIntegration
AC-8.2.13-02Veriff sessionBước 3 thực thiMỗi Founding Mentor nhận được verification_url duy nhất, có phạm vi session — không tái sử dụng link tĩnh giữa các người dùngIntegration
AC-8.2.13-03Bảo mật mật khẩuBước 6 thực thiTài khoản Workspace được tạo với changePasswordAtNextLogin: true; không có mật khẩu nào trong bất kỳ email nào; người dùng đặt mật khẩu qua Google invite flowIntegration
AC-8.2.13-04MFA enforcementFounding Mentor nhấp link kích hoạtGoogle nhắc đăng ký MFA trước khi truy cập Workspace được cấp; chính sách OU áp dụng Google AuthenticatorIntegration
AC-8.2.13-05Defense bypassRole_Flag = 'Founding_Mentor' được đặtNgười dùng được miễn khỏi các trigger tạm dừng Drawdown Defense tự động ảnh hưởng đến trạng thái mentorshipIntegration
AC-8.2.13-06Nội dung email chào mừngPod_Founding_Leader_Welcome được gửiEmail chứa mã coupon + link kích hoạt + link Typeform (+ khối Discord nếu chưa liên kết); link Veriff KYC KHÔNG có mặt; không có mật khẩu plaintextIntegration
AC-8.2.13-07Người dùng hiện cóuser_email đã có Global_User_IDBản ghi được sửa đổi (không trùng lặp); Role_Flag cập nhật thành 'Founding_Mentor'Integration
AC-8.2.13-08Email collisionjohn.doe@stacktrading.com đã tồn tại khi cấp phép Founding Mentor mớijohn.doe1@stacktrading.com được cấp phép; chỉ số tuần tự tăng cho đến khi tìm được địa chỉ duy nhấtIntegration
AC-8.2.13-09Sử dụng couponEmail Pod_Founding_Leader_Welcome được gửi với coupon 100%Mentor dùng coupon trên website checkout public; tài khoản được tạo ở Level 0 SIM với vốn khởi điểm tiêu chuẩn; không có cấp phép thủ công BPS AdminIntegration
AC-8.2.13-10Exc-2 Sub-case Auser_email đã có tài khoản Active_Challenge hoặc Active_DMA; nhận Signwell webhookRole_Flag cập nhật thành 'Founding_Mentor', is_pod_leader = TRUE, contract_pod_leader = 'Signed' trên bản ghi hiện có; tài khoản giao dịch hiện có tiếp tục; nếu mentor cố mua thêm tài khoản bằng coupon 100%, hệ thống chặn và trả "You already have an active account."Integration
AC-8.2.13-11Exc-2 Sub-case Buser_email có tài khoản Failed hoặc Terminated; nhận Signwell webhook; mentor sau đó dùng coupon 100% tại public checkoutRole_Flag = 'Founding_Mentor' được áp dụng; lịch sử tài khoản trước được lưu vào user_account_history; SIM challenge mới được cấp phép dưới cùng Global_User_IDIntegration
AC-8.2.13-12Smart gate — KYC bypassSignwell webhook nhận cho người dùng có identity_status = 'Approved'Veriff POST /v1/sessions KHÔNG được gọi; email KYC KHÔNG được gửi; luồng tiến thẳng đến kiểm tra Dots smart gateIntegration
AC-8.2.13-13Smart gate — Dots bypass (payout_status)Signwell webhook nhận cho người dùng có payout_status = 'Approved'Link setup Dots KHÔNG được gửi; luồng tiến thẳng đến kiểm tra provisioning gateIntegration
AC-8.2.13-13bSmart gate — Dots bypass (dots_payee_id)Signwell webhook nhận cho người dùng có dots_payee_id IS NOT NULL (hồ sơ payout tồn tại)Link setup Dots KHÔNG được gửi; luồng tiến thẳng đến kiểm tra provisioning gateIntegration
AC-8.2.13-14Provisioning gateidentity_status = 'Approved' nhưng payout_status = 'Pending'Google Workspace KHÔNG được cấp phép; coupon KHÔNG được tạo; Pod_Founding_Leader_Welcome KHÔNG được gửi — gate chưa quaIntegration
AC-8.2.13-15Provisioning gate — qua (async)Cả identity_status = 'Approved' VÀ payout_status = 'Approved' nhận qua webhooksWorkspace được cấp phép; coupon 100% được tạo (chỉ EVAL_L1); Pod_Founding_Leader_Welcome được gửiIntegration
AC-8.2.13-16Provisioning gate — ngay lập tức (đồng bộ)Signwell webhook nhận cho người dùng hiện có đã có cả identity_status = 'Approved' VÀ payout_status = 'Approved' (cả hai smart gate bypass kích hoạt ở Bước 3 và 4)Gate đánh giá là TRUE ngay lập tức; Workspace được cấp phép, coupon được tạo, Pod_Founding_Leader_Welcome được gửi mà không chờ bất kỳ webhook nào; không có email yêu cầu hành động onboarding nào được gửiIntegration
AC-8.2.13-17Đồng bộ hồ sơ Typeform [CHR-145]Founding Mentor nộp Typeform Bước 9Pod_Leader_Registry.Asset_Class và Trading_Style được ghi; Founding Mentor trở nên hiển thị với Flow 10 Matching EngineIntegration
AC-8.2.13-18Asset_Class bắt buộc [CHR-145]Founding Mentor nộp Typeform mà không chọn Asset_ClassValidation form từ chối — Founding Mentor phải khai báo tường minh asset class (không thể kế thừa từ Users — có thể không có bản ghi giao dịch hiện có)Integration
AC-8.2.13-19Exc-3 Workspace không chặnPOST /admin/directory/v1/users trả lỗi ở Bước 6Bước 7 (tạo coupon) và Bước 8 (email chào mừng) tiếp tục bình thường; SEV-2 alert gửi tới #ops-it; Ops cấp phép thủ công; Google Admin gửi email chào mừng Workspace gốcIntegration
AC-8.2.13-20Exc-4 giữ email khi coupon thất bạiPOST /amplify/create-coupon trả lỗi ở Bước 7Email Pod_Founding_Leader_Welcome KHÔNG được gửi; alert Ops để tạo coupon thủ công; email được gửi lại khi coupon sẵn sàngIntegration
AC-8.2.13-21Coupon không chuyển nhượngFounding Mentor cố chuyển coupon sang email khácHệ thống từ chối — coupon bị ràng buộc bởi user_email của người nhận; không thể sử dụng với email khácIntegration
AC-8.2.13-22Coupon chỉ áp dụng EVAL_L1Founding Mentor cố dùng coupon 100% cho track không phải EVAL_L1Hệ thống từ chối — coupon chỉ hợp lệ cho EVAL_L1 (Associate Track $650); không áp dụng cho các track khácIntegration
AC-8.2.13-23Kênh Discord — luồng cơ bảnBước 6 thành công; POST /create-pod-channel được gọi ở Bước 6.5 cho john.doe@stacktrading.comKênh text + voice riêng tư pod-john-doe-[4 ký tự đầu của leader_id] được tạo; channel_url được ghi vào bản ghi người dùng; POST /manage-discord-role gán Pod Leader (hoặc bỏ qua nếu chưa liên kết); Bước 7–8 tiếp tụcIntegration
AC-8.2.13-24Exc-5: Retry kênh DiscordPOST /create-pod-channel thất bại cả 3 lần retryPod_Leader_Registry KHÔNG bị rollback; DISCORD_CHANNEL_CREATION_FAILED được ghi log; SEV-1 alert đến #ops-it; Bước 7–8 tiếp tục; Ops tạo kênh thủ công và cập nhật channel_urlIntegration
AC-8.2.13-25Không khóa SIMTrader SIM hiện có ở Level 0 được đưa vào Flow 1.5; identity_status = 'Pending' và payout_status = 'Pending'Dashboard KHÔNG hiển thị overlay onboarding hard-lock (cổng Role_Flag = 'Founding_Mentor'); sidebar, settings và giao dịch SIM vẫn khả dụngUI / Integration
AC-8.2.13-27Overlay sau khi vượt SIMFounding Mentor đạt Passed_Challenge → Flow 3A Branch COverlay onboarding hard-lock được hiển thị như bình thường cho đến khi hoàn tất Live onboardingUI / Integration
AC-8.2.13-28Checkout — chưa nộp Typeform [CHR-145]Role_Flag = 'Founding_Mentor'; Pod_Leader_Registry.Asset_Class IS NULL; mentor nhập email tại checkout Bước 5HTTP 409; nút [Next] bị vô hiệu hóa; hiển thị BN-20; không ghi bản ghi UsersIntegration
AC-8.2.13-29Checkout — asset class không khớp [CHR-145]Typeform Asset_Class = 'Futures'; giỏ hàng asset_class = 'Forex'HTTP 409; nút [Next] bị vô hiệu hóa; hiển thị BN-18 với "Futures"; mentor phải chọn lạiIntegration
AC-8.2.13-30Checkout — gói không phải EVAL_L1 [CHR-145]Asset class khớp; giỏ hàng product_id = 'EVAL_L2'HTTP 409; nút [Next] bị vô hiệu hóa; hiển thị BN-19; mentor phải chọn Associate TrackIntegration
AC-8.2.13-26Gửi linkFlow 1.5 gửi link Veriff KYC và link setup DotsLink chỉ được gửi qua email; không hiển thị banner Flow 1.5 nào trên dashboardUI / Integration
AC-8.2.13-31Discord token — mentor mớiFounding Mentor hoàn toàn mới, đã qua provisioning gateUUID được ghi vào discord_link_token; email chào mừng chứa Discord invite + /link [token]Integration
AC-8.2.13-32Discord token — tái sử dụng / bỏ qua(a) đã có token, chưa liên kết; (b) discord_user_id đã được đặt(a) cùng token được tái sử dụng, không tạo lại; (b) không có token, không có khối Discord trong email; role + quyền truy cập kênh được áp dụng ở Bước 6.5/6.7Integration
AC-8.2.13-33Late-linkingMentor chạy /link [token] sau khi Bước 6.5–6.7 đã chạy lúc chưa liên kếtdiscord_user_id được ghi; role Pod Leader được gán; mentor mở được kênh pod-... của mình; không nhìn thấy các pod khácIntegration
AC-8.2.13-34Token không bị ghi đè khi checkoutMentor sau đó checkout bằng coupon 100%discord_link_token từ Bước 7.5 không thay đổi; token đã gửi qua email vẫn hợp lệIntegration
AC-8.2.13-35Flow 11 khi hoàn tất hồ sơFounding Mentor nộp Typeform Bước 9; Pod_Waitlist có trader cùng Asset_ClassFlow 11 được kích hoạt cho Leader_ID này; trader cùng loại tài sản chờ lâu nhất trong waitlist được mời (Pod_Spot_Available_Confirm)Integration

On this page

UC_8.2.9 — Luồng 15: Phân công lại Pod & Quản lýCác TriggerĐiều kiện tiên quyếtHậu điều kiệnLuồng cơ bảnTrigger A — Thay đổi trạng thái lãnh đạo (Cascade tự động)Trigger B — BPS Admin ghi đè thủ côngTrigger C — Leader mất điều kiện tham giaLuồng thay thếLuồng ngoại lệĐặc tả Quản lý Truy cập & Role DiscordA. Hành động Offboarding cho Leader bị Terminated / SuspendedB. Failsafe — discord_user_id là NULLC. Đồng bộ lại cho Mentee bị phân tánQuy tắc nghiệp vụBảng trạng thái — Pod Leader qua chu kỳ DefenseTiêu chí chấp nhậnUC_8.2.10 — Luồng 15B: Pod Leader Đăng ký & Cấp phépTriggerĐiều kiện tiên quyếtHậu điều kiệnLuồng cơ bảnLuồng ngoại lệQuy tắc nghiệp vụTiêu chí chấp nhận§7.1 Chính sách Nghỉ phép & Hiatus cho Regular Pod Leaders (Tích hợp Flow 13)§7.1.1 Nghỉ phép không thu hồi role Pod Leader§7.1.2 Ma trận trạng thái Pod_Leader_Registry§7.1.3 Hành vi số dư Carry trong thời gian nghỉ phépUC_8.2.11 — Luồng 15C: Cascade Offboarding khi Pod Leader bị sa thảiTriggerĐiều kiện tiên quyếtHậu điều kiệnLuồng cơ bảnCác hành động Middleware trước Webhook (Thực hiện bởi BPS, KHÔNG phải Zapier)Luồng thay thếLuồng ngoại lệQuy tắc nghiệp vụTiêu chí chấp nhậnUC_8.2.12 — Luồng 17: Chi trả Vesting cho Pod LeaderTriggerĐiều kiện tiên quyếtHậu điều kiệnLuồng cơ bảnTham chiếu tích lũy Carry (Cách Pending_Carry_Balance được tích lũy)Luồng ngoại lệQuy tắc nghiệp vụTiêu chí chấp nhậnUC_8.2.13 — Luồng 1.5: Khởi tạo Founding MentorTriggerĐiều kiện tiên quyếtHậu điều kiệnLuồng cơ bảnCấp hệ thống: Founding Mentor Defense Bypass (Liên tục)§6.1 Quản trị Hiatus & Nghỉ phép (Tích hợp Flow 13)Nguyên tắc bảo toàn vai trò tuyệt đốiLuồng ngoại lệQuy tắc nghiệp vụMô hình dữ liệuBảng Users (các trường liên quan được thêm/cập nhật bởi luồng này)Bảng Pod_Leader_Registry — các trường được ghi bởi luồng nàyTham chiếu APITemplate EmailTiêu chí chấp nhận