Descrizione
Operatore di branching binario condizionale enterprise — il control flow primitive di qualsiasi pipeline che ha bisogno di prendere una decisione "questo va a sinistra, quest'altro a destra" e che corrisponde concettualmente all'if-else dei linguaggi di programmazione classici. Valuta una condizione e instrada il workflow lungo il ramo "true" (yes) oppure il ramo "false" (no) — l'engine FlowForge esegue SOLO il ramo scelto (vedere chosenBranch + workflow-engine strategy logic-if), evitando fan-out su entrambi e sprecando risorse + side effects indesiderati. Due modalità di definizione della condizione mutuamente esclusive per coprire spettro complete dei case: (1) Builder visuale multi-regola — l'interfaccia no-code per non-developer commercialisti/marketing/amministrativi: aggiungi una o più regole composabili con combinatori AND/OR (logical operator scelto top-level), ogni regola consiste di un field path (dot-notation come "$node.triage.json.label"), un operatore type-aware (per stringhe: equals, not_equals, contains, starts_with, ends_with, matches_regex, is_empty; per numeri: greater_than, less_than, between, greater_than_or_equal; per array/collezioni: in, not_in, contains_any, contains_all, size_equals; per booleani: is_true, is_false; universal: exists, not_exists per null/undefined check), e un valore di confronto (può essere literal o expression {{$node.config.threshold}} valutata runtime); (2) Espressione JavaScript libera — back-compat con l'engine v1 e fallback per condizioni veramente complesse non esprimibili nel builder (es. "input.amount > input.user.tier_limit && Date.parse(input.due) < Date.now()") — valutata dall'interprete sicuro del runtime (denylist anti-escape + scope curato + timeout 250ms; il confine forte è l'isolamento per-tenant in container Docker), con accesso a $node, $input, $vars + helper tipo $date, $string e le pipe (| upper, | round, | currency, …). Use case canonici: routing email triagata (è un ordine cliente? → ramo Salesforce updateOrder, altrimenti → ramo notifications agli operatori); gate su soglia di confidence di un classifier ML (confidence > 0.8 → ramo auto-processed, altrimenti → ramo human_review); permission check pre-action (user.role === 'admin' → ramo dangerous_action allowed, altrimenti → ramo deny + audit log); A/B routing utenti su feature flag (user.experiment_cohort === 'B' → ramo new_experience, altrimenti → ramo control); validazione amount per workflow finanziari (amount > 10000 → ramo approval_workflow CFO, altrimenti → ramo auto_approve immediato).
