Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Upgrading to 1.8.0

This page is for operators upgrading an existing Orion deployment from 1.7.x to 1.8.0. It covers only what changes behaviour. The new capabilities — the tensor operators and the evaluation budget — are described in full in the CHANGELOG.

1.8.0 is a minor release and behaves like one. No config key was renamed or removed, no API path moved, no metric was renamed, and there are no migrations. Two things can reach you. One of them can change what an existing deployment already does — §1 — and the other is off until you turn it on.

The version-independent procedure — back up, preflight, validate config, migrate, roll — is on Upgrades.


Before you start

#CheckApplies to you if
1Run preflight and escape the keys it listsA stored workflow emits a literal object keyed shape, full, cast, pad, crop, concat or stack from a map mapping or a template field
2Nothing — the budget is offEvery deployment; read it before turning it on

1. Twenty operator names are now live

1.8 enables dataflow-rs’s tensor feature, so every engine Orion builds evaluates twenty more operators: tensor, zeros, full, scatter, rle_expand, one_hot, stack, concat, unstack, reshape, transpose, pad, crop, cast, normalize, argmax, gather, to_list, shape, dtype.

The rule that makes this a review item is the one templating has always had: in a template position — a map mapping’s logic, or a custom function’s field the registry marks as an expression — a single-key object whose key is a live operator is a call, not data. Before 1.8, shape was not an operator, so this mapping emitted an object:

{ "path": "data.board", "logic": { "shape": [6, 7] } }

From 1.8 it calls shape([6, 7]), which is not a valid call, so the task fails with an evaluation error. The fix is the $ key escape every engine already carries — one $ is stripped from every template key — so the literal is spelled:

{ "path": "data.board", "logic": { "$shape": [6, 7] } }

Multi-key objects ({"shape": "queue", "type": "channel"}) are unaffected. Conditions are unaffected: they compile strictly and always did, so a tensor-named key there raised Invalid operator before 1.8 and could not have been serving.

Finding them. Run the scan against the database before rolling the new binary; it is read-only and reports the stored estate:

orion-server preflight -c config.toml

Every affected key is listed under the advisory id logic.tensor_operator_key with its workflow, its path and the rewrite. Advisories never change the exit code, so add this to a deploy gate deliberately if you want it to. preflight lists both the constant objects ({"shape": [6, 7]}) and the dynamic ones ({"shape": {"var": "data.dims"}}): on a stored estate written before 1.8, neither can have meant a call.

For definition sets in a repository, orion-server lint <dir> reports the same id — but only for the constant objects that do not evaluate as a call. On a set being written today, {"shape": {"var": …}} is a call an author meant, and {"zeros": [[2], "i64"]} is a working one; lint stays quiet on both so that --deny-warnings does not refuse the feature it now supports.

Then prefix each listed key and PUT the workflow (or re-run the pipeline that promotes it). The escaped spelling is not reported, so a second preflight is the proof the estate is clean.

2. engine.ops_budget is new, and off

The budget feature is enabled too, which adds one setting:

[engine]
# ops_budget = 0

0, the default, installs no ceiling and changes nothing. Set it when expressions come from someone other than the operator — a tenant’s rules, a competitor’s model adapters — and read the caveat on the configuration page first: a custom function’s template field that crosses the ceiling fails its task with BUDGET_EXCEEDED, a built-in map mapping fails its task with status 500, but a condition that crosses it fails closed to false and is only logged, so a ceiling low enough to trip an ordinary condition reads as “no workflow matched”. Size it from the heaviest legitimate expression in the estate.

The counter behind the setting runs whether or not a ceiling is set. The cost is one add-and-compare per dispatched node.


  • Expressions › Tensors — the operator table with an example per operator.
  • CLI › lint and CLI › preflight — the advisory ids and what each command reports.
  • Configuration › Engineengine.ops_budget.
  • Models — the release’s headline capability, and the reason the tensor operators exist. It changes nothing about an existing deployment: models.enabled is off by default, and a node with it off behaves exactly as 1.7.x did.