stderr is for diagnostic output, not errors

For command-line program, stdout is used to output the result that the program produces. Anything else, i.e. diagnostic output, needs to be on stderr.

stderr is not for writing errors, confusingly.

All log messages belong on stderr. (Not just “warning and above”.)

If the program doesn’t produce output, then the difference between stdout and stderr is irrelevant.