Resolves the ability id required to access or execute the given artifact.
Returns null if — and only if — the artifact declares no gate. That is the
Open Gate Philosophy its callers act on: no declaration, no check. Adding the
SDK therefore never silently closes a Core app.
A declaration that cannot be resolved is not a null. Until 1.2.0 it was,
and the two meanings were indistinguishable: an #[Access] or #[Act] written
in code but not yet synced had no row, no id, and came back null — so a freshly
declared gate protected nothing, and nothing reported it. Both cases now throw,
separately, because they are two different deployment mistakes.