Looks very reasonable overall.
I may be reopening an old can of worms, but I believe that calling
(copy-list x) with any non-list object for x should be "an error" in
R5RS/R7RS sense. This is one of the few places where R7RS (and SRFI-1) is
as strict as R6RS in specifying exact semantics for a corner case, but
specified semantics differ, which hurts interoperability and makes Scheme
programs harder to understand with no obvious benefit. Having a separate
procedure -- say, (copy-leading-pairs x) -- for "just copy as many pairs as
you see along the cdr axis" would make the intent clear.
This does not, in my opinion, preclude (copy-list x 0 0) from returning an
empty list without examining x, which is consistent with other procedures
that only access the parts of x needed to construct the result. Not so sure
about (copy-list x 10 10) though.
-S