When a package is blocked and the user has supplied --keep-going, and one or more packages not related to the blockage have been selected, the un blocked package shoudl still be built.
Example: packages A, B, C, D and E are due for update.
B needs C
C is blocked for some reason (so neither B nor C are safe to install/update).
A, D and E should still be processed if --keep-going has been specified.
If C is blocked because it's update conflicts with E, then A and D should still be processed.
Basically if something comes up blocked a list should be made of all the packages, then every package in the the blocking set is removed. Then the dependent packages who's install-or-update are dependent on the blocked update are removed, etc. A package that can be built using the existing install is not removed. Lather-rinse-repeat. If that itterative process finishes with a non-empty list then that is a list of packages that are "innocent" of the conflicts in the system and they can be safely updated.
Real World Example:
I am running ~amd64. app-emulation/emul-linux-x86-medialibs and app-emulation/emul-linux-x86-soundlibs are blocked right now with the the ABI_X86="64 32" make flag. This is bleeding edge and likely to snag.
None of that blockage should be holding back xterm, dhcp, dosfstools or ntp (etc, etc, etc).
It's getting worse and worse every week, probably because more and more packages fail now in the main tree. The result is that we cant update system at all, because there's always one package failing early and emerge wont keep going after this. This is getting critical.