This document defines the YAML format accepted and generated by
ActionFlowCompiler. It describes specification version 1, the graph shape,
variables, parameters, conditions, and every currently supported typed action
configuration.
The YAML format is a semantic representation of an IAction graph. Runtime
identifiers such as action IDs, parameter IDs, graph positions, and incoming
variable metadata are generated by the compiler and are deliberately excluded
from YAML.
camelCase.null values, default values, and empty collections are omitted from
canonical YAML.type.branches and option dictionaries,
which are emitted in ordinal key order.For example, false, 0, an empty list, and an enum's first value may be
absent from generated YAML even though they remain valid when written
explicitly.
version: 1
scope: solution
root:
type: user
name: Example
description: Optional description
outputs: []
user: {}
branches: {}
next: null
| Property | Required | Meaning |
|---|---|---|
version |
Yes | Specification format version. The current and only supported value is 1. |
scope |
Yes | Ownership scope: solution, shared, platform, or system. unknown is invalid. |
root |
Yes | First action node in the graph. |
scope describes ownership and portability. It does not itself alter runtime
execution.
Every node has this common shape:
type: alert
name: ShowResult
description: Show the result to the user.
outputs:
- source: success
alias: WasSuccessful
type: boolean
scope: cascaded
alert:
message:
value: Done
next:
type: refresh
name: RefreshPage
refresh: {}
branches:
cancel:
type: alert
name: Cancelled
alert: {}
| Property | Required | Meaning |
|---|---|---|
type |
Yes | Selects the converter and matching configuration block. |
name |
Yes | Human-readable action name. The compiler removes spaces. Distinct names are strongly recommended, although the current normalizer does not reject duplicates. |
description |
No | Optional explanation shown in tooling. |
outputs |
No | Variables published by this node for downstream nodes. |
| Typed configuration | Yes | Exactly one block whose name matches type, such as user, input, or webService. |
next |
No | Normal/main continuation. |
branches |
No | Named alternate continuations supported by this action type. |
Supported typed node types are:
user, input, setVariable, if, alert, methodCaller,
updateEntity, createEntityForm, refresh, and webService.
runtime is also supported as a compatibility representation for the remaining
allow-listed ActionHandler action types.
next becomes IAction.Action, the normal exit. Named branches become an
action-specific secondary exit:
| Node type | Supported branch | Meaning |
|---|---|---|
input |
cancel |
User discarded/cancelled the input dialog. |
if |
false |
Condition result was false. next is the true exit. |
createEntityForm |
cancel |
User cancelled the form. next is submit/confirm. |
runtime |
second |
Generic secondary exit, only when the underlying action implements IDoubleExitAction. |
Unsupported branch names cause compilation to fail. A missing continuation ends that path.
outputs:
- source: result
alias: CreatedCustomer
type: businessEntity
scope: cascaded
| Property | Required | Meaning |
|---|---|---|
source |
Yes | Semantic local output exposed by the action converter. |
alias |
Defaults to source |
Stable YAML name used by later nodes. Must be unique in its scope. |
type |
Usually inferred | Silver value type. If supplied, it must exactly match the source type. |
scope |
Defaults to cascaded |
cascaded remains available to all downstream descendants; parameter is available only to the immediate next node. |
Supported output types are text, textArray, number, numberArray, data,
file, oledbImage, fileCollection, dataRow, dataTable, json,
jsonArray, xml, xmlArray, boolean, dateTime, html, csv, excel,
word, businessEntity, businessEntityList, and
businessEntityProperty.
All actions may expose common semantic sources such as name, description,
success, and error when those locals exist. Important action-specific
sources include:
| Node | Source |
|---|---|
user |
businessEntity |
input |
Field name, for example Email |
setVariable |
Item/input name |
if |
result |
methodCaller |
Declared return name; return is supported for the aggregate return local |
updateEntity |
result |
createEntityForm |
result |
webService |
response, responseCode, exceptionMessage, dataType |
The source must map to a real local variable on that action. Changing type
does not convert the value. For example, a businessEntity source cannot be
declared as oledbImage to extract an image.
Parameters can consume an output without embedding generated IDs:
value:
alias: CreatedCustomer
During compilation the alias is resolved to the appropriate runtime variable ID or token. An alias must have been published by an earlier reachable action.
The following reusable structure represents a SilverParameter:
name: Authorization
value: Bearer $$Secret:ApiToken$$
alias: ExistingOutput
parameterType: dynamicVariable
intValue: 10
doubleValue: 10.5
dateTimeValue: 2026-08-06T12:00:00Z
| Property | Required | Meaning |
|---|---|---|
name |
Contextual | Destination or field name. Required for named collections such as headers and entity properties. |
value |
No | Literal text or Silver expression. |
alias |
No | Semantic reference to a previously published YAML output. When present, it takes precedence over value and compiles to a dynamic variable reference. |
parameterType |
No | How Silver resolves the value. Default: dynamicVariable. |
intValue |
No | Typed integer value used by numeric controls/parameters. |
doubleValue |
No | Typed floating-point value. |
dateTimeValue |
No | Typed ISO date/time value. |
Supported parameterType values are incomingVariables,
businessEntityList, sbelList, businessEntity, security, constant,
basementCall, dynamicVariable, path, and entryParameter.
Do not specify both alias and a meaningful value. Use alias for generated
runtime references and value for literal values or expressions.
Dynamic values may contain placeholders:
$$Local:Result$$
$$Parameter:InvoiceId$$
$$Cascaded:CustomerId$$
$$Index:Index$$
$$Security:<name>$$
$$Roles:<name>$$
$$Env:<name>$$
$$AppEnv:<name>$$
$$Secret:<name>$$
$$System:NewGuid$$
Local, Parameter, Cascaded, and Index refer to action variables.
Security and Roles use the current user/security context. Env, AppEnv,
and Secret resolve configured values. System invokes a built-in expression.
Secrets should always be references; never store secret values in YAML.
button:
text: Save
icon: fas fa-save
iconFirst: true
iconOnly: false
cssClass: btn btn-primary
| Property | Meaning |
|---|---|
text |
Visible button text. |
icon |
Icon/CSS identifier. |
iconFirst |
Places the icon before the text. |
iconOnly |
Hides text and renders only the icon. |
cssClass |
Host CSS classes. |
The same structure is used by user, input, alert, confirm, and cancel buttons.
A condition compares left and right. An all collection is logical AND;
an any collection of groups is logical OR.
any:
- all:
- name: IsAdministrator
left:
value: $$Roles:UserRole$$
operator: contains
right:
value: Admin
parameterType: constant
dataType: text
| Property | Required | Meaning |
|---|---|---|
name |
No | Stable condition name. If omitted, the compiler derives one. |
left |
Yes | Left Silver parameter. |
operator |
Yes | Comparison operator. |
right |
Yes | Right Silver parameter. |
dataType |
Yes | Conversion/comparison type. |
basementDomain |
No | Optional basement-domain context. |
basementDomainIdentifier |
No | Optional identifier within that domain. |
Operators: equal, notEqual, greaterThan, greaterThanOrEqual, lessThan,
lessThanOrEqual, contains, notContains, and startsWith.
Data types: text, integer, boolean, float, dateTime, date, time,
guid, and oledbImage.
Both sides must be present. A parameter object with no value is still an
empty value; it is not a wildcard.
userUser-triggered entry point exposed on a controller.
type: user
name: CreateCustomer
user:
target: Customer
published: true
group: Administration
displayLabel:
value: Create customer
button:
text: Create
visibility: always
enabled: always
visibleWhen:
all: []
enabledWhen:
all: []
allowBulk: false
singleRun: true
allowCancel: false
cancelOnError: false
runType: single
| Property | Required/default | Meaning |
|---|---|---|
target |
Required | Controller on which the action is exposed. |
published |
Default true |
Makes the action available to the host. |
group |
Optional | UI/catalog group. |
displayLabel |
Optional parameter | Evaluated action label. |
button |
Optional | Button appearance. |
visibility |
Must be always |
Availability mode. Conditional behavior belongs in visibleWhen. |
enabled |
Must be always |
Enabled mode. Conditional behavior belongs in enabledWhen. |
visibleWhen |
Optional AND group | Conditions controlling whether the action is shown. An explicitly present group must contain a condition. |
enabledWhen |
Optional AND group | Conditions controlling whether the action is enabled. An explicitly present group must contain a condition. |
allowBulk |
Default false |
Advertises bulk UI capability. |
singleRun |
Default true |
Single-run/disconnect behavior used by the host. |
allowCancel |
Default false |
Allows user cancellation. |
cancelOnError |
Default false |
Requests graph cancellation on action error. |
runType |
Default single |
single, singleTask, or multiTask. Host behavior is authoritative. |
Method-based visibility/enabling from legacy UserAction cannot be represented
by the typed converter.
inputDisplays an input dialog. next is confirm; branches.cancel is discard.
input:
label: { value: Details }
cssClass: row
title: { value: Create customer }
message: { value: Enter the details. }
confirmButton: { text: Save }
cancelButton: { text: Cancel }
confirmLabel: On Confirm
cancelLabel: On Discard
cancelOnError: false
fields: []
| Property | Meaning |
|---|---|
label |
Evaluated form heading parameter. |
cssClass |
Dialog/container CSS classes. |
title |
Evaluated dialog title. |
message |
Evaluated dialog message. |
confirmButton |
Confirm button style. |
cancelButton |
Cancel button style. |
confirmLabel |
Main-exit label; default On Confirm. |
cancelLabel |
Cancel-exit label; default On Discard. |
cancelOnError |
Requests cancellation on error. |
fields |
Ordered list of controls. |
Each field supports:
| Property | Meaning |
|---|---|
name |
Required unique field/output name. |
cssClass |
Layout CSS; default col. |
required |
Requires a value. |
placeholder |
Evaluated placeholder parameter. |
placeholderDisplay |
Optional host display hint. |
label |
Evaluated label parameter. |
labelDisplay |
Optional host display hint. |
type |
Required input control type. |
range |
Produces/accepts a range where supported. |
readOnly |
Prevents editing. |
default |
Predefined/evaluated value. |
numeric |
Settings for integer and decimal. |
text |
Settings for text-family controls. |
date |
Settings for dateTime. |
source |
Settings for tags/dropdown/combobox. |
file |
Settings for file upload. |
Input types are label, text, email, maskedText, password, integer,
decimal, dateTime, checkbox, switch, file, radioButton, tags,
dropdown, combobox, richText, colorPicker, colorPickerTextBox,
iconPicker, and iconPickerTextBox.
Numeric settings:
| Property | Meaning |
|---|---|
dynamicMinimum / dynamicMaximum |
Evaluate min/max dynamically. |
minimum / maximum |
Limit parameters. |
format |
Numeric display format. |
showSpinner |
Shows increment controls. |
decimalPlaces |
Decimal precision. |
increment |
Spinner step; default 1. |
currency |
Currency display hint. |
Text settings:
| Property | Meaning |
|---|---|
mask |
Input mask. |
maximumLength |
Maximum character count; 0 means no configured maximum. |
toolbar |
Rich-text toolbar item names. |
validations |
Expression validations, each with expression and message. |
Date settings contain dynamicMinimum, minimum, dynamicMaximum, maximum,
allowEdit, and showWeekNumber.
Source settings:
| Property | Meaning |
|---|---|
options |
Sorted key/value custom options. |
targetAlias |
Existing variable used as the source. |
dataTableIdColumn / dataTableTextColumn |
Value/text columns for a DataTable source. |
lookup |
Lookup name. |
sourceType |
custom or incomingVariable. |
multiSelect |
Produces multiple values. |
virtualization |
Enables host virtualization. |
filtering |
Enables filtering. |
customValue |
Allows values outside the source. |
incomingType |
Expected Silver variable type. |
File settings contain extensions, size, and multiple.
setVariableCreates or updates typed variables.
setVariable:
cancelOnError: false
items:
- type: text
name: FullName
input:
value: $$Cascaded:FirstName$$ $$Cascaded:LastName$$
update: false
targetAlias: null
booleanValue: null
dateTimeInputType: incomingVariable
operations:
- operation: Trim
arguments: []
| Property | Meaning |
|---|---|
cancelOnError |
Requests graph cancellation when this action fails. |
items |
Ordered unique-name assignments. |
Item properties:
| Property | Meaning |
|---|---|
type |
Required: text, number, dateTime, or boolean. |
name |
Required unique output/input name. |
input |
Source parameter. |
update |
If true, updates an existing variable instead of creating one. |
targetAlias |
Required when update is true and forbidden otherwise. |
booleanValue |
Constant used by boolean items; default false. |
dateTimeInputType |
incomingVariable, dateTimePicker, or now. |
operations |
Ordered transformations. Each has operation and parameter arguments. |
Text operations: Replace, ToLower, ToUpper, Trim, TrimStart,
TrimEnd. Number operations: RoundUp, RoundDown, Decimal. Date/time
operations: AddSecond, AddMinute, AddHour, AddDay, AddMonth,
AddYear, Date, Hour, Day, Week, Month, Year. Operation names are
parsed case-insensitively.
ifEvaluates OR groups of AND conditions. next is true and branches.false is
false.
if:
trueLabel: "True"
falseLabel: "False"
any:
- all:
- left: { alias: Total }
operator: greaterThan
right: { intValue: 0, parameterType: constant }
dataType: integer
| Property | Meaning |
|---|---|
trueLabel |
Main-exit display label; default True. |
falseLabel |
False-exit display label; default False. |
any |
Required non-empty OR list. Every group requires a non-empty all condition list. |
The legacy third IfAction branch is not supported.
alertDisplays a message and then follows next.
alert:
title: { value: Completed }
message: { value: The operation completed. }
confirmButton: { text: OK }
title and message are evaluated parameters. confirmButton uses the common
button structure.
methodCallerCalls a published MethodAction.
methodCaller:
methodId: method-id
methodName: CalculateTotal
isActive: true
preSetupBreakpoint: false
postSetupBreakpoint: false
cancelOnError: false
requiredParameters: []
returnParameters: []
| Property | Required/default | Meaning |
|---|---|---|
methodId |
Required | Runtime method action identifier. |
methodName |
Optional | Display/reference name. |
isActive |
Default false |
Preserved legacy setting; the current handler does not enforce it. |
preSetupBreakpoint |
Default false |
Debugger break before setup. |
postSetupBreakpoint |
Default false |
Debugger break after setup. |
cancelOnError |
Default false |
Requests cancellation on error. |
requiredParameters |
Optional | Method arguments. |
returnParameters |
Optional | Expected returned variables. |
Required parameter properties are name, type (default text),
isRequired, businessEntityName, and parameter. Return parameter properties
are name, type (default text), isRequired, localName, and
businessEntityName.
updateEntityUpdates one business entity and follows next.
updateEntity:
target: Customer
identifier: { alias: CustomerId }
parameters:
- name: Status
value: Active
parameterType: constant
suppressNotification: false
suppressError: false
postSetupBreakpoint: false
cancelOnError: false
| Property | Meaning |
|---|---|
target |
Required controller/entity target name. |
identifier |
Required parameter selecting the entity. |
parameters |
Named property values to update. |
suppressNotification |
Suppresses normal success notification. |
suppressError |
Suppresses normal error presentation. |
postSetupBreakpoint |
Debugger break after setup. |
cancelOnError |
Requests graph cancellation on error. |
The entity result can be exported with source result.
createEntityFormOpens a create form. next is submit and branches.cancel is cancel.
createEntityForm:
target: Customer
parameters: []
upsertOnConfirm: true
submitLabel: On Submit
cancelLabel: On Cancel
suppressNotification: false
suppressError: false
cancelOnError: false
| Property | Meaning |
|---|---|
target |
Required controller/entity target. |
parameters |
Named initial form values. |
upsertOnConfirm |
Upserts when confirmed; default true. |
submitLabel |
Main-exit label; default On Submit. |
cancelLabel |
Cancel-exit label; default On Cancel. |
suppressNotification |
Suppresses normal notification. |
suppressError |
Suppresses normal error presentation. |
cancelOnError |
Requests graph cancellation on error. |
The submitted entity can be exported with source result.
refreshRequests a host UI refresh and follows next. It has no action-specific
properties:
type: refresh
name: RefreshPage
refresh: {}
webServiceEvaluates and submits an HTTP request.
webService:
method: post
navigation:
value: /api/customers
parameterType: constant
headers:
- name: Authorization
value: Bearer $$Secret:ApiToken$$
requestContentType: applicationJson
responseContentType: applicationJson
body:
- name: payload
value: '{"name":"$$Cascaded:CustomerName$$"}'
timeoutDelay: 30
numberOfRetryOnFail: 2
postSetupBreakpoint: false
cancelOnError: true
| Property | Required/default | Meaning |
|---|---|---|
method |
Default get |
get, post, put, patch, or delete. |
navigation |
Required | Evaluated endpoint parameter. Relative URLs target the local host. |
headers |
Optional | Named evaluated HTTP header parameters. |
requestContentType |
Default applicationJson |
Request MIME mode. |
responseContentType |
Default applicationJson |
Expected response conversion mode. |
body |
Optional by schema | Request body parameters. See body rules below. |
timeoutDelay |
Default 0 |
Advertised timeout setting; currently unused by ActionHandler. |
numberOfRetryOnFail |
Default 1 |
Advertised retry count; currently unused by ActionHandler. |
postSetupBreakpoint |
Default false |
Debugger break after setup. |
cancelOnError |
Default false |
Requests graph cancellation after an exception. |
Request content types: applicationJson, applicationXml, textXml,
applicationXWwwFormUrlEncoded, multipartFormData,
applicationOctetStream, applicationGraphql, and applicationNdJson.
Response content types: textPlain, textHtml, textCss, textJavascript,
applicationJson, applicationXml, textXml, applicationYaml,
applicationGraphql, applicationOctetStream, imagePng, imageJpeg,
imageGif, applicationPdf, applicationZip, videoMp4, audioMpeg,
applicationJavascript, applicationVndApiJson, and applicationNdJson.
Runtime body behavior:
get sends no body.post, put, and patch send a body.delete sends no body, although the current preprocessing path can still
access the first body parameter.multipartFormData processes every body parameter. Incoming file/data
variables become binary form parts; other parameters become text parts.Current response conversion is implemented for JSON/plain/XML text and for
octet-stream/PNG/JPEG/GIF/PDF/ZIP bytes. Other advertised response types may
produce no response value. HTTP 4xx/5xx status codes are not automatically
turned into exceptions by the current handler.
Web-service outputs can use response, responseCode, exceptionMessage, and
dataType.
Actions without a curated typed converter use:
type: runtime
name: Delay
runtime:
actionType: DelayAction
configurationJson: '{"Seconds":2}'
| Property | Required | Meaning |
|---|---|---|
actionType |
Yes | Exact allow-listed CLR action type name. |
configurationJson |
Yes | Compact JSON containing action-specific configuration. Graph links and runtime IDs/state are excluded. |
Currently allow-listed runtime types are:
EventAction, MethodAction, BackgroundAction, GetEntityAction,
GetEntityListAction, GetLookupAction, UpdateEntityListAction,
DeleteEntityListAction, LoadFileAction, DataParserAction,
ConvertorAction, ExportAction, ToastAction, NavigationAction,
DelayAction, ReloadAction, CreateEntityAction,
UpdateEntityFormAction, DeleteEntityAction, WhileLoopAction, LoopAction,
BreakLoop, ContinueLoop, DownloadAction, SendMailAction,
LoadingAction, SaveFileAction, ReturnAction, and ConfirmAction.
The JSON schema is the corresponding action model's serializable properties. Runtime nodes are safe only for known allow-listed types; arbitrary CLR type activation and JSON type-name handling are disabled.
Compilation performs these stages:
next and named branches.IAction graph and canonical YAML/hash metadata.A graph may contain at most 512 nodes and have a maximum nesting depth of 64. Cycles and reuse of the same YAML node object are rejected.
Decompilation performs the reverse operation. It rejects runtime graphs that cannot be represented semantically, for example an incoming variable ID with no available alias or a legacy action feature unsupported by its typed converter.
Compiler failures are written as one JSON file per failure under
ActionFlowLogs, named:
ActionCompilerErrorLog-yyyyMMdd-HHmmss-fffffff.json
The log contains the serialized action where available, error details, compiler operation, timestamp, and diagnostic context.
version: 1
scope: solution
root:
type: user
name: AskForEmail
outputs:
- source: businessEntity
alias: BusinessEntity:Customer
type: businessEntity
scope: cascaded
user:
target: Customer
published: true
displayLabel:
value: Update email
button:
text: Update email
visibility: always
enabled: always
singleRun: true
next:
type: input
name: ReadEmail
outputs:
- source: Email
alias: Email
type: text
scope: cascaded
input:
title:
value: Email address
fields:
- name: Email
required: true
type: email
branches:
cancel:
type: alert
name: Cancelled
alert:
message:
value: No changes were made.
next:
type: updateEntity
name: SaveEmail
updateEntity:
target: Customer
identifier:
value: $$Cascaded:BusinessEntity:Customer.PrimaryKey$$
parameters:
- name: Email
alias: Email
next:
type: refresh
name: RefreshCustomer
refresh: {}
Before saving or publishing YAML:
version: 1 and a non-unknown scope.type with exactly one configuration block.parameterType: constant for literal values when evaluation is not
wanted.$$Secret:<name>$$ references.