@tetsuro With app authorization only, the end user does not appear in `system.access.audit` for the calls your app makes. The sample query you found is showing on-behalf-of behavior specifically, and the query itself says, the CTE is named `obo_events`, and it filters on `identity_metadata.acting_resource IS NOT NULL`, a field that only populates when the app acts with a user's forwarded token.
In pure SP mode, every call your app makes authenticates with the SP's client ID and secret, no user identity reaches Databricks, so the audit row shows the SP's application ID in `user_identity.email` and `acting_resource` stays null.
On question 2: `run_by` and `run_as` are documented for contexts where one identity triggers work that executes as another, such as jobs and dedicated group compute. Nothing in the audit log reference ties them to Databricks Apps.
Here are few things to try,
1. Have one user perform a known action in the app, then query `system.access.audit` for that window. Seeing the SP's application ID and a null `acting_resource` gives your compliance file evidence rather than a doc interpretation.
2. Every request forwarded to your app carries the logged-in user's identity in headers (`X-Forwarded-Email`, `X-Forwarded-Preferred-Username`, per the "Access HTTP headers passed to Databricks apps" docs page), so the app can record which user drove which action.
3. If compliance requires the user in the platform-owned audit trail itself, OBO is the mechanism built for that. Those calls then audit as the user with your app in `acting_resource`, which is exactly the rows the sample query surfaces.