Terry, many thanks for the clarifications!
> The intended behavior is to complete if at all possible.
I can see the point in that.
> What is odd to me is that you seem happy using the more numerous non-user IDLE imports when there is no Shell.
The alternative would just be completing in an empty namespace, which would be completely useless. I do agree that having a shell should increase the available modules etc. available for completion.
FWIW I brought this up trying the dict-key completions in the shell with `globals()[` and got surprising results.
Perhaps we should differentiate between completions in the shell vs. when editing a file. In the shell, having completions for things not actually available is weird IMO. In the editor it makes more sense.
Or perhaps we should really go the route of issue #18766 and try to make all available modules available for completions. I really dislike the arbitrary availability of only certain modules for completion. That would likely be a *huge* undertaking, though, and I don't think it's worth it. Maybe restrict this to just stdlib modules, and/or use lazy (on demand) importing.
Finally, we can also decide that the current behavior is what we want. It's there, documented, and normally not very surprising.