Skip to content

docs(spec): SystemFieldName says which columns are actually injected - #4430

Merged
os-zhuang merged 2 commits into
mainfrom
claude/system-field-names-982
Aug 1, 2026
Merged

docs(spec): SystemFieldName says which columns are actually injected#4430
os-zhuang merged 2 commits into
mainfrom
claude/system-field-names-982

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

问题

SystemFieldName 自称是 system fields 的 canonical 协议级名字表,但它既不是注入集,也不是「所有系统字段」集,而且对最关键的一项记反了

常量文档说法实际
TENANT_ID"Tenant isolation key"open-core 从不注入applySystemFields provisions 的租户列是 organization_id(lookup → sys_organization)。objectql plugin 只在对象自己声明了tenant_id 时才 stamp,且填进去的值就是 session.organizationId。这个仓自己的 system-managed-fields-conformance.test.ts 已经把它归类为 "legacy/enterprise tenant key (not injected by open-core)"
ORGANIZATION_ID真·注入列,且是真正的租户隔离键,表里没有
CREATED_BY / UPDATED_BY真·注入列(AUDIT_PROVENANCE_FIELDS 的一半),表里没有
USER_ID"Foreign key to user on session / account objects"声明字段,业务对象也会合法声明它;不是注入列,但没写
DELETED_AT"Soft-delete timestamp"由 lifecycle / trash 层写,applySystemFields 不注入;没写

后果(已实测)

下游消费方把这张表当注入集手抄,然后各自漂移。cloud#982 在 cloud 一个包里查出三份手抄清单,分别带着 tenant_idorg_idspace —— 三个拼写没有任何注入点会产生。其中一份的漂移已经发作成用户可见故障(cloud#979):清单里的 owner 让一个业务字段被当成系统列,种子生成器双重跳过它,每一行种子数据的「负责人」列都是空的

根因是这张表混装了三类东西(真注入 / 遗留别名 / 声明字段)却只给了一个名字,且缺了三个真注入列。

改动

纯增量 —— 不删任何条目、不改任何取值。

  • ORGANIZATION_ID / CREATED_BY / UPDATED_BY 三个缺失的注入列常量;
  • 每条注明 open-core 是否真的注入,让遗留(tenant_id)和声明(user_id)拼写不再可能被误当成 provisioned 列;
  • 模块 doc 说清这是名字注册表,不是注入集:注入是 applySystemFields按对象ownership / tenancy / systemFields 算出来的,所以同一个名字在 A 对象上是系统列、在 B 对象上是业务字段。要回答「这个字段在这个对象上是不是系统列」,应该 branch 在 Field.system 上 —— 那个标志本来就是为这件事发布的(field.zod.ts 的 describe 原文就是这么说的),doc 现在指过去;
  • 测试补上三个新常量的断言,外加一条「表里必须有 registry 真实注入的每一列」的断言,说明它当初为什么会漏。

兼容性

  • @objectstack/lintSYSTEM_FIELDS内容不变:它是本表与 FIELD_GROUP_SYSTEM_FIELDS 的并集,而后者已经含这三个新增名字。其 "contains nothing BEYOND the two spec declarations" 断言照过。
  • 无删除、无改值,因此对现有 SystemFieldName.X 引用零影响。

验证

pnpm --filter @objectstack/spec test # 285 files / 7229 tests 全绿
pnpm --filter @objectstack/spec typecheck # 干净
pnpm --filter @objectstack/lint test # 43 files / 729 tests 全绿
pnpm --filter @objectstack/objectql test # 92 files / 1506 tests 全绿

相关

  • cloud#982 —— 消费侧的对应修复(cloud 改为逐对象判定 + 一条会响亮失败的对账门)。该 PR 不消费本表,所以两者互不阻塞。
  • cloud#979 —— 这个歧义的一次用户可见发作。

Generated by Claude Code

