Skip to content

Schedule 触发器不携带任何 org 上下文——定时 runAs:'system' 清扫在多组织部署里仍会产出 organization_id=NULL 的行(#5494 的用户缺席半边) #6155

Description

@hotlong

PR #6153(修 #5494)把 runAs:'system' 运行的三列染色收口到「引擎知道就染」:触发上下文带 user/org 的运行(手动触发、record-change、带鉴权的 api 触发)三列全染。但 schedule 触发器本身不供给任何 org:

// packages/triggers/trigger-schedule/src/schedule-trigger.ts(handler 内)
const ctx: AutomationContext = {
    event: 'schedule',
    params: { jobId, flowName, schedule },
};

没有 tenantId,引擎无从染 organization_id。于是 #5494 Impact 一节点名的主形态——定时清扫(生产里 sweep 是按 schedule 火的,不是手动)——在多组织部署里仍会把行生在组织分区之外:(organization_id, …) 唯一索引跨 NULL 不生效,org 作用域查询看不见(hotcrm#698 的重复编号证据即此类)。created_by/owner_id 在无用户运行下保持 NULL 是 ADR-0118 D1 的既定表示(PR #6153 已论证并钉住),org 不同:org 不是 actor 列,「这行属于哪个组织」对定时清扫是有真实答案的,只是当前没有任何声明面能把答案交给触发器。

需要一个设计裁决:定时流程的 org 从哪来。候选:

  1. flow 元数据的存储 org(org overlay 的流程天然归属其 org;平台级流程无 org → 维持不染);
  2. schedule 绑定面新增显式 org 声明(作者声明,publish 校验);
  3. 每-org 各火一次(Salesforce 式 per-org scheduling,改动最大);
  4. 维持现状 + lint:多组织部署里,含 create_record 的 schedule 流程若未在 fields 显式给 organization_id / owner_id,发布时警告或拒绝(不新增运行时语义,author-time 收口,与 fix(security): surface schedule/user-less flow runAs fail-open (#1888 follow-up) #2308/Author-time expression validator is blind to registry-injected system columns — record.owner_id / created_at / organization_id are rejected as unknown fields #5378 的既有 lint 面同族)。

单组织部署不受影响(org 列本就 NULL 语义)。与 ADR-0073 M2(automation principal,管 actor 不管 org)正交。

Refs:#5494、PR #6153(修复边界在测试 runas-system-stamping.integration.test.ts 的 user-less 用例里显式钉住)、ADR-0118 D1/D5、ADR-0073 D2/D3、hotcrm#698。查重:仓内无既有单(搜 schedule org tenantId / organization_id schedule flow NULL 均无命中)。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions