Memory leak
Memory the program no longer needs, and can't release because something still points at it: a list that only grows, a listener never removed. Each bit is small, so it passes every test and takes days to bring a server down.
An agent's session ends long before a leak shows. It adds a cache with no limit or a listener with no cleanup, the tests pass, and nothing fails until your server has been up for a week. Restarting hides it, so it can run for months. You have to go looking.
“Run the server under k6 at a steady 20 requests per second for 30 minutes, and log process.memoryUsage().heapUsed every 10 seconds. If it keeps climbing, take two heap snapshots ten minutes apart with node --inspect and tell me which object count grew. Every cache here needs a size limit.”