Onboarding can be complicated. I'm complaining about new comers not reading the documentation before writting articles but objectively some concepts are so foreign, it's a bit difficult to see what you are missing. Module level programming for exemple is key to writing good Ocaml and it's quite a step if you are entirely new to functional programming. Effects are great but conceptually it's quite hard to get your head around them. Some fairly common libraries use Haskell influenced monadic interface. Yet another hurdle.
Traits have their flaws but I have to agree that having to be explicit all the time can be annoying. Modular implicit would be nice.
Concurrency is soon to be a lot better now that the effect system is mostly there and eio is landing.
The standard library is in the best shape it has ever been. I would still like more.
It seems like you need to either be purely functional or have a borrowchecker if you want to have "fearless concurrency".
I've used OCaml for writing small compilers and it was really clean but that's a toy thing that will not see much real world usage.
It's surprisingly nice for web development also when you compile to JS. The ecosystem around Mirage and microkernel is quite impressive and if you want to build low level things and I for one like it significantly more than Rust for CLI tools.
It's a very versatile language honestly. It's opinionated enough that you have a clear idea of what would be the community choice but not so much that you can't just go to town with a different solution if it suits how you want to approach the problem more even it is an imperative implementation or even something object oriented.
I personally view Ocaml as basically a better Python with more features, better performance but without the huge success.