It might also make sense to have an AT "priority" setting (a bit like task priority) so that lower priority ATs might only be run at most every X blocks.
Yeah some form of triage makes sense, since computational resources may be limited. AT coders should be coding ATs in such a way that they don't have to be running every block to successfully complete execution anyways, since things like running out of funds could happen.
if( state.jumps.count( state.pc + addr3 ) )
state.pc += addr3;
Actually, that still isn't the subleq branching. SUBLEQ a, b, c means that after you perform a = a - b, if that is <= 0, you
goto c, not the address pointed to by c, or advance the code point by c. So you'll want
pc = addr3 instead.
(I don't know whether to feel proud or guilty about optimizing subleq!)