Portal Community

Port Definition

The timeout port is declared in the executor's port list with a special flag:

// BaseHILExecutor registers the timeout port
protected override IReadOnlyList<NodePortDefinition> DefineOutputPorts()
{
    return new[]
    {
        new NodePortDefinition("approved",   label: "Approved"),
        new NodePortDefinition("rejected",   label: "Rejected"),
        new NodePortDefinition("timeout",    label: "Timeout", isTimeoutPort: true)
    };
}

// The isTimeoutPort flag tells the canvas to render it with the clock icon
// and tells the engine this is the port to use when double-timeout fires

When the Timeout Port Fires

ScenarioTimeout Port Fires?
timeoutBehavior = Escalate, escalation also times outYes
timeoutBehavior = AutoApprove (single timeout)No — routes via approved port
timeoutBehavior = AutoReject (single timeout)No — routes via rejected port
timeoutBehavior = Fail (single timeout)No — workflow fails entirely

Routing Pattern

[Approval Node] (timeoutBehavior: Escalate, escalationActor: user-manager)
  ├─ approved → [Continue Process]
  ├─ rejected → [Send Rejection Email]
  └─ timeout  → [Send Critical Alert] → [Auto-Reject End Node]
                    ↑
              (fires when escalation also times out)

Timeout Port Output Data

When the timeout port fires, the node's output in ExecutionMemory is:

{
  "timedOut"     : true,
  "suspendedAt"  : "2026-05-25T09:00:00Z",
  "expiredAt"    : "2026-05-26T09:00:00Z",
  "originalActor": "user-manager",
  "escalationActor": "user-director"
}
Unconnected timeout port: If you configure a timeout but leave the timeout port unconnected, the engine will log a design warning. If the timeout port fires on an unconnected port, the workflow fails with an UnconnectedPortError. Always connect the timeout port when using Escalate behavior.