Is that what you really want or is that a tradeoff point short of ideal that you’ve selected as acceptable?
To put it more concretely, if you could have alive programs and alive tools, would that not be the pinnacle? Well categorically yes because an alive program has every capability a dead one has, including the ability to mimic “dead” one.
The problem as we all know is it appears to be impossible to write maximally alive tooling in the presence of alive programs because there’s no way to analyse them sufficiently with the compute available to us.
And so we select a trade off.
Aiming for the tradeoff point as the ultimate solution does us all a disservice though. We should call out that it’s a trade off (and a reasonable one at that) but what we really want is alive/alive!
No, they do not. What they are lacking isn't in what they can or cannot execute, it's what we can say about them. If your PL has eval, then you don't know if foo is ever called or not, for example.
I'm not interested in talking about the currently running instance of a program, but all possible running instances of it.
It's still the same issue; consider the halting problem. There are times when we can say a call does not return in a turing complete language (the bottom type, e.g. never in TS or ! in Rust), but the reverse is not true. We cannot be sure a given call will return in a turing complete language even without eval.
You could avoid this for a definition of dead that equates with non-turing complete i suppose but that's not particularly interesting since it's not a general programming language in that case.