Jev Recipe / 数据驻留与合规

Jev 数据驻留:把每一次决策固定在正确的辖区里

把「这条数据能否跨境」做成类型化决策:一次 Jev evaluate 调用同时返回合法处理路径、传输风险与越区覆盖标记——在任何包含个人数据的 state 出境之前。

广告

按辖区固定决策的 6 个步骤

01把辖区与数据类别放进 state,而不是靠猜。驻留执行的上限取决于输入:主体辖区(来自账户或账单——不要只看 IP)、state 中 present 的数据类别(行为聚合、财务记录、特殊类别数据),并且不在评估时临场推断。辖区判错会静默作废下游所有控制,所以 state schema 把 region 与 data_classes 设为必填字段,criteria 里写明来源冲突时怎么办。
02把处理路径做成类型化 Choice,而不是配置表查询。问题不是「API 部署在哪」,而是「这条 state 依哪条合法路径处理」:eu_in_region(评估留在主体所在区域内)、third_country_adequacy(目的地有充分性认定覆盖)、sccs_with_tia(标准合同条款 + 已归档的传输影响评估)、needs_dpa_review(无覆盖路径——先过法务再传输)。把路径写成 criteria,等于把传输地图变成可 diff、可重放、可给审计看的版本化契约——与审计追踪对决策本身的做法同构。
03对传输风险设闸,而不只看置信度。聚合点击流路由上的 0.97 与特殊类别健康数据上的 0.97 不是同一次传输。transfer_risk Score(1 = 聚合、非身份可识别;4 = 特殊类别或监管敏感)与置信度共闸:路径高置信且风险低才自动固定区域;中间带走确定性的最小化处理;风险 4 即使高置信也拦下自动路径——这正是审计追踪对可逆性的双轴纪律,用在地理维度上。
04按部署拓扑划车道。eu_in_region 把调用钉到区域内评估端点;adequacy 路由到指定目的地;sccs_with_tia 只有日志里带 TIA 引用才放行;needs_dpa_review 直接封死自动路径。某个区域如果没有区域内端点,车道降级为处理最小化——令牌化或剥离身份字段、只评估裁剪后的 state。驻留执行的失败方向必须是更少数据出境,绝不能静默变成更多。
05驻留记录与决策记录并排落账。审计追踪记「决策了什么」;驻留记录记「允许在哪处理」:主体辖区、数据类别、所选路径及置信度、传输风险、当期生效的区域地图版本、以及走 SCC 时的 TIA 引用。六个字段、一行定长记录。当某项充分性认定被撤销、或厂商更换托管区域,用新地图对日志 state 做重放,就能查出所有新地图会拦下的历史传输——重放即迁移检查,与 schema 升级同一纪律。
06定期复查地图,而不是等事故。充分性认定会被修订甚至撤销、SCC 模板会更新、厂商会增减区域、产品会进新市场。把区域地图做成带生效日期的版本化配置,criteria 里注明版本让每条记录都能回答「当时依哪版地图决策」,每季度用地图版本对驻留日志做 diff——这是审计追踪对置信度分布的漂移监测纪律,用在司法辖区上。
schema / 处理路径·传输风险·越区覆盖契约
{
  "processing_route": {
    "type": "choice",
    "instructions": "这条 state 依哪条合法路径处理?",
    "criteria": {
      "eu_in_region": "评估可留在主体所在区域内(EEA、日本、巴西本地)",
      "third_country_adequacy": "目的地国家对这些数据类别有充分性认定覆盖",
      "sccs_with_tia": "适用标准合同条款,且 TIA 引用已归档",
      "needs_dpa_review": "无覆盖路径——传输前先由法务决定"
    }
  },
  "transfer_risk": {
    "type": "score",
    "instructions": "如果这条 state 违规跨境,代价多大?1(聚合、非身份可识别)到 4(特殊类别或监管敏感)"
  },
  "regional_override": {
    "type": "noul",
    "instructions": "该请求是否要求比所在辖区默认路径更严格的处理?"
  }
}
把一条真实请求 state 发送,检查 processing_route、transfer_risk 与 regional_override 的校准置信度。

