Upstream: objectstack-ai/objectstack#4347 — that is the canonical report, with the reproduction. This issue exists only to track the hotcrm side; the details live upstream so the two cannot drift apart.
What it means for hotcrm
applyConversionsToFlow does not recurse into loop.config.body, so a bare string condition inside a loop is never converted to CEL and is string-compared instead — the gate silently never opens. Three flows shipped inert because of it (opportunity_stagnation, contract_renewal, campaign_enrollment).
Current state — worked around, not blocked
When objectstack#4347 ships
- Bump
@objectstack/service-automation.
- The "engine still treats a bare string differently from an envelope" test will go red — that is the signal, not a regression.
- Decide whether to relax the loop-body guard from fail to warn. Keeping the explicit envelopes is harmless either way; the guard is what stops the class coming back.
Related: #495 (surfaced it), #563, #565, #566.
Upstream: objectstack-ai/objectstack#4347 — that is the canonical report, with the reproduction. This issue exists only to track the hotcrm side; the details live upstream so the two cannot drift apart.
What it means for hotcrm
applyConversionsToFlowdoes not recurse intoloop.config.body, so a bare string condition inside a loop is never converted to CEL and is string-compared instead — the gate silently never opens. Three flows shipped inert because of it (opportunity_stagnation,contract_renewal,campaign_enrollment).Current state — worked around, not blocked
Ptagged template (fix(flows): author conditions as CEL envelopes so they actually evaluate #565, fix(flows): unbreak main — contract_renewal throws; rewrite the two tests #565 turned red #566).test/flow-scheduled.test.tswalks every registered flow, including nested loops, and fails if any loop body reintroduces a bare string condition. It also asserts the walk found something, so it cannot pass vacuously.When objectstack#4347 ships
@objectstack/service-automation.Related: #495 (surfaced it), #563, #565, #566.