basic-shaders-only restricts you to the arbvp1 and arbfp1 profiles. Once you disabled that variable, you still need to tell panda to use a certain profile.
I believe you can set it at the top of the shader program like this:
//Cg
//
//Cg profile arbvp1 arbfp1
…at least, that used to be the way to do it. It could have changed since last time I checked, though.
Here’s some info from the nvidia website:
PROFILES
A *profile* specifies the output language of the cg compiler (either a
shader assembly dialect, or a shading language). Each profile has its
own set of *profile options* that can be set for it, though many related
profiles have similar or identical options. Profiles can be grouped by
program type, API, or GPU generation.
DirectX profiles
"dx8ps", "dx8vs", "dx9ps2", "dxvs2", "hlslf", "hlslv", "ps_1_1",
"ps_1_2", "ps_1_3", "ps_2_0", "ps_2_x", "ps_3_0", "vs_1_1",
"vs_2_0", "vs_2_x", "vs_3_0"
OpenGL profiles
"arbfp1", "arbvp1", "fp20", "fp30", "fp30unlimited", "fp40",
"fp40unlimited", "glslf", "glslv", "gp4fp", "gp4gp", "gp4vp",
"gpu_fp", "gpu_gp", "gpu_vp", "vp20", "vp30", "vp40"
Fragment profiles
"arbfp1", "dx8ps", "dx9ps2", "hlslf", "fp20", "fp30",
"fp30unlimited", "fp40", "fp40unlimited", "glslf", "gp4fp",
"gpu_fp", "ps_1_1", "ps_1_2", "ps_1_3", "ps_2_0", "ps_2_x", "ps_3_0"
Geometry profiles
"gp4gp", "gpu_gp"
Vertex profiles
"arbvp1", "dx8vs", "dxvs2", "glslv", "gp4vp", "gpu_vp", "hlslv",
"vp20", "vp30", "vp40", "vs_1_1", "vs_2_0", "vs_2_x", "vs_3_0"
Geforce 3/4 profiles
"fp20", "vp20"
Geforce 5 profiles
"fp30", "vp30"
Geforce 6/7 profiles
"fp40", "vp40"
Geforce 8 profiles
"gp4fp", "gp4gp", "gp4vp", "gpu_fp", "gpu_gp", "gpu_vp"
About the strictness of the shader system: I don’t know, I found it to be annoying at places too. However, I did find that it’s somewhat looser than portrayed at the manual.