@@ -268,7 +268,9 @@ are refused at author time, so `os validate` finds them before a deploy: a
268268schema refusal throws ` STACK_SCHEMA_INVALID ` (422) from ` defineStack ` , a
269269cross-reference one ` STACK_CROSS_REFERENCE_INVALID ` (422), and an author-time
270270rule fails ` os validate ` with exit ` 1 ` . The metadata save door (Studio,
271- ` /api/v1/meta ` , MCP) refuses the same shapes on a save.
271+ ` /api/v1/meta ` , MCP) refuses the same shapes on a save: in the walk,
272+ ` PUT /api/v1/meta/page/NAME ` answered ` 422 INVALID_METADATA ` for an undeclared
273+ ` page:header ` prop and for ` kind: 'jsx' ` .
272274
273275##### Flows: one expression dialect per slot
274276
@@ -294,33 +296,37 @@ rule fails `os validate` with exit `1`. The metadata save door (Studio,
294296 (` '{current_user_id}' ` , ` '{today}' ` ) stays as it is. The refusal names the CEL
295297 spelling of each token (` 0e9e7b7 ` , ` 6a06e3b ` , ` d85615d ` , ` 615c696 ` ,
296298 ` 111ffff ` , ` 9fdb127 ` , ` f66fdc7 ` , ` 12b9daf ` , ` 968acc8 ` ). * Probed on 18.0.0
297- (` os validate ` ).*
299+ (` os validate ` ) at each of those positions but ` sourceId ` , ` templateData ` ,
300+ ` defaults ` and ` recordId ` .*
298301- ** Text slots take ` {{ }} ` holes.** A ` notify ` node's ` title ` , ` message ` and
299302 ` actionUrl ` , a ` screen ` node's ` title ` and ` description ` , a refusing ` end `
300303 node's ` message ` , an ` http ` node's ` url ` and ` headers ` values, and the
301304 translated screen heading ` flows.FLOW.screens.NODE.title ` : ` {x} ` → ` {{ x }} ` .
302305 Compute anything else into a variable first, and a run-user value too —
303306 ` {{ $User.Id }} ` is refused (` 2b61f2d ` , ` 3073b72 ` , ` 968acc8 ` , ` d973c34 ` ).
304- * Probed on 18.0.0 (` os validate ` ).*
307+ * Probed on 18.0.0 (` os validate ` ) on ` notify ` ` title ` , ` message ` and
308+ ` actionUrl ` , ` screen ` ` title ` and ` http ` ` url ` .*
305309- ** CEL reads only the roots the flow binds.** ` user.id ` , ` ctx.user.id ` ,
306310 ` os.user.id ` → ` current_user.id ` . ` record ` is bound only on a flow an
307311 entrance hands a record (a record trigger, a ` type: 'flow' ` action, an inbound
308312 hook, …): elsewhere read the variable by its name or as ` vars.NAME ` . A
309- condition is CEL: ` '{amount} > 100' ` → ` 'amount > 100' ` (` 5fb1746 ` ,
310- ` 0f77ff5 ` , ` 243dd3c ` , ` 7958bdf ` ). * Probed on 18.0.0 (` os validate ` ).*
313+ condition is CEL: ` '{amount} > 100' ` → ` 'amount > 100' ` — the old spelling is
314+ refused as ` invalid CEL predicate ` (` 5fb1746 ` , ` 0f77ff5 ` , ` 243dd3c ` ,
315+ ` 7958bdf ` ). * Probed on 18.0.0 (` os validate ` ).*
311316- ** No ` $ ` names of your own.** An ` outputVariable ` , an ` errorVariable ` other
312317 than the default ` $error ` , an ` iteratorVariable ` / ` indexVariable ` , an
313318 ` idVariable ` , a screen field's ` name ` and a declared variable's ` name ` drop
314319 the ` $ ` , and every read of them follows (` 3e72f93 ` , ` 9f5eca5 ` ). * Probed on
315- 18.0.0 (` defineStack ` ).*
320+ 18.0.0 (` defineStack ` ) for ` outputVariable ` , ` errorVariable ` and
321+ ` iteratorVariable ` .*
316322- ** Node config is held to its executor's contract.** An undeclared key, or a
317323 value of the wrong type, is refused at its location: ` fieldValues ` → ` fields ` ;
318324 ` bulk ` / ` all ` / ` multiple ` → ` multi: true ` ; a screen field's ` visibleIf ` →
319325 ` visibleWhen ` ; a loop's ` itemVariable ` → ` iteratorVariable ` ; delete an ` http `
320326 node's ` outputVariable ` ; a ` subflow ` ` config.timeoutMs ` moves onto the node;
321327 ` limit: '10' ` → ` limit: 10 ` ; a ` {token} ` in a literal key (` limit: '{x}' ` ) →
322328 the literal (` 2f70c22 ` , ` 78f841b ` , ` ac9f8bd ` , ` ca0bdbc ` ). * Probed on 18.0.0
323- (` defineStack ` ).*
329+ (` defineStack ` ), each .*
324330- ** The retired aliases are refused with their rename.** A CRUD node's
325331 ` config.object ` → ` objectName ` and ` config.filters ` → ` filter ` ; a ` notify `
326332 node's ` to ` / ` subject ` / ` body ` / ` url ` → ` recipients ` / ` title ` / ` message `
@@ -331,7 +337,8 @@ rule fails `os validate` with exit `1`. The metadata save door (Studio,
331337 (` duration ` → ` timerDuration ` , ` signal ` → ` signalName ` , ` timeoutMs ` →
332338 ` timerDuration ` as a string) and a ` connector_action ` node's →
333339 ` connectorConfig ` . ` os migrate meta --from 16 --write ` writes the ones it can
334- prove (` 5fd2c76 ` , ` f901746 ` , ` d176b0a ` ). * Probed on 18.0.0 (` defineStack ` ).*
340+ prove (` 5fd2c76 ` , ` f901746 ` , ` d176b0a ` ). * Probed on 18.0.0 (` defineStack ` ),
341+ each but the nested ` source ` pair.*
335342- ** An edge names two nodes of its graph, once.** An edge whose ` source ` or
336343 ` target ` is no node, or that repeats an earlier edge, is refused: delete it or
337344 re-point it (` db4c45b ` ). * Probed on 18.0.0 (` defineStack ` ).*
@@ -411,8 +418,8 @@ rule fails `os validate` with exit `1`. The metadata save door (Studio,
411418 on 18.0.0 (` os validate ` ).*
412419- ** A select option's ` visibleWhen ` reads what the server binds:** ` record ` ,
413420 ` previous ` and the acting user (` current_user ` , and its aliases ` user ` , ` ctx ` ,
414- ` os ` ). ` parent ` , ` ctx.locale ` , ` os.env ` , ` current_user.roles ` (now
415- ` positions ` ) and ` current_user.email ` are refused, and a gate the server
421+ ` os ` ). ` parent ` , ` ctx.locale ` , ` os.env ` and ` current_user.email ` are
422+ refused, and a gate the server
416423 cannot evaluate refuses the write instead of admitting the value (` bb4f5cc ` ,
417424 ` b1f7a7a ` , ` 46692c1 ` , ` 440bed6 ` ). * Probed on 18.0.0 (` os validate ` ).*
418425- ** A relationship does not target a stored-metadata table** (` sys_metadata ` and
@@ -421,7 +428,8 @@ rule fails `os validate` with exit `1`. The metadata save door (Studio,
421428- ** One name, one entry.** Two entries with one name in one of 27 stack
422429 collections, and two ` functions ` with one ` name ` , are refused, naming both
423430 (` 1959aac ` , ` 147a0d1 ` ). ` defineSeed() ` refuses a record key that is no column
424- of the object (` 9ad3d24 ` ). * Probed on 18.0.0.*
431+ of the object (` 9ad3d24 ` ). * Probed on 18.0.0 for ` objects ` , ` functions ` and
432+ ` defineSeed ` .*
425433
426434##### Positions, permission sets and sharing rules
427435
@@ -453,7 +461,10 @@ rule fails `os validate` with exit `1`. The metadata save door (Studio,
453461##### Datasources, email templates, webhooks and inbound hooks
454462
455463- ** ` driver: 'mongo' ` → ` 'mongodb' ` ,** and ` OS_DATABASE_DRIVER=mongo ` no longer
456- selects a driver (` bc0538a ` ). * Probed on 18.0.0 (` defineStack ` ).*
464+ selects a driver: ` os serve ` exits ` 1 ` with
465+ ` ✗ Unsupported driver "mongo" (OS_DATABASE_DRIVER / --database-driver). `
466+ (` bc0538a ` ). * Probed on 18.0.0 (` defineStack ` , and ` os serve ` in the walk's
467+ app).*
457468- ** Email templates.** Delete ` category ` and ` isSystem ` (` ec7f7f8 ` ). Templates
458469 resolve from the registry: declare them in code — an organization can no
459470 longer create or edit a ` sys_email_template ` row, and the built-in seed is
@@ -602,7 +613,8 @@ code is in the 18.0.0 packages while their entries will first appear in
602613 (` deploymentWide ` , ` @objectstack/plugin-sharing ` ).*
603614
604615The other six are fixes with no edit for an upgrader, among them
605- ` invite-member ` 's refusal of an unknown role with ` code: 'ROLE_NOT_FOUND' `
616+ ` invite-member ` 's refusal of a membership grade outside its vocabulary with
617+ ` code: 'ROLE_NOT_FOUND' `
606618(#24846 , in the 18.0.0 ` @objectstack/plugin-auth ` ).
607619
608620** Not in 18.0.0.** Twelve changesets belong to commits after the version
0 commit comments