It's not a ls bug. I've stepped through the code with gdb and it looks just fine. At this point I think Epsilon (a 32-bit app) is corrupting the image of its child process in a strange way. I'm working with the author at Lugaru (who's very responsive) to track it down. He couldn't reproduce it right away. I just reproduced it on a virgin CentOS 8 image at Linode with utterly no modifications. I just spun up the VM, logged in, scp'd the Epsilon RPM, dnf installed it, and demonstrated the issue. I extracted the formatting code from the ls source to create a short test program that doesn't rely on anything external like a file's actual modes. It's just the code that builds the string from the mode word. It looks like it mysteriously skips the middle of the routine for no reason when spawned either as a grandchild through bash or directly via whatever Epsilon uses to spawn a child process. It's definitely a spooky Halloween bug!
It's a display bug in PuTTY+Epsilon, but a subtle one! I upgraded PuTTY from 0.65 on one PC to 0.73 (latest) and the problem disappeared. I still see it on another PC running PuTTY 0.70. I'm still trying to characterize it but the output is correct and it's because I'm using Epsilon to view the output file that I'm not seeing the missing characters. The issue is related to repeating characters, such as the runs of dashes seen in a ls listing. But I'm able to reproduce it by displaying a file with a run of any character in Epsilon. So there's some quirky interaction between the terminal usage of Epsilon, PuTTY 0.70, and CentOS 8's openssh+bash. I ran back through PuTTY versions and it doesn't happen starting with 0.71, so that version fixed something that CentOS 8 triggers in the older versions. Here's its changelog: <https://www.chiark.greenend.org.uk/~sgtatham/putty/changes.html>
It's a missing ncurses feature in the older PuTTY that's trigged by an update to ncurses or terminfo in CentOS 8. PuTTY 0.72 added support for the REP (repeating character) command and the newer terminfo adds that as an xterm feature. The Epsilon author spotted it in the PuTTY changelog. So any curses app that uses repeating characters will have this problem when used with an old PuTTY version. Here's an example of someone running into this with iptraf-ng on Arch Linux a couple years ago: <https://unix.stackexchange.com/questions/394787/linux-terminal-skipping-some-repeating-whitespace-characters>