Per-node timeout anchor + node-level Timeout CM feature (#3604996)
Implements #3604996: a node's single timeout window can be anchored so it spans re-entries, and the single timeout is now a first-class, UI-authorable node feature.
Anchor
A node's single timeout was rearmed on every park, so a retry loop restarted the window. A timeout_anchor now controls where the window is measured from:
- park (default): now, rearmed each park (unchanged).
- instance: instance-created, a process-global budget.
- node: first arrival at the node, a per-step budget across retries (the payment-with-10-min-total case). The first arrival is stored as an internal instance variable, reused on re-entry, and cleared when the token leaves the node.
Harmonized into a node-level CM feature (UI)
The single timeout had no UI and was the lone node setting living under node['config'], unlike the node-level timers/retry/assignments features. It is now a proper Timeout node feature with a Complete Modeler editor (duration + on-timeout action + anchor), shown for parking task types. It lives at node['timeout'] = {duration, action, anchor, settings} and the engine reads it the same way it reads node['timers'].
- New
TimeoutNodeFeature;ProcessInstance::getCreatedTime(); validatableChoiceschema for the anchor. parkDeadline()and the timeout sweep readnode['timeout']; the example workflow and every timeout test migrated to the new shape.
Tests
InstanceTimeoutAnchorTest (each anchor, node reuse across re-entry, clear-on-pass), NodeFeatureEditorTest (the feature applies to parking nodes and persists through a CM save), plus the migrated TimeoutTest / NotifyTimeoutTest / SpawnTimeoutTest / UnclaimTimeoutTest / NodeExtrasRoundTripTest / ExamplesTest. Green locally; phpcs clean. drupal.org CI is the full-regression gate.