|
| 1 | +--- |
| 2 | +'@objectstack/spec': major |
| 3 | +'@objectstack/platform-objects': patch |
| 4 | +--- |
| 5 | + |
| 6 | +feat(spec)!: retire the five keys the advisory lint could never have warned about — mapping `extractQuery`/`errorPolicy`/`batchSize`, contextSelector `includeAll`/`placement` (#4509) |
| 7 | + |
| 8 | +Five authorable keys parsed, stored, and controlled nothing. What groups them is |
| 9 | +not the type they sit on but **why they had to go out in a major rather than |
| 10 | +after a deprecation cycle**: four of the five carry schema DEFAULTS, and a |
| 11 | +default materialises at parse time — so the liveness advisory lint cannot tell a |
| 12 | +value the author wrote from one the schema supplied. Marking them would have |
| 13 | +warned on every mapping and every selector in existence, which is why the ledger |
| 14 | +recorded them as `_authorWarnSkipped` instead. For a key in that state, removal |
| 15 | +is not the escalation after a warning. It is the only channel that ever reaches |
| 16 | +the author. |
| 17 | + |
| 18 | +**The retirement kit:** |
| 19 | + |
| 20 | +| FROM | TO | Fix | |
| 21 | +|---|---|---| |
| 22 | +| `mapping.extractQuery` | *(removed)* | Delete the key. Exports run through the ordinary query API (`POST /api/v1/data/:object/query`) — no exporter has ever read a mapping artifact. | |
| 23 | +| `mapping.errorPolicy` | *(removed)* | Delete the key. Error handling on the import path belongs to the import REQUEST's own options, not the stored mapping. | |
| 24 | +| `mapping.batchSize` | *(removed)* | Delete the key. The write path sizes its own batches. **Do not relocate the value** — see below. | |
| 25 | +| `app.contextSelectors[].includeAll` | *(removed)* | Delete the key. Selectors are mandatory-scope; widen `optionsSource.filter` to widen the choices. | |
| 26 | +| `app.contextSelectors[].placement` | *(removed)* | Delete the key. Selectors always render in the sidebar header; `'topbar'` placed nothing. | |
| 27 | + |
| 28 | +Run `os migrate meta --from 16` to rewrite existing sources automatically. |
| 29 | + |
| 30 | +**`includeAll` is the one worth reading twice.** It was not unread — it was |
| 31 | +deliberately *disobeyed*, and for a security reason. A context selector is a |
| 32 | +mandatory scope, so an "All" row would clear the scope on a surface that exists |
| 33 | +to be scoped; on Studio's package selector that means listing the platform's own |
| 34 | +system/cloud kernel packages to a developer who scoped to their own package. The |
| 35 | +renderer never offered an All row regardless of the flag, so `includeAll: false` |
| 36 | +hardened nothing and `includeAll: true` unlocked nothing. `STUDIO_APP` shipped |
| 37 | +authoring `includeAll: true` against a renderer that ignored it — that authoring |
| 38 | +site goes with the key in this change. |
| 39 | + |
| 40 | +**`batchSize` deliberately offers no rename.** `bulkActionDef.batchSize`, |
| 41 | +`connector.batchSize`, `sync.batchSize`, `offline.batchSize`, the seed loader's |
| 42 | +and the NoSQL driver cursor's are all LIVE and enforced — but each is a |
| 43 | +different key on a different type sizing its own path, and none of them sizes a |
| 44 | +mapping import. The rejection says so explicitly, because "removed" plus a |
| 45 | +familiar name one line away is exactly how a dead setting gets laundered into a |
| 46 | +live-looking one. Same trap `datasource.retryPolicy` had to defuse against |
| 47 | +`hook`/`job` `retryPolicy` (which spell the delay `backoffMs`) one issue |
| 48 | +earlier. |
| 49 | + |
| 50 | +Both schemas are `.strict()`, so the keys are deleted from the shape and |
| 51 | +rejected with a `guidance` prescription rather than tombstoned; their liveness |
| 52 | +rows are deleted rather than kept. The retired ALIAS spellings (`query`, |
| 53 | +`onError`, `errorHandling`, `errorMode`, `batch`, `chunkSize`, `skipErrors`, |
| 54 | +`showall`, `location`) route to the same prescriptions instead of suggesting a |
| 55 | +rename onto a key that is also gone. |
| 56 | + |
| 57 | +Registered as the ADR-0087 D2 conversion `mapping-inert-keys-removed` and an |
| 58 | +extension of `app-dead-authoring-keys-removed`, both wired into the protocol-17 |
| 59 | +D3 chain step. The mapping conversion is scoped to the `mappings` collection |
| 60 | +deliberately — a stack-wide strip would delete an enforced `batchSize` from |
| 61 | +connector, sync, bulk-action and offline shapes. |
| 62 | + |
| 63 | +`datasource` reached zero dead keys in #4583; `mapping` reaches zero here. |
0 commit comments