I'd prefer if you held off on this one.
In particular, trivial-features bothers me. Libraries probably shouldn't modify the features set by an implementation. I would feel much more comfortable if all names were prefixed to reduce conflict. e.g. set :tf-darwin and :tf-linux instead of :darwin and :linux
fwiw, i don't see in what way would it be better if the otherwise obvious symbol names were prefixed. it would just make the user code less readable. if tf modifies *features* in a wrong way then it needs to be fixed.
Other thoughts: Babel is used for external string support, right? Does it slow down the base, untranslated case? Could it be optional/disabled for those of us who don't want translation?
there's no untranslated case, you always need to turn lisp strings into byte-arrays using some encoding before calling C (except if relying on simple-base-string being ascii only, which is not mandated by the standard). the lack of proper encoding support was an important missing feature of cffi.
Is there a structural reason to merge grovel with cffi? If not, could they stay separate? Does that reduce the core CFFI dependencies? You probably integrated grovel for trivial-features... Could tf search for :cffi-grovel in *features* and implement a fallback if not found?
i'm not following you on this... cffi-grovel is a standalone .asd already, it's just practical to keep it in the same repo as cffi itself because it tightly depends on cffi and it's rather small to be a separate project.