Skip to content

feat(spec)!: 删除 tenancy.strategy + tenancy.crossTenantAccess — tenancy 块 strict 化 + tombstone(#2763) - #2962

Merged
os-zhuang merged 3 commits into
mainfrom
claude/remove-tenancy-strategy-2ex11u
Jul 15, 2026
Merged

feat(spec)!: 删除 tenancy.strategy + tenancy.crossTenantAccess — tenancy 块 strict 化 + tombstone(#2763)#2962
os-zhuang merged 3 commits into
mainfrom
claude/remove-tenancy-strategy-2ex11u

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

落地 #2763 的 owner 决策(2026-07-10):TenancyConfigSchema 的两个零消费者字段按 enforce-or-remove 处置为 REMOVE。

发版路线(owner 已确认):spec 15.0.0 已发布且不含本移除;按 launch-window 政策(CI 门禁原文:破坏性变更随 minor 发、不烧大版本号),本移除随下一个 15.x minor 发布,changeset 为 minor,tombstone 文案采用版本无关写法 "removed after v15.0 (#2763)"。发版时把迁移段落并入 v15 release 页的 "What's new in 15.x"。

变更内容(对照 #2763 的移除 PR 清单)

  • TenancyConfigSchema 删除 strategy / crossTenantAccess,只保留 live 的 enabled + tenantField
  • no-silent-strip 防呆(Object-level workflows: [...] (and any unknown ObjectSchema key) is silently stripped at build — no error/warning (ADR-0032 'no silent failure', metadata layer) #1535):tenancy 块改为 .strict(),并挂 strictTenancyError error map(复用 ADR-0089 D3a strictVisibilityError 的模式)。未知键不再被 zod 静默 strip,而是响亮报错;两个 retired 键的报错各带 tombstone 处方,指向两种真实模式:库隔离 = 环境级部署(每环境自带 database URL);行级隔离 = enabled + tenantFieldcrossTenantAccess 的 tombstone 指向 sharing/OWD(ADR-0056)、externalSharingModel(ADR-0090 D11)与 access posture
  • liveness ledger 删除两条目(chore(liveness): authorWarn sweep across all governed types + lint coverage to match #2750 的 authorWarn 随之退役,schema 本身已携带处方);README 计数表按脚本再生(object 37/12/1;顺带修正 field 54→55、position 3→4 的既有漂移)
  • gen:schema + gen:docs 再生 references:references/data/object.mdx 不再宣传 “isolated (separate DB per tenant)”。再生同时带出了此前未再生的漂移(Lifecycle、position、execution-context、security explain/misc、ui/action)——references 目录本就是 AUTO-GEN,以再生输出为准
  • 下游 grep:HotCRM/tianshun 不在本会话仓库范围内,已 grep 本仓库 examples/skills/content、../objectui(无使用)与 ../cloud(3 个 service-tenant 平台对象有使用,companion PR 见下)。仓内清扫:sys_sso_provider、plugin-security / driver-sql / driver-sqlite-wasm / spec / cli 测试夹具、objectstack-data SKILL.md 配方、手写文档 data-modeling/objects.mdx + protocol/objectql/schema.mdx
  • changeset(minor):正文含 FROM → TO 迁移映射 + 发版备注

迁移(行为无变化 —— 两个键从未被读取)

  • tenancy: { enabled: false, strategy: 'shared' }tenancy: { enabled: false }
  • tenancy: { enabled: true, strategy: '…', tenantField: 'x', crossTenantAccess: false }tenancy: { enabled: true, tenantField: 'x' }

验证

  • packages/spec 全量测试 251 文件 / 6792 用例绿(含 5 个新增 tombstone/strict 用例)
  • 全仓 pnpm build 70/70 任务绿;受影响包测试全绿:cli 505、plugin-security 423、driver-sql 275、driver-sqlite-wasm 119、platform-objects 80
  • check:liveness 绿(proof-tag 警告为既有、与本 PR 无关)
  • gen:api-surface 无 diff(导出面不变,仅 schema 形状收窄)

合并顺序

  1. 本 PR(framework)先合并
  2. companion PR objectstack-ai/cloud#837(service-tenant 三个对象删 strategy 键)后合并——旧 spec 里 strategy 是必填,新 spec 里它是 tombstone,两边只能各配各的 spec 版本(cloud#837 当前 CI 红即此原因,属预期)

关联:#2763(决策)、#2750(过渡期 authorWarn)、#1535(no-silent-strip)、#2707/#2727(liveness 收口)

🤖 Generated with Claude Code

https://claude.ai/code/session_01UQjM9nQiF8DRQ3XhuWktHp

…rict tenancy block with tombstones (#2763)

BREAKING CHANGE: TenancyConfigSchema drops its two zero-consumer fields and
the tenancy block is now .strict(): an unknown key — a retired strategy/
crossTenantAccess or a typo — is a loud parse error with tombstone guidance
instead of a silent zod strip (#1535; ADR-0049 enforce-or-remove, precedent
ADR-0056 D8).

The platform has exactly two tenancy modes, neither needing object-level
strategy config: database-per-tenant isolation is an environment/deployment
choice (each environment carries its own database URL), and shared-database
row isolation is tenancy.enabled + tenancy.tenantField (both stay live:
sql-driver row scoping, security-plugin org scoping). Cross-tenant visibility
is governed by sharing/OWD (ADR-0056), externalSharingModel (ADR-0090 D11)
and access posture — never a blanket boolean.

Per the #2763 removal checklist:
- TenancyConfigSchema: fields removed; strictTenancyError zod error map
  (pattern of strictVisibilityError, ADR-0089 D3a) carries the upgrade
  prescription pointing at the two real modes
- liveness ledger: the two dead entries removed (authorWarn #2750 retires
  with them); README count table regenerated (object 37/12/1; also fixes
  pre-existing field/position count drift)
- gen:schema + gen:docs: references regenerated (object.mdx no longer
  advertises 'isolated (separate DB per tenant)'; includes pending
  regeneration drift from earlier schema changes)
- downstream grep: platform-objects sys_sso_provider + test fixtures
  (plugin-security, driver-sql, driver-sqlite-wasm, spec, cli) drop the
  retired keys; objectstack-data SKILL.md recipe updated; cloud repo
  companion PR removes the keys from its service-tenant objects
- changeset: major, with FROM → TO migration

Spec suite 6792/6792 green; check:liveness green; api-surface unchanged
(exports are the same — only the schema shape narrowed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UQjM9nQiF8DRQ3XhuWktHp
@vercel

vercel Bot commented Jul 15, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 15, 2026 1:46pm

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation protocol:data tests tooling labels Jul 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 6 package(s): @objectstack/cli, @objectstack/platform-objects, @objectstack/driver-sql, @objectstack/driver-sqlite-wasm, @objectstack/plugin-security, @objectstack/spec.

109 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 packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @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 packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/cli, 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/driver-sql, @objectstack/driver-sqlite-wasm, @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/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/cli, @objectstack/plugin-security, @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/glossary.mdx (via @objectstack/driver-sql, @objectstack/driver-sqlite-wasm)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli, @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/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, 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/permissions/access-recipes.mdx (via packages/plugins/plugin-security)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via packages/plugins/plugin-security, @objectstack/spec)
  • content/docs/permissions/explain.mdx (via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/anatomy.mdx (via @objectstack/driver-sql)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/platform-objects, @objectstack/driver-sql, @objectstack/driver-sqlite-wasm, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/driver-sql)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/objectos/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/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/cli, @objectstack/driver-sql, @objectstack/driver-sqlite-wasm, @objectstack/plugin-security, @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/v9.mdx (via @objectstack/spec)
  • content/docs/ui/audience-based-interfaces.mdx (via packages/plugins/plugin-security)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/platform-objects, @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.

claude added 2 commits July 15, 2026 13:35
…major in the v16 release PR

The check-changeset-no-major gate enforces the v15 flow (#2950 precedent):
feature PRs land breaking changesets as minor; the release PR promotes to
major and adds the vN.mdx upgrade guide. Owner confirmed option A. The
changeset body now carries the promotion note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UQjM9nQiF8DRQ3XhuWktHp
… line per launch-window policy

Owner decision (PR #2962 discussion): spec 15.0.0 is already published to npm
without this removal, and the launch-window policy ships zero-consumer
breaking changes as minor rather than burning a major. Tombstones, liveness
notes, and the changeset now say 'removed after v15.0 (#2763)' instead of
pinning 16.0.0; the changeset stays minor and folds into the v15 release
page's 'What's new in 15.x' section at versioning time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UQjM9nQiF8DRQ3XhuWktHp
@os-zhuang
os-zhuang marked this pull request as ready for review July 15, 2026 14:41
@os-zhuang
os-zhuang merged commit f71d19a into main Jul 15, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/remove-tenancy-strategy-2ex11u branch July 15, 2026 14:41
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:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants