Under the hood
Permission dialogs can be held and resumed until a first reveal point, and a cancelled prompt returns to asking.
The permission-request flow now threads an askPatience object with hold()/resume() calls around showing the dialog, delaying it until a first reveal point (onFirstReveal). An askEnded() check also now routes a cancelled or denied prompt back into an "ask" state instead of failing outright.