Repository navigation
docs(tenancy): 18.0 states the three ownership rules and its fresh-install, single-only scope; the operator messages say so too - #24506
Conversation
…stall, single-only scope; the operator messages say so too The tenancy and permissions docs state ADR-0131's three rules: a managed package's metadata is not in the database; a row in a table with an organization column was written by that organization, and NULL is not an owner; a table with no organization column is deployment-level or code-level, protected by permissions. The tenancy page answers whether a platform table with no organization is by design, and its 18.0 callout adds the scope: 18.0 databases take the 18.x upgrade path, and the walled refusal covers the os boot path only. Text that read NULL as a global or platform-wide row is reworded, and the SQL driver's tenant-scope docblock says the NULL arm is the v17 reading the 18.x line removes. Three operator messages ride along: - the v18 boot refusal on a v17-shaped database says first that 18.0 does not upgrade it and that it stays on 17.x until 18.x; - the posture fix list says 18.0 refuses group and isolated at boot; - os doctor reports a walled posture as a warning naming the os serve refusal. Claude-Session: https://claude.ai/code/session_01L9ZWcgyzEyyKR2nnDzto54 Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 3 package(s): 10 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 3 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 50 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin cf170c92377aba2e4f5b3d7be008590f21f0dba7 && git checkout cf170c92377aba2e4f5b3d7be008590f21f0dba7
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 7e58e0a27998194640c145344b7519f1ccc9fad4 77a7a78abba9674fd9bef0b4d0f52069277362be && git checkout -B drift-repro 7e58e0a27998194640c145344b7519f1ccc9fad4 && git merge --no-ff 77a7a78abba9674fd9bef0b4d0f52069277362be
node scripts/docs-audit/affected-docs.mjs --json 7e58e0a27998194640c145344b7519f1ccc9fad4
|
Seat review ·
|
Part of #15214
Clause-②: no — docs, a driver docblock and three operator-facing message strings (one a new
os doctorwarning row); no API, schema, rule, permission or exit-code faceThe open-source docs half of C11. It runs in parallel to the 18.0 release and never holds it (ruling record 6261853191 on #15194). The ADR-0131 D14 dated note is a separate PR on
claude/issue-15214-c11-d14-note, becausedocs/adr/**is Tier H. Card close-outs stay with the epic seat: #13564, #13636, PR #14923, #11611 and #10103 remain open from this PR.What changes
Docs: the three sentences (ADR-0131 D1–D7), stated as 18.0 delivers them.
content/docs/deployment/tenancy-modes.mdxgets a new section, "Who owns a row", with the three rules:NULLis not an owner;singlebehaviour of 8b's ruling: a system write that names no organization is stamped with the Default Organization, or refused loudly when there are zero or two or more organizations.organization_idfilled in on write" cell forsingleread "no". It now reads "yes — the Default Organization" (ADR-0131 D11:singleis never a reason for a row to be organization-less).Docs: the 18.0 scope. The existing "18.0: single only" callout on the tenancy page is where an operator chooses a posture. It gains two facts:
osboot path only. The one-shotos migrate/os verify/os secret/os storageboots and embedded hosts (createStandaloneStack,@objectstack/adapter-hono) are not refused, and are not a supported walled deployment in 18.0.The six sentences #24480 added (
cli.mdx×3,environment-variables.mdx:101,self-hosting.mdx:470,tenancy-modes.mdx:20-21) agree with this text and are not repeated.Docs: the replaced mechanism. Wording that read
NULLas a global or platform-wide row is gone from the tenancy and permissions pages:sharing-rules.mdx: the scope was "this organization ∪ the platform-global rows". It is now the rule rows that organization wrote.sharing-rules.mdx,permissions-matrix.mdx,rls.mdx:tenancy.enabled: falsewas called "platform-global". It is now "deployment-level: no organization column".system-context.mdxrow 23d: "a row stored with no organization is a global grant". It now says such a row is not judged, and that undersingle18.0 stamps a new grant.SQL driver docblock. The
applyTenantScopecomment called theIS NULLarm "a GLOBAL/platform row". It now names that as the v17 reading and states the three rules. It says the arm matches nothing on a fresh 18.0singleinstall, and is removed on the 18.x line (ADR-0131 D14). The comment is the only change; the code is not touched.Riders (review 6261404044 ③, ruling record 6261853191 item 2):
packages/runtime/src/organization-ownership-boot-guard.ts,organizationOwnershipRefusalMessage). One sentence goes ahead of the ceremony command on a v17-shaped database: "18.0 does not upgrade a v17 database: keep this one on a 17.x release until the 18.x release that carries the upgrade path, and run these steps there." The operator no longer follows two hops.TENANCY_POSTURE_FIX_HINTS(packages/cli/src/utils/tenancy-posture-hints.ts). This was the smaller truthful change.groupandisolatedstay listed, because they are the vocabulary, with a suffix; refused at boot in 18.0, which supports single only(WALLED_POSTURE_RELEASE_NOTE, which the 18.x restore deletes).os serveandos doctorboth render it.os doctor. A valid posture used to print nothing. Undergroup/isolatedit now prints aTenancy posturewarning: 18.0 supportssingleonly, so the nextos serve(and soos dev/os start) refuses it at boot. The row is a warning, not an error, so doctor's exit code is unchanged. The one-shot commands doctor also fronts still boot under a walled posture.Changeset
.changeset/15214-c11-fresh-install-messages.md:patchfor@objectstack/cliand@objectstack/runtime.driver-sqlchanges a comment only and publishes no string. Nothing is touched undercontent/docs/releases/or anyCHANGELOG.md.File surface
claude/issue-15212-8b-stamp-or-refuse, fetched ataf977a6) touches 36 files underpackages/objectql,packages/core/src/security,plugin-security,plugin-authand others. None of them is in this diff, so no rider was dropped.serve.tsandmigrate/organization-ownership.tsare not touched.Tests
Measured at
77a7a78ab; its tree is byte-identical to the tree the runs below read.pnpm --filter '@objectstack/cli^...' build(lock)pnpm --filter @objectstack/cli exec vitest run --project unitpackages/cli/dist, which the first build did not make. Afterpnpm --filter @objectstack/cli buildthey were rerun:published-subpath-consoleandpublished-subpath-hook-bodypassed 2/2 files;boot-preparation-parityandhook-timeout-override-refusalpassed 2/2 files, 41/41 tests, with the box idlepnpm --filter @objectstack/cli typecheckpnpm --filter @objectstack/runtime testpnpm --filter @objectstack/runtime typecheckPins moved, and why:
serve-organizations-message-spelling.test.tssite 6 anddoctor-organizations-message-spelling.test.tslegs (i) and the CONTROL now carry the 18.0 suffix. Thegrouplegs read the shared table and move with it.doctor-tenancy-posture-report.test.tsanddoctor-env-provenance.test.tsusedisolatedas the "a posture that can start" control. In 18.0 that premise is false, so the control is nowsingle.walledPostureFindingover the posture vocabulary, and an in-processos doctorrun undergroup(warning row, exit 0).organization-ownership-boot-guard.test.tsasserts that the 18.0 / 17.x answer appears ahead of the command.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstacknamed 102 families, plus 48 roster commands on stderr. All 150 were run, exit codes recorded before any pipe.--ranreconciliation: "102 derived famil(ies) accounted for — 102 run, 0 NOT-MEASURED (a DERIVED zero — all 102 recorded an exit code and none of them is 3)".PREREQUISITE NOT MET(exit 3): missingdist/, or a shallow-clone fixture. After buildingclient-react,studioand the six packagescheck:published-readme-exportsnamed, and fetching the fixture commit, all seven exit 0:check-plugin-teardown-shape --self-test,check:skill-examples,check:dual-build-cjs-loads,check:i18n,check:i18n-coverage,check:i18n-walk-parity,check:published-readme-exports.check-closing-target-claim,check-partof-closing-keyword,check-single-claim-paths,check-governed-queue-guard. CI runs them on this PR.Build Docs,Build Core, theTest Coreshards, the type-check lanes.Acceptance notes
NOT NULL". The docs say every row carries its organization and thatNULLis not an owner. They do not claim the DDL constraint, because 8e (NOT NULL) moved to 18.x (ruling record 6259698357 item 3). An 18.0 database therefore has no such constraint, and a page claiming one would be false in 18.0.singlestamping is described as ruled (6259698357, 6259899486), not from its internals.COALESCE(organization_id, '__global__')index key and the NULL partition:data-modeling/indexing.mdx,protocol/objectql/schema.mdx,deployment/seed-tenancy-repair.mdx,deployment/cli.mdx. The mechanism is still live in 18.0 (8d moved to 18.x), so these pages are true today. They are this card's family for the 18.x docs pass. Successor: none.system-context.mdxrow 62 describes the enterprise organizations plugin's elevated insert under a wall. It was not changed: 18.0 refuses walled boots atos serve, and the walled half is 18.x. Successor: none.Generated by Claude Code