六条请求,一道区域闸门

下面每条请求都已经跑过区域闸门。拖动两条轴——自动固定的路径置信度阈值与自动传输的风险上限——看车道实时重算。0.96 的路径置信度本身不够:EEA 健康数据请求仍会离开自动路径,因为传输风险是第二条轴。

自动固定区域 · 2最小化后固定 · 2法务复核 · 2
请求路径与置信度传输风险车道

点击流路由 · EEA 用户 #2214

欧洲经济区(EEA) · 行为数据 · 聚合 · 94ms

区域内处理0.97风险 1/4自动固定区域

症状分诊 · EEA 用户 #4457

欧洲经济区(EEA) · 特殊类别 · 健康 · 101ms

区域内处理0.96风险 4/4最小化后固定

流水分类 · 日本用户 #7741

日本 · 财务记录 · 88ms

SCC + TIA0.91风险 2/4自动固定区域

内容个性化 · 美国用户 #2298

美国 · 行为数据 · 身份标识 · 96ms

充分性认定0.74风险 1/4最小化后固定

信贷初审 · 巴西用户 #5190

巴西 · 财务记录 · 92ms

待法务复核0.68风险 3/4法务复核

门禁判定 · EEA 员工 #3306

欧洲经济区(EEA) · 特殊类别 · 生物识别 · 99ms

区域内处理0.95风险 3/4override法务复核

仅演示数据——六条模拟请求。车道按与文案相同的双轴规则实时重算。

驻留执行方式:类型化区域闸门 vs 提示词规则 vs 默认 API 路由(不执行)

METRIC
Jev
默认 API 路由 / 写死在代码里的辖区判断
辖区由什么决定
合法路径的类型化 Choice——criteria 把传输地图编码成可版本化、可 diff 的配置
提示词里一句「欧洲用户在欧盟处理」——建议性文本,负载高或截断时就没了
如何解释一次被拦截的传输
criteria 块就是解释——记录里有路径、置信度和当期生效的地图版本
事后猜测提示词「大概想表达什么」;默认路由则什么都不会说
风险与置信度的相互作用
双轴——transfer_risk 参与闸门,特殊类别数据即使在 0.97 也不进自动固定
至多单轴(文本上的类置信度分数);默认路由两样都没有
例外如何审计
SCC 车道在同一条定长记录里携带 TIA 引用——例外可查询,而不是口口相传
批准记录散落在工单与聊天里,与它们覆盖的传输互不关联
法规变化时
用新区域地图对日志 state 重放——一次查询捞出所有受影响的历史传输
靠人的记忆手动复查;默认路由靠事故发现变化
多区域产品
一份版本化契约全服务共享——criteria 是传输事实的唯一来源
N 个服务 N 份漂移的 if 判断;默认路由是一条对所有服务静默的路径

代码对比:各自漂移的应用层辖区判断 vs 类型化区域闸门

python / 基线:住在应用代码里、各自漂移的辖区判断
def pick_endpoint(user: dict) -> str:
    # 传输地图散落成几段 if 判断。没有任何东西记录用的是哪条
    # 路径,没有风险轴,没有复核车道:EEA 用户的健康数据请求
    # 和一条美国聚合指标走同一个默认端点。充分性名单一变,
    # 每个服务各自打补丁——或者忘掉。
    if user.get("region") in ("DE", "FR", "NL"):
        return "https://eu.api.typesafe.ai/v1/jev/evaluate"
    return "https://api.typesafe.ai/v1/jev/evaluate"
python / jev:一次 evaluate 调用返回路径、风险与覆盖标记
import requests

GATE_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate"
AUTO_ROUTE_CONFIDENCE = 0.85
AUTO_MAX_RISK = 2  # risk <= 2 且 confidence >= 闸门 -> 自动固定

ZONE_ENDPOINTS = {
    "eu_in_region": "https://eu.api.typesafe.ai/v1/jev/evaluate",
    "third_country_adequacy": "https://api.typesafe.ai/v1/jev/evaluate",
    "sccs_with_tia": "https://api.typesafe.ai/v1/jev/evaluate",
}

QUESTIONS = {
    "processing_route": {
        "type": "choice",
        "instructions": "这条 state 依哪条合法路径处理?",
        "criteria": {
            "eu_in_region": "评估可留在主体所在区域内",
            "third_country_adequacy": "目的地有充分性认定覆盖",
            "sccs_with_tia": "适用 SCC 且 TIA 引用已归档",
            "needs_dpa_review": "无覆盖路径——先过法务",
        },
    },
    "transfer_risk": {
        "type": "score",
        "instructions": "违规跨境代价多大?1 聚合 - 4 特殊类别",
    },
    "regional_override": {
        "type": "noul",
        "instructions": "该请求是否要求比所在辖区默认更严格的处理?",
    },
}


def gate_transfer(state: dict) -> dict:
    resp = requests.post(
        GATE_ENDPOINT,
        json={"state": state, "questions": QUESTIONS},
        timeout=5,
    )
    resp.raise_for_status()
    data = resp.json()

    route = data["processing_route"]
    risk = data["transfer_risk"]["answer"]

    if route["answer"] == "needs_dpa_review" or data["regional_override"]["answer"]:
        lane = "legal_review"  # 自动路径彻底封死
    elif route["confidence"] >= AUTO_ROUTE_CONFIDENCE and risk <= AUTO_MAX_RISK:
        lane = "auto_pinned"
    else:
        lane = "minimize_then_pin"  # 令牌化/剥离后评估裁剪 state

    return {
        "lane": lane,
        "endpoint": ZONE_ENDPOINTS.get(route["answer"]),
        "residency_record": {
            "subject_region": state.get("region"),
            "data_classes": state.get("data_classes"),
            "route": route["answer"],
            "route_confidence": route["confidence"],
            "transfer_risk": risk,
            "zone_map_version": "zone-map@2026.10",
            "tia_ref": state.get("tia_ref")
            if route["answer"] == "sccs_with_tia"
            else None,
        },
    }
typescript / 基线:事后没人说得清的环境变量开关
// 传输地图被压缩成一个环境变量。每个服务读同一个值,
// 没有任何一个能回答「为什么」。日本用户的财务记录和美国
// 聚合指标走同一条默认路径,审计问题「这次传输依哪条合法
// 路径」在系统里没有答案。
const EVALUATION_ENDPOINT =
  process.env.REGION === "eu"
    ? "https://eu.api.typesafe.ai/v1/jev/evaluate"
    : "https://api.typesafe.ai/v1/jev/evaluate";

export const pickEndpoint = () => EVALUATION_ENDPOINT;
typescript / jev:端到端类型化的区域闸门
const GATE_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate";
const AUTO_ROUTE_CONFIDENCE = 0.85;
const AUTO_MAX_RISK = 2;

type Lane = "auto_pinned" | "minimize_then_pin" | "legal_review";

const QUESTIONS = {
  processing_route: {
    type: "choice",
    instructions: "这条 state 依哪条合法路径处理?",
    criteria: {
      eu_in_region: "评估可留在主体所在区域内",
      third_country_adequacy: "目的地有充分性认定覆盖",
      sccs_with_tia: "适用 SCC 且 TIA 引用已归档",
      needs_dpa_review: "无覆盖路径——先过法务",
    },
  },
  transfer_risk: {
    type: "score",
    instructions: "违规跨境代价多大?1 聚合 - 4 特殊类别",
  },
  regional_override: {
    type: "noul",
    instructions: "该请求是否要求比所在辖区默认更严格的处理?",
  },
} as const;

export async function gateTransfer(state: {
  region: string;
  data_classes: string[];
  tia_ref?: string;
}) {
  const resp = await fetch(GATE_ENDPOINT, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ state, questions: QUESTIONS }),
  });
  if (!resp.ok) throw new Error("Jev evaluate failed");
  const data = await resp.json();

  const route = data.processing_route as {
    answer: string;
    confidence: number;
  };
  const risk = data.transfer_risk.answer as number;

  const lane: Lane =
    route.answer === "needs_dpa_review" || data.regional_override.answer
      ? "legal_review"
      : route.confidence >= AUTO_ROUTE_CONFIDENCE && risk <= AUTO_MAX_RISK
        ? "auto_pinned"
        : "minimize_then_pin";

  // 驻留记录 = 审计追踪决策记录的兄弟记录。用下一版区域地图
  // 对日志 state 重放,即可找出新地图会拦下的所有历史传输。
  return {
    lane,
    residency_record: {
      subject_region: state.region,
      data_classes: state.data_classes,
      route: route.answer,
      route_confidence: route.confidence,
      transfer_risk: risk,
      zone_map_version: "zone-map@2026.10",
      tia_ref: route.answer === "sccs_with_tia" ? state.tia_ref : null,
    },
  };
}

Jev 数据驻留 FAQ

什么是数据驻留?它为什么对 AI 决策格外重要?

数据驻留要求数据在特定司法辖区内处理或存储。它对 AI 决策的卡点非常具体:发给评估端点的 state 往往携带个人数据,所以每一次 evaluate 调用都可能构成一次跨境传输。如果路由服务在没有任何合法传输路径的情况下,把 EEA 用户的健康问卷送到另一个辖区的端点评估,违规的不是存储,而是这次分类本身。这份配方把「这条数据可以在哪处理」变成显式的、有闸门的、留痕的决策,而不是默认端点的副作用。

GDPR 要求欧盟数据必须留在欧盟境内吗?

不是——GDPR 限制向 EEA 之外的传输,但并不禁止。第五章(第 44–49 条)允许在充分性认定(第 45 条)、适当保障措施如标准合同条款(第 46 条)或有限例外(第 49 条)下传输。「数据留在欧盟」是一些团队选择的简化,因为它把整个分析坍缩成一条路径;这份配方支持一般情形:把路径本身(区域内 / 充分性 / SCC / 法务复核)做成类型化决策,而不是把简化硬编码进去。

Jev 提供欧盟(或日本)区域端点吗?

这是需要核实的厂商事实,不是这份配方能替你回答的——与我们对待兼容性声明是同一条诚实规则:端点区域、子处理者位置和 DPA 承诺都会变化,钉生产流量之前先查厂商当前文档。配方保证的是边界中你这一侧:无论存在哪些端点,决定「哪条 state 可以去哪」的闸门是显式的、版本化的、留痕的——而且某区域没有区域内端点时,车道降级为最小化(令牌化后评估裁剪 state),而不是静默传输。

什么是传输影响评估(TIA)?

在 SCC 体系下(Schrems II 之后),TIA 记录目的地国家法律是否削弱合同保护——政府调取、再传输、救济渠道——以及哪些补充措施(加密、拆分、透明度承诺)能补上缺口。它是你们团队维护的法律文件,这份配方不产出它。配方做的是运营化:sccs_with_tia 路径只有在 TIA 引用已归档时才放行,而且这个引用随驻留记录落账——「这次传输由哪份 TIA 覆盖」从此是一条查询,而不是一次考古。

它和决策审计追踪怎么配合?

两种记录是兄弟关系。审计追踪记录回答「决策了什么、置信度多少、依哪些 schema 版本」;驻留记录回答「这条 state 被允许在哪处理、依哪条合法路径与哪版地图」。两者都是从同一次 evaluate 响应派生的定长行,而且都可重放:区域地图变化时——充分性认定被撤销、厂商更换托管——用新地图重放日志 state 并 diff 车道,与 schema 升级完全同构。一个例外因此可以端到端证明:这里是决策,这里是合法承载它的路径。

这些路径多久变一次?我该怎么办?

频到值得制度化:充分性认定会被修订甚至撤销、SCC 模板条款会更新、厂商会开设和退役区域端点、产品进入新市场会带来新规则(日本 APPI 的越境移転规制与巴西 LGPD 各有自己的传输逻辑)。配方的答案是版本化区域地图:每条记录注明决策时依哪版地图、每季度用地图版本对驻留日志做 diff 找出受影响传输、改地图是发布一次配置——而不是重写散落在各服务里的辖区判断。

继续扩展合规与隐私层