Skip to content

feat(org-scoping): multi-tenant seed ownership handoff to default-org admin#2031

Merged
os-zhuang merged 1 commit into
mainfrom
feat/multitenant-seed-ownership
Jun 18, 2026
Merged

feat(org-scoping): multi-tenant seed ownership handoff to default-org admin#2031
os-zhuang merged 1 commit into
mainfrom
feat/multitenant-seed-ownership

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

The multi-tenant companion to #2021's single-tenant claimSeedOwnership. Completes the ownership-handoff story symmetrically across both deployment modes.

Gap: seeded rows land owner_id NULL (authors leave it unset; cel\os.user.id`resolves to NULL at seed time). In multi-tenant modeclaimOrphanOrgRowsback-fills theirorganization_id, but owner_id` stayed NULL — so "My" views, owner reports and owner notifications were empty for the org's members.

Change

  • claimOrgSeedOwnership(ql, organizationId, ownerUserId) — assigns owner_id = ownerUserId to an org's NULL-owned seed rows. Scoped to one org (never touches another tenant), idempotent, skips managedBy / sys_*, requires both owner_id and organization_id columns.
  • ensureDefaultOrganization calls it after binding the platform admin as the default org's owner, so the default org's demo data is owned by the admin out of the box.

Tests

  • claim-org-seed-ownership.test.ts (+5): registry-unavailable, no-op without org/owner, skip managed/sys_/missing-column, org-scoped claim (other orgs + human-owned untouched), idempotent.
  • Full org-scoping suite green (20 tests); build + typecheck clean.

Follow-ups (not here)

  • Subsequent orgs (cloneOrgSeedData) could stamp owner_id = the new org's creator at clone time — the default-org case (the common one) is covered here.

🤖 Generated with Claude Code

Multi-tenant companion to plugin-security's single-tenant claimSeedOwnership.
Seeded rows land owner_id NULL; claimOrphanOrgRows back-fills organization_id
but owner_id stayed NULL, so owner-keyed UX was empty for org members.

- New claimOrgSeedOwnership(ql, orgId, ownerUserId): assigns owner_id to an
  org's NULL-owned seed rows; org-scoped, idempotent, skips managedBy/sys_*,
  requires both owner_id + organization_id columns.
- ensureDefaultOrganization calls it after binding the admin as the default
  org's owner — symmetric with the single-tenant first-admin handoff.

Tests: claim-org-seed-ownership suite (+5). org-scoping 20 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@os-zhuang
os-zhuang merged commit 4b6430e into main Jun 18, 2026
9 of 10 checks passed
@os-zhuang
os-zhuang deleted the feat/multitenant-seed-ownership branch June 18, 2026 12:12
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling labels Jun 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/dogfood, @objectstack/driver-sql.

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

  • content/docs/concepts/core/plugins.mdx (via @objectstack/driver-sql)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/driver-sql)
  • content/docs/concepts/terminology.mdx (via @objectstack/driver-sql)
  • content/docs/getting-started/glossary.mdx (via @objectstack/driver-sql)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/driver-sql)
  • content/docs/guides/packages.mdx (via @objectstack/driver-sql)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/driver-sql)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/driver-sql)

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.

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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant