Two stages, two kinds of failure
A shader object compiles one stage’s source. A program links compatible stages into an executable pipeline. Check each compile result and the program link result separately, and attach the stage or file name to a bounded diagnostic. A valid vertex shader can still fail to link with an incompatible fragment input.
The starter reads a bounded source file, passes an explicit source length, and installs ownership before fallible compilation. Failed compilation therefore releases its shader object while the context remains current. The same pattern applies to the candidate program during link failure.
Use #version 330 core for this desktop course. GLSL ES 3.00 from the browser course has related ideas but different version and precision rules. Keep the environment in the file itself so an editor, compiler log, and reviewer can agree on the language being compiled.
Add a paused exposure control to the panel. Deliberately break one stage and one interface, preserving the different logs.
