In case anyone is listening,
makeDualDec [d| cata :: Functor f => (f a -> a) -> Fix f -> a cata f = f . fmap (cata f) . unfix |] "ana"
does the right thing now, which is sort of my base level “it works!” As @parsonsmatt has pointed out, plenty of things are still wrong, but hey, I’m not presenting this to anyone for like 2.5 more weeks, so plenty of time for me to figure out everything there is about duality, right?