Well, it’s kind of weird, but…
The server keeps a list of all the pk3s it used to load data for the current map and a separate list with every pk3 the server can read (with the current fs_game setting), along with checksums for each pk3 in both lists.
The client looks at these lists in determining what to load (because there could be a file with the same name inside different pk3s), and pk3s that match one also existing on the server are kosher, even if they aren’t referenced (this is how the optional voicechat/skin/etc. packs work without requiring everyone to download them.) The client sends checksums for each pk3 it referenced back to the server, and when sv_pure is 1, the server either lets them live (continue playing) or disconnects them (and broadcasts the ‘Invalid PK3 files referenced!’ message to other players.)
(This is approximately how it works, anyway, I might’ve gotten a specific wrong somewhere.)
Campaign files are always referenced (as explained earlier in the thread), so clients always need the pk3 files they’re in. 