On this page
- Ten small refunds, one large loss.
- Why do AI agent policies need history?
- What is a feature store for AI agent decisions?
- How is this different from a feature pipeline?
- Freshness is part of the definition
- Record the snapshot with the decision
- History informs. It doesn't reserve.
- Common anti-patterns
- Ten rules for history-aware agent decisions
- The result: rules that see the pattern, not just the request
- Frequently asked questions
- How Frozion gives policy the history
- Sources
A feature store for AI agents computes history about people, accounts and records (counts, totals and status over time) so a policy can judge each request alongside earlier ones. Good features have freshness limits, and the values used are snapshotted with the decision. History informs a decision; it doesn't reserve capacity, so concurrent requests can still overshoot a limit.
Ten small refunds, one large loss.
A retailer lets its customer-service agent issue refunds up to $200 without review. The rule is sensible: most refunds are small, and making a person approve each one would bury the team.
One evening, a single account asks for a refund on a damaged item. Approved: $184. Twelve minutes later, a different order, a similar story. Approved: $176. By the end of the hour the agent has issued ten refunds to the same account, each under $200, for $1,830 in total. Every decision checked the amount against the limit. Not one of them asked how many refunds this account had already received tonight.
The policy was correct for a single request. It failed because it had no memory of the business, only of the request in front of it.
Why do AI agent policies need history?
Because many risky patterns are invisible in a single request. Volume, velocity, cumulative totals and recent status changes only appear when a decision can see what already happened.
Agents make this worse in two ways. They act fast and tirelessly, so a pattern that would take a person a week can happen in an hour. And they're easy to steer: a customer, a compromised account or a manipulated prompt can split one large request into many small ones, each within limits. OWASP's agentic risks include exactly this kind of misuse of legitimate tools, where every call is allowed and the sequence is the problem.
Typical questions a policy needs answered:
| Signal | Example feature | What it catches |
|---|---|---|
| Velocity | Refunds for this account in the last hour | Many small requests in a burst |
| Cumulative value | Total refunded to this account in 30 days | Limits evaded by splitting |
| Recent change | Hours since bank details or email changed | Takeover followed by payout |
| Status over time | Open disputes or chargebacks on this account | Acting while something's unresolved |
| Agent behaviour | Actions by this agent in the last 10 minutes | A loop or runaway tool use |
| Ratio | Refunds as a share of orders this quarter | Gradual abuse below every per-request limit |
What is a feature store for AI agent decisions?
It's a store of computed facts about history, such as counts, totals and status over time, kept fresh and ready at decision time so a policy can judge an agent's proposed action in context.
The term comes from machine learning, but the job here is different. The main consumer isn't a model. It's a rule: "hold for review if refunds in the last hour are three or more, or if the 30-day total exceeds $1,000." The features are business quantities people can read, argue about and sign off.
How is this different from a feature pipeline?
Feature pipelines are built for model training and inference, maintained in code by data teams. Decision features serve policy, so they're authored by the people who own the rule, in SQL or visually, with freshness and snapshots built in.
| Feature pipelines (ML) | Decision features for agent policy | |
|---|---|---|
| Main consumer | Models, in training and inference | Policy rules, at the moment of action |
| Authored by | Data engineers, in pipeline code | Risk, operations and platform teams, in SQL or visually |
| Typical values | Embeddings, encodings, statistical transforms | Counts, totals, ratios, status, time since |
| Key concern | Training and serving consistency | Freshness at decision time and an audit trail |
| What's recorded | Model inputs, often sampled | The exact values each decision used |
Most features an agent policy needs are window queries over operational data. A count of refunds in the last hour per account is a few lines of SQL with a window function or a grouped time filter. Authoring it directly, or building it visually, keeps the definition next to the rule that uses it, rather than in a pipeline repository few risk owners will ever read.
Freshness is part of the definition
A feature is only as good as its age. "Refunds in the last hour" computed 40 minutes ago misses most of the hour.
Give every feature a freshness limit: the oldest value a policy may use. Refund velocity might need to be under a minute old; a 90-day dispute rate can be a day old. Then decide in advance what happens when a feature is older than its limit or missing. The safe default for consequential actions is to hold the request for a person, not to allow it on stale data and not to treat "no value" as zero.
Features can be refreshed on a schedule, or triggered by an event through an API call when the underlying data changes: a refund issued, a bank detail updated, a dispute opened. Event-triggered refresh keeps velocity features close to current without recomputing everything constantly.

