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

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 1, 2026 6:39am

Request Review

@github-actions

github-actions Bot commented Aug 1, 2026

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-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Aug 1, 2026
@os-zhuang
os-zhuang merged commit 04f1182 into main Aug 1, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/system-field-names-982 branch August 1, 2026 07:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:system size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants