1. How much complexity is acceptable?
However much it takes to get the required features at an acceptable speed. Complexity takes a back seat to functionality, or else you end up with a system without the desired functionality, which would defeat the entire fucking purpose of programming.
2. What functions do we really need to implement?
Whatever the user needs to accomplish, without forcing them to run through undue hoops. You don't write a lib to make the lib itself easier to write, you write libs so the users can get their fucking work done.
It is about not wasting time on stuff we do not need, and about keeping the API simple and easy to learn.
"""Simple""" always means avoiding the actual hard parts to these fuck nuggets, meaning your shit is going to be useless.
3. When is it worth using assembly?
When it's not running fast enough and algorithmic optimizations have been exhausted. Why the fuck are you asking this up front?
The reason for avoiding assembly is simply that it is not portable and cannot replace C code.
What. the. fuck. C code isn't portable either, depending on how it's written. Optimizations done to C code aren't portable either, as a speedy decision for one processor's details like caches can be slower on another. Plus, "cannot replace C code"? Nigga, asm can by default replace every fucking language on the planet, if you want to put in the work. The fact that you've got your dick in this space and don't know what you can and can't do in asm means you're all dumbfucks.
4. Which functions used internally should also be available via the API?
None of them. If you can't distinguish internal from external user needs, you have no business designing a fucking API.
5. How can the API and use of libzahl suck less?
Kill yourself.