I've been wasting way too much time on this uxntal type checking thing, it's starting to feel like one of those programs that I make to save time, but in the end I just spend an unrecoverable amount of time fine-tuning.
But despite that, it has one unexpected upside, which is that when it gets hard to predict the state stack, I've begun using defined labels's arity like breakpoints through the body of routines to validate that the stack state, at that moment in the program, is as predicted.
I was already writing these comments from time to time to describe the transformations across different lines of a program, now they're actually part of the verification of the function. It's neat! I think I might write a thing about this once it's a bit less clunky.