Portal Community

EvaluationStage

ValueClock startsUse for
AtConfigLoadWhen workflow loadsFixed static config values
AtInputReadyJust before node executesDynamic values from upstream data
NodeControlledWhen the executor decidesCustom/advanced timing
AsLiteralNever (raw value used)Constants that must not be processed

EvaluatorKind

ValueSyntaxUse for
Template{{workflow.var}}Simple interpolation from workflow/input data
JavaScriptJS expression/scriptLogic, computation, data transformation
JsonPath$.property.pathExtract from a JSON document
LiteralRaw valueFixed constants
NoneRuntime-populated fields (executor sets value)

HilDisplayMode

ValueWhat the human sees
ConcealedField not rendered
ReadableContextFull value displayed
ReadableMaskedPartially obscured (e.g. ****1234)

HilInputMode

ValueHuman interaction
LockedRead-only — can see but not change
EditableOptionalPre-filled, human may optionally change
PrefilledEditablePre-filled, human is actively prompted to review/edit
RequiredFromHumanMust explicitly confirm or provide before submitting

TimeoutBehavior

ValueCountdown starts
AbsoluteDeadlineAt the moment of suspension
AfterSlaThresholdAfter 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

DurationSeconds
30 minutes1800
1 hour3600
2 hours7200
12 hours43200
24 hours / 1 day86400
48 hours / 2 days172800
5 days432000
7 days / 1 week604800

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

ItemPath
NodeExecutorManifestBizFirst.Ai.ProcessNodePolicies.Domain/Models/
NodeFieldDescriptorSame
ExpressionPolicySame
DataFlowPolicySame
HilPolicySame
SecurityPolicySame
SuspensionPolicySame
NodeFieldManifestRegistryBizFirst.Ai.ProcessNodePolicies.Service/
NodeFieldManifestResolverSame
SuspensionPolicyOrchestratorBizFirst.Ai.ProcessEngine.Service/
Global type aliasBoth GlobalUsings.cs files