Record the snapshot with the decision
When a policy allows or holds an action, record the feature values it read, with their timestamps and the feature version. A month later, the current count for that account will be different. The question an auditor asks isn't "what's the count now?" but "what did the rule see when it decided?"
This also makes changes safe. When someone proposes tightening a rule, you can run the new version against recorded decisions and their snapshots to see which past requests it would have held. See audit trails versus evidence for what else a decision record needs.
History informs. It doesn't reserve.
This is the honest limit of the pattern. A feature describes what has already happened. It doesn't hold a place for what's about to happen.
Suppose the rule allows up to five refunds an hour, and the count is four. Two requests arrive at the same moment. Both read four, both pass, both refund. The account now has six. Event-triggered refresh narrows the gap but can't close it, because reading history and acting on it are separate steps.
For most risk rules, that's fine: the goal is to catch patterns, and one request over a soft threshold is still caught on the next. Where a limit must be strict (a credit line, a budget, an inventory allocation) the reservation has to happen where the value is committed:
- Reserve in the system of record. Use an atomic, conditional write: decrement the remaining budget only if enough remains.
- Serialize per entity. Process actions for the same account one at a time where the stakes justify it.
- Use features for judgement, not for accounting. Let history decide whether to hold or escalate; let the ledger decide whether capacity remains.

Common anti-patterns
| Anti-pattern | Why it fails | What to do instead |
|---|---|---|
| Per-request limits only | Splitting and bursts stay under every limit | Add counts, totals and velocity to the rule |
| Treat a missing feature as zero | No data looks like no risk | Hold consequential actions when features are missing or stale |
| No freshness limit | Old values hide recent bursts | Set and check a freshness limit per feature |
| Features buried in pipeline code | Rule owners can't read or review them | Author in SQL or visually, next to the rule |
| Recompute history at audit time | Today's values aren't what the rule saw | Snapshot feature values with every decision |
| Use history to enforce a hard cap | Concurrent requests both read under the limit | Reserve atomically in the system of record |
| Ask the agent to "keep track" in memory | Agent memory is unverified and easy to steer | Compute features from operational data |
Ten rules for history-aware agent decisions
- Judge each consequential request alongside the ones before it.
- Define features as counts, totals, ratios, status and time since, per entity.
- Give each feature a window, a version and an owner.
- Set a freshness limit for every feature, and check it at decision time.
- Hold the action when a feature is missing or too old.
- Refresh velocity features on events, not only on schedules.
- Author features in SQL or visually, where rule owners can read them.
- Record the feature values, their age and version with every decision.
- Test rule changes against recorded decisions before publishing them.
- Remember that history informs, it doesn't reserve: put strict limits in the system of record.
The result: rules that see the pattern, not just the request
Per-request limits are a good start, and on their own they're blind to the patterns that matter most when agents act fast and at volume. Decision features give policy the context a careful person would have: how many, how much, how recently, and what's still unresolved.
Built well, they're readable by the people who own the risk, fresh enough to trust, recorded with every decision, and honest about their limits. The tenth refund gets judged with the nine before it, and when a limit truly can't be crossed, the ledger, not the history, says no. Agent memory isn't a substitute: see memory versus application state.
Frequently asked questions
What is a feature store for AI agents?
It's a store of computed facts about history, such as refunds in the last hour, total spend this month or days since an account changed, kept fresh and available at decision time so policies can evaluate an agent's proposed action in context rather than in isolation.
How is this different from an ML feature store?
ML feature stores mainly serve model training and inference, built and maintained through feature pipelines in code. For agent decisions, the main consumer is policy: features are business counts and totals, authored in SQL or visually, with freshness limits and snapshots recorded with each decision.
Can a feature store enforce a hard limit on agent actions?
It can flag and hold requests, but it can't strictly cap them on its own. A feature describes what has already happened. Two concurrent requests can both read a count below the limit and both pass. For a strict cap, reserve against the limit in the system of record with an atomic, conditional write.
How does this work for agents we already run?
Route the agent's tool calls through a governed runtime over MCP or HTTPS. Before each consequential call, policy reads the relevant features (counts, totals, recent status) and decides to allow, hold for a person or block, with the snapshot recorded.
How Frozion gives policy the history
In Frozion, policies decide with history. The Feature Store computes counts, totals and status over time, triggered by API or on a schedule. Teams author features in SQL, window functions included, or visually, with no pipeline code to maintain, and set the freshness limit for each one. Rules built in the Visual Policy Builder read those features before and after every step. Provenance & Evidence keeps one tamper-evident record per decision, so the rule and the facts it used stay together with the approval, the attempt and the confirmed outcome.
Sources
- OWASP Top 10 for Agentic Applications (2026)ASI02 tool misuse, including repeated or runaway use of legitimate tools.
- OWASP LLM06:2025 Excessive AgencyRate limiting and limits on the actions an LLM-driven tool can take.
- NIST SP 800-162, Guide to Attribute Based Access ControlEnvironment conditions as inputs to per-request decisions.
- NIST AI Risk Management Framework 1.0Documenting the data and context behind AI-informed decisions.
- W3C PROV-ORecording which inputs, at which time, produced a decision.
- EY survey on AI governance, September 202672% worry they can't trace the lineage behind critical AI decisions.
More in Data & context
Context assembly 2
Retrieval & data access 3
State, memory & features 2
Other topics



