Skip to content

feat(hooks)!: remove deprecated ctx.session.tenantId alias — converge on organizationId (#3290)#3305

Merged
os-zhuang merged 2 commits into
mainfrom
claude/remove-session-tenantid-alias-h89c5x
Jul 19, 2026
Merged

feat(hooks)!: remove deprecated ctx.session.tenantId alias — converge on organizationId (#3290)#3305
os-zhuang merged 2 commits into
mainfrom
claude/remove-session-tenantid-alias-h89c5x

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #3290.

What & why

#3280 made organizationId the blessed developer-facing name for the caller's active org across the JS authoring surface, keeping ctx.session.tenantId as a @deprecated alias carrying the identical value. This PR removes that alias from the hook ctx.session, the action-body ctx.session, and the action-body ctx.user, so the authoring surface converges on a single name — matching the organization_id column and current_user.organizationId in RLS/sharing.

Scope of the removal (issue checklist)

  • Drop session.tenantId from HookContextSchema.session (@objectstack/spec) — only organizationId remains; a stray tenantId on a constructed session is now stripped by the schema.
  • Drop the tenantId alias emitted by the engine's buildSession() (@objectstack/objectql) and the runtime's buildActionSession() / action ctx.user (@objectstack/runtime).
  • Extend scripts/check-org-identifier.mjs to also cover packages/** (the framework's own hook/action surface no longer emits or reads the alias), leaving the driver layer alone.
  • Changeset as a breaking change for @objectstack/spec + @objectstack/objectql + @objectstack/runtime.

Internal consumers migrated (behavior-preserving)

The two internal readers of the hook ctx.session.tenantId now read session.organizationId (identical value), so nothing regresses:

  • @objectstack/objectql — the audit-stamp plugin sources the tenant_id column from session.organizationId.
  • @objectstack/trigger-record-change — forwards the writer's org to a runAs:'user' flow from session.organizationId.

Reference docs/skills

Migrated the objectstack-data / objectstack-ui skill examples and the runtime-services docs off ctx.session?.tenantId so no reference body teaches the removed name.

Migration (FROM → TO)

In any *.hook.ts / *.action.ts body:

- const org = ctx.session.tenantId;      // hook or action body
+ const org = ctx.user?.organizationId ?? ctx.session?.organizationId;
  • ctx.session.tenantIdctx.session.organizationId
  • ctx.user.tenantId (action body) → ctx.user.organizationId

ctx.user is undefined for system / unauthenticated writes, so read ctx.session?.organizationId when the hook/action must work regardless of a resolved user.

Explicit non-goals (untouched)

The generic driver-layer tenancy abstraction is deliberately not changed — it is a distinct, configurable isolation axis (legitimately an environment id in database-per-tenant kernels): ExecutionContext.tenantId, DriverOptions.tenantId, SqlDriver.applyTenantScope / TenancyConfig.tenantField, and ExecutionLog.tenantId. The guard's pattern anchors on the session receiver, so execCtx.tenantId / opts.tenantId are never matched.

Verification

  • Affected package tests green: spec (50), objectql (116, incl. the tenant_id stamping integration test), runtime (185), trigger-record-change (25).
  • Full dependency-closure turbo build succeeds (no type errors).
  • pnpm check:org-identifier passes across examples/, apps/, and packages/ (1408 files).

⚠️ Timing

Per #3290 this is scheduled for the next major (v11/v12) and should not land before a real deprecation window (the @deprecated TSDoc + the #3289 guard are the migration aids in the meantime). Opened as a draft so it can ride the major train — the changeset is a major bump for the three packages, so it will only release on a major.


Generated by Claude Code

Converge the hook and action-body authoring surface on `organizationId`,
removing the `ctx.session.tenantId` / `ctx.user.tenantId` alias that #3280
added as a deprecated shim.

- spec: drop `tenantId` from `HookContextSchema.session` (only
  `organizationId` remains; a stray key is now stripped by the schema).
- objectql: engine `buildSession()` no longer emits `session.tenantId`; the
  audit-stamp plugin sources the `tenant_id` column from
  `session.organizationId`.
- runtime: `buildActionSession()` and the REST action `ctx.user` no longer
  emit `tenantId`.
- trigger-record-change: reads `session.organizationId` when forwarding the
  writer's org to a runAs:'user' flow (behavior identical).
- check:org-identifier guard now also covers `packages/**` (tests and
  comments excluded); docs/skills reference bodies migrated to
  `organizationId`.

The generic driver-layer tenancy knob (ExecutionContext.tenantId,
DriverOptions.tenantId, SqlDriver.applyTenantScope, ExecutionLog.tenantId)
is deliberately untouched. Breaking: major bump for spec, objectql, runtime.

Closes #3290

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Q7R16SoGBeqKkEd7RCZRL
@vercel

vercel Bot commented Jul 19, 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 19, 2026 5:52pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/objectql, @objectstack/runtime, @objectstack/spec, packages/triggers.

112 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/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, 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 @objectstack/objectql, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @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 packages/objectql, @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/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.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/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime, @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/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @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/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/runtime, @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/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/objectql, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @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/objectql, @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/objectql, @objectstack/runtime, @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/objectql, @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.

@os-zhuang os-zhuang added the allow-major label Jul 19, 2026 — with Claude
@os-zhuang
os-zhuang marked this pull request as ready for review July 19, 2026 17:52
@os-zhuang
os-zhuang merged commit 6c270a6 into main Jul 19, 2026
18 of 20 checks passed
@os-zhuang
os-zhuang deleted the claude/remove-session-tenantid-alias-h89c5x branch July 19, 2026 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove the deprecated hook/action ctx.session.tenantId alias in the next major (converge on organizationId)

2 participants