Skip to content

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

Closed

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. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  2. 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

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  4. self-assigned this
    on Aug 6, 2026
  5. 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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions