THIS EXPLANATION
THE ROOM
CDA·64 Computing, Data & AI 6 MIN · 8 STATIONS

Deciding apart from enforcing

A Socratic walk-through of deciding apart from enforcing — reasoned out one step at a time, not lectured.

abcdefgh
a

The question we started with

THE QUESTION #

Why separate the thing that decides whether you may from the thing that stops you?

Picture a guard at a door. He knows the rules and he is standing in the way, so he can both judge you and stop you. Splitting him into two — a judge somewhere else who says yes or no, and a doorkeeper who only obeys — looks like pure loss. You have added a message, a wait, and a second thing that can fail.

So the split must be buying something the single guard cannot supply. What is it that one guard, at one door, is structurally bad at?

b

Reasoning it through

REASONING #

Start by adding doors. A system rarely has one entry point; it has an API gateway, a message consumer, a database proxy, a batch job, a mobile client, an admin console. If each of those carries its own copy of the rules, then the rules exist in six dialects, written by six teams, in six languages. Ask yourself the practical question: who can now answer "which staff can approve a refund over ten thousand?" Nobody can, without reading six codebases — and a rule change means six deployments that will not land on the same day.

That already gives most of the case. Pulling the judgement into one place — the policy decision point — makes the policy a single artefact you can version, review, test against synthetic cases, and query. The doorkeeper — the policy enforcement point — shrinks to something almost mechanical: gather the request, ask, obey. The vocabulary is old; RFC 2753 named these roles for network policy in 2000, XACML formalised them for access control, and NIST's zero-trust architecture (SP 800-207) reuses the same shape with a policy engine behind an enforcement point.

Now notice something that the "guard" picture hides. The decision point usually does not hold the facts it needs. Whether you may approve that refund depends on your role, your department, whether your device is managed, whether it is inside working hours, whether the customer is flagged. Those live in a directory, a device registry, a clock, a risk service. So the decision point queries them — the policy information point role — and the answer becomes a function of policy plus attributes, not of code plus attributes. That is the real separation: rules on one side, facts on another, and enforcement on a third.

What does the answer look like? Not simply true or false. XACML defines four outcomes — permit, deny, indeterminate, and not-applicable — and the last two matter, because "the policy did not evaluate" is very different from "the policy said no". Decisions can also carry obligations: permit, but mask these columns; permit, but write this audit record; permit, but only for the next five minutes. The enforcement point is not just a gate, then; it is a gate that must carry out attached instructions faithfully.

And what happens when the decision point is unreachable? This is the question that turns the pattern from a diagram into an engineering problem. Fail closed and an outage in the policy service becomes an outage in everything. Fail open and the same outage silently disables your access control. Most real systems buy their way out with cached decisions and short-lived tokens — which trades availability for staleness, since a revoked permission stays honoured until the cache expires. There is no answer here that is free; there is only the choice of which failure you prefer, made deliberately rather than discovered at three in the morning.

One more thing, and it is the one people get wrong. Separating the two does not move power to the decision point. The enforcement point still holds all of it. A decision is advisory data; if a request can reach the resource by a path with no enforcement point on it, the policy simply did not happen. Which is why enforcement is pushed into places that cannot be routed around — a sidecar proxy every call must traverse, a gateway that owns the only network path, a kernel that owns the syscall.

c

The analogy

THE ANALOGY #
THE FIGURE

Think of a court and a bailiff. The judge holds the law, hears the facts, and rules; the bailiff holds the door and the handcuffs. The bailiff does not reason about statute, which is precisely why the ruling is consistent across every courtroom in the country, and why amending the statute does not require retraining every bailiff.

WHERE IT BREAKS DOWN

A bailiff can be handed a forged ruling on convincing paper, and a court can take months — whereas an enforcement point must verify that the decision genuinely came from its decision point, and must usually act in single-digit milliseconds, often on a ruling cached from a few minutes ago that may already be wrong.

d

Clarifying the model

THE MODEL #

Three refinements tie this together.

