Skip to content

Commit f1905ac

Browse files
committed
docs(spec): the ADR-0087 ledger states the component-props gate's tier as the head enforces it
The contract-tier review of the retired-key error upgrade found two conversion docblocks this change made false: page-header-breadcrumb-removed and object-master-detail-form-detail-sort-field-removed said the tombstone refuses the key "advisory, via the props lint". Both now say os validate, os build and os lint refuse it as an error, the load path keeping the open properties bag. The sweep of registry.ts and migrations/entries for the same class found three pre-existing false sentences, folded in under the seat's amendment: element-text-variant-heading-levels said an author is refused at parse (a retired enum value is an advisory finding); page-tabs-type-to-tab-style said the tombstone refuses at load (the load path does not parse the props bag); time-default-utc-suffix-dropped said refused at parse for an element:button inline action (an advisory finding there). The breadcrumb retired-key note keeps its residue argument and now says the lint was advisory in every release that shipped the default. Comment-only. Claude-Session: https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ Co-authored-by: Claude <noreply@anthropic.com>
1 parent f88009a commit f1905ac

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

‎packages/spec/src/conversions/registry.ts‎

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5834,7 +5834,9 @@ const inlineActionApiParamsToBodyExtra: MetadataConversion = {
58345834
* component's inner `type` (an action's `type: 'url'`, a tab item's fields)
58355835
* into a rewrite target: only `properties.type` on a node whose own `type` is
58365836
* `page:tabs` moves. The tombstone still carries the refusal at the authoring
5837-
* site (`tsc`) and at load (the parse), whatever the walk reached.
5837+
* site (`tsc`) and at `os validate` / `os build` / `os lint`, where the
5838+
* component-props gate refuses it as an `error` (the load path keeps the open
5839+
* `properties` bag as written), whatever the walk reached.
58385840
*
58395841
* `retiredFromLoadPath: true`: no alias window, deliberately. The tombstone owns
58405842
* the refusal; this entry exists so `spec-changes.json`, the upgrade guide and
@@ -8027,8 +8029,12 @@ const translationPerAppSettingsRemoved: MetadataConversion = {
80278029
* Reach: the literal defaults the narrowed gates judge — a `time` field's
80288030
* (`objects[]`, `objectExtensions[]`) and an action param typed `time`
80298031
* (`actions[]`, `objects[].actions[]`, an `element:button`'s inline action).
8030-
* Retired from the load path: an author is refused at parse, and data at rest
8031-
* and `os migrate meta` replay it.
8032+
* Retired from the load path: an author is refused at parse — except on an
8033+
* `element:button`'s inline action, which sits in the open `properties` bag the
8034+
* load path keeps as written, where the refusal is an advisory
8035+
* `component-props-invalid` finding at `os validate` / `os build` / `os lint`
8036+
* (the component-props gate, `@objectstack/lint`) — and data at rest and
8037+
* `os migrate meta` replay it.
80328038
*/
80338039
const timeDefaultUtcSuffixDropped: MetadataConversion = {
80348040
id: 'time-default-utc-suffix-dropped',
@@ -8324,8 +8330,12 @@ const translationComponentSubmitLabelRemoved: MetadataConversion = {
83248330
* positions the component-props gate judges. `variant` on any other component
83258331
* type is that component's own vocabulary and is never read here.
83268332
*
8327-
* `retiredFromLoadPath`: an author is refused at parse with the prescription
8328-
* rather than silently rewritten; stored rows replay it at rehydration
8333+
* `retiredFromLoadPath`: an author is not silently rewritten — `os validate`,
8334+
* `os build` and `os lint` report an old spelling as an advisory
8335+
* `component-props-invalid` finding carrying the prescription (the
8336+
* component-props gate, `@objectstack/lint`: a retired enum value is a value
8337+
* verdict, a warning; the load path keeps the open `properties` bag as
8338+
* written); stored rows replay it at rehydration
83298339
* (`applyConversionsToStoredItem`) and `os migrate meta` lists the edit for
83308340
* existing sources. Idempotent by construction: the rewrite's output is
83318341
* outside its own input set.
@@ -10609,8 +10619,10 @@ const objectKanbanQuickAddRemoved: MetadataConversion = {
1060910619
* nothing fills the slot. The console draws the navigation trail once, in the
1061010620
* shell (`@object-ui/app-shell` `AppHeader`, inside `/apps/:appName/*`), so the
1061110621
* retirement takes the key away rather than building a second trail. The
10612-
* tombstone on `PageHeaderProps` refuses it for a live author (advisory, via
10613-
* the props lint: `PageComponentSchema.properties` is an open bag).
10622+
* tombstone on `PageHeaderProps` refuses it for a live author: `os validate`,
10623+
* `os build` and `os lint` refuse it as an `error` with the prescription (the
10624+
* component-props gate, `@objectstack/lint`; the load path keeps the open
10625+
* `properties` bag as written).
1061410626
*
1061510627
* **A delete of both values.** `true` and `false` go alike: neither ever drew
1061610628
* a trail, so there is no value to preserve and no rewrite target. The one
@@ -13551,8 +13563,10 @@ const dashboardWidgetChartConfigStructureRemoved: MetadataConversion = {
1355113563
* `sort_field` (`:874`). An authored value changed nothing on that console, so
1355213564
* deleting it preserves observed behaviour exactly; the line order is kept by
1355313565
* the child object's own field, which the entry's tombstone names. The
13554-
* tombstone refuses the key for a live author (advisory, via the props lint:
13555-
* `PageComponentSchema.properties` is an open bag).
13566+
* tombstone refuses the key for a live author: `os validate`, `os build` and
13567+
* `os lint` refuse it as an `error` with the prescription (the component-props
13568+
* gate, `@objectstack/lint`; the load path keeps the open `properties` bag as
13569+
* written).
1355613570
*
1355713571
* ⚠️ Scoped by component `type` and by POSITION — `properties.details[]` of an
1355813572
* `object-master-detail-form` — never by key name: `sortField` is an ordinary

‎packages/spec/src/migrations/entries/retired-keys/18.ui__PageHeaderProps__breadcrumb.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
// ⭐ RETIRED-DEFAULT RESIDUE: not owed, although the key carried
1515
// `.default(true)`. The default was never materialized: a page parses its
1616
// component `properties` as an open bag, and this row is parsed only by the
17-
// advisory props lint, which writes nothing back — so no released toolchain
18-
// emitted `breadcrumb: true` into an artifact nobody authored.
17+
// props lint (advisory in every release that shipped the default), which
18+
// writes nothing back — so no released toolchain emitted `breadcrumb: true`
19+
// into an artifact nobody authored.
1920
//
2021
// Registered under 18, not 17: v17.0.0 was cut before this landed, so the
2122
// removal ships on the 17.x line (launch-window convention: accept-set

0 commit comments

Comments
 (0)