"The same signer name does not mean the same certificate."
What the Requirement Is
Every signature carries a code requirement language. The designated requirement (DR) is the one that answers "is this future binary the same app?" If you do not write one, codesign derives it from how the code was signed: for a certificate-signed app, the bundle identifier plus a statement about the certificate chain; for ad-hoc code, the hash of the code itself. TCC, the Keychain and several system services store the DR — not the app's name, path or version — and compare new code against it.
You read it with codesign -dr - Spark.app. A leading # in the output (# designated => cdhash H"…") means the requirement was implied rather than written into the signature.
Test a Requirement Instead of Eyeballing It
codesign --verify -R='<requirement>' Spark.app checks a binary against any requirement you write and exits non-zero with test-requirement: code failed to satisfy specified code requirement(s) when it does not match. That turns "does the new build still count as the same app to TCC?" into a command a script can gate on.
Compare Before You Replace
The family's queue launchers are small signed helpers installed on every Mac. Their installer refuses to replace an installed launcher whose designated requirement differs from the newly built one, and names both. The reason is in the quote above: a certificate regenerated under the same common name produces a different leaf hash, a different requirement, and silently orphans every Accessibility grant on that Mac, while every signature "looks" like it came from the same identity. Comparing the requirement text is cheap and catches it before the swap rather than after a user notices the prompts.
A Stable Requirement Is Necessary, Not Sufficient
One more distinction the family learned the careful way: a correctly certificate-signed launcher with a stable requirement still failed Accessibility on a Mac where an earlier ad-hoc build had been installed and its permission row deleted during recovery. A stable DR means a future grant will survive rebuilds; it does not prove a grant exists right now. The only honest check of the grant is asking from the running app — the next lessons show how.