模块 1 · 风控能力

预警、适当性、AML
与模拟交易

风控专员 Demo STAFF-30001 带 risk_officer + risk_demo 角色: 能看预警台账、处置、跑 AML 扫描,还能在模拟交易页触发规则引擎。 本地登录页一键切换,改 JWT 角色后需重新登录。 仓库基线 merger · python -m pytest → 825 passed。

四条能力线(REST + 对话 Tool 共用底座)

预警台账 FR-4

GET /api/risk/alerts 分页查询;POST .../handle 人工处置(仅 risk_officer)。响应固定带 disclaimer。

适当性校验 R-02 / FR-2

POST /api/risk/suitability/check 与网关共用 Core 只读层 的 check_suitability(旧 SUIT-001~008 已退役)。客户本人 / 理财师名下 / 风控全量。

AML 扫描 FR-5

POST /api/risk/aml/scan:仅 risk_officer 触发全量扫描,生成 aml 类预警。

模拟交易 FR-1

POST /api/simulate/trade:risk_demo 或客户本人可提交;走 模拟写 Core 网关(trade_gateway.py) → 适当性 → 规则引擎(risk_engine.py)。

鉴权与问数不同: 风控 REST 走 get_auth_context,前端 risk.ts 必须带 X-Agent-Type: risk + Bearer。缺头会 401 AUTH_401_MISSING_AGENT_TYPE。

群聊:风控专员打开预警页

浏览器通过 riskHeaders 声明自己在敲风控窗:

CODE · 模拟交易入口(simulate.py)鉴权
if not (auth.has_role("risk_demo")
        or (auth.is_customer()
            and auth.customer_id == req.customer_id)):
    deny(auth, "AUTH_403_ROLE", ...)
return submit_trade(req.model_dump(), actor_id=auth.actor_id)
白话

模拟交易不是谁都能点:要么 risk_demo 演示号,要么客户给自己下单。

STAFF-30001 有 risk_demo 权限,可在 RiskSimulatePage 代客触发规则。

越权会 deny 并写审计,不会悄悄放行。

STAFF-30001 能在模拟交易页提交申购吗?