First, "separate" means separate responsibility, not necessarily separate machines. A decision point can be a library compiled into the service, a sidecar on the same host, or a remote service; the pattern is preserved as long as the policy is authored and evaluated as one artefact rather than scattered through business logic. The distributed deployment is the version that costs latency, and it is chosen when you need one policy across many runtimes, not because remoteness is the point.

Second, this is not the same distinction as authentication versus authorization. Authentication establishes who is asking; the decision point consumes that as one attribute among several. A perfectly authenticated caller can still be denied, and much of the interesting policy is about context — device, location, time, sensitivity of the resource — rather than identity alone.

Third, the split makes auditability possible rather than automatic. Because every decision is a request and a response, you can record the attributes, the policy version and the outcome, and later answer "why was this allowed on that Tuesday?" — but a log line saying "permit" without the facts that produced it explains nothing.

e

A picture of it

THE PICTURE #
Deciding apart from enforcing
Deciding apart from enforcing Start at the angled input node and follow it into the enforcement point -- the box on a path the caller cannot avoid. The diamond is the decision point: everything entering is a question, everything leaving is an answer. Trace the short loop out to the store shape and back, which shows the decision point fetching facts it does not own. Then take the three exits: two ordinary outcomes, and the dashed edge to the hazard node, which is what decides your real posture -- what the doorkeeper does when the judge does not answer. {"generator":"mermaid-svg-renderer@3.2.1","source":"../Socrates/.diagram-cache/_src/deciding-apart-from-enforcing.md","sourceIndex":1,"sourceLine":4,"sourceHash":"874b810404c08d59e1d8faf825d19875826b0a5fa0b4cfe0b986fcc393dc6a8e","diagramType":"flowchart-v2","layoutVariant":"source","repairedDuplicateIds":[],"motion":"entrance-with-reduced-motion-fallback","presentation":"editorial","attempt":1,"viewBox":{"x":0,"y":0,"width":1340,"height":699},"qa":{"passed":true,"findings":[]}} who, what, in whatcontext needs a fact role, posture, time permit, plus obligations deny, or indeterminate unreachable Request arriving with a token Enforcement point on the onlypath Decision point evaluates policy Attribute sources: directory,device, clock Forward, apply obligations, log Refuse and log the reason Fail closed, or serve a stalecached decision
KINDSsourceprocessdecisionoutcomeriskconnector

How to readStart at the angled input node and follow it into the enforcement point — the box on a path the caller cannot avoid. The diamond is the decision point: everything entering is a question, everything leaving is an answer. Trace the short loop out to the store shape and back, which shows the decision point fetching facts it does not own. Then take the three exits: two ordinary outcomes, and the dashed edge to the hazard node, which is what decides your real posture — what the doorkeeper does when the judge does not answer.

f

What became clearer

WHAT CLEARED #
WHAT CLEARED

The split is not about doors and rules being different topics; it is about a rulebook needing exactly one author while enforcement needs to be everywhere. Centralising the judgement makes policy reviewable, changeable and auditable in one place, at the cost of a hop, a dependency, and a staleness window — and the enforcement point, though it does no thinking, is still where all the actual power lives.

g

Where to go next

ONWARD #
  • Fail-open versus fail-closed, and how short-lived cached decisions try to have both.
  • Policy-as-code languages such as Rego or Cedar, and what makes a policy testable.
  • Why revocation is hard once decisions are cached — the same problem that makes signing out everywhere difficult.
h

Key terms

TERMS #
TermWhat it means
Policy enforcement point (PEP)the component sitting on the request path that blocks or permits, and carries out any obligations attached to a decision.
Policy decision point (PDP)the component that evaluates policy against the request and its attributes and returns an outcome.
Policy information point (PIP)a source of attributes the decision point queries, such as a directory or device registry.
XACMLan OASIS standard for access-control policy that defines these roles and the permit / deny / indeterminate / not-applicable outcomes.
Obligationan instruction returned alongside a permit that the enforcement point must perform, such as masking a field or writing an audit record.
Fail closed / fail opendenying, or allowing, when the decision point cannot be reached.

Every term the collection defines is gathered in the glossary.

Nearby on the shelf

4