Ooh, I have a question. Considering how incredibly huge Guardian was, have you done anything to condense compiled DNA? It looks like you're using the new stack commands, so I'm guessing yes?
The main reason Guardian's DNA was so huge, and improvements since then, are:
1. Each store operation had all its conditions attached to it (there were no if statements, let alone nested branching ones), so whenever conditions were similar or identical in different store operations (and this was very common), there was a lot of code duplication. The nested branching if statements (if they're used) significantly reduce DNA size. Guardian's conditional stores used PyBot's 'when' statements exclusively.
2. All the 'when' conditions attached to store/inc/dec(s) now use the boolean logic operators (>, >=, <, and, or, etc) which, when Guardian was written, did not work outside of cond blocks. Guardian used SGized versions of those which inflated the DNA size - all the conditions (<, >, etc) were turned into 3-6 operations (like sub sgn - 0 floor), whereas, now they are one operation (not including the extra stuff which is done to make the nested branching conditions work in concert with when conditions and storechecks)
3. Guardian had a lot of math for targeting, and a lot of repeated DNA for checking if things were veggies or friendlies, which was redundantly repeated to avoid doing energy-costing stores. Besides using if blocks to avoid having to repeat things, there isn't really a good way to fix this one, though, besides using stores anyways. Since there's no way to push something onto a separate variable stack and access elements in it by index, there's no feasible way to do complicated work on multiple variables at the same time besides by using either stores or redundant recalculations.