In my opinion Luanti is a living proof that top-down extensibility aka “we make monolithic engine in C++ and then provide some APIs for scripting via bindings for some scripting language on the side” doesn’t work well. You can’t change main menu, you can’t fix player controller (and the default one sucks), you can’t write your own renderer, etc. Because developers didn’t imagine someone would want that (actually they probably did, but they simply don’t have capacity to provide this). Good extensibility/modability should be automatic, on binary level. Like what you get by developing in bytecode/JIT-compiled languages like Java/C# or in old Unreal Engines where everything was done in bytecode-(de)compilable special language called Unreal Script.
My orange cat loves pushing things off tables. At this point, he knows he’ll get in trouble for it too, so he tries to be sneaky about it right up until whatever it is smashes on the floor.