Skip to Content
This documentation is provided with the HEAT environment and is relevant for this HEAT instance only.

Outputs and pipelines

What run(ctx) returns and how dataserviceOutput is configured determine the stored node output and what downstream nodes can consume.


Runtime envelope (always computed)

Every run produces an arbex envelope in memory:

FieldDescription
outputYour return value (or error object)
consoleCaptured log lines
statusSUCCESS or ERROR
metrics.executionTimeMsWall time
configurationSnapshotBase64Node config at run time (for auditing script versions)
profilerOptional CPU/heap samples (see system-arbex-js)

What gets persisted depends on dataserviceOutput.persistence.


dataserviceOutput configuration

PropertyDefaultEffect
enabledfalseValidate returns that contain $heat-dataservice
persistencearbex-envelopeStored file shape (table below)
dashboardUsers[]Applied when the script omits dashboard_users
layoutOutput.enabledfalseValidate suggestedLayoutConfiguration when present
layoutOutput.requirefalseFail if layout required but missing (needs layoutOutput.enabled)

Persistence modes

persistenceStored artifactWhen to use
arbex-envelopeFull envelope JSONDebugging, custom parsers of output / console / profiler
dataservice-root{ $heat-dataservice, dashboard_users, suggestedLayoutConfiguration?, $heat-arbex-run }Parent for heat-system-next-dimension and Next direct ingest
dataservice-in-envelopeEnvelope with output replaced by validated dataservice rootTools that need envelope metadata plus canonical data in output

When enabled is true and persistence is dataservice-root, the script must return an object with $heat-dataservice (use heat.dataservice.buildRoot()).

With dataservice-root, sibling $heat-arbex-run retains envelope fields that would otherwise be dropped.


v2 Next pipeline (typical)

upstream → system-arbex-js → heat-system-next-dimension → v2 API / ui/dashboard

Arbex node:

{ "script": "... async function run(ctx) { ... }", "parent": { "nodeInstanceName": "upstream", "mode": "latest" }, "dataserviceOutput": { "enabled": true, "persistence": "dataservice-root" } }

Dimension node (heat-system-next-dimension):

  • Reads parent $heat-dataservice
  • Merges realms into layout
  • Persists dimension + storage for the dashboard SPA

With layout from arbex:

{ "layoutFromParentOutput": true, "layoutConfiguration": { "version": "1.0.0", "realms": ["default"], "components": { "rows": [] } } }

Arbex returns buildRoot({ suggestedLayoutConfiguration: layoutBuilder }) with layoutOutput.enabled (and require when layout is mandatory).

Shipped example: preset sample-arbex-composable-dashboard (sample-inputsample-arbexsample-dashboard).


Arbitrary JSON (no dataservice)

With dataserviceOutput.enabled: false, return any JSON shape. Downstream nodes must understand that contract. The Next dashboard will not ingest it automatically.


Production layout guidance

PatternRecommendation
Stable production dashboardsKeep layoutConfiguration on heat-system-next-dimension
Script iterationUse suggestedLayoutConfiguration + layoutFromParentOutput
Channel idsKeep ids stable; layout only references ids, not inline data

Legacy v1 dashboards

v1 facade blobs ({ Map: { ... } }, mount ids, combined charts) target heat-system-legacy-dimension and ui/legacy, not $heat-dataservice. Set dataserviceOutput.enabled: false and use types in heat-arbex-v1-dashboard.d.ts. Authoring notes live in the monorepo under tools/arbex/rag/12-v1-dashboard-payload-authoring.md.