Well, it kind of goes to the definition of what a "kernel" is, as to how much scope is included for it to be considered done.

You do have a task switcher, but I don't see any stack management code which is pretty necessary for preemptive task switching. While 6502 kernels often don't do much memory management (and here you've chosen static partitioning), figuring out how to divvy up pages 0 and 1 between the tasks is still usually the job of the kernel (either software-provided or designs for programmer discipline), as well as if you're going the micro/nanokernel route, how message passing & I/O will be managed.
Because the task switcher is called quite often and is a steady source of overhead, you should look at collapsing the code down heavily. The big CMP/BEQ tree will take dozens of cycles per switch, so if you could simply use offsets into your tables instead of branching to variants of code, you'd get rid of both cycles & bytes. While this technically is optimization, it's pretty important to make this tight early on, because it can affect the structure of task state variables which will have wide-ranging design effects.
Overall, I think a memory map of zeropage & comments would be necessary to understand the other specifics of the code so far. For instance, the purging/locks/stopping/loading features mentioned in the changelog aren't easily decipherable from the code as-is, to a new reader. But honestly without any stack handling (unless I'm missing it) I'm not sure what you have would actually work for any tasks which call subroutines or otherwise use the stack. However, it's certainly a reasonable beginning for experimentation. By writing more complex tasks to switch, you'll bump into the issues you need to deal with. If you can think about some of the issues above first, that could prevent you from baking in constraining designs too early.
Edit: Just noticed another issue. When an IRQ hits and it branches down to 'cont', the X register is being used without ever being initialized. If the tasks are required to keep a certain value in X that might be okay (though more difficult to program for and less robust), but otherwise it might be a bug.