发现于 #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 …
三处问题:
- 同一段里两个名字:示例把租户列叫
tenant_id,下一段正文说 registry 注入的是 organization_id。这正是 ADR-0120 §Terminology 点名要消除的「两个子系统给同一个概念起不同名字」;该 ADR 已把可授权词汇定死为 organization(tenant / org 一律拒收)。
- 引用了一个不存在的对象:
reference: tenant —— 平台没有 tenant 对象,租户/组织对象是 sys_organization。
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 轮次自行判定。
发现于 #5315(去掉
TenancyConfigSchema.tenantField的.default('tenant_id'))的消费方扫荡,与该单契约无关,按 Prime Directive #10 单独记录,未在该 PR 中修改。事实
content/docs/protocol/objectql/schema.mdx的「Multi-Tenant Schemas」小节(约 711–727 行):紧接着的正文:
三处问题:
tenant_id,下一段正文说 registry 注入的是organization_id。这正是 ADR-0120 §Terminology 点名要消除的「两个子系统给同一个概念起不同名字」;该 ADR 已把可授权词汇定死为organization(tenant/org一律拒收)。reference: tenant—— 平台没有tenant对象,租户/组织对象是sys_organization。OS_MULTI_ORG_ENABLED是 legacy:packages/types/src/env.ts:89原文 "Read the LEGACYOS_MULTI_ORG_ENABLEDboolean";同文件 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 轮次自行判定。