Skip to content

Commit a789148

Browse files
fix(spec): 18.0 upgrade-guide entries say 18.0 supports fresh installs only (#24661)
Refs #24637 Clause-②: no The `domain:spec` row of #24637. The parent closes once this PR and its three children land (#24651, #24652, #24653 are not addressed here), so this PR does not close it. ## What changes In 18.0, `os migrate organization-ownership` refuses plan and apply on every database (exit 1, `NOT_IMPLEMENTED`, nothing read or written), and 18.0 supports fresh installs only. Seven ADR-0087 semantic entries under `packages/spec/src/migrations/entries/semantic/` compile into the 18.0 upgrade guide, and they still prescribed `--out PLAN` then `--apply --plan-file PLAN` as if 18.0 upgraded a v17 database. Each entry now says what 18.0 supports for a v17 database, in the words PR #24635 (`f89d29e382`) landed in the CLI and the boot refusal: > 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 entry keeps the plan and apply steps, now introduced as "In that 18.x release, ...". | entry | fields changed | |:--|:--| | `sys-metadata-organization-column-retired`, `-audit-`, `-commit-`, `-history-` | `replacement` and `acceptanceCriteria` lead with the 18.0 sentence and qualify the ceremony as 18.x; in `reason`, "the v18 ceremony" becomes "the 18.x ceremony", and the boot-refusal clause says it refuses in 18.0 on every such database | | `ups-permission-set-id-column-retired` | `replacement` and `acceptanceCriteria` the same way; `reason` names "the 18.x ceremony" | | `sharing-rule-declared-mirror-retired` | `replacement` leads with the 18.0 sentence; `surface` and `acceptanceCriteria` name the ceremony as 18.x | | `cli-organization-ownership-apply-plan-file-required` | see below | ### The `cli-organization-ownership-apply-plan-file-required` entry The command itself is this entry's whole subject. I kept the entry and rewrote the guidance rather than deleting it: - The upgrade guide renders each entry as `` `surface` → replacement ``, then "Why not automatic" (`reason`) and "Done when" (`acceptanceCriteria`) (`packages/spec/scripts/build-upgrade-guide.ts`). Nothing checks the prose against the CLI. The entry's id and step are registered, and `.changeset/pre/15211-cli-apply-reviewed-plan.md` cites it. - The `surface` stays as it is: the bare `--apply --backup-taken` invocation that `@objectstack/cli` 18.0.0-next.1 shipped. A script written against that prerelease is still a real reader, and in 18.0 the invocation is refused. - The `replacement` now opens with "nothing in 18.0: 18.0 refuses this invocation, as it refuses every plan and apply of `os migrate organization-ownership` on every database". Then it gives the 18.0 sentence, then the plan-file rule, introduced as "In that 18.x release". - `reason` adds one sentence on why 18.0 holds the ceremony back. The ceremony is knowingly incomplete, and an incomplete ceremony must never certify a v17 database that the boot would then serve. This paraphrases the docblock on `ORGANIZATION_OWNERSHIP_UPGRADE_UNAVAILABLE`. - `acceptanceCriteria` now opens with what holds on 18.0, then keeps the 18.x plan-file criteria. Deleting the entry would drop the 18.x plan-file rule from the guide, and it would leave a next.1 script with no entry that names its invocation. Only text changes. Every entry keeps its `id`, its step and its fields. ## Census ``` git grep -n -E "organization-ownership (--apply|--out|--dev)|--plan-file" -- packages/spec/src ':!*.test.ts' ``` At `a58972d67b`, every hit in the seven entries sits after the 18.0 sentence or under an "In that 18.x release" / "In the 18.x release that carries the upgrade path" qualifier. The one hit not in an entry is the code comment at `system/migration.zod.ts:174`, which is out of scope by the card's rule. The cli entry's `surface` (line 10) names the refused invocation and prescribes nothing. In a rendered single-file guide (`tsx scripts/build-upgrade-guide.ts --out`, written to a scratch path), the sentence "18.0 supports fresh installs only" appears 12 times: 7 replacements and 5 acceptance criteria. `sharing-rule-declared-mirror-retired`'s acceptance criteria say "18.0 upgrades no v17 database" instead. ## Verification (head `a58972d67b`) - `pnpm --filter @objectstack/spec build`: `VERDICT command-exit 0`. - `pnpm --filter @objectstack/spec test`: `Test Files 702 passed (702)`, `Tests 21349 passed | 1 todo (21350)`. - `pnpm --filter @objectstack/spec typecheck`: exit 0. check:test-typecheck reports OK. - `pnpm --filter @objectstack/spec check:generated`: "All 14 generated artifacts are up to date", with no tracked file changed. No baseline pins this text. - `node scripts/pm/dispatch-gates.mjs --commands` derived 83 commands, and all of them were run: - 80 exit 0, including `check:upgrade-guide`, `check:spec-changes`, `check:adr-0087-registration --base origin/main`, `check:doc-authoring`, `check:nul-bytes`, `check:empty-changeset` and `check:changeset-no-major`. - 3 exit 3, PREREQUISITE NOT MET, so NOT MEASURED here: `check:doc-formula-expressions` (`@objectstack/formula` not built), `check:dual-build-cjs-loads` (workspace `dist/` absent) and `check:lean-entry-closure` (`@objectstack/objectql` not built). None reads these entries. They are declared to CI. - No open PR touches `packages/spec/src/migrations/entries/semantic/`. I checked all 14 open PRs' file lists over REST. ## Acceptance notes - Out of scope by the card's rule: `packages/spec/CHANGELOG.md` history, and the code comment at `packages/spec/src/system/migration.zod.ts:174`. - The boot guard, the plugin-security report and the docs rows are #24651, #24652 and #24653. --- _Generated by [Claude Code](https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9f12d06 commit a789148

8 files changed

Lines changed: 65 additions & 36 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
fix(spec): the 18.0 upgrade-guide entries that name `os migrate organization-ownership` say first that 18.0 supports fresh installs only
6+
7+
Clause-②: no
8+
9+
In 18.0, `os migrate organization-ownership` refuses plan and apply alike on every database (exit 1, `NOT_IMPLEMENTED`, nothing read or written). Seven ADR-0087 semantic entries still told an operator to run `--out PLAN`, then `--apply --plan-file PLAN`, as if 18.0 upgraded a v17 database. Each now says, in the same words as the CLI and the boot refusal: 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. The plan and apply steps stay, marked as the 18.x release's ceremony.
10+
11+
- `sys-metadata-organization-column-retired`, `sys-metadata-audit-organization-column-retired`, `sys-metadata-commit-organization-column-retired`, `sys-metadata-history-organization-column-retired`, `ups-permission-set-id-column-retired`: the replacement and the acceptance criteria.
12+
- `sharing-rule-declared-mirror-retired`: the replacement and the acceptance criteria.
13+
- `cli-organization-ownership-apply-plan-file-required`: the replacement now says that 18.0 refuses this invocation, as it refuses every invocation of the command, and keeps the plan-file rule as the 18.x release's.
14+
15+
Only the text changes. Every entry keeps its `id`, its surface and its step.

‎packages/spec/src/migrations/entries/semantic/18.cli-organization-ownership-apply-plan-file-required.ts‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,29 @@ export const entry: SemanticMigration = {
1010
'os migrate organization-ownership --apply, invoked without --plan-file (the bare --apply --backup-taken that '
1111
+ '@objectstack/cli 18.0.0-next.1 shipped, with or without --fate-supplement)',
1212
replacement:
13-
'Run the plan first, `os migrate organization-ownership --out plan.json` (with the same `--fate-supplement`, '
14-
+ 'under the same tenancy posture, against the same database), review the file it writes, then '
15-
+ '`os migrate organization-ownership --apply --backup-taken --plan-file plan.json`. A script or runbook that '
16-
+ 'applies directly gains the plan step and the flag; nothing in a package source or a stored row changes.',
13+
'nothing in 18.0: 18.0 refuses this invocation, as it refuses every plan and apply of '
14+
+ '`os migrate organization-ownership` on every database (exit 1, `NOT_IMPLEMENTED`, nothing read or written). '
15+
+ '18.0 supports fresh installs only and does not upgrade a v17 database: keep a v17 database on a 17.x release '
16+
+ 'until the 18.x release that carries the upgrade path. A script or runbook that applies directly does not run '
17+
+ 'against 18.0 at all. In that 18.x release, run the plan first, `os migrate organization-ownership --out plan.json` '
18+
+ '(with the same `--fate-supplement`, under the same tenancy posture, against the same database), review the file '
19+
+ 'it writes, then `os migrate organization-ownership --apply --backup-taken --plan-file plan.json`: the script or '
20+
+ 'runbook gains the plan step and the flag; nothing in a package source or a stored row changes.',
1721
reason:
1822
'ADR-0131 D10 makes the ceremony an operator\'s act on a plan the operator reviewed. The apply computes its '
1923
+ 'own plan at apply time, and that plan\'s inputs can move between the review and the run: a different host '
2024
+ 'fate supplement, another release\'s inventory, another tenancy posture or another database. Planning with '
2125
+ 'one supplement and applying with another ran the second one\'s fates unreviewed, including a mirror deletion '
22-
+ 'the reviewed plan never listed. So the apply now reads the plan file the operator reviewed and refuses, before '
26+
+ 'the reviewed plan never listed. So the 18.x apply reads the plan file the operator reviewed and refuses, before '
2327
+ 'anything is written, when its inventory digest, posture or database differs from the run\'s. Without the '
24-
+ 'file there is nothing to compare, so the bare invocation is refused.',
28+
+ 'file there is nothing to compare, so the bare invocation is refused. 18.0 itself withholds the whole '
29+
+ 'ceremony: it is knowingly incomplete in 18.0, and an incomplete ceremony must never certify a v17 database '
30+
+ 'that the boot would then serve, so 18.0 refuses plan and apply alike before it reads anything.',
2531
acceptanceCriteria:
26-
'Every invocation of `os migrate organization-ownership --apply` passes `--plan-file` with the file a plan run '
27-
+ 'wrote, and the run reports `reviewedPlan`. A run that answers `plan-file-required`, `plan-digest-mismatch`, '
32+
'On 18.0, no script or runbook runs `os migrate organization-ownership`, and every v17 database stays on a 17.x '
33+
+ 'release. In the 18.x release that carries the upgrade path, every invocation of '
34+
+ '`os migrate organization-ownership --apply` passes `--plan-file` with the file a plan run wrote, and the run '
35+
+ 'reports `reviewedPlan`. A run that answers `plan-file-required`, `plan-digest-mismatch`, '
2836
+ '`plan-posture-mismatch` or `plan-database-mismatch` has written nothing: plan again, review, and pass the new '
2937
+ 'file.',
3038
};

‎packages/spec/src/migrations/entries/semantic/18.sharing-rule-declared-mirror-retired.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ export const entry: SemanticMigration = {
99
+ 'the declared-rule seeder (`bootstrapDeclaredSharingRules`, @objectstack/plugin-sharing) is '
1010
+ 'retired. FROM one `managed_by: package` row per declared rule TO none: the sharing-rule '
1111
+ 'service reads each declared rule from the registry, its id is its name, and its grants carry '
12-
+ 'that name as `sys_record_share.source_id`; the organization-ownership ceremony renames the '
12+
+ 'that name as `sys_record_share.source_id`; the 18.x organization-ownership ceremony renames the '
1313
+ 'grants of the rows the seeder wrote, then deletes those rows, and Setup\'s Sharing Rules object '
1414
+ 'list (which lists rows) no longer shows declared rules. `DELETE /api/v1/sharing/rules/:idOrName` '
1515
+ 'on a declared rule: FROM 204 with the seeded row deleted (and written again by the next boot) '
1616
+ 'TO 403 PERMISSION_DENIED',
1717
replacement:
1818
'change or remove the rule in its declaration in the package (the stack\'s `sharingRules`); '
1919
+ 'read declared rules through `GET /api/v1/sharing/rules`, which lists them beside the rules an '
20-
+ 'organization authors. An organization\'s own rule is deleted as before. On an upgraded '
21-
+ 'database run `os migrate organization-ownership --apply` with a fresh plan: its mirror-deletion '
20+
+ 'organization authors. An organization\'s own rule is deleted as before. Existing databases: 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. '
21+
+ 'In that 18.x release, run `os migrate organization-ownership --apply` on the upgraded database with a fresh plan: its mirror-deletion '
2222
+ 'step removes the seeded copies',
2323
reason:
2424
'ADR-0131 D2 retires the seeders: declared metadata is code, served from the registry, and a '
@@ -34,6 +34,6 @@ export const entry: SemanticMigration = {
3434
acceptanceCriteria:
3535
'A fresh boot in every posture writes no `sys_sharing_rule` row for a declared rule and the rule '
3636
+ 'still grants; removing the declaration stops its grant; no consumer deletes a declared rule '
37-
+ 'through the sharing-rule API or expects it as a `sys_sharing_rule` row; an upgraded database '
38-
+ 'certifies only after the ceremony has deleted the seeded copies.',
37+
+ 'through the sharing-rule API or expects it as a `sys_sharing_rule` row. 18.0 upgrades no v17 database; in the '
38+
+ '18.x release that carries the upgrade path, an upgraded database certifies only after its ceremony has deleted the seeded copies.',
3939
};

‎packages/spec/src/migrations/entries/semantic/18.sys-metadata-audit-organization-column-retired.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ export const entry: SemanticMigration = {
1818
replacement:
1919
'nothing on this table — metadata is the environment\'s (ADR-0131 D6), and no organization owns '
2020
+ 'a row. Delete any authored filter, list-view column, report grouping, formula or seed key that '
21-
+ 'names `organization_id` on `sys_metadata_audit`. Existing databases: run the v18 ceremony, '
22-
+ '`os migrate organization-ownership --out PLAN` to write its plan for review, then '
21+
+ 'names `organization_id` on `sys_metadata_audit`. Existing databases: 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. '
22+
+ 'In that 18.x release, run its ceremony: `os migrate organization-ownership --out PLAN` to write its plan for review, then '
2323
+ '`os migrate organization-ownership --apply --plan-file PLAN`, which promotes or reports the legacy '
2424
+ 'organization rows and then drops the physical column',
2525
reason:
2626
'ADR-0131 D6 retired the per-organization overlay axis: every metadata write now lands '
2727
+ 'environment-wide with a NULL organization, every read is environment then code, and a legacy '
28-
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column until the ceremony has run. The column therefore only holds '
29-
+ 'the legacy rows the 17.x organization layer wrote, and the v18 ceremony owns those: under '
28+
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column (18.0 on every such database; the 18.x release that carries the upgrade path until its ceremony has run). The column therefore only holds '
29+
+ 'the legacy rows the 17.x organization layer wrote, and the 18.x ceremony owns those: under '
3030
+ 'single it promotes the presentational customizations to environment rows and carries every '
3131
+ 'public-form withdrawal onto the environment, fail-closed (the maintainer rulings on organization customizations and form withdrawals), and '
3232
+ 'it reports the rest. Only then does its column-drops step drop the column, through the '
@@ -40,6 +40,7 @@ export const entry: SemanticMigration = {
4040
acceptanceCriteria:
4141
'No authored metadata names `organization_id` on `sys_metadata_audit`: the field resolver (lint and the data '
4242
+ 'door) answers it as an unknown field. A fresh database creates `sys_metadata_audit` with no organization '
43-
+ 'column. On a legacy database, after `os migrate organization-ownership --apply --plan-file PLAN` the column is '
43+
+ 'column. 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. '
44+
+ 'In that 18.x release, after `os migrate organization-ownership --apply --plan-file PLAN` on a legacy database the column is '
4445
+ 'gone and the boot no longer reports it orphaned.',
4546
};

‎packages/spec/src/migrations/entries/semantic/18.sys-metadata-commit-organization-column-retired.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ export const entry: SemanticMigration = {
1818
replacement:
1919
'nothing on this table — metadata is the environment\'s (ADR-0131 D6), and no organization owns '
2020
+ 'a row. Delete any authored filter, list-view column, report grouping, formula or seed key that '
21-
+ 'names `organization_id` on `sys_metadata_commit`. Existing databases: run the v18 ceremony, '
22-
+ '`os migrate organization-ownership --out PLAN` to write its plan for review, then '
21+
+ 'names `organization_id` on `sys_metadata_commit`. Existing databases: 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. '
22+
+ 'In that 18.x release, run its ceremony: `os migrate organization-ownership --out PLAN` to write its plan for review, then '
2323
+ '`os migrate organization-ownership --apply --plan-file PLAN`, which promotes or reports the legacy '
2424
+ 'organization rows and then drops the physical column',
2525
reason:
2626
'ADR-0131 D6 retired the per-organization overlay axis: every metadata write now lands '
2727
+ 'environment-wide with a NULL organization, every read is environment then code, and a legacy '
28-
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column until the ceremony has run. The column therefore only holds '
29-
+ 'the legacy rows the 17.x organization layer wrote, and the v18 ceremony owns those: under '
28+
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column (18.0 on every such database; the 18.x release that carries the upgrade path until its ceremony has run). The column therefore only holds '
29+
+ 'the legacy rows the 17.x organization layer wrote, and the 18.x ceremony owns those: under '
3030
+ 'single it promotes the presentational customizations to environment rows and carries every '
3131
+ 'public-form withdrawal onto the environment, fail-closed (the maintainer rulings on organization customizations and form withdrawals), and '
3232
+ 'it reports the rest. Only then does its column-drops step drop the column, through the '
@@ -40,6 +40,7 @@ export const entry: SemanticMigration = {
4040
acceptanceCriteria:
4141
'No authored metadata names `organization_id` on `sys_metadata_commit`: the field resolver (lint and the data '
4242
+ 'door) answers it as an unknown field. A fresh database creates `sys_metadata_commit` with no organization '
43-
+ 'column. On a legacy database, after `os migrate organization-ownership --apply --plan-file PLAN` the column is '
43+
+ 'column. 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. '
44+
+ 'In that 18.x release, after `os migrate organization-ownership --apply --plan-file PLAN` on a legacy database the column is '
4445
+ 'gone and the boot no longer reports it orphaned.',
4546
};

‎packages/spec/src/migrations/entries/semantic/18.sys-metadata-history-organization-column-retired.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ export const entry: SemanticMigration = {
1818
replacement:
1919
'nothing on this table — metadata is the environment\'s (ADR-0131 D6), and no organization owns '
2020
+ 'a row. Delete any authored filter, list-view column, report grouping, formula or seed key that '
21-
+ 'names `organization_id` on `sys_metadata_history`. Existing databases: run the v18 ceremony, '
22-
+ '`os migrate organization-ownership --out PLAN` to write its plan for review, then '
21+
+ 'names `organization_id` on `sys_metadata_history`. Existing databases: 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. '
22+
+ 'In that 18.x release, run its ceremony: `os migrate organization-ownership --out PLAN` to write its plan for review, then '
2323
+ '`os migrate organization-ownership --apply --plan-file PLAN`, which promotes or reports the legacy '
2424
+ 'organization rows and then drops the physical column',
2525
reason:
2626
'ADR-0131 D6 retired the per-organization overlay axis: every metadata write now lands '
2727
+ 'environment-wide with a NULL organization, every read is environment then code, and a legacy '
28-
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column until the ceremony has run. The column therefore only holds '
29-
+ 'the legacy rows the 17.x organization layer wrote, and the v18 ceremony owns those: under '
28+
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column (18.0 on every such database; the 18.x release that carries the upgrade path until its ceremony has run). The column therefore only holds '
29+
+ 'the legacy rows the 17.x organization layer wrote, and the 18.x ceremony owns those: under '
3030
+ 'single it promotes the presentational customizations to environment rows and carries every '
3131
+ 'public-form withdrawal onto the environment, fail-closed (the maintainer rulings on organization customizations and form withdrawals), and '
3232
+ 'it reports the rest. Only then does its column-drops step drop the column, through the '
@@ -40,6 +40,7 @@ export const entry: SemanticMigration = {
4040
acceptanceCriteria:
4141
'No authored metadata names `organization_id` on `sys_metadata_history`: the field resolver (lint and the data '
4242
+ 'door) answers it as an unknown field. A fresh database creates `sys_metadata_history` with no organization '
43-
+ 'column. On a legacy database, after `os migrate organization-ownership --apply --plan-file PLAN` the column is '
43+
+ 'column. 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. '
44+
+ 'In that 18.x release, after `os migrate organization-ownership --apply --plan-file PLAN` on a legacy database the column is '
4445
+ 'gone and the boot no longer reports it orphaned.',
4546
};

‎packages/spec/src/migrations/entries/semantic/18.sys-metadata-organization-column-retired.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ export const entry: SemanticMigration = {
1818
replacement:
1919
'nothing on this table — metadata is the environment\'s (ADR-0131 D6), and no organization owns '
2020
+ 'a row. Delete any authored filter, list-view column, report grouping, formula or seed key that '
21-
+ 'names `organization_id` on `sys_metadata`. Existing databases: run the v18 ceremony, '
22-
+ '`os migrate organization-ownership --out PLAN` to write its plan for review, then '
21+
+ 'names `organization_id` on `sys_metadata`. Existing databases: 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. '
22+
+ 'In that 18.x release, run its ceremony: `os migrate organization-ownership --out PLAN` to write its plan for review, then '
2323
+ '`os migrate organization-ownership --apply --plan-file PLAN`, which promotes or reports the legacy '
2424
+ 'organization rows and then drops the physical column',
2525
reason:
2626
'ADR-0131 D6 retired the per-organization overlay axis: every metadata write now lands '
2727
+ 'environment-wide with a NULL organization, every read is environment then code, and a legacy '
28-
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column until the ceremony has run. The column therefore only holds '
29-
+ 'the legacy rows the 17.x organization layer wrote, and the v18 ceremony owns those: under '
28+
+ 'organization row is served by no read, and the v18 runtime refuses to start on a database still holding the column (18.0 on every such database; the 18.x release that carries the upgrade path until its ceremony has run). The column therefore only holds '
29+
+ 'the legacy rows the 17.x organization layer wrote, and the 18.x ceremony owns those: under '
3030
+ 'single it promotes the presentational customizations to environment rows and carries every '
3131
+ 'public-form withdrawal onto the environment, fail-closed (the maintainer rulings on organization customizations and form withdrawals), and '
3232
+ 'it reports the rest. Only then does its column-drops step drop the column, through the '
@@ -40,6 +40,7 @@ export const entry: SemanticMigration = {
4040
acceptanceCriteria:
4141
'No authored metadata names `organization_id` on `sys_metadata`: the field resolver (lint and the data '
4242
+ 'door) answers it as an unknown field. A fresh database creates `sys_metadata` with no organization '
43-
+ 'column. On a legacy database, after `os migrate organization-ownership --apply --plan-file PLAN` the column is '
43+
+ 'column. 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. '
44+
+ 'In that 18.x release, after `os migrate organization-ownership --apply --plan-file PLAN` on a legacy database the column is '
4445
+ 'gone and the boot no longer reports it orphaned.',
4546
};

0 commit comments

Comments
 (0)