Skip to content

Commit c056979

Browse files
fix(spec): tombstones for keys live in @objectstack/spec 17.7.0 name 18 as their removal version (#23186)
Fixes #23145 Clause-②: no (prescription text only: no key, value or shape is accepted or refused differently) **Block lifted.** `check:future-spec-major` went green when the Version Packages pull request #21988 merged and `packages/spec/package.json` read `18.0.0-next.0`. ## Fix round (seat notes 6144192235 and 6144323612) - **Why.** `main` gained two `retiredAfter: '17.7.0'` entries after the last merge. Unjoined, they trip the pin's completeness guard; on the previous head CI's `Test Core (1/6)` failed in `packages/spec` `pnpm run test` (its annotation; the job log is not readable from this container). `main` also gained a string of this class, `view.data.provider: 'api'` "removed in @objectstack/spec 17" (`1912af47b`, D3-only). - **Joined.** `page-action-row-navigation-executor-to-url`: the `'navigation'` refusal on all four row shapes. `cbp-master-detail-required-defaulted`: the parse's refusal at `sharingModel`. - **Corrected** (text only; the literal pins follow): - The `'navigation'` refusal named no release. It now says the alias is "refused on page action rows since @objectstack/spec 18". - The controlled-by-parent refusal named no release. It now says "ADR-0055 §1: since @objectstack/spec 18, …". - `view.data.provider: 'api'` now says "removed in @objectstack/spec 18". - The two-master refusal (same function, not on the D2 entry's surface) is unedited and names no release. - **Measured liveness** (parse probes against each tarball, controls accepted): - all three shapes, including every `controlled_by_parent` variant (no master, optional master, required lookup, two masters), are **accepted** by 17.7.0 and by **18.0.0-next.0**; - the HEAD build refuses each one with its prescription. - So the changeset names next.0 only for its first table. These three rows sit in a second table: `18.0.0-next.0` still accepts them, so the first release that refuses them is the one after it. - **Release pins.** `view-data-api-provider-retirement.test.ts` pins "@objectstack/spec 18"; `view.test.ts` and `object-storage.test.ts` gain one line each. - **Pending-changeset quotes, corrected in place.** `23082:25` (`provider: 'api'`, byte-equal to the emitted string) and `23103:36` (the `'navigation'` first sentence, equal to the emitted one). `pre/22876:29,31` stay byte-equal. - **`check-empty-changeset` stays red by design (DELIBERATE CORRECTION).** Verdict at `38728b3e1`, verbatim: ```text This PR changes a changeset it did not add: .changeset/23082-view-data-api-provider-retired.md present on the merge base and CHANGED by this PR -- this is somebody else's release note .changeset/23103-page-action-row-on-success-and-executor.md present on the merge base and CHANGED by this PR -- this is somebody else's release note .changeset/pre/22876-email-template-category-is-system-retired.md present on the merge base and CHANGED by this PR -- this is somebody else's release note ``` Each note quotes a prescription this PR corrects, and each corrected quote is equal to the emitted text. Restoring any of them from the base would publish a false sentence. - **Ablation**, each leg restored to blob == HEAD: - ⑥ the `'navigation'` refusal without its release: **red**, 1 failed / 18 passed, "names no release". The first try was refused by the tool (the replacement was a substring of the anchor; nothing ran). - ⑦ the controlled-by-parent refusal without its release: **red**, 1/18. - **`main` since:** 9 commits to `6d7f4df3c`. None touches `packages/spec` or adds a `retiredAfter` line; `git merge-tree` with it is clean. - **Not swept:** two other new D3 narrowings (`page-default-record-page-one-per-object-refused`, `ui-page-action-row-on-success-shape-closed`) whose refusals name no release. They are outside this surface. ## Patch round (seat note 6143582707) - `@objectstack/spec@18.0.0-next.0` reached npm `next` at 2026-10-13T08:35:43Z, so the changeset's "17.7.0, the newest published release" was false where it is read. It now names 17.7.0 as the newest 17.x release (npm `latest`) and names `18.0.0-next.0` (`56d63b4e7`; the fix round split that sentence per table). - The next.0 tarball (`npm pack` into its own directory; integrity `sha512-ASTh6…2Ow==` matches the packument) refuses all 16 first-table rows with the text this PR replaces, and the sub-day intervals too. Its `CHANGELOG.md:2091` and `:2093` quote the `email_template` prescriptions as "…17". - Gates at `56d63b4e7`: 20 derived, 20 run, 19 exit 0, 1 exit 1 (`check-empty-changeset`, by design). ## Landing round (seat review 6140670883) - **Merge** `071dbdb24` (parents `1ee37155d` and `d889448b9`, the `18.0.0-next.0` version commit), no conflict. The release **moved** `22876` to `.changeset/pre/`; git followed the rename, so the two-line correction sits there. - **Kept (decision A, seat-confirmed).** At `changeset pre exit` the consumed `pre/` changesets are read again into the stable `18.0.0` CHANGELOG: `@changesets/read@1.0.1` `dist/index.mjs:29`, `@changesets/assemble-release-plan@7.0.0` `dist/index.mjs:328` (drops `pre/` only while `preState.mode !== "exit"`), `@changesets/apply-release-plan@8.1.1` `dist/index.mjs:301-319`. - **`RETIRED_SUB_DAY_INTERVALS` TSDoc** (`data/analytics.zod.ts:104`, shipped in the `.d.ts`) now reads "declared through @objectstack/spec 17.4.0; 17.5.0 removed them". Docblock text, not a row. - **`check-issue-citations`**: the one added citation (`#17296`) resolves locally ("1 resolves"); the CI annotation was exit 3, the could-not-measure class. ## Patch round (seat answer 6139390852) - **Merge.** `7bfd6b035` (parents `936750950` and `20949e7a7`), no conflicts, via `scripts/pm/os-regen-merge.sh`; `check:generated` green at `1ee37155d`. - **Row 236, the opposite direction.** `TimeUpdateInterval` accepts `second` / `minute` / `hour` in the 17.4.0 tarball (`src/data/analytics.zod.ts:53-55`) and refuses them in 17.5.0 (`:145-148`); its D2 `cube-sub-day-granularities-removed` is `retiredAfter: '17.4.0'`. The refusal said "retired in protocol 18"; it now says "was removed in @objectstack/spec 17.5.0". It is joined to the pin; its two literal pins follow (`spec/src/data/analytics.test.ts`, `drivers/driver-memory/src/memory-analytics-time-granularity.test.ts`). - **Pending-changeset quotes, BEFORE → AFTER.** Every quote the sweep read, against each row's verdict. Paths are as read at `e81cae014`; the `18.0.0-next.0` release has since moved each of these files into `.changeset/pre/`: | changeset quote | before | after | | --- | --- | --- | | `22876-email-template-category-is-system-retired.md:29` (`email_template.category`) | removed in @objectstack/spec 17 | **edited**: removed in @objectstack/spec 18; now byte-equal to the emitted prescription | | `22876-…md:31` (`email_template.isSystem`) | removed in @objectstack/spec 17 | **edited**: removed in @objectstack/spec 18; byte-equal to the emitted prescription | | `22161-lint-slice-6-one-line.md:17` (`element:filter`) | removed in @objectstack/spec 17 | true as written: `element-filter-removed` is `retiredAfter: '17.0.0'`, first retired in the 17.1.0 tarball (census), and the tag carries the same prescription (`ui/page.zod.ts:114`) | | `22876-…md:36` | "(protocol 18, retired from the load path)" | true as written: it names the D2 entry's `toMajor`, not a release | | `22340-registry-allow-environment-overlay.md:37` | "(protocol 18)" | true as written: it names the D3 entry's registration major, not a release | | `22130-protocol-18.md:10` | the ADR-0087 marker's id list (`cube-sub-day-granularities-removed`) | an id, not a quote: untouched byte-for-byte | | `23082-view-data-api-provider-retired.md:25` (fix round) | removed in @objectstack/spec 17 | **edited**: removed in @objectstack/spec 18; byte-equal to the emitted string | | `23103-page-action-row-on-success-and-executor.md:36` (fix round) | the `'navigation'` refusal's first sentence, no release | **edited**: equal to the emitted first sentence, which now names 18 | | `pre/22340-s3-governed-text-rename.md:9` (landing-round re-sweep) | "renamed to `allowEnvironmentOverlay` in protocol 18" | true as written: a paraphrase of the rename naming the protocol major (`PROTOCOL_VERSION` 18.0.0), not a quote of the prescription | No other changeset quotes a changed prescription. The landing round re-swept the remaining root stock and `.changeset/pre/`. The sweep covered every `.changeset/*.md` for each changed sentence and for "17.8.0", "retired in protocol 18", "renamed to `allowEnvironmentOverlay`" and "legacy form of a package manifest". 22876's frontmatter and marker block are byte-identical (first 12 lines, same md5). This PR's own changeset gains the interval correction. **`check-empty-changeset` stays red by design** (ruling D on #17712, DELIBERATE CORRECTION class): the consumed `pre/22876` note still feeds the stable `18.0.0` notes at pre exit, so restoring it from the base would put a false sentence into them. Decision A, seat-confirmed. The current three-file verdict is in the fix-round section. ## What changed Eleven prescription strings named the wrong removal release, or none. Ten are for shapes the `@objectstack/spec@17.7.0` tarball still accepts, and they now name 18. The eleventh is the interval refusal above. - `elementFlatBindingRetired` (`ui/component.zod.ts`): one shared string rendering ten tombstones (`element:number` `object` / `filter`; `element:record_picker` and `element:repeater` `object` / `filter` / `sort` / `limit`). Was 17. - `object-grid` `defaultFilters` (`ui/component.zod.ts`). Was 17. - `email_template.category` and `email_template.isSystem` (`system/email-template.zod.ts`). Was 17. - The flat permission-string list on a package manifest (`kernel/manifest.zod.ts`, the union arm `ManifestPermissionsSchema` dropped; D2 `manifest-permissions-string-list-removed`, `retiredAfter: '17.7.0'`). Was 17. - `public` in `StorageScope` (`system/object-storage.zod.ts`, `enumWithRetiredValues`; D3 `storage-scope-public-retired`). Was **17.8.0**, a release this train will not cut. - `MetadataTypeRegistryEntry.allowOrgOverride` → `allowEnvironmentOverlay` (`kernel/metadata-plugin.zod.ts`). Named **no** release, an omission against the governing text ("the version that removed it"). The seat ratified the edit. - Fix round: the `'navigation'` row-executor refusal and the controlled-by-parent no-required-master refusal (both named no release), and `view.data.provider: 'api'` (was 17). Every `os migrate meta --from 17` sentence is unchanged and correct (H6 below). The test files that pinned the old literals follow. The `content/docs/references/**` projection is regenerated (14 rows). One changeset, `@objectstack/spec` patch. One new pin, `packages/spec/src/shared/retired-key-removal-version.pin.test.ts`. The two non-`retiredKey` renderers (manifest list, `StorageScope.public`) and the interval message are seat-ratified surface additions (6139390852). ## The enumeration Population (H2): every `RETIRED_KEYS_BY_MAJOR[18]` id (232), joined by **position** (`category/Def:key`) to its tombstone. Added to those: - the three non-key renderers of the five unpublished D2 entries, and the one major-18 D3 value tombstone; - the 17.x-shipped interval refusal (row 236, patch round); - the fix round's three rows (237–239): two new `retiredAfter: '17.7.0'` entries and the D3-only `view.data.provider: 'api'`. **239 rows: 20 edited, 219 unchanged.** Edited rows render 11 strings; the 10 element rows share one. Entries at `retiredAfter: '17.7.0'`: **7**. How each column was read: - **before**: the release the guidance names at `121847a7d` (row 236: at `936750950`). - **live at the tag**: read against the `@objectstack/spec@17.7.0` tarball, integrity-verified against the packument, and against tag commit `4e4e88142`. Paths are relative to `packages/spec/` at `4e4e88142`; `tarball json-schema/…` is the published JSON Schema. - `yes` rows cite the live declaration. `no` rows cite a `[RETIRED]` authorable-surface line, a `[REMOVED]` describe, the tombstone's source line, or the def's retired-defs entry. - **D2 entry**: the conversion the retired-keys entry file names. For the comment-derived join, every row with `retiredAfter: '17.7.0'` is LIVE at the tag and every earlier stamp is tombstoned there: zero disagreements. | # | key (type:key) | registry entry (D2 named in the retired-keys entry file) | toMajor | retiredAfter | live at the tag | before | after | | --- | --- | --- | --- | --- | --- | --- | --- | | 1 | `ai/Agent:lifecycle` | `agent-lifecycle-removed` | 18 | 17.6.0 | no · authorable-surface/ai.json:29 `[RETIRED]` | 17.7.0 | unchanged | | 2 | `ai/Agent:memory.longTerm.store` | `agent-memory-long-term-store-removed` | 18 | 17.6.0 | no · tarball json-schema/ai/Agent.json:140 `[REMOVED]` | 17.7.0 | unchanged | | 3 | `ai/ConversationAnalytics:duration` | retired-keys only | — | — | no · authorable-surface/ai.json:96 `[RETIRED]` | 17 | unchanged | | 4 | `api/ApiEndpoint:cacheTtl` | `api-endpoint-cache-ttl-to-cache-ttl-seconds` | 18 | 17.3.0 | no · authorable-surface/api.json:120 `[RETIRED]` | 17 | unchanged | | 5 | `api/BatchEndpointsConfig:defaultAtomic` | retired-keys only | — | — | no · authorable-surface/api.json:262 `[RETIRED]` | 17 | unchanged | | 6 | `api/BatchEndpointsConfig:operations.upsertMany` | retired-keys only | — | — | no · tarball json-schema/api/BatchEndpointsConfig.json:37 `[REMOVED]` | 17 | unchanged | | 7 | `api/CrudEndpointsConfig:objectParamStyle` | retired-keys only | — | — | no · authorable-surface/api.json:425 `[RETIRED]` | 17 | unchanged | | 8 | `api/CrudEndpointsConfig:patterns` | retired-keys only | — | — | no · authorable-surface/api.json:427 `[RETIRED]` | 17 | unchanged | | 9 | `api/DataLoaderConfig:cacheTtl` | retired-keys only | — | — | no · authorable-surface/api.json:453 `[RETIRED]` | 17 | unchanged | | 10 | `api/DeviceRequestResponse:interval` | retired-keys only | — | — | no · authorable-surface/api.json:514 `[RETIRED]` | 17 | unchanged | | 11 | `api/EnhancedApiError:retryAfter` | retired-keys only | — | — | no · authorable-surface/api.json:603 `[RETIRED]` | 17 | unchanged | | 12 | `api/ListInstalledPackagesRequest:cursor` | retired-keys only | — | — | no · authorable-surface/api.json:998 `[RETIRED]` | 17.5.0 | unchanged | | 13 | `api/ListInstalledPackagesRequest:limit` | retired-keys only | — | — | no · authorable-surface/api.json:1000 `[RETIRED]` | 17.5.0 | unchanged | | 14 | `api/ListRunsRequest:cursor` | retired-keys only | — | — | no · authorable-surface/api.json:1025 `[RETIRED]` | 17.5.0 | unchanged | | 15 | `api/MetadataEndpointsConfig:cacheTtl` | retired-keys only | — | — | no · authorable-surface/api.json:1073 `[RETIRED]` | 17 | unchanged | | 16 | `api/MetadataEndpointsConfig:endpoints.schema` | retired-keys only | — | — | no · tarball json-schema/api/MetadataEndpointsConfig.json:49 `[REMOVED]` | 17 | unchanged | | 17 | `api/RestApiConfig:documentation.enabled` | retired-keys only | — | — | no · tarball json-schema/api/RestApiConfig.json:79 `[REMOVED]` | 17.5.0 | unchanged | | 18 | `api/RestApiConfig:documentation.version` | retired-keys only | — | — | no · tarball json-schema/api/RestApiConfig.json:91 `[REMOVED]` | 17.5.0 | unchanged | | 19 | `api/RestApiConfig:responseFormat` | retired-keys only | — | — | no · authorable-surface/api.json:1437 `[RETIRED]` | 17.5.0 | unchanged | | 20 | `api/RestApiEndpoint:cacheTtl` | retired-keys only | — | — | no · authorable-surface/api.json:1439 `[RETIRED]` | 17 | unchanged | | 21 | `api/RestApiEndpoint:handlerStatus` | retired-keys only | — | — | no · authorable-surface/api.json:1445 `[RETIRED]` | 17 | unchanged | | 22 | `api/RestApiEndpoint:timeout` | retired-keys only | — | — | no · authorable-surface/api.json:1455 `[RETIRED]` | 17 | unchanged | | 23 | `api/RestApiPluginConfig:performance.defaultCacheTtl` | retired-keys only | — | — | no · tarball json-schema/api/RestApiPluginConfig.json:812 `[REMOVED]` | 17 | unchanged | | 24 | `api/RouteDefinition:timeout` | retired-keys only | — | — | no · authorable-surface/api.json:1512 `[RETIRED]` | 17 | unchanged | | 25 | `api/RouteGenerationConfig:excludeObjects` | retired-keys only | — | — | no · authorable-surface/api.json:1514 `[RETIRED]` | 17 | unchanged | | 26 | `api/RouteGenerationConfig:includeObjects` | retired-keys only | — | — | no · authorable-surface/api.json:1515 `[RETIRED]` | 17 | unchanged | | 27 | `api/RouteGenerationConfig:nameTransform` | retired-keys only | — | — | no · authorable-surface/api.json:1516 `[RETIRED]` | 17 | unchanged | | 28 | `api/RouteGenerationConfig:overrides` | retired-keys only | — | — | no · authorable-surface/api.json:1517 `[RETIRED]` | 17 | unchanged | | 29 | `api/SessionUser:language` | retired-keys only | — | — | no · authorable-surface/api.json:1600 `[RETIRED]` | 17.4.0 | unchanged | | 30 | `api/SimplePresenceState:lastSeen` | retired-keys only | — | — | no · authorable-surface/api.json:1615 `[RETIRED]` | 17 | unchanged | | 31 | `api/WebSocketConfig:pingInterval` | retired-keys only | — | — | no · authorable-surface/api.json:1771 `[RETIRED]` | 17 | unchanged | | 32 | `api/WebSocketConfig:reconnectInterval` | retired-keys only | — | — | no · authorable-surface/api.json:1775 `[RETIRED]` | 17 | unchanged | | 33 | `api/WebSocketConfig:timeout` | retired-keys only | — | — | no · authorable-surface/api.json:1777 `[RETIRED]` | 17 | unchanged | | 34 | `api/WebSocketEvent:timestamp` | retired-keys only | — | — | no · authorable-surface/api.json:1783 `[RETIRED]` | 17 | unchanged | | 35 | `api/WebSocketServerConfig:heartbeatInterval` | retired-keys only | — | — | no · authorable-surface/api.json:1787 `[RETIRED]` | 17 | unchanged | | 36 | `data/AutoPersistenceConfig:autoSaveInterval` | `memory-persistence-auto-save-interval-to-ms` | 18 | 17.3.0 | no · authorable-surface/data.json:38 `[RETIRED]` | 17 | unchanged | | 37 | `data/Cube:refreshKey` | `cube-refresh-key-removed` | 18 | 17.5.0 | no · authorable-surface/data.json:100 `[RETIRED]` | 17 | unchanged | | 38 | `data/CubeJoin:relationship` | `cube-join-sql-and-relationship-removed` | 18 | 17.4.0 | no · src/data/analytics.zod.ts:573 | 17 | unchanged | | 39 | `data/CubeJoin:sql` | `cube-join-sql-and-relationship-removed` | 18 | 17.4.0 | no · src/data/analytics.zod.ts:572 | 17 | unchanged | | 40 | `data/CurrencyConfig:precision` | `currency-config-precision-removed` | 18 | 17.4.0 | no · src/data/field.zod.ts:453 | 17.5.0 | unchanged | | 41 | `data/Dimension:name` | `cube-member-inner-name-removed` | 18 | 17.4.0 | no · authorable-surface/data.json:197 `[RETIRED]` | 17.5.0 | unchanged | | 42 | `data/DriverOptions:timeout` | retired-keys only | — | — | no · authorable-surface/data.json:279 `[RETIRED]` | 17 | unchanged | | 43 | `data/ESignatureConfig:expirationDays` | retired-keys only | — | — | no · authorable-surface/data.json:288 `[RETIRED]` | n/a (def retired at HEAD) | unchanged | | 44 | `data/ESignatureConfig:reminderDays` | retired-keys only | — | — | no · authorable-surface/data.json:290 `[RETIRED]` | n/a (def retired at HEAD) | unchanged | | 45 | `data/FilePersistenceConfig:autoSaveInterval` | `memory-persistence-auto-save-interval-to-ms` | 18 | 17.3.0 | no · authorable-surface/data.json:444 `[RETIRED]` | 17 | unchanged | | 46 | `data/FileValue:duration` | retired-keys only | — | — | no · authorable-surface/data.json:449 `[RETIRED]` | 17 | unchanged | | 47 | `data/Metric:filters` | `metric-filters-removed` | 18 | 17.1.0 | no · src/data/analytics.zod.ts:367 | 17 | unchanged | | 48 | `data/Metric:name` | `cube-member-inner-name-removed` | 18 | 17.4.0 | no · authorable-surface/data.json:602 `[RETIRED]` | 17.5.0 | unchanged | | 49 | `data/NoSQLQueryOptions:timeout` | retired-keys only | — | — | no · authorable-surface/data.json:663 `[RETIRED]` | 17 | unchanged | | 50 | `data/TenancyConfig:organizationField` | `object-tenancy-organization-field-removed` | 18 | 17.4.0 | no · src/data/object.zod.ts:543 | 17 | unchanged | | 51 | `data/TursoConfig:timeout` | `turso-config-timeout-to-timeout-ms` | 18 | 17.3.0 | no · authorable-surface/data.json:1014 `[RETIRED]` | 17 | unchanged | | 52 | `integration/CircuitBreakerConfig:monitoringWindow` | `connector-resilience-keys-removed` | 18 | 17.4.0 | no · def retired whole: src/migrations/entries/retired-defs/18.integration__CircuitBreakerConfig.ts | n/a (def retired at HEAD) | unchanged | | 53 | `integration/Connector:connectionTimeoutMs` | `connector-connection-timeout-ms-removed` | 18 | 17.4.0 | no · authorable-surface/integration.json:15 `[RETIRED]` | 17 | unchanged | | 54 | `integration/Connector:errorMapping` | `connector-error-mapping-removed` | 18 | 17.3.0 | no · authorable-surface/integration.json:18 `[RETIRED]` | 17 | unchanged | | 55 | `integration/Connector:fieldMappings` | retired-keys only | — | — | no · authorable-surface/integration.json:19 `[RETIRED]` | 17 | unchanged | | 56 | `integration/Connector:health` | `connector-resilience-keys-removed` | 18 | 17.4.0 | no · authorable-surface/integration.json:20 `[RETIRED]` | 17 | unchanged | | 57 | `integration/Connector:status` | `connector-resilience-keys-removed` | 18 | 17.4.0 | no · authorable-surface/integration.json:30 `[RETIRED]` | 17 | unchanged | | 58 | `integration/Connector:syncConfig` | `connector-sync-keys-removed` | 18 | 17.5.0 | no · authorable-surface/integration.json:31 `[RETIRED]` | 17 | unchanged | | 59 | `integration/Connector:triggers` | `connector-triggers-removed` | 18 | 17.5.0 | no · authorable-surface/integration.json:32 `[RETIRED]` | 17 | unchanged | | 60 | `integration/Connector:webhooks` | `connector-resilience-keys-removed` | 18 | 17.4.0 | no · authorable-surface/integration.json:34 `[RETIRED]` | 17 | unchanged | | 61 | `integration/ConnectorTrigger:interval` | `connector-triggers-removed` | 18 | 17.5.0 | no · def retired whole: src/migrations/entries/retired-defs/18.integration__ConnectorTrigger.ts | n/a (def retired at HEAD) | unchanged | | 62 | `integration/DeclarativeConnectorEntry:connectionTimeoutMs` | retired-keys only | — | — | no · authorable-surface/integration.json:61 `[RETIRED]` | 17 | unchanged | | 63 | `integration/DeclarativeConnectorEntry:errorMapping` | retired-keys only | — | — | no · authorable-surface/integration.json:64 `[RETIRED]` | 17 | unchanged | | 64 | `integration/DeclarativeConnectorEntry:fieldMappings` | retired-keys only | — | — | no · authorable-surface/integration.json:65 `[RETIRED]` | 17 | unchanged | | 65 | `integration/DeclarativeConnectorEntry:health` | retired-keys only | — | — | no · authorable-surface/integration.json:66 `[RETIRED]` | 17 | unchanged | | 66 | `integration/DeclarativeConnectorEntry:status` | retired-keys only | — | — | no · authorable-surface/integration.json:76 `[RETIRED]` | 17 | unchanged | | 67 | `integration/DeclarativeConnectorEntry:syncConfig` | retired-keys only | — | — | no · authorable-surface/integration.json:77 `[RETIRED]` | 17 | unchanged | | 68 | `integration/DeclarativeConnectorEntry:triggers` | retired-keys only | — | — | no · authorable-surface/integration.json:78 `[RETIRED]` | 17 | unchanged | | 69 | `integration/DeclarativeConnectorEntry:webhooks` | retired-keys only | — | — | no · authorable-surface/integration.json:80 `[RETIRED]` | 17 | unchanged | | 70 | `kernel/CompatibilityMatrixEntry:estimatedMigrationTime` | retired-keys only | — | — | no · authorable-surface/kernel.json:33 `[RETIRED]` | 17 | unchanged | | 71 | `kernel/EventPersistence:retention` | retired-keys only | — | — | no · authorable-surface/kernel.json:130 `[RETIRED]` | 17 | unchanged | | 72 | `kernel/EventSourcingConfig:retention` | retired-keys only | — | — | no · authorable-surface/kernel.json:149 `[RETIRED]` | 17 | unchanged | | 73 | `kernel/HealthStatus:timestamp` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.kernel__HealthStatus.ts | n/a (def retired at HEAD) | unchanged | | 74 | `kernel/HotReloadConfig:debounceDelay` | retired-keys only | — | — | no · authorable-surface/kernel.json:212 `[RETIRED]` | 17 | unchanged | | 75 | `kernel/HotReloadConfig:watchPatterns` | retired-keys only | — | — | no · authorable-surface/kernel.json:218 `[RETIRED]` | 17.3.0 | unchanged | | 76 | `kernel/KernelContext:previewMode` | retired-keys only | — | — | no · authorable-surface/kernel.json:243 `[RETIRED]` | 17 | unchanged | | 77 | `kernel/KernelContext:startTime` | retired-keys only | — | — | no · authorable-surface/kernel.json:244 `[RETIRED]` | 17 | unchanged | | 78 | `kernel/KernelSecurityPolicy:auditLog.retention` | retired-keys only | — | — | no · tarball json-schema/kernel/KernelSecurityPolicy.json:195 `[REMOVED]` | 17 | unchanged | | 79 | `kernel/KernelSecurityPolicy:authentication.tokenExpiration` | retired-keys only | — | — | no · tarball json-schema/kernel/KernelSecurityPolicy.json:134 `[REMOVED]` | 17 | unchanged | | 80 | `kernel/Manifest:capabilities` | retired-keys only | — | — | no · authorable-surface/kernel.json:259 `[RETIRED]` | 17 | unchanged | | 81 | `kernel/Manifest:configuration` | retired-keys only | — | — | no · authorable-surface/kernel.json:260 `[RETIRED]` | 17 | unchanged | | 82 | `kernel/Manifest:contributes.actions` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:180 `[REMOVED]` | 17 | unchanged | | 83 | `kernel/Manifest:contributes.commands` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:200 `[REMOVED]` | 17 | unchanged | | 84 | `kernel/Manifest:contributes.drivers` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:184 `[REMOVED]` | 17 | unchanged | | 85 | `kernel/Manifest:contributes.events` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:164 `[REMOVED]` | 17 | unchanged | | 86 | `kernel/Manifest:contributes.fieldTypes` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:188 `[REMOVED]` | 17 | unchanged | | 87 | `kernel/Manifest:contributes.functions` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:192 `[REMOVED]` | 17 | unchanged | | 88 | `kernel/Manifest:contributes.kinds.globs` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:149 `[REMOVED]` | 17 | unchanged | | 89 | `kernel/Manifest:contributes.menus` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:168 `[REMOVED]` | 17 | unchanged | | 90 | `kernel/Manifest:contributes.routes` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:196 `[REMOVED]` | 17 | unchanged | | 91 | `kernel/Manifest:contributes.themes` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:172 `[REMOVED]` | 17 | unchanged | | 92 | `kernel/Manifest:contributes.translations` | retired-keys only | — | — | no · tarball json-schema/kernel/Manifest.json:176 `[REMOVED]` | 17 | unchanged | | 93 | `kernel/Manifest:extensions` | retired-keys only | — | — | no · authorable-surface/kernel.json:269 `[RETIRED]` | 17 | unchanged | | 94 | `kernel/MetadataManagerConfig:cache.enabled` | retired-keys only | — | — | no · tarball json-schema/kernel/MetadataManagerConfig.json:52 `[REMOVED]` | 17 | unchanged | | 95 | `kernel/MetadataManagerConfig:cache.maxSize` | retired-keys only | — | — | no · tarball json-schema/kernel/MetadataManagerConfig.json:64 `[REMOVED]` | 17 | unchanged | | 96 | `kernel/MetadataManagerConfig:cache.ttl` | retired-keys only | — | — | no · tarball json-schema/kernel/MetadataManagerConfig.json:60 `[REMOVED]` | 17 | unchanged | | 97 | `kernel/MetadataManagerConfig:cache.ttlSeconds` | retired-keys only | — | — | no · tarball json-schema/kernel/MetadataManagerConfig.json:56 `[REMOVED]` | 17 | unchanged | | 98 | `kernel/MetadataManagerConfig:persistence.overlayWritable` | retired-keys only | — | — | no · tarball json-schema/kernel/MetadataManagerConfig.json:177 `[REMOVED]` | 17 | unchanged | | 99 | `kernel/MetadataPluginConfig:additionalTypes` | retired-keys only | — | — | no · authorable-surface/kernel.json:310 `[RETIRED]` | 17 | unchanged | | 100 | `kernel/MetadataPluginConfig:customizationPolicies` | retired-keys only | — | — | no · authorable-surface/kernel.json:313 `[RETIRED]` | 17 | unchanged | | 101 | `kernel/MetadataPluginConfig:mergeStrategy` | retired-keys only | — | — | no · authorable-surface/kernel.json:316 `[RETIRED]` | 17 | unchanged | | 102 | `kernel/MetadataTypeRegistryEntry:allowOrgOverride` | retired-keys only | — | — | **yes** · src/kernel/metadata-plugin.zod.ts:267 | none | **18** | | 103 | `kernel/MultiVersionSupport:rollout.duration` | retired-keys only | — | — | no · tarball json-schema/kernel/MultiVersionSupport.json:139 `[REMOVED]` | 17 | unchanged | | 104 | `kernel/PackageDependencyResolutionResult:resolvedIn` | retired-keys only | — | — | no · authorable-surface/kernel.json:397 `[RETIRED]` | 17 | unchanged | | 105 | `kernel/PluginHealthCheck:autoRestart` | retired-keys only | — | — | no · authorable-surface/kernel.json:439 `[RETIRED]` | 17.3.0 | unchanged | | 106 | `kernel/PluginHealthCheck:interval` | retired-keys only | — | — | no · authorable-surface/kernel.json:442 `[RETIRED]` | 17 | unchanged | | 107 | `kernel/PluginHealthCheck:maxRestartAttempts` | retired-keys only | — | — | no · authorable-surface/kernel.json:444 `[RETIRED]` | 17.3.0 | unchanged | | 108 | `kernel/PluginHealthCheck:restartBackoff` | retired-keys only | — | — | no · authorable-surface/kernel.json:445 `[RETIRED]` | 17.3.0 | unchanged | | 109 | `kernel/PluginHealthCheck:timeout` | retired-keys only | — | — | no · authorable-surface/kernel.json:447 `[RETIRED]` | 17 | unchanged | | 110 | `kernel/PluginHealthReport:metrics.responseTime` | retired-keys only | — | — | no · tarball json-schema/kernel/PluginHealthReport.json:57 `[REMOVED]` | 17 | unchanged | | 111 | `kernel/PluginHealthReport:metrics.uptime` | retired-keys only | — | — | no · tarball json-schema/kernel/PluginHealthReport.json:53 `[REMOVED]` | 17 | unchanged | | 112 | `kernel/PluginQualityMetrics:securityScan` | retired-keys only | — | — | no · authorable-surface/kernel.json:511 `[RETIRED]` | 17 | unchanged | | 113 | `kernel/PluginSecurityManifest:scanResults` | retired-keys only | — | — | no · authorable-surface/kernel.json:552 `[RETIRED]` | 17 | unchanged | | 114 | `kernel/PluginSecurityManifest:vulnerabilities` | retired-keys only | — | — | no · authorable-surface/kernel.json:555 `[RETIRED]` | 17 | unchanged | | 115 | `kernel/PluginSecurityManifest:vulnerabilityDisclosure.responseTime` | retired-keys only | — | — | no · tarball json-schema/kernel/PluginSecurityManifest.json:824 `[REMOVED]` | 17 | unchanged | | 116 | `kernel/PluginStartupResult:duration` | retired-keys only | — | — | no · authorable-surface/kernel.json:557 `[RETIRED]` | 17 | unchanged | | 117 | `kernel/PluginStartupResult:health` | retired-keys only | — | — | no · authorable-surface/kernel.json:560 `[RETIRED]` | 17 | unchanged | | 118 | `kernel/PluginStartupResult:plugin` | retired-keys only | — | — | no · authorable-surface/kernel.json:561 `[RETIRED]` | 17 | unchanged | | 119 | `kernel/PluginStartupResult:startTime` | retired-keys only | — | — | no · authorable-surface/kernel.json:563 `[RETIRED]` | 17 | unchanged | | 120 | `kernel/RuntimeConfig:resourceLimits.timeout` | retired-keys only | — | — | no · tarball json-schema/kernel/RuntimeConfig.json:146 `[REMOVED]` | 17 | unchanged | | 121 | `kernel/SandboxConfig:process.timeout` | retired-keys only | — | — | no · tarball json-schema/kernel/SandboxConfig.json:165 `[REMOVED]` | 17 | unchanged | | 122 | `kernel/StartupOptions:timeout` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.kernel__StartupOptions.ts | n/a (def retired at HEAD) | unchanged | | 123 | `kernel/StartupOrchestrationResult:totalDuration` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.kernel__StartupOrchestrationResult.ts | n/a (def retired at HEAD) | unchanged | | 124 | `kernel/TenantRuntimeContext:previewMode` | retired-keys only | — | — | no · authorable-surface/kernel.json:732 `[RETIRED]` | 17 | unchanged | | 125 | `kernel/TenantRuntimeContext:startTime` | retired-keys only | — | — | no · authorable-surface/kernel.json:733 `[RETIRED]` | 17 | unchanged | | 126 | `kernel/UpgradePlan:estimatedDuration` | retired-keys only | — | — | no · authorable-surface/kernel.json:763 `[RETIRED]` | 17 | unchanged | | 127 | `qa/TestScenario:requires.plugins` | retired-keys only | — | — | no · tarball json-schema/qa/TestScenario.json:403 `[REMOVED]` | 17.5.0 | unchanged | | 128 | `security/EffectiveObjectPermission:allowPurge` | `permission-allow-restore-purge-removed` | 18 | 17.2.0 | no · authorable-surface/security.json:56 `[RETIRED]` | 17 | unchanged | | 129 | `security/EffectiveObjectPermission:allowRestore` | `permission-allow-restore-purge-removed` | 18 | 17.2.0 | no · authorable-surface/security.json:58 `[RETIRED]` | 17 | unchanged | | 130 | `security/ObjectPermission:allowPurge` | `permission-allow-restore-purge-removed` | 18 | 17.2.0 | no · authorable-surface/security.json:101 `[RETIRED]` | 17 | unchanged | | 131 | `security/ObjectPermission:allowRestore` | `permission-allow-restore-purge-removed` | 18 | 17.2.0 | no · authorable-surface/security.json:103 `[RETIRED]` | 17 | unchanged | | 132 | `security/RowLevelSecurityPolicy:tags` | `permission-rls-tags-removed` | 18 | 17.4.0 | no · authorable-surface/security.json:153 `[RETIRED]` | 17.5.0 | unchanged | | 133 | `system/AccessControlConfig:maxAge` | retired-keys only | — | — | no · authorable-surface/system.json:13 `[RETIRED]` | 17 | unchanged | | 134 | `system/CacheAvalanchePrevention:circuitBreaker.resetTimeout` | retired-keys only | — | — | no · tarball json-schema/system/CacheAvalanchePrevention.json:46 `[REMOVED]` | 17 | unchanged | | 135 | `system/CacheTier:ttl` | retired-keys only | — | — | no · authorable-surface/system.json:193 `[RETIRED]` | 17 | unchanged | | 136 | `system/ChangeImpact:downtime.durationMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__ChangeImpact.ts | n/a (def retired at HEAD) | unchanged | | 137 | `system/ChangeRequest:implementation.steps.estimatedMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__ChangeRequest.ts | n/a (def retired at HEAD) | unchanged | | 138 | `system/CollaborationSessionConfig:idleTimeout` | retired-keys only | — | — | no · authorable-surface/system.json:223 `[RETIRED]` | 17 | unchanged | | 139 | `system/CollaborationSessionConfig:snapshot.interval` | retired-keys only | — | — | no · tarball json-schema/system/CollaborationSessionConfig.json:77 `[REMOVED]` | 17 | unchanged | | 140 | `system/EmailTemplateDefinition:category` | `email-template-category-is-system-removed` | 18 | 17.7.0 | **yes** · src/system/email-template.zod.ts:106 | 17 | **18** | | 141 | `system/EmailTemplateDefinition:isSystem` | `email-template-category-is-system-removed` | 18 | 17.7.0 | **yes** · src/system/email-template.zod.ts:193 | 17 | **18** | | 142 | `system/FailoverConfig:healthCheckInterval` | retired-keys only | — | — | no · authorable-surface/system.json:426 `[RETIRED]` | 17 | unchanged | | 143 | `system/HttpDestinationConfig:batch.flushInterval` | retired-keys only | — | — | no · tarball json-schema/system/HttpDestinationConfig.json:79 `[REMOVED]` | 17 | unchanged | | 144 | `system/HttpDestinationConfig:retry.initialDelay` | retired-keys only | — | — | no · tarball json-schema/system/HttpDestinationConfig.json:106 `[REMOVED]` | 17 | unchanged | | 145 | `system/HttpDestinationConfig:timeout` | retired-keys only | — | — | no · authorable-surface/system.json:466 `[RETIRED]` | 17 | unchanged | | 146 | `system/IncidentNotificationMatrix:escalationTimeoutMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentNotificationMatrix.ts | n/a (def retired at HEAD) | unchanged | | 147 | `system/IncidentNotificationRule:regulatorDeadlineHours` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentNotificationRule.ts | n/a (def retired at HEAD) | unchanged | | 148 | `system/IncidentNotificationRule:withinMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentNotificationRule.ts | n/a (def retired at HEAD) | unchanged | | 149 | `system/IncidentResponsePhase:targetHours` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentResponsePhase.ts | n/a (def retired at HEAD) | unchanged | | 150 | `system/IncidentResponsePolicy:retentionDays` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentResponsePolicy.ts | n/a (def retired at HEAD) | unchanged | | 151 | `system/IncidentResponsePolicy:triageDeadlineHours` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__IncidentResponsePolicy.ts | n/a (def retired at HEAD) | unchanged | | 152 | `system/Job:timeout` | `job-timeout-to-timeout-ms` | 18 | 17.3.0 | no · authorable-surface/system.json:488 `[RETIRED]` | 17 | unchanged | | 153 | `system/LoggingConfig:buffer.flushInterval` | retired-keys only | — | — | no · tarball json-schema/system/LoggingConfig.json:408 `[REMOVED]` | 17 | unchanged | | 154 | `system/MetricAggregationConfig:window.size` | retired-keys only | — | — | no · tarball json-schema/system/MetricAggregationConfig.json:34 `[REMOVED]` | 17 | unchanged | | 155 | `system/MetricDefinition:summary.maxAge` | retired-keys only | — | — | no · tarball json-schema/system/MetricDefinition.json:174 `[REMOVED]` | 17 | unchanged | | 156 | `system/MetricExportConfig:interval` | retired-keys only | — | — | no · authorable-surface/system.json:739 `[RETIRED]` | 17 | unchanged | | 157 | `system/MetricsConfig:collectionInterval` | retired-keys only | — | — | no · authorable-surface/system.json:744 `[RETIRED]` | 17 | unchanged | | 158 | `system/MetricsConfig:retention.period` | retired-keys only | — | — | no · tarball json-schema/system/MetricsConfig.json:737 `[REMOVED]` | 17 | unchanged | | 159 | `system/OpenTelemetryCompatibility:exporter.batch.exportTimeout` | retired-keys only | — | — | no · tarball json-schema/system/OpenTelemetryCompatibility.json:96 `[REMOVED]` | 17 | unchanged | | 160 | `system/OpenTelemetryCompatibility:exporter.batch.scheduledDelay` | retired-keys only | — | — | no · tarball json-schema/system/OpenTelemetryCompatibility.json:100 `[REMOVED]` | 17 | unchanged | | 161 | `system/OpenTelemetryCompatibility:exporter.timeout` | retired-keys only | — | — | no · tarball json-schema/system/OpenTelemetryCompatibility.json:55 `[REMOVED]` | 17 | unchanged | | 162 | `system/QueueConfig:rateLimit.duration` | retired-keys only | — | — | no · tarball json-schema/system/QueueConfig.json:33 `[REMOVED]` | 17 | unchanged | | 163 | `system/RegistryConfig:cache.ttl` | retired-keys only | — | — | no · tarball json-schema/system/RegistryConfig.json:236 `[REMOVED]` | 17 | unchanged | | 164 | `system/RegistryUpstream:syncInterval` | retired-keys only | — | — | no · authorable-surface/system.json:930 `[RETIRED]` | 17 | unchanged | | 165 | `system/RegistryUpstream:timeout` | retired-keys only | — | — | no · authorable-surface/system.json:933 `[RETIRED]` | 17 | unchanged | | 166 | `system/RollbackPlan:steps.estimatedMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__RollbackPlan.ts | n/a (def retired at HEAD) | unchanged | | 167 | `system/SchemaLevelIsolationStrategy:performance.schemaCacheTTL` | retired-keys only | — | — | no · tarball json-schema/system/SchemaLevelIsolationStrategy.json:94 `[REMOVED]` | 17 | unchanged | | 168 | `system/ServiceLevelIndicator:window.size` | retired-keys only | — | — | no · tarball json-schema/system/ServiceLevelIndicator.json:76 `[REMOVED]` | 17 | unchanged | | 169 | `system/ServiceLevelObjective:errorBudget.burnRateWindows.window` | retired-keys only | — | — | no · tarball json-schema/system/ServiceLevelObjective.json:91 `[REMOVED]` | 17 | unchanged | | 170 | `system/ServiceLevelObjective:period.duration` | retired-keys only | — | — | no · tarball json-schema/system/ServiceLevelObjective.json:46 `[REMOVED]` | 17 | unchanged | | 171 | `system/Span:duration` | retired-keys only | — | — | no · authorable-surface/system.json:1062 `[RETIRED]` | 17 | unchanged | | 172 | `system/StorageConnection:timeout` | retired-keys only | — | — | no · authorable-surface/system.json:1125 `[RETIRED]` | 17 | unchanged | | 173 | `system/TracingConfig:performance.exportInterval` | retired-keys only | — | — | no · tarball json-schema/system/TracingConfig.json:608 `[REMOVED]` | 17 | unchanged | | 174 | `system/TrainingCourse:durationMinutes` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__TrainingCourse.ts | n/a (def retired at HEAD) | unchanged | | 175 | `system/TrainingCourse:validityDays` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__TrainingCourse.ts | n/a (def retired at HEAD) | unchanged | | 176 | `system/TrainingPlan:gracePeriodDays` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__TrainingPlan.ts | n/a (def retired at HEAD) | unchanged | | 177 | `system/TrainingPlan:recertificationIntervalDays` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__TrainingPlan.ts | n/a (def retired at HEAD) | unchanged | | 178 | `system/TrainingPlan:reminderDaysBefore` | retired-keys only | — | — | no · def retired whole: src/migrations/entries/retired-defs/18.system__TrainingPlan.ts | n/a (def retired at HEAD) | unchanged | | 179 | `ui/Action:aria` | `action-aria-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:13 `[RETIRED]` | 17.5.0 | unchanged | | 180 | `ui/ChartConfig:aria` | `chart-config-aria-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:262 `[RETIRED]` | 17 | unchanged | | 181 | `ui/Dashboard:refreshInterval` | `dashboard-refresh-interval-to-refresh-interval-seconds` | 18 | 17.3.0 | no · authorable-surface/ui.json:327 `[RETIRED]` | 17 | unchanged | | 182 | `ui/DashboardWidgetChartConfig:series` | `dashboard-widget-chart-config-structure-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:377 `[RETIRED]` | 17.5.0 | unchanged | | 183 | `ui/DashboardWidgetChartConfig:type` | `dashboard-widget-chart-config-structure-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:382 `[RETIRED]` | 17.5.0 | unchanged | | 184 | `ui/DashboardWidgetChartConfig:xAxis` | `dashboard-widget-chart-config-structure-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:383 `[RETIRED]` | 17.5.0 | unchanged | | 185 | `ui/DashboardWidgetChartConfig:yAxis` | `dashboard-widget-chart-config-structure-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:384 `[RETIRED]` | 17.5.0 | unchanged | | 186 | `ui/ElementFilterProps:aria` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:448 `[RETIRED]` | 17 | unchanged | | 187 | `ui/ElementFilterProps:fields` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:449 `[RETIRED]` | 17 | unchanged | | 188 | `ui/ElementFilterProps:layout` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:450 `[RETIRED]` | 17 | unchanged | | 189 | `ui/ElementFilterProps:object` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:451 `[RETIRED]` | 17 | unchanged | | 190 | `ui/ElementFilterProps:showSearch` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:452 `[RETIRED]` | 17 | unchanged | | 191 | `ui/ElementFilterProps:targetVariable` | `element-filter-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:453 `[RETIRED]` | 17 | unchanged | | 192 | `ui/ElementFormProps:aria` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:454 `[RETIRED]` | 17 | unchanged | | 193 | `ui/ElementFormProps:fields` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:455 `[RETIRED]` | 17 | unchanged | | 194 | `ui/ElementFormProps:mode` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:456 `[RETIRED]` | 17 | unchanged | | 195 | `ui/ElementFormProps:object` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:457 `[RETIRED]` | 17 | unchanged | | 196 | `ui/ElementFormProps:onSubmit` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:458 `[RETIRED]` | 17 | unchanged | | 197 | `ui/ElementFormProps:submitLabel` | `element-form-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:459 `[RETIRED]` | 17 | unchanged | | 198 | `ui/ElementNumberProps:filter` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:2606 | 17 | **18** | | 199 | `ui/ElementNumberProps:object` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:2585 | 17 | **18** | | 200 | `ui/ElementRecordPickerProps:filter` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:3041 | 17 | **18** | | 201 | `ui/ElementRecordPickerProps:limit` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:3064 | 17 | **18** | | 202 | `ui/ElementRecordPickerProps:object` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:2995 | 17 | **18** | | 203 | `ui/ElementRecordPickerProps:sort` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:3054 | 17 | **18** | | 204 | `ui/ElementRecordPickerProps:targetVariable` | `element-input-target-variable-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:491 `[RETIRED]` | 17 | unchanged | | 205 | `ui/ElementRepeaterProps:filter` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:4093 | 17 | **18** | | 206 | `ui/ElementRepeaterProps:limit` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:4097 | 17 | **18** | | 207 | `ui/ElementRepeaterProps:object` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:4075 | 17 | **18** | | 208 | `ui/ElementRepeaterProps:sort` | `element-flat-data-binding-to-data-source` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:4095 | 17 | **18** | | 209 | `ui/ElementTextInputProps:targetVariable` | `element-input-target-variable-removed` | 18 | 17.0.0 | no · authorable-surface/ui.json:509 `[RETIRED]` | 17 | unchanged | | 210 | `ui/FormField:publicPicker` | `form-field-public-picker-removed` | 18 | 17.5.0 | no · authorable-surface/ui.json:538 `[RETIRED]` | 17.6.0 | unchanged | | 211 | `ui/JoinedReportBlock:chart` | `report-joined-chart-removed` | 18 | 17.4.0 | no · src/ui/report.zod.ts:289 | 17.5.0 | unchanged | | 212 | `ui/ListView:pageName` | `view-page-mount-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:757 `[RETIRED]` | 17.5.0 | unchanged | | 213 | `ui/ListView:tabs` | `view-list-tabs-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:771 `[RETIRED]` | 17.5.0 | unchanged | | 214 | `ui/NavigationConfig:view` | retired-keys only | — | — | no · authorable-surface/ui.json:787 `[RETIRED]` | 17.5.0 | unchanged | | 215 | `ui/ObjectGridProps:defaultFilters` | `object-grid-default-filters-removed` | 18 | 17.7.0 | **yes** · src/ui/component.zod.ts:4498 | 17 | **18** | | 216 | `ui/ObjectGridProps:defaultSort` | `object-grid-default-sort-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:867 `[RETIRED]` | 17 | unchanged | | 217 | `ui/ObjectGridProps:resizableColumns` | `object-grid-resizable-columns-removed` | 18 | 17.6.0 | no · authorable-surface/ui.json:885 `[RETIRED]` | 17.7.0 | unchanged | | 218 | `ui/ObjectKanbanProps:quickAdd` | `object-kanban-quick-add-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:911 `[RETIRED]` | 17 | unchanged | | 219 | `ui/ObjectListView:pageName` | `view-page-mount-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:943 `[RETIRED]` | 17.5.0 | unchanged | | 220 | `ui/ObjectListView:tabs` | `view-list-tabs-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:957 `[RETIRED]` | 17.5.0 | unchanged | | 221 | `ui/ObjectMasterDetailFormProps:details.sortField` | `object-master-detail-form-detail-sort-field-removed` | 18 | 17.6.0 | no · tarball json-schema/ui/ObjectMasterDetailFormProps.json:1321 `[REMOVED]` | 17 | unchanged | | 222 | `ui/Page:assignedProfiles` | `page-assigned-profiles-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:1053 `[RETIRED]` | 17.5.0 | unchanged | | 223 | `ui/PageComponent:responsive` | `page-component-responsive-removed` | 18 | 17.2.0 | no · authorable-surface/ui.json:1087 `[RETIRED]` | 17 | unchanged | | 224 | `ui/PageHeaderProps:breadcrumb` | `page-header-breadcrumb-removed` | 18 | 17.5.0 | no · authorable-surface/ui.json:1096 `[RETIRED]` | 17 | unchanged | | 225 | `ui/RecordHighlightsField:icon` | `record-highlights-field-icon-removed` | 18 | 17.1.0 | no · src/ui/component.zod.ts:1626 | 17 | unchanged | | 226 | `ui/ReportChart:aria` | `chart-config-aria-removed` | 18 | 17.4.0 | no · authorable-surface/ui.json:1251 `[RETIRED]` | 17 | unchanged | | 227 | `ui/ViewItem:hidden` | `view-item-owner-hidden-removed` | 18 | 17.4.0 | no · tarball json-schema/ui/ViewItem.json:2355 `[REMOVED]` | 17.5.0 | unchanged | | 228 | `ui/ViewItem:owner` | `view-item-owner-hidden-removed` | 18 | 17.4.0 | no · tarball json-schema/ui/ViewItem.json:2351 `[REMOVED]` | 17.5.0 | unchanged | | 229 | `ui/ViewItemWire:hidden` | `view-item-owner-hidden-removed` | 18 | 17.4.0 | no · tarball json-schema/ui/ViewItemWire.json:2355 `[REMOVED]` | 17.5.0 | unchanged | | 230 | `ui/ViewItemWire:owner` | `view-item-owner-hidden-removed` | 18 | 17.4.0 | no · tarball json-schema/ui/ViewItemWire.json:2351 `[REMOVED]` | 17.5.0 | unchanged | | 231 | `ui/ViewMetadata:hidden` | `view-overlay-owner-hidden-removed` | 18 | 17.4.0 | no · src/ui/view.zod.ts:5025 | 17.5.0 | unchanged | | 232 | `ui/ViewMetadata:owner` | `view-overlay-owner-hidden-removed` | 18 | 17.4.0 | no · src/ui/view.zod.ts:5024 | 17.5.0 | unchanged | | 233 | manifest `permissions` as a string list (union arm; `ManifestPermissionsSchema`) | `manifest-permissions-string-list-removed` | 18 | 17.7.0 | **yes** · src/kernel/manifest.zod.ts:94-95 | 17 | **18** | | 234 | `StorageScope` value `public` (`enumWithRetiredValues`) | D3 `storage-scope-public-retired` | — | — | **yes** · src/system/object-storage.zod.ts:40 | 17.8.0 | **18** | | 235 | `indexes[].unique: true` (value; `IndexSchema.unique`) | `declared-index-unique-scope` | 18 | 17.7.0 | **yes** · src/data/object.zod.ts:490 | protocol 18 | unchanged | | 236 | `TimeUpdateInterval` members `second` / `minute` / `hour` (value; its error map) — patch round | `cube-sub-day-granularities-removed` | 18 | 17.4.0 | no · src/data/analytics.zod.ts:169 already refuses; 17.4.0 tarball src/data/analytics.zod.ts:53-55 accepts them, 17.5.0 tarball :145-148 refuses | protocol 18 | **17.5.0** | | 237 | `'navigation'` as a page action row's executor (`action:button` / `action:icon` `actionType`, `action:group` / `action:menu` member `type`) — fix round | `page-action-row-navigation-executor-to-url` | 18 | 17.7.0 | **yes** · accepted by the 17.7.0 tarball (measured) and by 18.0.0-next.0 | none | **18** | | 238 | `controlled_by_parent` object with no `master_detail` declared `required: true` — fix round | `cbp-master-detail-required-defaulted` | 18 | 17.7.0 | **yes** · accepted by the 17.7.0 tarball (measured; the tag has no one-master refusal) and by 18.0.0-next.0 | none | **18** | | 239 | `view.data.provider: 'api'` (union arm; D3 only, out of the pin's reach) — fix round | D3 `view-data-api-provider-retired` | — | — | **yes** · src/ui/view.zod.ts:190 (`provider: z.literal('api')`); accepted by the 17.7.0 tarball and by 18.0.0-next.0 | 17 | **18** | Zero-hit controls on the join: - No HEAD tombstone names 18: 0 of 226 visible in the JSON Schema tree. - No tombstone a 17.x tarball carries names a release inconsistent with the first tarball carrying it: 0 of 212, against the 17.0.0–17.7.0 tarballs, all integrity-verified. - `retiredAfter` stamps disagreeing with the tarballs: 0 of 117. - `git diff 4e4e88142 936750950`: added non-comment `retiredKey(` lines are exactly the 14 LIVE rows, and the one added `enumWithRetiredValues(` is `StorageScope`. - Positive control: the 17.4.0 tarball's retired ids equal the committed census's 17.4.0 row (73). Controls kept at 17, all `toMajor: 18`: `page-header-breadcrumb-removed` (17.5.0), `object-grid-default-sort-removed` (17.2.0) and `object-kanban-quick-add-removed` (17.4.0). ## Zone 2, measured - **H1: falsified on the count.** `conversions/registry.ts` holds **5** entries with `retiredAfter: '17.7.0'`, not 4; the fifth is `declared-index-unique-scope`, whose prescription already says "protocol 18" and is unchanged. (At the fix-round head: 7, after `main` added the two entries the fix round joins.) The tag `@objectstack/spec@17.7.0` peels to `4e4e88142`, and `defaultFilters` is live there at `src/ui/component.zod.ts:4498`. - **H2: holds.** Only the conversion registry carries `retiredAfter`. The retired-keys registry holds ids only, under one major 18 for both shipped and unshipped keys. - **H3: holds.** All 117 retired stamps agree with the tarballs, including 17.5.0–17.7.0, which the census has not recorded. The 5 unpublished entries are exactly the `17.7.0` set and are all live at the tag. - **H4: no reader exists, so the pin derives the newest stable release instead of hard-coding `17.7.0`.** The census trails at `17.4.0`, and the census test's helpers are test-local. The pin reads the highest stable version the tree records: census, stamps, and the label when it is stable. It takes the next major from `PROTOCOL_MAJOR`. Simulated facts pin four windows: a stable 17.x label on the v18 train, a prerelease label, label `18.0.0`, and the 17.x minor line. - **H5: holds.** All ten element keys are live at the tag (rows 198–208). - **H6: holds; nothing to change.** `composeMigrationChain` keeps majors above N, so `--from 17` replays step 18. The pin asserts `--from` equals `toMajor - 1`. ## The pin For each joined retired conversion, the pin derives the removal major from `retiredAfter`. It then reads every tombstone parse refusal and `[REMOVED]` describe (or the refusal, for a value or arm) and asserts they name that major and nothing else. Two guards: - every entry retired after the newest published stable release must be joined; - the rows must derive both `PROTOCOL_MAJOR` and an older major. Joined: the seven unpublished entries, three 17.x controls, and `cube-sub-day-granularities-removed`: 19 cases. Out of reach by construction: a retirement with no D2 entry (`allowOrgOverride`, `StorageScope.public`, `view.data.provider: 'api'`); the last two carry a one-line literal release pin instead. Ablation via `node scripts/ablation-replace.mjs … -- vitest run` on the pin, each leg from committed state and restored to blob == HEAD with `git diff HEAD` empty: - ① `defaultFilters` 18→17: **red**, 1 failed / 15 passed. Head `8d3a9c21b`. - ② the shared element string 18→17: **red**, 1/15. Head `8d3a9c21b`. - ③ the control `breadcrumb` 17→18: **red**, 1/15. Head `8d3a9c21b`. The first try was an anchor miss the tool refused (exit 3, nothing written). - ④ unjoin the manifest row: **red**, 4/12. Head `8d3a9c21b`. - ⑤ (patch round, head `1ee37155d`) the interval string back to "was retired in protocol 18": **red**, 1 failed / 16 passed, on `cube-sub-day-granularities-removed`: "retiredAfter 17.4.0 (newest published stable 17.7.0) derives @objectstack/spec 17, but the prescription names 18". Restored to blob `b7e1a037def1` == HEAD. - ⑥ and ⑦ (fix round, head `38728b3e1`): the `'navigation'` and controlled-by-parent refusals without their release: **red**, 1 failed / 18 passed each. Restored to blobs `fb3ad73747ac` and `6347359316f2` == HEAD. ## Verification (head `38728b3e1`, fix round) - Merge `b24018c07` (parents `56d63b4e7` and `197fbe2c0`) via `os-regen-merge.sh`. `content/docs/references/ui/component.mdx` merged without a text merge; it was regenerated (`gen:schema` + `gen:docs`, `d0b4cfd1a`) and differs from `origin/main` by exactly this branch's 11 rows. - Turbo builds: the spec closure, then the workspace, 74/74. `check:generated`: "All 14 generated artifacts are up to date". The `provider: 'api'` text lives in an error map, so there is no references row to regenerate. - Tests: - spec `--project local`: 668 files, 20229 passed, 1 todo (the pin's 19 cases included); - spec `--project repo`, all `src/**` members plus `references-banner`: 35 files, 473 passed; - lint: 138 files, 6679 passed; - verify `parent-write-reach.test.ts`: 10 passed. - `typecheck`: spec and lint exit 0. - `dispatch-gates --commands`: **113**, all run. - 112 exit 0, 3 of them after a workspace build (PREREQUISITE NOT MET on the first pass). - 1 exit 1: `check-empty-changeset`, by design (see the fix-round section). - `--ran`: "113 derived, 113 run, 0 NOT-MEASURED, 0 UNRUN". - `check:future-spec-major`: "✓ … no `@objectstack/spec` citation names a major above 18". - CI on `38728b3e1`: TypeScript Type Check (4/4 lanes), Test Core, Build Core and Lint & Repo Gates are green; `Check Changeset` is red by design. ## Acceptance notes - NOT MEASURED locally: - the 23 `scripts/**` members of spec's `repo` project (none reads an edited file); - the CI-only jobs and type-check lanes outside the derived list and the source-gates lane. - Value-level prescriptions naming no release were not swept. - `retired-after.census.json` trails the published line (17.5.0–17.7.0, and now `18.0.0-next.0`, which the census never records as a prerelease). No live defect: every stamp agrees with the tarballs. --- _Generated by [Claude Code](https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent b4d573a commit c056979

30 files changed

Lines changed: 422 additions & 46 deletions

‎.changeset/23082-view-data-api-provider-retired.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Measured before removal: no producer wrote `provider: 'api'` on a view outside d
2222

2323
**What an author who still writes it sees.** `tsc` fails at the authoring site (`ViewData` no longer has the arm), and the parse — `defineView()`, `defineStack({ views })`, `os validate`, `PUT /api/v1/meta/view/:name` — refuses it at `data.provider` with the prescription:
2424

25-
> `view.data.provider: 'api'` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — a view-level API source took any `url` and any `headers`, so a credential or a cross-origin call written there was stored with the view, served to every client that read it and sent by the console as written; a metadata-declared API call now has one door, the page element's binding, which is same-origin and credential-free. Bind the view to its object — `data: { provider: 'object', object: '<object_name>' }` — or to static rows — `data: { provider: 'value', items: [...] }` — and move the API read onto a page component: `dataSource: { provider: 'api', read: { url: '/api/...' } }` (with an optional `path` into the response) under a page's `regions[].components[]`, which the console reads with its own signed-in fetch.
25+
> `view.data.provider: 'api'` was removed in @objectstack/spec 18 (ADR-0049 enforce-or-remove) — a view-level API source took any `url` and any `headers`, so a credential or a cross-origin call written there was stored with the view, served to every client that read it and sent by the console as written; a metadata-declared API call now has one door, the page element's binding, which is same-origin and credential-free. Bind the view to its object — `data: { provider: 'object', object: '<object_name>' }` — or to static rows — `data: { provider: 'value', items: [...] }` — and move the API read onto a page component: `dataSource: { provider: 'api', read: { url: '/api/...' } }` (with an optional `path` into the response) under a page's `regions[].components[]`, which the console reads with its own signed-in fetch.
2626
2727
## The retirement kit
2828

‎.changeset/23103-page-action-row-on-success-and-executor.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ A page's `properties` bag is outside the stack parse. `os validate` judges it th
3333

3434
**The one-line fix: give every page action row's `onSuccess` the action's block, `{ navigate, openIn? }`, with a `navigate` that is an `http(s)://` URL, a `mailto:` address, an in-app path that starts with `/` or `./`, or a template that opens with `${` — and spell the url executor `'url'`.** The rename from `'navigation'` is lossless on a row: the runner sends both spellings to one navigator, and the alias's own keys (`to`, `redirect`, `external`, `newTab`, `replace`) are not row keys. The executor rename is mechanical: `os migrate meta --from 17 --write` performs it through the ADR-0087 D2 conversion `page-action-row-navigation-executor-to-url`, which is retired from the load path, so an author meets the refusal while stored rows and migrated sources are rewritten. It lists the D3 entries `ui-page-action-row-navigation-executor-refused` (which names that conversion) and `ui-page-action-row-on-success-shape-closed`. An `onSuccess` rewrite stays by hand, because which address a refused `navigate` meant is the author's call.
3535

36-
**What an author now sees.** `os validate`'s props gate reports a refused `navigate` at `properties.onSuccess.navigate` (or `properties.actions.N.onSuccess.navigate` for a member) with the action's own refusal: ``An action's `onSuccess.navigate` opens with `javascript:`, a scheme a url target never opens.``, followed by the reason and the admitted set. The alias is reported at `properties.actionType` (or `properties.actions.N.type`): ``An `action:button`'s `actionType: 'navigation'` is the console runner's local alias of `'url'`, and the url executor has one spelling.``, followed by the rename. A row's parsed `onSuccess` now carries `openIn: 'self'` when it was omitted, as an action's does; the runner reads an omitted `openIn` the same way.
36+
**What an author now sees.** `os validate`'s props gate reports a refused `navigate` at `properties.onSuccess.navigate` (or `properties.actions.N.onSuccess.navigate` for a member) with the action's own refusal: ``An action's `onSuccess.navigate` opens with `javascript:`, a scheme a url target never opens.``, followed by the reason and the admitted set. The alias is reported at `properties.actionType` (or `properties.actions.N.type`): ``An `action:button`'s `actionType: 'navigation'` is the console runner's local alias of `'url'`, refused on page action rows since @objectstack/spec 18, and the url executor has one spelling.``, followed by the rename. A row's parsed `onSuccess` now carries `openIn: 'self'` when it was omitted, as an action's does; the runner reads an omitted `openIn` the same way.
3737

3838
**Measured producers: none refused.** No page action row in this repository or in objectui (at its pin `1fb1ced3`) writes an `onSuccess` outside the block or the executor `'navigation'`. objectui's row tests write `{ navigate: '/app/records/${result.id}' }`, admitted, and every `type: 'navigation'` there is an `element:button` inline action or a runner test, not a page action row. Host-registered executor names are kept: this package's own released guidance prescribes `actionType: 'navigate_edit'` on an `action:button`.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
Retirement prescriptions for shapes `@objectstack/spec` 17.7.0 still accepts now name 18 as the release that removed them
6+
7+
Clause-②: no
8+
9+
17.7.0, the newest 17.x release (npm `latest`), still accepts every shape in the two tables below. No 17.x release removes them: the 18 line does. `18.0.0-next.0` is the first release that refuses the shapes in this first table. Their refusals, and their `[REMOVED]` JSON Schema descriptions, named a different release:
10+
11+
| Surface | Was | Now |
12+
| --- | --- | --- |
13+
| `element:number` `object` / `filter`; `element:record_picker` and `element:repeater` `object` / `filter` / `sort` / `limit` | removed in @objectstack/spec 17 | removed in @objectstack/spec 18 |
14+
| `object-grid` `defaultFilters` | removed in @objectstack/spec 17 | removed in @objectstack/spec 18 |
15+
| `email_template.category`, `email_template.isSystem` | removed in @objectstack/spec 17 | removed in @objectstack/spec 18 |
16+
| a package manifest's `permissions` written as a list of permission strings | removed in @objectstack/spec 17 | removed in @objectstack/spec 18 |
17+
| `public` in `StorageScope` | removed in @objectstack/spec 17.8.0 | removed in @objectstack/spec 18 |
18+
| `MetadataTypeRegistryEntry.allowOrgOverride` → `allowEnvironmentOverlay` | renamed (no release named) | renamed in @objectstack/spec 18 |
19+
20+
The `18.0.0-next.0` release notes quoted the two `email_template` prescriptions with the earlier version, 17; from this release on they name 18.
21+
22+
`18.0.0-next.0` still accepts the shapes in this second table, so the first release that refuses them is the one after it. Their refusals named 17, or no release at all:
23+
24+
| Surface | Was | Now |
25+
| --- | --- | --- |
26+
| `view.data.provider: 'api'` | removed in @objectstack/spec 17 | removed in @objectstack/spec 18 |
27+
| `'navigation'` as a page action row's executor (`actionType` on `action:button` / `action:icon`, member `type` on `action:group` / `action:menu`) | no release named | refused on page action rows since @objectstack/spec 18 |
28+
| a `controlled_by_parent` object with no `master_detail` declared `required: true` | no release named | the one-required-master rule holds since @objectstack/spec 18 |
29+
30+
One prescription was wrong the other way. 17.4.0 accepts the sub-day `TimeUpdateInterval` members `second`, `minute` and `hour`, and 17.5.0 refuses them, but the refusal said "retired in protocol 18". It now says "removed in @objectstack/spec 17.5.0".
31+
32+
The `os migrate meta --from 17` sentence in each prescription is unchanged and was already right: `--from 17` replays the protocol-18 conversions. A prescription for a key that a 17.x release already refuses keeps naming 17. Text only: no key, value or shape is accepted or refused differently.

‎.changeset/pre/22876-email-template-category-is-system-retired.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ Measured before removal: no reader of either key in `@objectstack/plugin-email`,
2626

2727
**What an author who still writes either sees.** `tsc` fails at the authoring site (`EmailTemplateDefinition` types both keys as retired), and the parse — `defineEmailTemplateDefinition()`, `defineStack({ emailTemplates })`, `PUT /api/v1/meta/email_template/:name` — refuses each at its own path with the prescription:
2828

29-
> `email_template.category` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing read it: the Studio listing never offered the filter facet it promised, and delivery never depended on it. Delete the key. A template is found by its `name`, so group templates with a dotted namespace prefix instead (`auth.password_reset`, `crm.welcome`). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.
29+
> `email_template.category` was removed in @objectstack/spec 18 (ADR-0049 enforce-or-remove) — nothing read it: the Studio listing never offered the filter facet it promised, and delivery never depended on it. Delete the key. A template is found by its `name`, so group templates with a dotted namespace prefix instead (`auth.password_reset`, `crm.welcome`). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.
3030
31-
> `email_template.isSystem` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing enforced it: no door refused deleting a template that set it. Delete the key. A built-in template is a code package's declaration: a Studio save overrides it for the environment, and discarding that save restores the package's copy. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.
31+
> `email_template.isSystem` was removed in @objectstack/spec 18 (ADR-0049 enforce-or-remove) — nothing enforced it: no door refused deleting a template that set it. Delete the key. A built-in template is a code package's declaration: a Studio save overrides it for the environment, and discarding that save restores the package's copy. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.
3232
3333
## The retirement kit
3434

‎content/docs/references/kernel/metadata-plugin.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ const result = MetadataBulkResultSchema.parse(data);
269269
| **filePatterns** | `string[]` | ✅ | Glob patterns to discover files of this type |
270270
| **supportsOverlay** | `boolean` | optional (default: `true`) | Whether a stored overlay row of an item a managed package ships may be removed through the ordinary delete door without the type's environment-overlay permission: the removal removes no managed definition, and changes what is served for permission alone; it opens no save and it decides no read |
271271
| **allowEnvironmentOverlay** | `boolean` | optional (default: `false`) | Whether an environment may overlay an item of this type that a managed package ships (ADR-0131 D6 regime O). Decides the save door, the managed-content seal on write and on read, and Studio's write gate; the OS_METADATA_WRITABLE hatch does not reach a managed item. Default false. |
272-
| **allowOrgOverride** | `never` | optional | [REMOVED] `MetadataTypeRegistryEntry.allowOrgOverride` was renamed to `allowEnvironmentOverlay` (ADR-0131 D6) — the per-organization overlay axis was retired, and the key now names the one scope it governs: whether an environment may overlay an item of this type that a managed package ships. Rename the key to `allowEnvironmentOverlay`; the value is unchanged. |
272+
| **allowOrgOverride** | `never` | optional | [REMOVED] `MetadataTypeRegistryEntry.allowOrgOverride` was renamed to `allowEnvironmentOverlay` in @objectstack/spec 18 (ADR-0131 D6) — the per-organization overlay axis was retired, and the key now names the one scope it governs: whether an environment may overlay an item of this type that a managed package ships. Rename the key to `allowEnvironmentOverlay`; the value is unchanged. |
273273
| **allowRuntimeCreate** | `boolean` | optional (default: `true`) | Allow runtime creation via API |
274274
| **supportsVersioning** | `boolean` | optional (default: `false`) | Whether version history is tracked |
275275
| **executionPinned** | `boolean` | optional (default: `false`) | Transaction rows reference a specific version_hash; history GC is disabled and getByHash() MUST resolve old hashes (ADR-0009) |

‎content/docs/references/system/email-template.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const result = EmailTemplateDefinitionSchema.parse(data);
4747
| :--- | :--- | :--- | :--- |
4848
| **name** | `string` | ✅ | Template identifier (dotted snake_case) |
4949
| **label** | `string` | ✅ | Display label |
50-
| **category** | `never` | optional | [REMOVED] `email_template.category` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing read it: the Studio listing never offered the filter facet it promised, and delivery never depended on it. Delete the key. A template is found by its `name`, so group templates with a dotted namespace prefix instead (`auth.password_reset`, `crm.welcome`). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |
50+
| **category** | `never` | optional | [REMOVED] `email_template.category` was removed in @objectstack/spec 18 (ADR-0049 enforce-or-remove) — nothing read it: the Studio listing never offered the filter facet it promised, and delivery never depended on it. Delete the key. A template is found by its `name`, so group templates with a dotted namespace prefix instead (`auth.password_reset`, `crm.welcome`). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |
5151
| **locale** | `string` | optional (default: `"en-US"`) | BCP-47 locale (e.g. en-US, zh-CN) — the bundle key the resolver matches EXACTLY. A call that NAMES a locale gets exactly one retry rung, the literal `en-US`, with no language-subtag folding: `en` and `en-US` are different ROWS of one bundle and neither reaches the other, so a bundle with no `en-US` row has no fallback floor for those calls and every recipient locale it does not carry a row for raises TEMPLATE_NOT_FOUND, which is permanent — the delivery dead-letters with no retry. A call naming NO locale is the other case and does not dead-letter: it drops to the bundle's lowest locale tag and renders that silently. Your stack's own `i18n.defaultLocale` is the wrong tag here unless it is spelled `en-US`. |
5252
| **subject** | `string` | ✅ | Subject template |
5353
| **bodyHtml** | `string` | ✅ | HTML body template |
@@ -56,7 +56,7 @@ const result = EmailTemplateDefinitionSchema.parse(data);
5656
| **fromOverride** | `{ name?: string; address: string }` | optional | |
5757
| **replyTo** | `string` | optional | |
5858
| **active** | `boolean` | optional (default: `true`) | |
59-
| **isSystem** | `never` | optional | [REMOVED] `email_template.isSystem` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing enforced it: no door refused deleting a template that set it. Delete the key. A built-in template is a code package's declaration: a Studio save overrides it for the environment, and discarding that save restores the package's copy. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |
59+
| **isSystem** | `never` | optional | [REMOVED] `email_template.isSystem` was removed in @objectstack/spec 18 (ADR-0049 enforce-or-remove) — nothing enforced it: no door refused deleting a template that set it. Delete the key. A built-in template is a code package's declaration: a Studio save overrides it for the environment, and discarding that save restores the package's copy. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |
6060
| **description** | `string` | optional | |
6161
| **protection** | `{ lock: Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>; reason: string; docsUrl?: string }` | optional | Package author protection block — lock policy for this email template. |
6262
| **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). |

0 commit comments

Comments
 (0)