The table documented `tenant_id` as "Tenant isolation key" while the column
the registry actually provisions is `organization_id` — which had no constant
at all, alongside the equally-missing `created_by` / `updated_by`. Two of the
seven entries (`user_id`, `deleted_at`) are not injected either, with nothing
saying so.
Consumers hand-copying a system-field list read this as the injection set and
drifted accordingly: cloud#982 found three copies carrying `tenant_id`,
`org_id` and `space` between them, none of which any injection site produces,
and cloud#979 was one of those copies claiming a business field named `owner`
so every seeded row shipped it blank.
Additive only — no entry removed, no value changed:
- add ORGANIZATION_ID, CREATED_BY, UPDATED_BY, the three injected columns the
table was missing;
- record per entry whether open-core injects it, so the legacy (`tenant_id`)
and authored (`user_id`) names cannot be mistaken for provisioned ones;
- state in the module doc that this is a NAME registry, not the injected set —
`applySystemFields` decides that per object from `ownership` / `tenancy` /
`systemFields`, so the same name is a system column on one object and
business data on the next. A consumer asking "is this field system-managed
on THIS object" branches on `Field.system`, which is already published for
exactly that and which the doc now points at.
`@objectstack/lint`'s SYSTEM_FIELDS is unaffected in content: it unions this
table with FIELD_GROUP_SYSTEM_FIELDS, which already carried all three added
names.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YRXTo7QC2A6EXXxJ5GKwsS
@vercel

vercelBot commented Aug 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 1, 2026 6:39am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx(via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx(via @objectstack/spec)
  • content/docs/ai/skills.mdx(via @objectstack/spec)
  • content/docs/api/client-sdk.mdx(via @objectstack/spec)
  • content/docs/api/environment-routing.mdx(via @objectstack/spec)
  • content/docs/api/error-catalog.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/api/index.mdx(via @objectstack/spec)
  • content/docs/automation/approvals.mdx(via @objectstack/spec)
  • content/docs/automation/connectors.mdx(via @objectstack/spec)
  • content/docs/automation/flows.mdx(via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx(via packages/spec)
  • content/docs/automation/hooks.mdx(via @objectstack/spec)
  • content/docs/automation/index.mdx(via @objectstack/spec)
  • content/docs/automation/webhooks.mdx(via @objectstack/spec)
  • content/docs/automation/workflows.mdx(via @objectstack/spec)
  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/index.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx(via packages/spec)
  • content/docs/concepts/north-star.mdx(via packages/spec)
  • content/docs/data-modeling/analytics.mdx(via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx(via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx(via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx(via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx(via @objectstack/spec)
  • content/docs/data-modeling/index.mdx(via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx(via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx(via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx(via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx(via @objectstack/spec)
  • content/docs/deployment/cli.mdx(via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx(via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/spec)
  • content/docs/kernel/cluster.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx(via packages/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/spec)
  • content/docs/kernel/services.mdx(via @objectstack/spec)
  • content/docs/permissions/authorization.mdx(via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/permissions/positions.mdx(via @objectstack/spec)
  • content/docs/permissions/rls.mdx(via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/plugins/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/protocol/diagram.mdx(via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx(via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v17.mdx(via @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/spec)
  • content/docs/ui/actions.mdx(via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.mdx(via @objectstack/spec)
  • content/docs/ui/forms.mdx(via @objectstack/spec)
  • content/docs/ui/index.mdx(via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx(via @objectstack/spec)
  • content/docs/ui/setup-app.mdx(via @objectstack/spec)
  • content/docs/ui/translations.mdx(via @objectstack/spec)
  • content/docs/ui/views.mdx(via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YRXTo7QC2A6EXXxJ5GKwsS
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tooling labels Aug 1, 2026
@os-zhuang
os-zhuang merged commit 04f1182 into mainAug 1, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/system-field-names-982 branch August 1, 2026 07:06
@github-actionsgithub-actionsBot mentioned this pull request Aug 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:systemsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude