Skip to content

protocol/objectql/schema.mdx 的多租户小节教 tenant_id + legacy OS_MULTI_ORG_ENABLED,与平台的 organization_id / ADR-0120 词表不一致 #5746

Description

@os-zhuang

发现于 #5315(去掉 TenancyConfigSchema.tenantField 的 .default('tenant_id'))的消费方扫荡,与该单契约无关,按 Prime Directive #10 单独记录,未在该 PR 中修改。

事实

content/docs/protocol/objectql/schema.mdx 的「Multi-Tenant Schemas」小节(约 711–727 行):

name: customer
tenancy:
  enabled: true       # Automatically filter by the tenant field (row-level isolation)
  tenantField: tenant_id
fields:
  tenant_id:
    type: lookup
    reference: tenant
    required: true

紧接着的正文:

When the kernel runs in multi-tenant mode (OS_MULTI_ORG_ENABLED=true), the registry also auto-injects an organization_id lookup on every user object, and the default tenant_isolation RLS policy scopes reads/writes to the caller's tenant …

三处问题:

  1. 同一段里两个名字:示例把租户列叫 tenant_id,下一段正文说 registry 注入的是 organization_id。这正是 ADR-0120 §Terminology 点名要消除的「两个子系统给同一个概念起不同名字」;该 ADR 已把可授权词汇定死为 organization(tenant / org 一律拒收)。
  2. 引用了一个不存在的对象:reference: tenant —— 平台没有 tenant 对象,租户/组织对象是 sys_organization。
  3. OS_MULTI_ORG_ENABLED 是 legacy:packages/types/src/env.ts:89 原文 "Read the LEGACY OS_MULTI_ORG_ENABLED boolean";同文件 129–132 行说明它已被新变量取代(仅在新变量 unset 时才由它派生 isolated / single)。文档把它当现行开关介绍。

影响

packages/spec 侧的默认值本身已由 #5315 修正(未声明即 undefined,有效租户列由 driver 回落到 organization_id),但这一页仍是 AI 作者会照抄的面。照抄它会同时得到:一个按 tenant_id 命名的租户列、一个指向不存在对象的 lookup、以及一个 legacy 环境变量。运行时不会立刻报错(driver 的 computeTenantField 对不存在的列会跳过并回落),但产出的元数据与平台其余部分(RLS 谓词、写入打戳、autonumber 序列)错位 —— 与 #5315 描述的是同一个失配模式,只是残留在协议文档这一侧。

为什么没有在 #5315 里顺手改

改对这一段不是替换一个词。要先决定这个示例的教学意图:是保留「自定义租户列」的演示(那就得换一个 ADR-0120 词表允许的场景,并把 lookup 指向真实存在的对象),还是改成平台默认姿势(省略 tenantField,让 driver 回落)。再加上 OS_MULTI_ORG_ENABLED 那句需要按 env.ts 的现行事实重写。这超出了 #5315 的裁定面(该单只动 packages/spec/src/data/object.zod.ts 的 @example / .describe(),以及 content/docs/data-modeling/objects.mdx 这一处直接的授权指引),故单独记录,严重度请 triage 轮次自行判定。

Activity

  1. claude commented on Aug 6, 2026

    @claude
    Contributor

    分诊:入队 pm:queue,域 domain:devx。

    落点:content/docs/protocol/objectql/schema.mdx「Multi-Tenant Schemas」小节 —— 已在 origin/main 889ae47 上核对,示例原样在 ~711–727 行(tenantField: tenant_id / reference: tenant / OS_MULTI_ORG_ENABLED 三处俱在)。content/docs/** 按域表归 devx,本单不动 packages/spec 任何声明,只改这一页的示例与散文。

    三条事实逐条复核(均在 origin/main,非工作树):

    • packages/types/src/env.ts:89 原文 "Read the LEGACY OS_MULTI_ORG_ENABLED boolean",129–132 行确认它已被新变量取代(仅在新变量 unset 时派生 isolated/single)⇒ 文档把 legacy 变量当现行开关介绍,属实;
    • 租户/组织对象是 sys_organization(packages/platform-objects 内有实体),reference: tenant 指向不存在的对象,属实;
    • 同一段里 tenant_id 与 organization_id 并存,与 ADR-0120 §Terminology 定死的词表冲突,属实。

    查重(三仓 open issue + open PR 各搜一遍:OS_MULTI_ORG_ENABLED / tenantField / tenant_id / ADR-0120):唯一相邻单是 #5315(pm:dispatched,spec 座位在飞)—— 它只动 packages/spec/src/data/object.zod.ts 的默认值与 @example、以及 content/docs/data-modeling/objects.mdx,不覆盖本页。两单文件面不相交,可并行,故不设 Blocked-by:;实施时以 #5315 的落地结论复述默认值语义(未声明 ⇒ driver 回落 organization_id)即可。

    未升级为 needs-user-decision 的理由:正文所说的「教学意图二选一」不是产品语义拍板 —— ADR-0120 已把可授权词表定死、sys_organization 是既存对象、env.ts 的现行事实明确。两条路(改成平台默认姿势、省略 tenantField;或换一个词表允许的自定义列场景并把 lookup 指向真实对象)都不改变任何公共契约,属文档作者的实现裁量。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 6, 2026
  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    Claim(PM devx 车道):本单由本 PM 会话派发实现。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions