Agent Access Enforcement

Agent Access Enforcement

An AI agent can inherit a person’s access in minutes. The platform could show that it had happened — it couldn’t stop it. This is how a one-off block became a rule, and why no rule goes live until it has been run against production first.

My Role
Lead Product Designer
Duration
2 Quarters
New enforcement rule Step 4 of 4
  • Scope
  • Condition
  • Action
  • Dry run
Dry run — what this rule would do today
17 matched
  • 14 agents — blocked, no recent activity
  • 2 agents — ran in the last 24 hours
  • 1 agent — holds a scheduled production job
Nothing has changed yet. Review the 3 flagged agents to continue.
Activate rule
4
Steps in the rule builder
Scope, condition, action, dry run — in that fixed order
6
Rule states designed
Including the two ways a rule fails after it looks finished
0
Rules that activate without a dry run
The preview is a step, not a link you can walk past

Scope of the work — not performance claims

The Problem

Visible, and still not stoppable

The platform was good at showing that an AI agent held access it shouldn’t. Doing something about it meant leaving the platform, opening someone else’s console, and revoking by hand — without being able to see what that would break.

So it mostly didn’t happen. Findings were acknowledged and deferred, quarter after quarter. The gap wasn’t detection. It was that nobody could be sure enough to act.

Access Review Sessions

Watched the people who sign off quarterly access reviews work through a list that now included agents.

  • Agents arrived with no named owner to ask
  • Nobody could say which were still in use
  • Removal was deferred rather than decided

Ticket & Incident Review

Traced what actually happened the handful of times an agent’s access was pulled.

  • Every block was manual and one agent at a time
  • Blast radius was discovered after the revoke
  • Rollback meant re-granting permissions by hand

Engineering Walkthrough

Established what enforcement can promise, and at which moment it can promise it.

  • The block executes in the source system, not ours
  • Confirmation is asynchronous and can fail hours later
  • Identity attributes are reliable; ownership is not

Constraints

Three facts about enforcement that decided the shape of the flow

Constraint 01

The undo isn’t symmetrical

Blocking takes one click. Restoring means re-granting each permission by hand, in the source system, and any job that failed in between has already failed.

Rules outAny flow that treats activation as a low-stakes save.
Constraint 02

Ownership is usually missing

Agents are created by automation and inherit their access from a human, a service account, or another agent. More often than not there is no person to route the decision to.

Rules outApproval routing and “notify the owner” as prerequisites for acting.
Constraint 03

We don’t own the moment of enforcement

The rule is written here and executed elsewhere. The target system can accept it, partially apply it, or reject it — and tell us hours later.

Rules outA UI that confirms success at the moment of save.

The hard part was never writing the rule. It was letting someone be certain before they were committed.

Decisions

What I considered, what I chose, and what made the difference

How a rule picks its targetsDecision 01
Considered

Select agents from a list and block the selection.

Chose

A rule keyed on identity attributes, with the matched set resolving live underneath it.

Because

A saved list is stale the moment it’s saved. Agents are created continuously, and the access that matters most belongs to the one that doesn’t exist yet.

Where the preview sitsDecision 02
Considered

An optional “preview matches” link beside the save button.

Chose

A dry run as the mandatory fourth step. The rule cannot be activated until it has run against production data.

Because

Constraint 01. A preview you’re allowed to skip is the one that gets skipped on the day it mattered — and the cost of the wrong rule is a live workflow stopping mid-run.

What a block actually isDecision 03
Considered

A one-time action on the agent row — press it and it’s done.

Chose

A rule as a persistent object with its own lifecycle and six named states.

Because

Enforcement is continuous, not an event. A state a rule can sit in is a state someone can be shown, alerted on, and asked to review.

What happens when the target system says noDecision 04
Considered

Retry quietly in the background and keep the rule showing as active.

Chose

“Failed to land” as a first-class state on the rule, carrying the reason the target system gave.

Because

Constraint 03. A rule that reports active while the block was rejected is worse than no rule — it removes the reason to check.

01
Draft

Scope and action set. Nothing is enforced and nothing is promised.

02
Dry run complete

Matched set resolved against production, timestamped. Activation unlocks here.

03
Active

Applied and confirmed by every target system in scope.

04
Partially applied

Landed in some systems, not others. Names which, and why.

05
Failed to land

Rejected downstream. The rule exists; the block does not.

06
Retired

Turned off deliberately, with the matched set it last held kept on record.

States 04 and 05 are the two that don’t appear in any happy-path spec — and they’re the reason the lifecycle exists at all.

A dry run has a date on it

The result is stamped with when it ran and against what. If the environment has changed since, the rule re-flags and asks for a fresh run rather than quietly activating on a week-old picture.

Blocked is not deleted

The rule stops access; it never removes the identity. The word “block” is used at every step — in the builder, on the rule, in the audit entry — so nobody has to guess whether something is recoverable.

Outcome

What shipped, and what it changed

Enforcement moved inside the platform

The block is written where the finding is read. No second console, no manual revoke, no gap between noticing and acting.

A rule that catches the agent created tomorrow

Attribute-based scope means enforcement doesn’t decay between access reviews the way a saved list of names does.

Certainty before commitment

Every rule shows what it would do, against real data, before it is allowed to do it — and flags the matches that carry real risk instead of returning a count.

Failure that says so

Six states, two of them failures with names. A rule can no longer look like it’s protecting something it isn’t.

What I’d do differently

I designed the creation flow before the rules list. But the list is where you land when something has already gone wrong, and it got the last two weeks instead of the first. Next time I’d design the screen you open under pressure first, and let the builder inherit its vocabulary — not the other way round.

All visuals rebuilt with synthetic data. Product and vendor names withheld under NDA.