Ecto traverse_errors - getting to the values triggering the errors?

Sounds like you might get what you’re looking for with the behavior traverse_errors has when you pass a function with arity 3, referenced briefly in the documentation:

Optionally function can accept three arguments: changeset, field and error tuple {msg, opts}.
It is useful whenever you want to extract validations rules from changeset.validations to build detailed error description.

Combining the first two args using Ecto.Changeset.get_change(changeset, field) will get you the value that triggered the validation error.