`git bisect` -- sure. It's pretty handy.
You need three things:
0) a test (script, or manual actions) to check for the problem (for this I just ran the repl with the above test code)
1) a commit where the problem exists (for this it was HEAD)
2) a commit where the problem does not exist (for this it was the tag core.typed-pom-0.2.58, which I found by trial and error)
git checkout master
git bisect start
# run the test code, ensure it fails
git bisect bad
git checkout core.typed-pom-0.2.58
# run the test code, ensure it works
git bisect good
Git now does a binary search, automatically moving you to the commit in between the closest "bad" and "good". You then run the test again, then record the result with `git bisect good` or `git bisect bad`. Eventually you converge on where the problem first appeared.
You can also use `git bisect run mycript myarg0 myarg1 ...` to fully automate this. I didn't do that here because I couldn't figure out how to make leiningen run an expr from the command line, and it was pretty fast to do by hand anyway.