Follow-up: Notarization ticket database analysis
I ran diagnostic queries against the three SystemPolicyConfiguration databases (ExecPolicy, SystemPolicy, Tickets) comparing my extension against a working Tailscale NE on the same machine. Here's what I found.
Tickets database
The Tickets database has two tables: tickets (direct entries) and hashes (component CDHashes linked to a parent ticket).
After xcrun stapler staple Chakshu.app:
CDHash
tickets (direct)
hashes (linked)
Host app 02d771fe...
Yes (id=940)
Yes → ticket 940
Extension 658144fa...
No
Yes → ticket 940
For comparison, Tailscale's extension CDHash has a direct entry in tickets (id=639).
ExecPolicy policy_scan_cache
Binary
policy_match
flags
Tailscale extension
4
8704
My host app
4
8704
My extension
9
64
policy_match=4 appears to be the "Notarized Developer ID" assessment. policy_match=9 is the default/legacy assessment — the most common value in the table (350 of 910 entries). My extension consistently gets the legacy assessment.
SystemPolicy object_state
The object_state table confirms both my app and Tailscale are recognized as "Notarized Developer ID" (authority 11) at the app bundle level. The problem is specifically at the extension level.
Hypothesis
stapler staple writes the top-level app CDHash as a direct entry in tickets but only records nested component CDHashes (including the system extension) in the hashes table. If sysextd's policy evaluation looks up the extension's CDHash only in tickets and not hashes, it would fail to find the notarization ticket and fall back to the legacy Developer ID assessment — which would explain the "no policy" rejection.
Tailscale's extension works because it has a direct tickets entry, likely created when it was first activated on a pre-Tahoe macOS version.
Topic:
App & System Services
SubTopic:
Networking
Tags: