Found the problem… That “1 storagename.stats file with 0 size” that was in the C:\ProgramData.duplicacy-web\stats\storages folder was apparently messing things up. I deleted that empty file and re-ran the check job, and it wrote the new file successfully.
I am guessing that during the check job processing, it tries the parse the JSON in the existing .stats file, and that empty file got a parse error, which caused it to fail writing the new file.
I did see JSON parse errors for that empty .stats file in the log file, but I assumed those were from the UI trying to display the empty JSON file. Apparently those JSON parse errors were from the actual check job processing, and not the UI trying to display it. Makes sense in retrospect, as the web UI probably doesn’t write to the log.
I don’t know how the 0 length file got there - maybe a result of some other error months ago. But deleting it got things going again. It never affected backups, but it’s nice to see storage usage reports again.
Thanks for the help.