← All topics

Permission Inspector

Ask why a user can or can't see an object, a field, or one specific record. OrgBolt walks the org's visibility model, names the layer that decides it, and offers the smallest change that would fix it.

What it does

Ask in a task, in plain language: "why can't Jack see Annual Revenue on Account?", or the other way round — "why CAN this contractor see that account?". OrgBolt walks the org's visibility model one layer at a time and answers with the layer that decides it.

Every verdict names its evidence: which profile, which permission set, which sharing rule, which page. You can check any claim in Setup yourself. A progress panel shows each layer as it lands, so a trace that takes a few seconds looks like work happening.

A trace reads. It changes nothing in your org until you click a fix, and it tells you exactly what that fix would add before you do.

What it checks, in order

LayerThe question it answers
LicenseWhich license the user holds
User activeIs the user active at all
Object permissionsRead on the object — including View All, Modify All, View All Data and Modify All Data
Field-level securityRead on the field — including View All Fields, which overrides field security outright
Record typesWhether record types constrain the answer
Sharing modelOwnership, the org-wide default, the role hierarchy, sharing rules, queues and share rows
Restriction rulesWhether an active restriction rule takes back what sharing gave
Record page visibilityWhich Lightning page the user gets, and whether the component or field is visible on it

The walk stops at the first layer that says no. That layer is the answer, and every layer after it is marked "not evaluated — access is already denied at …" rather than left out. You read one cause, not a wall of diagnostics.

When a record is granted, the trace names the path that granted it — the user owns it, their queue owns it, the org-wide default is public, the role hierarchy reaches down to the owner, a named sharing rule shares it, or a share row does. When it is denied, the trace lists every path it checked and why each one failed.

What it will not guess

Salesforce does not publish an answer for everything. Where that is true, the trace says so instead of inventing one. These layers report as "not traced" and never as a verdict:

  • Whether a license type admits an object. The licence itself is named; the entitlement is not queryable.
  • Per-user record type visibility, when the object has record types. An object with none cannot be constrained by them, and that case is answered.
  • Grant Access Using Hierarchies on a custom object. Salesforce exposes no API for the toggle, so the trace says it assumed it is on — if you cleared it in Setup, that path is wrong and the trace tells you to check.
  • Whether a session-based permission set is activated in the user's session right now. Such a set is reported as a near miss, not as a grant.

OrgBolt also checks itself. After the walk reaches its own verdict, it asks Salesforce the same question and compares the two answers. If Salesforce grants access that no traced path explains, the trace says the grant comes from a layer it does not model — implicit sharing from a parent record, a territory, or an Apex share — and refuses to name which. A wrong cause is worse than an honest gap: you would go and change the wrong thing.

Tracing one specific record

Object and field questions need no permission from you — permission sets, profiles, sharing rules and page layouts are configuration, and OrgBolt reads configuration all the time. A question about one record is different. Reading who owns it, which shares are on it, and what Salesforce says about it means reading record data, and that needs the same standing permission as a data query.

Without it, the trace still runs and still answers. Object, field, record type and license layers all complete; the record layers are marked skipped with the reason, and the chat offers you two choices: allow record data for this org and re-run, or keep the partial answer.

There is no "allow once" for a trace. That choice approves one exact SOQL statement, and a trace composes its own reads — there would be nothing for your approval to match. A trace offers the standing permission or the partial answer, and nothing between them.

The permission is re-read every single time a trace runs, so revoking it in Settings → Orgs stops the record reads on the very next trace, including part-way through a task.

The fix, and why that one

When the trace ends in a denial it can fix, it offers two options side by side: the best existing permission set (or permission set group) in your org, and a new one scoped to just the missing privilege. Both always render, because the trade-off between permission-set sprawl and least privilege is yours to make, not OrgBolt's.

"Best" means the smallest addition for that specific user — the candidate that adds the fewest privileges they do not already hold. Not the smallest set in the org: a five-permission set is the wrong answer when the user already has four of the five and a forty-permission set would add three. The score is arithmetic over what each set grants, so you can reproduce it. The AI does not rank the options.

  • A set that would not actually lift the denial is never offered, however small it is.
  • A set carrying View All Data or Modify All Data is dropped, not ranked — it would score as a tiny addition while handing over every record in the org.
  • A session-based set is not offered: assigning one grants nothing until the user activates it in their session.

One cause swaps the first button. When the user is already assigned to a set that grants what they are missing — and that assignment has expired — assigning another set would be the wrong fix. The trace names the expired assignment, says when it expired, and offers to renew it instead, next to the same scoped-new-set alternative. You choose how long the renewed access lasts: 7, 30, or 90 days, or no expiration. Nothing is pre-selected, and nothing is renewed until you choose.

Expired assignments are easy to misread in Setup, because Salesforce hides them from ordinary queries — a user can look unassigned while a hidden expired assignment still blocks re-assigning the same set. The trace reads the one API that still returns them. That is how it can tell "never had access" apart from "had access until the 14th", and why its renew button revives the exact assignment instead of piling on a new one.

Applying either fix — an assignment or a renewal — immediately runs a second trace, so you get a before-and-after view. That is what lets you tell the person who filed the ticket "verified fixed", with the evidence attached.

A denial at the record-page layer offers no fix. A field hidden by a page visibility rule is not fixable by assigning a permission set, and OrgBolt will not pretend otherwise — it names the page and the rule so you can edit the right thing.

What is kept

  • The saved trace holds the object, the field, and the record's 18-character Id. Nothing else about the record.
  • No record values are stored, and no display names. Names appear on your screen while the trace runs and in the task transcript, because you typed one and read the other.
  • Every trace writes an audit row — permission_trace.completed — carrying the verdict, the layer that decided it, and whether OrgBolt's answer and Salesforce's own answer agreed.
  • Applying a fix is audited the same way permission set assignment always has been.

Traces stay with the task. Deleting the task deletes them; deleting your account purges them.

Common questions

Does a trace change anything in my org?
No. The walk only reads. The one thing that writes is a fix you click, and that is a permission set assignment you can undo in Setup like any other.
Why does it say "not traced" instead of yes or no?
Because Salesforce publishes no answer for that layer. OrgBolt could guess, and a guess would send you to change the wrong setting. The layers this affects are listed above, and the object and field layers still carry the real answer for most tickets.
I named a user and got a list of people instead.
Several users matched what you typed. Pick one from the buttons and the trace runs. Nothing was traced in the meantime — OrgBolt will not choose a person for you when it is not sure which one you meant.
Can I trace a record by name rather than by Id?
Turning a record's name into its Id is itself a record read, so it goes through a data query and its permission prompt. Ask for the record in the same task and the AI will look it up, then trace it.
What does a trace cost?
It runs inside an ordinary AI message and is metered like any other message. There is no separate charge for a trace.