Looking at this, I think checking the context version via the CGLContextObj’s pixel format, which lets you query kCGLPFAOpenGLProfile / either kCGLOGLPVersion_Legacy or kCGLOGLPVersion_3_2_Core.
Secondly, I think state is going to need to be tracked *really* tightly. Shader loading, VAO / VBO /VA attribute caching / re-binding for pointers, error checking, etc. Its a lot.
I am almost wondering if a second compatible share context should be setup, so OpenGL state cannot be corrupted in the parent applications context that Syphon was initialized with. That has drawbacks (state switching, etc), but grants us some potential leniency.
@bangnoise is out until next week – He has done a lot of amazing re-engineering of Syphon, and frankly has better fundamentals than I. I am curious of his thoughts. What is your timeframe for your app, out of curiosity?
One thing you can do, is attempt to swap in your Syphon framework in Apps that are Syphon aware, and see how they run. VDMX, Mad Mapper, Resolume Avenue 4, and CoGe all come to mind to test, as they have a lot of different OpenGL state assumptions to juggle.