ai

Policy Drift Checker: An AI Agent That Tests Agent Rails Against Reality

The Policy Drift Checker is an AI agent that compares rail cards with what the audit ledger shows agents actually did on a customer data platform (CDP). AI governance leads run it at read level (L1), on metadata only. It reports differences and names the rail owner to notify. It never changes a rail, pauses an agent or reads customer payloads.

Rail level: L1 · Risk: low · Function: compliance privacy security

By Art Kukharenko · Published · Updated

All AI agent rails

In the AI agent rails method, the card is the claim and the ledger is the evidence. This agent tests one against the other, and the compliance, privacy and security playbook places it in the wider function.

Rail at a glance

The Policy Drift Checker's rail allows metadata alone, so it can compare what a run did without seeing what the run touched.

FieldValue
JobCompare rail cards with what the ledger shows agents actually did.
TriggerA schedule, or a rail or policy change.
Data scopeRail cards, ledger metadata and policy versions, with no payloads.
Tool scopeRead: rail cards, ledger metadata, policy versions; propose: no changes; execute: no actions, and no pause tool.
Output contractDifferences found, severity, and the rail owner to notify.
GateNone for reports, because the rail owner decides any change.
LimitsLedger metadata only, under a set budget per run.
LedgerRail versions compared, findings, owner notified.
EvaluationSeeded out-of-scope tool calls and undocumented changes.
Owner and kill switchAI governance lead; stopping the schedule leaves the ledger recording as before.

What it does and who uses it

The Policy Drift Checker tests a simple claim: the card says one thing, and the ledger should show the same. Infrastructure teams know the idea from configuration drift, where Terraform compares recorded state with real resources 2.

Illustrative run: a weekly job compares last week's ledger metadata with each rail card in force, and it raises three findings. A Reporting Summariser run called a query ID outside its fixed list, rated high. The Segment Drafter rail shows a new model version with no regression pass on record. The Journey QA Reviewer rail has had no named owner for three weeks. A notification service tells each rail owner, and the checker takes no action. Any demotion comes from written triggers in the control plane, not from this agent.

Most of the comparison is set arithmetic, so code should do it and the model should only explain the result. The mapping below is illustrative.

Rail card saysLedger showsFindingComputed by
Tool scope lists these toolsA call to another toolOut-of-scope callCode
Gate binds approval to a hashAn execution with no hash, or a different oneGate bypassCode
Limits cap runs or sizeCounts above the capLimit breachCode
A regression pass precedes a model changeNew model version, no pass on recordUndocumented changeCode
A named owner holds the railOwner field empty or vacatedOwnerless railCode
One jobRequest types spreading beyond that jobPossible job creepModel, as a hypothesis

Why this level

Reading metadata and writing a report leaves production alone, so a wrong finding costs attention and nothing more. Read level (L1) is where the Policy Drift Checker stays.

The Rule of Two 1 count is short. Values in ledger metadata can originate with the agents under review, so treat them as untrusted input. The session holds no payloads and has no way to change state, which leaves one property of three.

It will never gain a pause button. A checker that can stop what it checks puts detection and enforcement in one place, so one bug or hijack could halt every rail at once. OWASP's agentic list names tool misuse and rogue agents among its risks 3, and an independent witness helps expose both. Keep enforcement in the systems that already hold it, and see the rail levels for how demotion triggers work.

Three ways it fails, and the control for each

Drift checks are only as honest as the record they read.

FailureWhat it looks likeControl
Blind to what was never loggedA tool call bypasses the ledger writer, so the comparison looks clean.Each report states its coverage. The platform reconciles gateway counts with ledger counts and writes the result to ledger metadata, and any mismatch is rated high.
Card edited to match behaviourA run under version 3 is tested against version 4, or an owner widens a card so a finding disappears.Code joins each run to the card version in force by timestamp. Card changes need sign-off, and a widening that follows a finding is itself reported.
Findings with no consequenceReports arrive, nobody acts, and old findings fade from view.Findings stay open against the rail until its owner records a decision. Aged items go to the AI governance lead, grouped by rail and role, not by person.

How to evaluate it

Drift detection can only be scored against drift you planted, so seed it deliberately. Write seeded entries to a test ledger, since a production ledger is append-only and should stay free of fake runs.

  • Seeded drift found, broken down by out-of-scope call, gate bypass, limit breach and undocumented change.
  • Time from drift to report, measured from the seeded event's timestamp.
  • False findings at version boundaries. Include runs that straddle a card change, where naive comparisons go wrong.
  • Audit coverage, the share of gateway calls with a matching ledger entry.
  • Decision age, how long findings wait for an owner, reported per rail.

Someone else should check the checker, because no agent should mark its own work. A person samples its ledger entries against the seeded results.

Where it runs

Ledger metadata carries no customer payloads, so contract terms decide whether an external model is acceptable. Rail cards and tool names still reveal your control design, which favours a private model in regulated teams, as the boundary architecture patterns explain. PrivyCDP provides an immutable audit ledger that names the authorising actor on each AI-assisted action, which gives such a comparison something firm to read, but the checker is not part of the product.

Browse the agents this one watches from the AI agent rails hub. Without a written claim there is nothing to test, so start with the rail card template.

Browse use casesFunction playbooksAgent roster

FAQ

What is policy drift for AI agents?

The gap that opens between what an agent's written rules allow and what it actually does. Causes include a new tool, a model change nobody tested, or a limit quietly raised. Comparing the card with the ledger makes that gap visible.

Why can't the checker pause an agent that breaks its rail?

Separating detection from enforcement limits the damage from a fault in either. Written demotion triggers and owners act on findings. If the checker could pause agents, one bad report or hijacked session could stop every rail at once.

Does a clean report mean the agents are compliant?

No. A clean report means no differences appeared in what the ledger recorded, for the rails compared. It says nothing about whether the rail was well designed, or about anything the ledger never saw.

Sources

  1. Meta, Agents Rule of Two, counted here for a metadata-only session
  2. HashiCorp, detecting and managing resource drift in Terraform
  3. OWASP GenAI Security Project, Top 10 for Agentic Applications for 2026

Further reading

Published: · Updated:

Editorial dates describe content changes. Confirm current sources before making legal, security or purchasing decisions.