private boolean verifyTaskInputParameters(
                ConstraintValidatorContext context, WorkflowDef workflow) {
            MutableBoolean valid = new MutableBoolean();
            valid.setValue(true);

            if (workflow.getTasks() == null) {
                return valid.getValue();
            }

            workflow.getTasks().stream()
                    .filter(workflowTask -> workflowTask.getInputParameters() != null)
                    .forEach(
                            workflowTask -> {
                                List<String> errors =
                                        ConstraintParamUtil.validateInputParam(
                                                workflowTask.getInputParameters(),
                                                workflowTask.getName(),
                                                workflow);
                                errors.forEach(
                                        message ->
                                                context.buildConstraintViolationWithTemplate(
                                                                message)
                                                        .addConstraintViolation());
                                if (errors.size() > 0) {
                                    valid.setValue(false);
                                }
                            });

            return valid.getValue();
        }
This constraint class validates following things.

<ul>
  <li>1. WorkflowDef is valid or not
  <li>2. Make sure taskReferenceName used across different tasks are unique
  <li>3. Verify inputParameters points to correct tasks or not
</ul>
common/src/main/java/com/netflix/conductor/common/constraints/TaskReferenceNameUniqueConstraint.java