You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`os generate migration` gives the file family — `file` / `image` / `avatar` / `video` / `audio` — the **same column width in both formats**. The typescript format emitted a bare `table.string(name)`, knex's `varchar(255)`, while `--format sql` emitted `VARCHAR(2048)` for the same field, so one command answered one field with two widths depending on the flag (#17883).
6
+
7
+
2048 is not a new number: ADR-0104 ruled the generator's `VARCHAR(2048)` the end-state for this family, `driver-sql` moved to it (`MEDIA_ID_VARCHAR_CHARS`, #15989), and `os migrate files-to-references --apply` retypes the column to `varchar(2048)`. The typescript format was the one producer left at 255 — so a deployment scaffolded from it declared a width the migration it will later run retypes away from.
8
+
9
+
```diff
10
+
- table.string('cover_image').nullable();
11
+
+ table.string('cover_image', 2048).nullable();
12
+
```
13
+
14
+
-**No regeneration is required of anyone.**`syncSchema` / `initObjects` are additive and never alter an existing column's type, and a `sys_file` id is far shorter than 255, so nothing stored today is at risk either way. What moves is the **declared** width of tables generated from now on.
15
+
-**The width is now read from the sql format's own entry** instead of being retyped beside it, so the two formats cannot drift apart again; `generate-file-reference-width.pin.test.ts` measures both against `driver-sql`'s constant, which is what stops the two halves from "meeting in the middle" at some third value.
16
+
- ⛔ **Nothing outside the family moved.** The `text` family, the reference types the file family used to share an arm with (`lookup` / `master_detail` / `user` / `tree`), `autonumber`, and every `--format sql` answer are byte-identical.
A package whose `manifest.permissions` carries the ADR-0025 capability grant is now NAMED when the audience-binding reconciler skips it, instead of vanishing; and both halves of the `permissions` key now point at each other in the spec (#18031).
7
+
8
+
`permissions` has two incompatible readings and the package registry stores both in the same slot. At the AUTHORING stage `ManifestSchema.permissions` is the capability grant a plugin requests — the legacy flat `string[]`, or the structured `{ services, hooks, network, fs }` block (ADR-0025 §3.2). At the ASSEMBLED stage the collection wins and the same key is the ADR-0090 `PermissionSet[]` collection (`AssembledPackageBodySchema`, ADR-0130 D4). `SchemaRegistry.installPackage` records whichever stage its caller handed it.
9
+
10
+
-**`collectDeclaredSuggestions` reports the reading it cannot use.** It wants the assembled one. Handed the authoring one it returned an empty list and logged nothing: the structured arm is an object, so `Array.isArray(manifest.permissions)` was false and the value never entered the loop; every member of the legacy arm is a bare string, so `consider`'s `typeof ps !== 'object'` line dropped all of them. A package declaring the other reading produced no `sys_audience_binding_suggestion` row, no prompt and no log. It now warns once per engine per package and arm, naming which arm it found, what is lost if the author meant permission sets (no admin is ever prompted to bind the set, and the deployment goes on looking healthy), and where the sets belong — the package's own `defineStack({ permissions: [ … ] })`, which is what the assembled body carries.
11
+
-**`warn`, not `error`, and deliberately.** Nothing here claims to have persisted anything, so this is a functional degradation — a prompt that is not offered. Same reasoning, one step weaker, as the write-refusal report beside it, and the same sink (`SuggestionDeps['logger']`, which declares no `error`).
12
+
-**Reported once per engine per package+arm.** The pass runs at boot, after every package-door `permission` publish and on every list call, while a manifest's shape is fixed for as long as that package is installed; an undeduplicated line would repeat on every console page load and be skimmed past.
13
+
-**The spec half is declaration text only — no key, export, arm or accept-set moved.**`ManifestSchema.permissions` now says it describes the AUTHORING stage and names the assembled-stage counterpart; the stack collection `permissions` names the manifest-stage grant; and `InstalledPackageSchema.manifest` says it is the authoring STAGE rather than "whatever was stored", pointing at `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema` for the stage a `defineStack()` host installs.
14
+
- ⛔ **The union at the key was NOT widened, and must not be.** Widening a manifest key into a union of both stages is road C of #14242, rejected by name by the maintainer on 2026-09-02 in favour of road B — declare the assembled stage rather than widen the authoring one — because a union at the key makes neither stage checkable (Prime Directive #12). That ruling is why the fix here is a report and a cross-reference rather than a schema change.
|**permissions**|`{ name: string; label?: string; description?: string; packageId?: string; … }[]`| optional | Permission Sets — the ADR-0090 collection half of `permissions`; at the manifest/authoring stage the same key is the ADR-0025 capability grant instead (`ManifestSchema.permissions`) |
76
76
|**objects**|`{ name: string; label?: string; pluralLabel?: string; description?: string; … }[]`| optional | Business Objects definition (owned by this package) |
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**permissions**|`string[] \| { services?: string[]; hooks?: string[]; network?: string[]; fs?: string[] }`| optional | Required permissions at the AUTHORING stage: legacy string[] or structured plugin block (ADR-0025 §3.2) — at the assembled stage the same key is the ADR-0090 `PermissionSet[]` collection instead (`AssembledPackageBodySchema`) |
257
257
|**objects**|`string[]`| optional | Glob patterns for ObjectQL schemas files |
258
258
|**datasources**|`string[]`| optional | Glob patterns for Datasource definitions |
|**permissions**|`{ name: string; label?: string; description?: string; packageId?: string; … }[]`| optional | Permission Sets — the ADR-0090 collection half of `permissions`; at the manifest/authoring stage the same key is the ADR-0025 capability grant instead (`ManifestSchema.permissions`) |
320
320
|**objects**|`{ name: string; label?: string; pluralLabel?: string; description?: string; … }[]`| optional | Business Objects definition (owned by this package) |
|**permissions**|`string[] \| { services?: string[]; hooks?: string[]; network?: string[]; fs?: string[] }`| optional | Required permissions at the AUTHORING stage: legacy string[] or structured plugin block (ADR-0025 §3.2) — at the assembled stage the same key is the ADR-0090 `PermissionSet[]` collection instead (`AssembledPackageBodySchema`) |
485
485
|**objects**|`string[]`| optional | Glob patterns for ObjectQL schemas files |
486
486
|**datasources**|`string[]`| optional | Glob patterns for Datasource definitions |
|**permissions**|`string[] \| { services?: string[]; hooks?: string[]; network?: string[]; fs?: string[] }`| optional | Required permissions at the AUTHORING stage: legacy string[] or structured plugin block (ADR-0025 §3.2) — at the assembled stage the same key is the ADR-0090 `PermissionSet[]` collection instead (`AssembledPackageBodySchema`) |
609
609
|**objects**|`string[]`| optional | Glob patterns for ObjectQL schemas files |
610
610
|**datasources**|`string[]`| optional | Glob patterns for Datasource definitions |
|**permissions**|`string[] \| { services?: string[]; hooks?: string[]; network?: string[]; fs?: string[] }`| optional | Required permissions at the AUTHORING stage: legacy string[] or structured plugin block (ADR-0025 §3.2) — at the assembled stage the same key is the ADR-0090 `PermissionSet[]` collection instead (`AssembledPackageBodySchema`) |
695
695
|**objects**|`string[]`| optional | Glob patterns for ObjectQL schemas files |
696
696
|**datasources**|`string[]`| optional | Glob patterns for Datasource definitions |
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**permissions**|`string[] \| { services?: string[]; hooks?: string[]; network?: string[]; fs?: string[] }`| optional | Required permissions at the AUTHORING stage: legacy string[] or structured plugin block (ADR-0025 §3.2) — at the assembled stage the same key is the ADR-0090 `PermissionSet[]` collection instead (`AssembledPackageBodySchema`) |
1895
1895
|**objects**|`string[]`| optional | Glob patterns for ObjectQL schemas files |
1896
1896
|**datasources**|`string[]`| optional | Glob patterns for Datasource definitions |
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
|**manifest**|`{ id: string; namespace?: string; defaultDatasource?: string; version: string; … }`| ✅ |Package manifest at the AUTHORING stage; a row installed by a `defineStack()` host carries the assembled body instead — see `AssembledInstalledPackageSchema` / `InstalledPackageAtEitherStageSchema`|
0 commit comments