That leaves the rest. These are the commands that have to be built into
the shell or they won't do anything useful. This is commands like
cd, ulimit, wait, times, bg, fg, jobs, ... there are actually quite a lot
(you can read the sh man page to see the complete set, just omit the
ones in the other two categories.) These have no external command
equivalent (because such a thing would be useless).
This leads to the crux of the matter - I have been told that POSIX
actually requires that all of the commands in this third category (actually
all the sh built-in commands, except the special built-ins) have an
executable that can be subject of an execvp(2) call. The second group
already have that, so it is only the third that matter here.
Apparently the standard way to conform with this requirement (if it exists,
it is possible it once did, and then sanity took over - as unlikely as that
seems in the standards community, sometimes they do the right thing) is to
create a small script
#! /bin/sh
$(basename $0) "$@"