EvaluationStage
| Value | Clock starts | Use for |
| AtConfigLoad | When workflow loads | Fixed static config values |
| AtInputReady | Just before node executes | Dynamic values from upstream data |
| NodeControlled | When the executor decides | Custom/advanced timing |
| AsLiteral | Never (raw value used) | Constants that must not be processed |
EvaluatorKind
| Value | Syntax | Use for |
| Template | {{workflow.var}} | Simple interpolation from workflow/input data |
| JavaScript | JS expression/script | Logic, computation, data transformation |
| JsonPath | $.property.path | Extract from a JSON document |
| Literal | Raw value | Fixed constants |
| None | — | Runtime-populated fields (executor sets value) |
HilDisplayMode
| Value | What the human sees |
| Concealed | Field not rendered |
| ReadableContext | Full value displayed |
| ReadableMasked | Partially obscured (e.g. ****1234) |
HilInputMode
| Value | Human interaction |
| Locked | Read-only — can see but not change |
| EditableOptional | Pre-filled, human may optionally change |
| PrefilledEditable | Pre-filled, human is actively prompted to review/edit |
| RequiredFromHuman | Must explicitly confirm or provide before submitting |
TimeoutBehavior
| Value | Countdown starts |
| AbsoluteDeadline | At the moment of suspension |
| AfterSlaThreshold | After SlaThresholdSeconds have elapsed |
Field Archetype Patterns
Static Config
// Fixed in workflow definition — no data flow
DataFlowPolicy: AcceptsUpstreamInput: false | EmitsToDownstream: false
ExcludeFromInputMapping: true | ExcludeFromOutputMapping: true
ExpressionPolicy: AtConfigLoad + Template
// Examples: strategy, method, host, resource, operation
Dynamic Input
// Receives value from upstream node at runtime
DataFlowPolicy: AcceptsUpstreamInput: true | ExcludeFromInputMapping: false
ExcludeFromOutputMapping: true
ExpressionPolicy: AtInputReady + Template
// Examples: to, body, channel, actors, assignedTo
Output / Result
// Produced by executor; downstream nodes consume it; persisted to memory
DataFlowPolicy: EmitsToDownstream: true | PersistsToMemory: true
ExcludeFromInputMapping: true | ExcludeFromOutputMapping: false
ExpressionPolicy: AtInputReady + None
// Examples: messageId, response.body, approvalDecision, form.submission, slack.ts
Credential / Secret
// Full lockdown — masked, concealed, isolated from data flow
DataFlowPolicy: AcceptsUpstreamInput: false | ExcludeFromInputMapping: true
ExcludeFromOutputMapping: true
HilPolicy: SendToHil: false | DisplayMode: Concealed
SecurityPolicy: MaskInLogs: true | MaskInOutput: true | RequiresElevatedAccess: true
HIL Decision Tree
Should the human see this field?
NO → SendToHil: false, DisplayMode: Concealed
YES →
Can the human change it?
NO → DisplayMode: ReadableContext, InputMode: Locked
YES →
Must the human actively confirm it?
YES → InputMode: RequiredFromHuman
NO, should human be prompted to edit?
YES → InputMode: PrefilledEditable
NO → InputMode: EditableOptional
Security Decision Tree
Is this a password / API key / token / credential reference?
YES → MaskInLogs: true, MaskInOutput: true, RequiresElevatedAccess: true
Is this PII that must not appear in logs?
YES → MaskInLogs: true
Is this admin-only configuration?
YES → RequiresElevatedAccess: true
Otherwise → all false (defaults)
Common Time Values
| Duration | Seconds |
| 30 minutes | 1800 |
| 1 hour | 3600 |
| 2 hours | 7200 |
| 12 hours | 43200 |
| 24 hours / 1 day | 86400 |
| 48 hours / 2 days | 172800 |
| 5 days | 432000 |
| 7 days / 1 week | 604800 |
Config.cs Skeleton
namespace BizFirst.Ai.ExecutionNodes.MyCategory;
public partial class MyNodeExecutor
{
protected override NodeExecutorManifest? GetNodeExecutorManifest()
=> NodeExecutorManifest.From(
ProcessElementTypeCode,
new[]
{
new NodeFieldDescriptor
{
FieldId = "",
Description = "",
ExpressionPolicy = new ExpressionPolicy
{
EvaluationStage = EvaluationStage.AtInputReady,
EvaluatorKind = EvaluatorKind.Template
},
DataFlowPolicy = new DataFlowPolicy
{
AcceptsUpstreamInput = false,
EmitsToDownstream = false,
PersistsToMemory = false,
ExcludeFromInputMapping = true,
ExcludeFromOutputMapping = true
},
HilPolicy = new HilPolicy
{
SendToHil = false,
DisplayMode = HilDisplayMode.Concealed,
InputMode = HilInputMode.Locked,
Label = "",
Description = ""
},
SecurityPolicy = new SecurityPolicy
{
MaskInLogs = false,
MaskInOutput = false,
RequiresElevatedAccess = false
}
}
}
);
}
Key Project Locations
| Item | Path |
NodeExecutorManifest | BizFirst.Ai.ProcessNodePolicies.Domain/Models/ |
NodeFieldDescriptor | Same |
ExpressionPolicy | Same |
DataFlowPolicy | Same |
HilPolicy | Same |
SecurityPolicy | Same |
SuspensionPolicy | Same |
NodeFieldManifestRegistry | BizFirst.Ai.ProcessNodePolicies.Service/ |
NodeFieldManifestResolver | Same |
SuspensionPolicyOrchestrator | BizFirst.Ai.ProcessEngine.Service/ |
| Global type alias | Both GlobalUsings.cs files |