Refusals are recorded, not just successes

Every time someone reaches for something their role doesn't cover, the attempt is recorded with the capability they were missing.

What it is

Two kinds of refusal are logged at the capability gate: a signed-in person with no platform role probing a platform endpoint, and a staff member reaching for a capability their role doesn't include. Both rows carry the actor, the endpoint, the account in context and the reason.

Also called: denied access log · 403 log · attempted access · someone tried to open something

See it
Refusals are recorded, not just successes
Area
Operations
Group
Audit
System
Multi-Tenancy & Identity
Solves
3 named problems
01The gate records a denial with reason 'no platform access' for a caller with no role at all.
02It records a denial with reason 'missing capability' plus the role for a staff member who lacks it.
03Denials are never throttled.
The audit table filtered to denials, each row naming the missing capability and the endpoint. src/app/platform/audit/page.tsx. Sample data — no customer information appears here.
How it works
  1. 1The gate records a denial with reason 'no platform access' for a caller with no role at all.
  2. 2It records a denial with reason 'missing capability' plus the role for a staff member who lacks it.
  3. 3Denials are never throttled.
  4. 4The refusal returned to the caller names the missing capability, so a legitimate gap is diagnosable rather than mysterious.
Why we built it

The comment ranks these rows above the others: they are 'the most important rows in the table: someone reaching for something their role doesn't cover. A run of these is the earliest signal there is.' The other case is logged for its own reason: 'A signed-in person with no platform role probing a platform endpoint is worth a row on its own.' Not throttling them is deliberate — writes, denials and account entries 'are the record, and two of the same in a row is itself information.'

The problem
  • A log of successes alone can't show someone probing for access.
  • A generic refusal makes a legitimate permission gap indistinguishable from an attack.
  • Throttling would hide a repeated attempt, which is itself the signal.
Sound familiar?
What you get
Probing shows up as a run of denial rows.
A staff member blocked by a real gap can say exactly which capability they lack.
Refusals are never collapsed away by noise filtering.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →