Skip to content

Commit 0431002

Browse files
docs: the organization-ownership passages say what 18.0 supports for a v17 database (#24678)
Fixes #24653 Refs #24637 (the 18.0 release-text family parent; this PR is its `domain:devx` row 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-ownership` plan 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`): - **(a)** where it tells an 18.0 reader what happens now: "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." - **(b)** where it teaches the ceremony's mechanics (plan, apply, the drop gate's way on): the mechanics stay, under an explicit "In the 18.x release that carries the upgrade path" qualifier. 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 at `BASE` `bfc1539fe0`, 8 hits at head `d989786746`. Every hit after the change sits under an (a) or (b) sentence: | before | after | passage | choice | the sentence it sits under | |:--|:--|:--|:--|:--| | `concepts/metadata-lifecycle.mdx:109` | `:109` | ADR-0131 D6 overlay note: a v18 `os serve` refuses a database still holding an organization overlay row | (a) + (b) | the landed sentence verbatim, then "In that release, the v18 migration ceremony (ADR-0131 C7: `--out PLAN`, then `--apply --plan-file PLAN`) carries such a row to the environment layer…" | | `deployment/cli.mdx:213` | `:220` | `os dev`, step 2 (`organization-ownership --dev`) | (b), under an (a) callout | callout `: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 what `os dev` does in 18.0); the steps open with "In the 18.x release that carries the upgrade path, `os dev` runs that ceremony for you…" (`:215`) | | `deployment/cli.mdx:1029` | `:1047` | `os migrate apply --allow-destructive`, the `organization_id` drop gate | (a) + (b) | `: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 FILE` run drops these columns itself…" | | `deployment/cli.mdx:1492` | `:1507` | the ceremony's fence, `--out plan.json` | (b), under the (a) callout | callout `:1498–1504`: refused in 18.0 with `NOT_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` | the fence, `--apply --plan-file plan.json --backup-taken` | (b) | the same callout | | `deployment/cli.mdx:1494` | `:1509` | the fence, `--dev …` | (b) | the same callout | | `permissions/capabilities.mdx:220` | `:223` | what `--apply` does with `sys_capability` rows | (b) | `:220–222`: "In the 18.x release that carries the upgrade path (18.0 does not upgrade a v17 database: see `os migrate organization-ownership`)", linking the CLI page's callout | | `permissions/permission-sets.mdx:399` | `:402` | what `--apply` does with `sys_permission_set` rows | (b) | `:399–401`: the same qualifier and link | Other edits inside the same passages: - Heading `A 17.x development database is upgraded in place` is now `A 17.x development database`: in 18.0 nothing is upgraded. Nothing in the repo links the old anchor (`git grep` over `content`, `apps`, `docs`: 0 hits), and `check:doc-anchors` is 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…" at `BASE`. It also still names the 18.x steps, which is the `domain:cli` row (#24651), so this sentence holds whichever way that row lands. - The `os migrate organization-ownership` intro: "Under `os dev` it runs on its own" now carries the 18.x qualifier. - The drop gate's population. The page said "These tables are the ADR-0131 D7 tables and the `sys_metadata` family", which is narrower than the code: `ceremonyOrganizationColumnDrops` (`packages/cli/src/utils/organization-ownership-drop-gate.ts`) holds back every `drop_column organization_id` in the intended drift, its header says why ("the ceremony plans each table that carries the column"), and PR #24635 measured an application object (`acme_note` with `systemFields: { 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 the `sys_metadata` family among them". ## The two facts, measured at `BASE` - **The drop gate still withholds the drops.** `MigrateApply.run()` (`packages/cli/src/commands/migrate/apply.ts:555–611`): when the intended drift holds an `organization_id` drop and `readOrganizationOwnershipMarker` answers not verified, it refuses the whole `--allow-destructive` run, 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 refusing `MigrateOrganizationOwnership`, so 18.0 records no verified run and the drops stay withheld on a v17-shaped database. The page says so. - **The refusal code is `NOT_IMPLEMENTED`.** `ORGANIZATION_OWNERSHIP_UPGRADE_UNAVAILABLE_CODE = 'NOT_IMPLEMENTED'` (`packages/cli/src/commands/migrate/organization-ownership.ts:1115`). `MigrateOrganizationOwnership.run()` (`:1147`) answers `error: plan_refused | apply_refused`, `reason: upgrade-unavailable`, `code: NOT_IMPLEMENTED` and `detail` under `--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 "exits `1` with `NOT_IMPLEMENTED` (under `--json`, `code` beside `error`) and reads and writes nothing" was already right and is kept. ## Dispatch hypotheses 1. **`os dev` on a v17-shaped database at `BASE`: the step still runs, and it refuses.** The `recover` hook in `packages/cli/src/commands/dev.ts` calls `upgradeDevelopmentDatabase` (`utils/dev-organization-ownership-upgrade.ts`). For a local SQLite file it copies the file and its `telemetry` sibling into the backups directory, then spawns `migrate organization-ownership --dev --database-url URL --out PLAN`. The registered 18.0 command refuses that with `NOT_IMPLEMENTED` and writes no plan. `os dev` then 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 from `src/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). 2. **Docs gates reading the fence: falsified, because no gate reads it.** `check:cli-examples-parity` compares one declared pair only (`os package publish`; `--list` prints "1 row(s) read"), and `check-cli-command-ids` keeps out of `content/docs` by 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. 3. **The release page states the rule: falsified.** `content/docs/releases/v18/index.mdx` has 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's `os migrate organization-ownership` callout 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.mdx` callouts and the `:1205` table 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 to `BASE` as a scratch commit and trial-merged it with this head: `git merge-tree --write-tree` exit 0, a tree id, no conflict. Control leg: the same against this branch's first commit (`5da97c5952`), which edited those lines, exit 1 with `CONFLICT (content)`. `cli.mdx` has 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 base `bfc1539fe`, 45 commands (31 pnpm, 14 node). **All 45 exit 0**, with each exit code captured before any pipe. The `--ran` reconciliation: `Run reconciliation — 45 derived, 45 run, 0 NOT-MEASURED, 0 UNRUN.` - At the first head (`5da97c5952`), five first attempts exited 3 with PREREQUISITE NOT MET: `check:doc-formula-expressions`, `check:doc-security-posture`, `check:skill-examples` and `check:docs-transcript-drift` (no `dist`), and `check:docs` exited 1 (`packages/spec/json-schema` missing). They measured nothing. After `turbo run build` of `spec`, `lint`, `formula` and `sdui-parser` (4 cache hits), then `core`, `client` and `client-react`, all five re-ran exit 0. At `d989786746` every one of the 45 exited 0 on its first attempt. - Verdict lines: `✓ 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`. - I compiled the four pages with `@mdx-js/mdx` 3.1.1 and `remark-gfm`: 4 OK. Negative control (an unclosed expression): FAIL, exit 1. CI's `Build Docs` is the authority here. - `pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 src/utils/dev-organization-ownership-upgrade.test.ts` under `scripts/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. - The control-byte self-scan of the four files found none. - No ablation and no reverse verification: this is docs prose, and no tested behaviour changed. - Left to CI: the full farm, `pnpm lint`, the 11 declared-wide families, `Build Docs` and `Test Core`. ## Changeset `skip-changeset`. No published package ships `content/docs`. No `files[]` entry in any non-private workspace `package.json` names `content`, `docs` or a parent path: 0 hits, with a positive control (a `dist` entry) at 73 packages. `apps/docs` is private. ## Acceptance notes - `content/docs/kernel/contracts/metadata-service.mdx:415–419` says "an 18.x `os serve` refuses 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 #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). - When #24667's wording lands, the `os dev` callout'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](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent d61ed6a commit 0431002

5 files changed

Lines changed: 49 additions & 23 deletions

File tree

‎content/docs/concepts/metadata-lifecycle.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ later ships. See [ADR-0070](https://github.com/objectstack-ai/objectstack/blob/m
106106

107107
**Most metadata types must not be overlaid by an environment** — overlaying a packaged item would break the physical schema or the behaviour its package ships. The whitelist lives in **one** place: `MetadataTypeRegistryEntry.allowEnvironmentOverlay` in `packages/spec/src/kernel/metadata-plugin.zod.ts` (spelled `allowOrgOverride` before protocol 18; `GET /api/v1/meta/types` serves it per entry as `allowEnvironmentOverlay`).
108108

109-
> **ADR-0131 D6 — the per-organization overlay axis is retired.** The `/meta` doors (REST and the runtime dispatcher) carry no organization into a metadata write or read: a Studio or `PUT /api/v1/meta/...` write of the five ✅ types below lands **environment-wide** (since ADR-0131 D7 the `sys_metadata` family declares no organization column) and is served to every organization, and an organization admin holding only the retired `manage_org_presentation` capability is refused (`403`). The protocol itself refuses every organization-scoped write, and every read — item, list, layers, cached, history, diff, audit, drafts and the commit timeline — is environment → code, whatever organization a caller names. An overlay row an earlier release stored under an organization — under the `single` posture, every Studio save of these types, filed under the Default Organization — is served by no read, and an 18.x `os serve` refuses to start on a database still holding one until the v18 migration ceremony (ADR-0131 C7: `os migrate organization-ownership --out PLAN`, then `--apply --plan-file PLAN`) has carried it to the environment layer and dropped the column; nothing deletes or rewrites it before then. The anonymous form doors read the environment alone too: the ceremony carries every organization-layer public-form withdrawal onto the environment, fail-closed. The table still records which types take an overlay of a shipped item.
109+
> **ADR-0131 D6 — the per-organization overlay axis is retired.** The `/meta` doors (REST and the runtime dispatcher) carry no organization into a metadata write or read: a Studio or `PUT /api/v1/meta/...` write of the five ✅ types below lands **environment-wide** (since ADR-0131 D7 the `sys_metadata` family declares no organization column) and is served to every organization, and an organization admin holding only the retired `manage_org_presentation` capability is refused (`403`). The protocol itself refuses every organization-scoped write, and every read — item, list, layers, cached, history, diff, audit, drafts and the commit timeline — is environment → code, whatever organization a caller names. An overlay row an earlier release stored under an organization — under the `single` posture, every Studio save of these types, filed under the Default Organization — is served by no read, and on a SQL database (SQLite, PostgreSQL, MySQL) still holding one a v18 `os serve` refuses to start. 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. In that release, the v18 migration ceremony (ADR-0131 C7: `os migrate organization-ownership --out PLAN`, then `--apply --plan-file PLAN`) carries such a row to the environment layer and drops the column; nothing deletes or rewrites it before then. The anonymous form doors read the environment alone too: in that release the ceremony carries every organization-layer public-form withdrawal onto the environment, fail-closed. The table still records which types take an overlay of a shipped item.
110110

111111
| Type | `allowEnvironmentOverlay` | Rationale |
112112
| :--- | :---: | :--- |

‎content/docs/deployment/cli.mdx‎

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,31 +196,40 @@ os dev --database file:./data/test.db --auth-secret $(openssl rand -hex 32)
196196
| `--seed-admin` / `--no-seed-admin` | — | Seed a dev admin (`admin@objectos.ai` / `admin123`) on an empty DB — default on; override with `--admin-email` / `--admin-password` |
197197
| `-v, --verbose` | — | Verbose output |
198198

199-
##### A 17.x development database is upgraded in place
199+
##### A 17.x development database
200200

201201
A v18 server refuses to start on a database still in the v17
202202
organization-ownership shape until the [ownership ceremony](#os-migrate-organization-ownership)
203-
has run on it. `os dev` runs that ceremony for you when the database is a local
204-
SQLite file:
203+
has run on it.
205204

206205
<Callout type="warn">
207206
18.0 supports fresh `single` installs; upgrades and walled postures arrive in 18.x. In 18.0 the ceremony refuses, so `os dev` stops at step 2 with its
208207
refusal and changes nothing.
208+
18.0 does not upgrade a v17 database: keep a v17 database on a 17.x release
209+
until the 18.x release that carries the upgrade path. For a local SQLite file,
210+
`os dev` in 18.0 still takes step 1's copy first and prints where it is,
211+
beside the ceremony's `NOT_IMPLEMENTED` refusal; any other database gets no
212+
copy and the same answer.
209213
</Callout>
210214

215+
In the 18.x release that carries the upgrade path, `os dev` runs that ceremony
216+
for you when the database is a local SQLite file:
217+
211218
1. It copies the database file and its `telemetry` sibling (each with its
212219
`-wal` / `-shm`) into `<data dir>/backups/organization-ownership-<timestamp>/`.
213220
2. It runs `os migrate organization-ownership --dev` (the plan), then applies
214221
that plan. The plan, the apply report and the ceremony's log are kept
215222
beside the copy.
216223
3. It prints the ceremony's warnings and starts the server again.
217224

218-
If a step blocks, or the post-check still holds rows (a row whose owner cannot
225+
In that release, if a step blocks, or the post-check still holds rows (a row whose owner cannot
219226
be derived, named per table with its remedy), `os dev` stops and prints what
220227
holds it, where the copy is, and the command that resumes the run. It tries once per session. A database that is
221228
not a local SQLite file (PostgreSQL, a remote libSQL, `:memory:`) is not
222-
upgraded in place: run the ceremony yourself. `os serve` and `os start` never run
223-
it; they refuse and name the command.
229+
upgraded in place: run the ceremony yourself.
230+
231+
`os serve` and `os start` never run the ceremony: they refuse to start, and on
232+
a v17 database their 18.0 refusal says that 18.0 does not upgrade it.
224233

225234
##### Serving dev over https
226235

@@ -1025,13 +1034,18 @@ safe. No flag skips these refusals:
10251034
- `sys_account.issuer` is dropped only when its retirement pre-flight reads the
10261035
table clean (`os migrate account-issuer` reports the colliding rows).
10271036
- `sys_comment.reactions` waits for a verified `os migrate comment-reactions --apply` run.
1028-
- `organization_id` on any table the organization-ownership ceremony covers
1029-
waits for a verified `os migrate organization-ownership --apply --plan-file FILE`
1030-
run. These tables are the ADR-0131 D7 tables and the `sys_metadata` family.
1031-
The ceremony drops those columns itself, in its column-drops step, before it
1032-
records the run verified. Dropping one first would turn every legacy
1037+
- `organization_id` waits for a verified run of the organization-ownership
1038+
ceremony, on every table the drift offers to drop it from: the ceremony plans
1039+
every table that still carries the column, the ADR-0131 D7 tables and the
1040+
`sys_metadata` family among them. Dropping one first would turn every legacy
10331041
organization row into an environment row. Under `--json` the refusal answers
10341042
`message: 'refused_organization_ownership_unmigrated'` and lists the `tables`.
1043+
18.0 itself never records a verified run, so on a v17 database this refusal
1044+
holds on every run. 18.0 supports fresh installs only and does not upgrade a
1045+
v17 database: keep a v17 database on a 17.x release until the 18.x release
1046+
that carries the upgrade path. In that release, the ceremony's
1047+
`os migrate organization-ownership --apply --plan-file FILE` run drops these
1048+
columns itself, in its column-drops step, before it records the run verified.
10351049
10361050
Each refusal holds the whole `--allow-destructive` run: nothing in it is
10371051
created, applied or dropped, the run's other changes included. A run without
@@ -1478,14 +1492,15 @@ reports the failed read and exits `1`. A failed read or write exits `1`.
14781492
14791493
The v18 ownership ceremony (ADR-0131 D10). A v18 `os serve` / `os start` refuses
14801494
to start on a database still in the v17 organization-ownership shape until this
1481-
has run. Under `os dev` it runs on its own for a local SQLite database (see
1482-
[`os dev`](#os-dev)).
1495+
has run. In the 18.x release that carries the upgrade path, `os dev` runs it on
1496+
its own for a local SQLite database (see [`os dev`](#os-dev)).
14831497
14841498
<Callout type="warn">
14851499
18.0 supports fresh `single` installs; upgrades and walled postures arrive in 18.x. In 18.0 this command refuses, plan and apply alike: it exits `1` with
14861500
`NOT_IMPLEMENTED` (under `--json`, `code` beside `error`) and reads and
14871501
writes nothing. Keep a v17 database on a 17.x release until the 18.x release
1488-
that carries the upgrade path.
1502+
that carries the upgrade path. The invocations below, and what the list after
1503+
them says the ceremony does, are that 18.x release's.
14891504
</Callout>
14901505
14911506
```bash

‎content/docs/kernel/contracts/metadata-service.mdx‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -412,11 +412,16 @@ overlay axis is retired: the doors carry no organization, so the overlay is
412412
column, ADR-0131 D7) and served to every organization
413413
of the deployment, whatever the author's active organization. Every protocol
414414
read is environment → code, whatever organization a caller names. An overlay
415-
row an earlier release stored under an organization is served by no read, and
416-
an 18.x `os serve` refuses to start on a database still holding one until the
417-
v18 migration ceremony (ADR-0131 C7) has carried it to the environment layer. The anonymous form doors read the environment alone too: the ceremony carries
418-
every organization-layer public-form withdrawal onto the environment,
419-
fail-closed. The per-user,
415+
row an earlier release stored under an organization is served by no read. On a
416+
SQL database (SQLite, PostgreSQL, MySQL) still holding one, a v18 `os serve`
417+
refuses to start, because the `sys_metadata` family there still carries its
418+
`organization_id` column. 18.0 supports fresh installs only and does not
419+
upgrade a v17 database: keep a v17 database on a 17.x release until the 18.x
420+
release that carries the upgrade path. In that release, the v18 migration
421+
ceremony (ADR-0131 C7) carries such a row to the environment layer. The
422+
anonymous form doors read the environment alone too; in that release the
423+
ceremony carries every organization-layer public-form withdrawal onto the
424+
environment, fail-closed. The per-user,
420425
per-field patch overlay a previous revision of this page taught here was
421426
removed in #13135 — it was never served by any route.
422427

‎content/docs/permissions/capabilities.mdx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,11 @@ and resource `requiredPermissions` match capability names **as strings**. The
217217
boot writes no row for a capability, declared or curated: both are served by
218218
the registry. The `sys_capability` object itself is retired and no longer
219219
registered (ADR-0131 D3): a row an older database still holds is served by no
220-
route and read by nothing, and `os migrate organization-ownership --apply`
221-
reports the authored rows and deletes the seeded copies (ADR-0131 D10).
220+
route and read by nothing. In the 18.x release that carries the upgrade path
221+
(18.0 does not upgrade a v17 database: see
222+
[`os migrate organization-ownership`](/docs/deployment/cli#os-migrate-organization-ownership)),
223+
`os migrate organization-ownership --apply` reports the authored rows and
224+
deletes the seeded copies (ADR-0131 D10).
222225
Withdraw a capability by withdrawing the **grant**.
223226
</Callout>
224227

‎content/docs/permissions/permission-sets.mdx‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,10 @@ posture, the platform operator. This has three author-visible consequences:
396396
package. Uninstall the owning package to remove a packaged set entirely.
397397

398398
An older database keeps the `sys_permission_set` table and its rows, and
399-
nothing serves or reads them. `os migrate organization-ownership --apply`
399+
nothing serves or reads them. In the 18.x release that carries the upgrade
400+
path (18.0 does not upgrade a v17 database: see
401+
[`os migrate organization-ownership`](/docs/deployment/cli#os-migrate-organization-ownership)),
402+
`os migrate organization-ownership --apply`
400403
(ADR-0131 D10) converts the sets an organization authored in Setup into
401404
environment metadata under `single` and deletes the seeded copies. The shipped
402405
sets that an install created before 2026-08-15 stored as `managed_by: 'admin'`

0 commit comments

Comments
 (0)