Computes the field changes a FieldRuleSet would make to a record — WITHOUT mutating anything.
Returning a list of FieldChange (old → new per rule) is what makes a dry-run preview possible:
the caller decides whether to apply. Conditions are evaluated with the safe expression evaluator;
value formulas + the transform pipeline run through the shared FieldTransformEngine; entity
lookups go through the injected resolver. The engine never touches a database itself.
Computes the field changes a FieldRuleSet would make to a record — WITHOUT mutating anything.
Returning a list of FieldChange (old → new per rule) is what makes a dry-run preview possible: the caller decides whether to apply. Conditions are evaluated with the safe expression evaluator; value formulas + the transform pipeline run through the shared FieldTransformEngine; entity lookups go through the injected resolver. The engine never touches a database itself.