@praxisui/page-builder 9.0.45 → 9.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -287,6 +287,15 @@ Repeated parent/resource context can be declared through `UiCompositionPlan.cont
287
287
 
288
288
  Compiled links may retain `metadata.source: 'ui-composition-plan'` as explicit authoring provenance. This value is part of core's public `LinkMetadata` contract and remains distinct from `native-composition-link`, `persisted-composition-link`, and legacy migration provenance.
289
289
 
290
+ `bindings[].from` accepts `global-action` as the canonical continuation source for results emitted through `dynamicPage.composition.dispatch`. The authored source declares only a stable `actionId`; the runtime dispatch payload is the value delivered to state or component targets. `payload`, `payloadExpr`, `meta`, labels and result-type hints do not participate in endpoint matching and fail closed when placed on a global-action source. Those fields remain valid only for global-action targets, where they configure command dispatch. The compiler persists the source as `{ kind: 'global-action', ref: { actionId } }`, matching Core's existing runtime contract without a host adapter.
291
+
292
+ When a `template` transform changes the semantic kind of its source, declare
293
+ `transform.output.semanticKind` (and, when applicable, `schemaId`, `schemaRef`
294
+ and `stableShape`). The compiler projects the same output hint onto the canonical
295
+ pipeline and its materializing step, allowing registry-aware preflight to compare
296
+ the transformed contract with the target port. Do not relax target compatibility
297
+ or relabel the source port to hide a transformation.
298
+
290
299
  The official Employee Operations case is an executable regression for this boundary. Its first-class `*.ui-composition-plan.json` artifact expresses 22 persisted links as one `selectionSyncs` declaration, two `contextScopes` declarations and one explicit transformed binding, while compilation preserves the same 22 source/target paths, guards, transforms and policies. This reduces the wiring declarations from 22 to 4 (82%) without hiding the executable graph from runtime inspection, audit or the public JSON viewer. Context scopes are deliberately limited to direct inheritance: a value that must be wrapped or reshaped remains an explicit binding with a canonical transform.
291
300
 
292
301
  Page-owned copy can remain compact in the authoring plan. When a `PraxisTextValue` descriptor declares only `{ key }` and the key exists in `i18n.dictionaries[fallbackLocale]`, both canonical compilers materialize that message as the descriptor's runtime `text` fallback. The persisted `WidgetPageDefinition` therefore stays portable while authors do not repeat the same fallback beside every key. Explicit `text` still wins and unknown keys remain untouched, so the compiler never invents copy.
@@ -307,6 +316,28 @@ Every official local apply of a `UiCompositionPlan` now runs a fail-closed prefl
307
316
 
308
317
  `preflightUiCompositionPlan(plan, targetRegistry)` is exported by `@praxisui/page-builder` for official Dynamic Page hosts that compile plans outside `DynamicPageBuilderComponent`. Those hosts must inject their runtime `ComponentMetadataRegistry`; omitting it fails closed with `UI_COMPOSITION_TARGET_REGISTRY_REQUIRED`.
309
318
 
319
+ Workspace contributors can exercise this path in the reference host at
320
+ `/dynamic-page-lab`. Its **Certificação do UiCompositionPlan** station displays
321
+ the compact plan, registry-aware preflight, compiled `WidgetPageDefinition`, real
322
+ Dynamic Page, diagnostics, widget-event trail and sanitized runtime observation
323
+ without introducing another compiler or registry. Its scenario catalog reuses the
324
+ same A2-A4 plan fixtures exercised by focused certification specs—forms/filters,
325
+ CRUD lifecycle and parent/related-resource—alongside the certified A5
326
+ Table/shell/global-action contracts. An unknown component proves fail-closed
327
+ behavior. The browser proof for the related-resource scenario requires a real
328
+ parent selection, the relationship filter and visible child columns/data derived
329
+ from the remote schema; request success alone is insufficient. The same route's
330
+ People Operations dashboard is authored as a 9-widget/10-binding plan and proves
331
+ filter and governed decision propagation through the compiled graph. The broader
332
+ certification matrix remains tracked in issue #430; issue #431 closed the former
333
+ global-action source limitation.
334
+
335
+ For multi-consumer interaction state, author one `event -> state` binding and
336
+ project `state -> component-port` to each consumer. A direct event delivery is
337
+ transient; it must not become the page's durable semantic source across runtime
338
+ recomposition. The People Operations certification scenario applies this rule to
339
+ `state.activeFilter` and verifies the complete fan-out in the browser.
340
+
310
341
  When a preview contains both `uiCompositionPlan` and `compiledFormPatch`, the semantic plan is the attested source for local preview. Persistence rebuilds `patch.page` from that locally materialized page so a backend patch cannot bypass the registry-aware gate. Provider readiness in this cut means that the target registry contains owner metadata with a materializable Angular component type; uniform certification of the owner providers and bootstrap recipes remains tracked by issue #392 and is not inferred through Page Builder heuristics.
311
342
 
312
343
  Streaming apply is fail-closed. A preview is persistable only when it is the unchanged payload of an applicable terminal `result` event and its diagnostics carry the matching `streamId`, `threadId`, `turnId`, and `resultEventId`. A locally regenerated or normalized preview remains available for review, but it cannot reuse an older terminal reference or call `page-apply`; the backend must issue a new terminal result for the new patch.