Mutable stack in Racket
Many Lisp programs use cons cells quite liberally instead of adding a
separate stack structure, in that sense your concerns about complexity
are probably a bit less critical.  Since the stack is also carrying the
length of the list it actually supports at least the additional size
operator quite well.  Of course writing more code for an underlying
(resizable) vector could make sense, but again I wouldn't count on
that being necessary.

For the code I only have minor suggestions, as it's pretty well written
and clear what each part means; while I'm not that familiar with Racket
it's easily readable to me.


For the pattern (+/- x 1) there are also the functions add1 and
sub1 which could be used.
The non-empty-stack? could just check whether the buffer is
null? or empty? instead.  positive? sounds like there's some
risk that the stack size might get negative for some reason.  For the
same reason the contract can probably also be tightened to check for
non-negative integers.
(append (list x) y) is a bit shorter as (cons x y).