@robryk @b0rk
it feels like CSP would benefit from a feature where a resource could be repudiated for CSP-related purposes
CSP does have a repudiation feature where you can really lock it down. Safelist instead of blocklist.
https://content-security-policy.com/hash/
Many modern build systems will generate these by default and embed them in the HTML which loads the JS for the app. (You can send them in the HTTP headers, but that's actually very rare, as now you need to synchronize your headers with specific content versions, which is a pain.)
While these hashes are also useful for Sub-Resource Integrity (tamper detection), they work just as well for attestation. "When loading this app, these are the hashes of the exact list of scripts, css, images, etc, which I expect to be loaded and used."
I just built a system for this a few months ago at my previous employer. It's fiddly to set up, but it really helps raise visibility of when something changes in your build/deploy system, whether intentional or not.