I guess you've realised generic isn't the silver bullet. In all cases having a strict contract/interface is preferable. Generic when it is a common reusable pattern. If your lower abstraction layers use generics - stop and reevaluate if necessary.
It’s ok. I don’t actually need help. I was messing around with a reusable pipeline to check etag headers and throw a concurrency error. The generics didn’t end up even being the problem.