I have a light near the roof of a room in my map. The 'light' from this light passes between brushes (even when there is no space), and even through some of them (like through the roof).
(a) Why does it do this?
(b) How can I fix it?
Is there some kind of 'clip' brush I can make (like the clip_all texture maybe) that will prevent this?
i think common_shadow (or something_shadow, not sure what it realy is) does that. if all else fails make two brushes with a nodraw sandwiched in between.
As to why it happens: the compilers work with triangles/polys to calculate the lightmaps. Sometimes it can not see that a brush should block light when one of the brushes' triangles is extending beyond a wall or other obstacle.
You could do as Lizardkid suggested, insert a thin brush with the common/caulkshadow texture and sandwich it between the walls. You would have to split the walls to do so.
The method I usually try first is manually cut the brushes where they meet to make sure the polys won't extend beyond brushes that should stop the light.