# Praxis Table Resource Events

`PraxisTable` emits `resourceEvent` in parallel with its existing public outputs. The envelope is intended for enterprise hosts that need one governed stream for audit, analytics, shell orchestration, and related-resource surfaces.

## Event Mapping

| Table interaction | `kind` | `sourceOutput` | `phase` |
| --- | --- | --- | --- |
| Row click | `row-click` | `rowClick` | `notification` |
| Row double click | `row-double-click` | `rowDoubleClick` | `notification` |
| Selection change | `selection-change` | `selectionChange` | `notification` |
| Row action | `row-action` | `rowAction` | `notification` |
| Toolbar action | `toolbar-action` | `toolbarAction` | `notification` |
| Bulk action | `bulk-action` | `bulkAction` | `notification` |
| Export action | `export-action` | `exportAction` | `success` or `error` |
| Dynamic record surface fallback | `surface-open` | `recordSurfaceOpen` | `request` |
| Catalog-backed record surface | `surface-open` | `recordSurfaceOpen` | `request`, then `success` or `error` |
| Catalog-backed collection surface | `surface-open` | `toolbarAction` | `request`, then `success` or `error` |

`notification` events preserve the old output semantics and should not be interpreted as business completion. Host-mediated operations such as `surface.open` emit `request` before invoking `GlobalActionService` and then emit `success` or `error` after the result is known.

`selectionChange` can also be emitted with `trigger: "data-reconcile"` when a data update removes identities from the effective selection. Rehydrating the same selected identities does not emit a new selection event. With `persistSelection`, identities may remain selected outside the current page; `persistOnDataUpdate` only reconciles selection against the current visible dataset.

Record-oriented events may carry `resourceIdentity`. Resolution prefers a valid
explicit `x-ui.resource.identity`, then a key-only fallback from a valid
`x-ui.resource.idField`, then the effective host `idField` when that field is
present in the filtered response schema. Fallback identities expose `source`
and structured `diagnostics`; they never infer a title from property names. If
the configured field has no displayable row value, the event carries
`resourceIdentity: null` and the runtime emits a deduplicated diagnostic.

## Surface Rules

For catalog-backed surfaces, `resourceEvent.surface` carries the canonical `ResourceSurfaceCatalogItem`, including `relatedResource` when the backend publishes it. For fallback dynamic-page requests, the payload still carries the requested surface context, but `surface` may be `null` because no full catalog item is available.

Consumers must keep legacy outputs wired where they already depend on them. `resourceEvent` is the canonical cross-component event stream, not a breaking replacement for existing outputs.
