Sure enough directly after posting this I found the issue... The ESP32 FS library uses a namespace for some reason. If I change fs::FS &fs to FS &fs it works fine. I don't know why they are using a namespace or if...
(EDIT: you probably should skip ahead to my followup post before sinking time into reading this...)
I'm trying to adapt some filesystem code that was SD-specific to be filesystem agnostic, so it can be used with SD...