| name | nowdev-ai-toolbox-access-denied-explainer |
| user-invocable | true |
| description | Explains exactly why a ServiceNow user lacks access or permissions to view/edit a record, view/modify a field, or execute an action/UI Action, and provides a precise remedy. Triggers when the user mentions "I can't see/edit X", "insufficient rights", "why is this field read-only", "access denied", "user can't run this action/UI action", "ACL failure", "no write access", "cannot view", or similar permission and access restriction issues. It uses read-only `now-sdk` retrieval delegated to `nowdev-ai-toolbox-servicenow-sdk` to trace ACL evaluations and identify failing roles or conditions. |
| argument-hint | [table.field] [user] [operation] |
ServiceNow Access Denied Explainer
This skill provides a structured, live diagnostic tracing workflow to analyze, diagnose, and resolve access control list (ACL) failures and security permission issues on a ServiceNow instance (e.g., why a user gets "Access Denied", why a field is unexpectedly read-only, or why a record is hidden).
Core Principles
- Strictly Read-Only: NEVER perform write, update, delete, or credential-mutating operations on the instance. Use
now-sdk only for read-only retrieval of structural information and roles.
- SDK Authority: Load
nowdev-ai-toolbox-servicenow-sdk before using now-sdk. It is the sole authority for command construction, flags, authentication aliases, output handling, pagination, and CLI troubleshooting.
- Deterministic Evaluation Trace: Reconstruct ServiceNow's multi-tier ACL evaluation logic (Table-level security checks first, then Field-level check; check roles first, then evaluate condition and script criteria).
- No Direct Security Alteration: Provide clear recommendations and exact snippets describing how to grant or modify permissions, but do not execute changes.
Standard Diagnosing Workflow
Follow these steps precisely when diagnosing an access issue:
Step 1: Identify Context & Scopes
- Identify Target Table & Field: Determine the ServiceNow table (e.g.,
incident or x_abc_app_my_table) and the specific field (e.g., short_description) being accessed.
- Identify Operation: Determine the requested operation:
read, write, create, delete, or execute.
- Identify User Context: Identify the target user. If a name or sys_id is provided, search for them. If none is listed, check if the current user context or default admin/agent needs to be evaluated.
- Identify Target Instance: Determine the intended connected instance. Delegate alias discovery and selection mechanics to
nowdev-ai-toolbox-servicenow-sdk; if the target is ambiguous, ask the user before retrieval.
Step 2: Retrieve Live Instance Data
Ask nowdev-ai-toolbox-servicenow-sdk to perform bounded, read-only retrievals from the intended instance using this specification. Resolve reference display names when needed for role analysis; the canonical SDK skill decides the CLI mechanics.
| Table | Filter intent | Fields | Limit intent |
|---|
sys_user | Match the supplied username, email, or known sys_id | sys_id,name,active | One exact user |
sys_user_has_role | Active role grants for the affected user | role,inherited,user | All matching grants needed to establish direct roles |
sys_user_grmember | Memberships for the affected user | group,user | All matching memberships needed for inheritance tracing |
sys_group_has_role | Roles for the discovered group IDs | role,group,inherits | All matching role mappings for those groups |
sys_security_acl | Active ACLs for the requested operation matching the target table, parent tables, and table wildcards such as <table>, <table>.None, and *.None | sys_id,name,operation,active,advanced,script,condition,admin_overrides,type | All applicable ACLs; paginate deliberately if the bounded response is incomplete |
sys_security_acl | Active ACLs for the requested operation matching the exact field, parent-table field, and wildcard patterns such as <table>.<field>, <table>.*, *.<field>, and *.* | sys_id,name,operation,active,advanced,script,condition,admin_overrides,type | All applicable field ACLs; paginate deliberately if needed |
sys_security_acl_role | ACL reference is in the discovered ACL ID set | sys_id,sys_security_acl,sys_user_role | All role mappings for the discovered ACLs |
Step 3: Evaluate security rules & Trace failures
Once the data is retrieved, construct the evaluation tracing log:
- Aggregate User's Roles: Build a unique set of all role display names (direct and group-inherited) belonging to the user.
- Execute Table-Level ACL Evaluation:
- Filter active ACLs targeting the table directly (e.g.
table or table.None or *.None).
- If multiple active ACLs match: At least one ACL must pass (logical OR) for table access.
- For each matching ACL:
- Role Requirements Check: Does the user have at least one of the roles mapped to this ACL in
sys_security_acl_role? (If no roles are mapped to an ACL, it does not require a role, passing this step automatically).
- Condition Check: Does the record/context satisfy the ACL's
condition?
- Script Check: Does the
script evaluate to true?
- If all three items (Roles AND Condition AND Script) match, this ACL passes.
- If no table-level ACL passes, the operation fails at the table boundary.
- Execute Field-Level ACL Evaluation:
- Only execute this if table-level evaluation passed.
- Map field-specific ACLs in order of specificity:
table.field → parent_table.field → *.field → table.* → parent_table.* → *.*.
- Each level must pass. If a matching ACL is found, the user must satisfy its configuration (Roles AND Condition AND Script).
- If any applicable field-level constraint is failed, the operation fails.
Step 4: Formulate the Explanation Report
Generate a detailed diagnostic report in the user's language containing the precise reasons and recommendations.
Report Structure
When responding to the user, you must ALWAYS structure your output using the following layout (translated to the user's active language if non-English):
🔍 Access Diagnostic Report
Affected User: [User Display Name or Sys ID]
Target Table/Element: [Table / Field Name]
Current Operation: [read / write / create / delete]
🚦 Security Audit Summary
- Verdict:
[ACCESS GRANTED / ACCESS DENIED - Fail at Table-level / ACCESS DENIED - Fail at Field-level]
- Root Cause Summary:
[Brief, concise sentence explaining exactly why the access was denied, e.g., "The user lacks the 'itil' role required by the table-level read ACL."]
🧬 ACL Evaluation Trace
Construct a sequence showing which security rules were checked and their outcome:
| ACL Sys ID | Target/Name | Required Role(s) | Condition / Script Check | Status |
|---|
[Sys ID] | [e.g., incident.None] | [Required Roles list] | [Checked / Passed / Failed] | [❌ Fail (Role Missing) / Check condition / etc.] |
[Sys ID] | [e.g., incident.short_description] | [Required Roles list] | [Checked / Not run] | [Skipped (Table-level failed)] |
(Clearly list all matching ACLs found and mark which evaluated first, and what failed).
👥 Affected User's Active Roles
List the roles held by the target user that were discovered during evaluation:
- Directly Assigned Roles:
[comma-separated list of direct roles]
- Group-Inherited Roles:
[comma-separated list of group-inherited roles and the groups they came from]
🛠️ Recommended Corrective Actions
Provide technical, actionable, read-only remedies. Provide the exact path and sys_id of rules to adjust or roles to assign:
- Action Option A (Grant User Privilege): Assign the missing role (
[role_name]) to the user directly, or add them to the assignment group [group_name] which inherits the role. This is the recommended secure pattern.
- Action Option B (Modify ACL Rule): Adjust the ACL script or conditions under
sys_security_acl.do?sys_id=[acl_id] to allow the action.
Language Alignment / Multilingual Support
- ALWAYS communicate with the user, draft the Access Diagnostic Report, and formulate response summaries in the exact language used by the user in their active prompt or conversation context.
- Translate standard layout headers appropriately so the report remains fully aligned and native to the user's language (e.g., in Spanish:
# 🔍 Reporte de Diagnóstico de Acceso instead of # 🔍 Access Diagnostic Report, ## 🚦 Resumen de Auditoría de Seguridad instead of ## 🚦 Security Audit Summary, etc.).
- Technical Safeguard: KEEP technical system strings, ServiceNow table names (e.g.,
sys_security_acl), field names (e.g., sys_updated_by), role names (e.g., itil), Sys IDs, and filter intent in technical English to preserve precision.