Repository navigation
docs: the organization-ownership passages say what 18.0 supports for a v17 database - #24678
Merged
objectstack-fleet[bot] merged 3 commits intoOct 19, 2026
Conversation
…a v17 database
Four hand-written pages walked an operator through the organization-ownership
plan and apply with no 18.0 qualifier, and 18.0 refuses that command on every
database (NOT_IMPLEMENTED). Each passage that tells an 18.0 reader what happens
now carries the 18.0 sentence ("18.0 supports fresh installs only and does not
upgrade a v17 database: keep a v17 database on a 17.x release until the 18.x
release that carries the upgrade path"); each passage that teaches the
ceremony's mechanics keeps them under an explicit 18.x qualifier.
The os dev section now says what os dev does in 18.0 on a v17 database (copy,
refused plan, exit, database unchanged), and the drop-gate bullet names the
population the gate actually holds: every organization_id drop the drift
offers, not only the D7 tables and the sys_metadata family.
Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
The first line of the os dev and os migrate organization-ownership callouts is the one an open 18.x walled-lift PR rewrites. Leave it as it was and carry the 18.0 sentence and the 18.x qualifier on the lines after it, so the two changes do not meet on one line. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…a v17 database The Environment Customization note said an 18.x os serve refuses a database still holding an organization-layer overlay row "until the v18 migration ceremony has carried it", with no 18.0 qualifier, and 18.0 has no ceremony. It now carries the 18.0 sentence and puts both ceremony halves (the overlay row and the public-form withdrawals) under the 18.x qualifier, as its twin in metadata-lifecycle does. The refusal is stated as the boot guard measures it: on a SQL database, where the sys_metadata family still carries its organization_id column. The guard reads physical columns and is inert on memory and MongoDB, so the twin note in metadata-lifecycle gains the same condition. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Seat reviewACCEPT ·
This seat readies the PR and queues it with auto-merge. Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-24653-docs-org-ownership-18-qualifier
branch
October 19, 2026 23:54
os-steve
pushed a commit
that referenced
this pull request
Oct 20, 2026
Conflicts and restatements, the ceremony being open on this branch: - runtime boot guard, its unit, kernel and dogfood pins: #24682's 18.0 "fresh installs only" refusal gives way to the marker-based refusal that names the ceremony's plan and apply. - cli.mdx: the open-ceremony text kept; #24678 and step 4's "until then the ceremony refuses" sentences restated; #24722's audit-mail-bodies row and section kept beside it. - B2: #24661's seven 18.0 upgrade-guide entries prescribe the ceremony again (the ups entry keeps the full apply), pinned in organization-ownership-upgrade-entries.test.ts. - metadata-lifecycle, metadata-service, capabilities, permission-sets: the 18.0 deferral restated. - platform-core.v18-boot-refusals revision 5. - objectql: WALLED_ORGANIZATION_LESS_BRIDGE, isWalledOrganizationLessBridgeObject and the engine reader are deleted (sys_secret and sys_flow_credential are column-less here); the refusal names systemFields: { tenant: false }. The tripwire is deleted; the flow-credential walled pin is kept, renamed walled-flow-credential-write.test.ts. - #24688's principal x door matrix restated over a ceremonied fixture. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014UATXWqAXqkaZkbG92ox6V
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #24653
Refs #24637 (the 18.0 release-text family parent; this PR is its
domain:devxrow and leaves the parent open)Clause-②: no — docs prose only; no authorable key, flag, exit code or JSON key moves.
Four hand-written pages walked an operator through
os migrate organization-ownershipplan and apply with no 18.0 qualifier, and 18.0 refuses that command on every database (NOT_IMPLEMENTED). Each passage now does one of the two things the card's Done line allows, in the terms PR #24635 landed (f89d29e382):Docs only: no package code, no new gate, label
skip-changeset(see Changeset).Census
git grep -n -E "organization-ownership (--apply|--out|--dev)|--plan-file" -- content/docs— 8 hits atBASEbfc1539fe0, 8 hits at headd989786746. Every hit after the change sits under an (a) or (b) sentence:concepts/metadata-lifecycle.mdx:109:109os serverefuses a database still holding an organization overlay row--out PLAN, then--apply --plan-file PLAN) carries such a row to the environment layer…"deployment/cli.mdx:213:220os dev, step 2 (organization-ownership --dev):205–213("18.0 does not upgrade a v17 database: keep a v17 database on a 17.x release until the 18.x release that carries the upgrade path", plus whatos devdoes in 18.0); the steps open with "In the 18.x release that carries the upgrade path,os devruns that ceremony for you…" (:215)deployment/cli.mdx:1029:1047os migrate apply --allow-destructive, theorganization_iddrop gate:1043–1046: "18.0 itself never records a verified run, so on a v17 database this refusal holds on every run." plus the landed sentence verbatim; then "In that release, the ceremony's--apply --plan-file FILErun drops these columns itself…"deployment/cli.mdx:1492:1507--out plan.json:1498–1504: refused in 18.0 withNOT_IMPLEMENTED, "Keep a v17 database on a 17.x release until the 18.x release that carries the upgrade path. The invocations below, and what the list after them says the ceremony does, are that 18.x release's."deployment/cli.mdx:1493:1508--apply --plan-file plan.json --backup-takendeployment/cli.mdx:1494:1509--dev …permissions/capabilities.mdx:220:223--applydoes withsys_capabilityrows:220–222: "In the 18.x release that carries the upgrade path (18.0 does not upgrade a v17 database: seeos migrate organization-ownership)", linking the CLI page's calloutpermissions/permission-sets.mdx:399:402--applydoes withsys_permission_setrows:399–401: the same qualifier and linkOther edits inside the same passages:
A 17.x development database is upgraded in placeis nowA 17.x development database: in 18.0 nothing is upgraded. Nothing in the repo links the old anchor (git grepovercontent,apps,docs: 0 hits), andcheck:doc-anchorsis green.os serve/os start: "they refuse and name the command" is now "they refuse to start, and on a v17 database their 18.0 refusal says that 18.0 does not upgrade it". The runtime boot refusal's v17-shape branch (organizationOwnershipRefusalMessage,packages/runtime/src/organization-ownership-boot-guard.ts) says "18.0 does not upgrade a v17 database: keep this one on a 17.x release…" atBASE. It also still names the 18.x steps, which is thedomain:clirow (runtime: the organization-ownership boot refusals prescribe--out PLAN/--apply --plan-file PLAN, which 18.0 refuses on every database (#24637, domain:cli row) #24651), so this sentence holds whichever way that row lands.os migrate organization-ownershipintro: "Underos devit runs on its own" now carries the 18.x qualifier.sys_metadatafamily", which is narrower than the code:ceremonyOrganizationColumnDrops(packages/cli/src/utils/organization-ownership-drop-gate.ts) holds back everydrop_column organization_idin the intended drift, its header says why ("the ceremony plans each table that carries the column"), and PR fix(cli): the organization-ownership drop refusal says what 18.0 supports for a v17 database #24635 measured an application object (acme_notewithsystemFields: { tenant: false }) refused by it. The page now says "on every table the drift offers to drop it from: the ceremony plans every table that still carries the column, the ADR-0131 D7 tables and thesys_metadatafamily among them".The two facts, measured at
BASEMigrateApply.run()(packages/cli/src/commands/migrate/apply.ts:555–611): when the intended drift holds anorganization_iddrop andreadOrganizationOwnershipMarkeranswers not verified, it refuses the whole--allow-destructiverun, exit 1 (--json:message: refused_organization_ownership_unmigrated,tables,detail,marker). Only the ceremony's apply writes that marker (utils/organization-ownership-apply.ts), and the registered 18.0 command is the refusingMigrateOrganizationOwnership, so 18.0 records no verified run and the drops stay withheld on a v17-shaped database. The page says so.NOT_IMPLEMENTED.ORGANIZATION_OWNERSHIP_UPGRADE_UNAVAILABLE_CODE = 'NOT_IMPLEMENTED'(packages/cli/src/commands/migrate/organization-ownership.ts:1115).MigrateOrganizationOwnership.run()(:1147) answerserror: plan_refused | apply_refused,reason: upgrade-unavailable,code: NOT_IMPLEMENTEDanddetailunder--json, otherwise the message plus(NOT_IMPLEMENTED), exit 1, before it opens anything. Its flags are plain strings, so parsing reads no file. The page's "exits1withNOT_IMPLEMENTED(under--json,codebesideerror) and reads and writes nothing" was already right and is kept.Dispatch hypotheses
os devon a v17-shaped database atBASE: the step still runs, and it refuses. Therecoverhook inpackages/cli/src/commands/dev.tscallsupgradeDevelopmentDatabase(utils/dev-organization-ownership-upgrade.ts). For a local SQLite file it copies the file and itstelemetrysibling into the backups directory, then spawnsmigrate organization-ownership --dev --database-url URL --out PLAN. The registered 18.0 command refuses that withNOT_IMPLEMENTEDand writes no plan.os devthen prints the refusal, "The upgrade plan was refused, and nothing was changed", where the copy is, and the 18.0 sentence, and exits with the refused child's code. The apply step is never reached. For any other database it takes no copy, runs nothing, and prints the 18.0 sentence. The callout now says this. Measured from source and fromsrc/utils/dev-organization-ownership-upgrade.test.ts: 6 of 6 passed, and its refused-plan case asserts one call, "nothing was changed", the copy's location, "17.x release" and no--plan-file. Not run live: this is a docs-only card, and a live run needs the CLI's dependency closure built (63 build tasks, 49 cache misses at this base).check:cli-examples-paritycompares one declared pair only (os package publish;--listprints "1 row(s) read"), andcheck-cli-command-idskeeps out ofcontent/docsby its own header. The qualified fence names only flags the registered command declares, inherited from the ceremony class. All 45 derived gates exit 0 with the fence in place.content/docs/releases/v18/index.mdxhas no hit for "fresh install", "17.x release" or "upgrade path". So the (a) passages carry the sentence, and the two permissions pages link to the CLI page'sos migrate organization-ownershipcallout rather than restate it again. The release page is not touched.Overlap with an open PR
Open draft PR #24667 (the 18.x walled lift) rewrites the first line of both
cli.mdxcallouts and the:1205table row. This diff leaves those three lines byte-identical and puts the 18.0 sentence and the 18.x qualifier on the lines after them. I applied #24667's three hunks toBASEas a scratch commit and trial-merged it with this head:git merge-tree --write-treeexit 0, a tree id, no conflict. Control leg: the same against this branch's first commit (5da97c5952), which edited those lines, exit 1 withCONFLICT (content).cli.mdxhas no merge driver (git check-attr merge: unspecified), so the local reading is the one GitHub makes.Tests and gates (head
d989786746)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths): 4 paths, 57 changed lines (+39 / -18) against merge basebfc1539fe, 45 commands (31 pnpm, 14 node). All 45 exit 0, with each exit code captured before any pipe. The--ranreconciliation:Run reconciliation — 45 derived, 45 run, 0 NOT-MEASURED, 0 UNRUN.5da97c5952), five first attempts exited 3 with PREREQUISITE NOT MET:check:doc-formula-expressions,check:doc-security-posture,check:skill-examplesandcheck:docs-transcript-drift(nodist), andcheck:docsexited 1 (packages/spec/json-schemamissing). They measured nothing. Afterturbo run buildofspec,lint,formulaandsdui-parser(4 cache hits), thencore,clientandclient-react, all five re-ran exit 0. Atd989786746every one of the 45 exited 0 on its first attempt.✓ check-cli-examples-parity: 1 declared pair(s) agree as SETS·✅ check-doc-anchors: 538 internal #fragment link(s) across 423 source file(s) all resolve to a real heading·✓ check-docs-transcript-drift: 4 declared transcript value(s) across 417 page(s)·✓ content/docs/concepts/metadata-lifecycle.mdx: the overlay whitelist table AND the counts in the sentence under it agree with DEFAULT_METADATA_TYPE_REGISTRY·✅ 227 generated files in sync with packages/spec·check-nul-bytes: OK.@mdx-js/mdx3.1.1 andremark-gfm: 4 OK. Negative control (an unclosed expression): FAIL, exit 1. CI'sBuild Docsis the authority here.pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 src/utils/dev-organization-ownership-upgrade.test.tsunderscripts/pm/os-verify-lock.sh:Tests 6 passed (6),VERDICT command-exit 0. This is the measurement for hypothesis 1, not a test of this diff.pnpm lint, the 11 declared-wide families,Build DocsandTest Core.Changeset
skip-changeset. No published package shipscontent/docs. Nofiles[]entry in any non-private workspacepackage.jsonnamescontent,docsor a parent path: 0 hits, with a positive control (adistentry) at 73 packages.apps/docsis private.Acceptance notes
content/docs/kernel/contracts/metadata-service.mdx:415–419says "an 18.xos serverefuses to start on a database still holding one until the v18 migration ceremony (ADR-0131 C7) has carried it to the environment layer", with no 18.0 sentence. It is the twin of the metadata-lifecycle note above. It names no command, so the card's census does not reach it, and it is outside this claim's file surface, so it is not edited here. Reported to the seat for the 18.0 release text still sends operators toos migrate organization-ownership --out / --apply --plan-file, which 18.0 refuses on every database (family close-out: spec upgrade-guide entries, runtime boot refusals, plugin-security report, docs) #24637 family.cli.mdx:1205, the command table row, already says "In 18.0 the command refuses" and names no plan or apply invocation. It is not a census hit and is not edited (see the overlap above).os devcallout's first line will say "Until then the ceremony refuses", and the lines after it will still say what 18.0 does. The two read together.Generated by Claude Code