I decided to back down on the "no error! antiforms in packs" policy, instead saying that packs containing ERROR! antiforms can't be elided (explicitly with ELIDE, or implicitly by multi-step evaluations).
The trick is that if you DECAY a pack to its first element (or try to ELIDE it), it first checks to see if any of the elements are raised errors...or packs with raised errors in them...and promotes them to PANICs. This way you don't accidentally gloss over them...
So it's actually pretty trivial to accomplish the original desire now--another home run for isotopes! 
>> name: null
>> block: [1 + 2 1 / 0 10 + 20]
>> collect [
while [[{block} ^result]: eval:step block] [
if error? ^result [
keep quasi (disarm ^result).id
] else [
keep result
]
]
]
== [3 ~zero-divide~ 30]
That's pretty good. There's a bit of a question though about the "circling" of the block to avoid trying to decay the pack with an error in it... that might need an additional notation to say you want to ignore the error:
while [[{block} ~^result~]: eval:step block] [...]
If you're willing to say that, maybe it's enough to do that and the decay works without needing you to circle anything (though it would mean synthesizing a new pack with a TRASH! in it, or similar, as the overall expression result):
while [[block ~^result~]: eval:step block] [...]
A Note On Why You Can't Intercept UNSPACED NULL
unspaced ["hello" null] gives a definitional error due to the choice of UNSPACED to return a definitional error in that case. But unspaced null causes a parameter type checking error, and is a hard failure. Type check errors are not definitional, which is by design--and we would not want to do otherwise.
It would be like making typos interceptible. Imagine if typos raised definitional errors. You'd say try takke block and the TRY would suppress the "no such variable as TAKKE" error and turn it to NULL. Then BLOCK would be evaluated in isolation.
You only want definitional errors to come from inside the functions themselves once they've started running and have all their arguments.
Theoretically, UNSPACED could make NULL one of its accepted parameter types. Then from the inside of its implementation, it could raise a definitional error related to it. I'll leave it as an exercise for the reader to think about why not to do that. 