Microsoft’s new ASSERT evaluation framework and Agent Control Specification (ACS) give developers a more disciplined way to test and constrain AI agents, but the important operational detail is easy to miss: ACS does not enforce anything by itself. The application or framework host must call the policy runtime at the relevant point in an agent workflow and must honor its verdict before a tool executes or data is returned.

That distinction turns Microsoft’s August 24 Command Line post from a generic “agent safety” announcement into a practical architecture decision for teams deploying tool-using assistants. ASSERT is the discovery and regression-testing layer; ACS is a portable policy-decision layer. Neither substitutes for correctly placed integration points in the agent, the tool gateway, or the service boundary that owns the sensitive action.

Microsoft first positioned the two open-source projects together at Build 2026, with ASSERT intended to translate written behavior requirements into generated evaluations and ACS providing a common runtime contract for decisions at agent lifecycle checkpoints. The Command Line post now illustrates the claimed workflow with a bank-support demonstration: discover failures through generated cases and traces, place a control at the failed boundary, then rerun the same test set to measure whether safety improved without breaking legitimate work.

The practical conclusion is sound: prompts can influence an agent, but prompts cannot reliably repair missing authorization coverage in a downstream service. If a sensitive loan-record tool never invokes the authorization check, adding tougher wording to the system prompt leaves the real enforcement gap intact.

Azure diagram shows an AI support agent using policy enforcement to govern banking tool calls, dashboards, and outcomes.The policy bug was coverage, not logic​

Microsoft’s first banking example starts with a policy that is deliberately broader than any one product: records marked with a sensitive risk_tier require verified authorization before they can be read or modified. The demonstration agent already had a working server-side gate for deposit accounts, yet loans, brokerage records, and client records did not call it.

That is a common failure mode in enterprise agent deployments. A team writes an authorization rule, tests it thoroughly around one early integration, and later adds tools or service routes that bypass the original boundary. The rule remains correct; the system architecture ceases to apply it everywhere the business requirement says it should apply.

ASSERT’s contribution is not that it proves policy correctness. Its job is to take a broad requirement, expand it into categories and test cases, run those cases against a live agent, and preserve evidence about what happened. Its documentation describes a pipeline that generates a taxonomy, creates prompts and multi-turn scenarios, executes the target, then emits verdicts and aggregate measurements. Crucially, the framework can capture OpenTelemetry traces covering model calls, routing, tool activity, and timing.

For an authorization policy, that trace evidence matters more than a polished final answer. An agent might reply that it cannot disclose a record, yet have already made a tool call that retrieved the record without authorization. Conversely, it might fetch the data only after a valid verification step. The final text alone cannot distinguish those cases.

The reported results from Microsoft’s 72-prompt demonstration are encouraging but should be read correctly. Microsoft says the baseline produced an 8% impermissible-behavior violation rate, the defensive prompt reduced that to 6%, and an ACS Rego policy reached 0%; all three kept the permitted-behavior violation figure at 0%. Those numbers come from a runnable synthetic demo, not a production banking system, a general industry benchmark, or a measurement of real customer behavior.

What the example does establish is the type of control that fits the defect. When an allow-or-deny decision depends on a normalized field such as risk_tier, policy-as-code is the appropriate mechanism. A single Rego rule can operate over a shared data property instead of relying on deposit-account prefixes, customer-ID patterns, or a long collection of per-service exceptions.

ACS needs an enforcement point, not a wish​

ACS is currently a public-preview specification and runtime within Microsoft’s Agent Governance Toolkit. Its contract is intentionally narrow: a host supplies a complete snapshot at an intervention point, ACS evaluates the relevant policy and returns a normalized verdict. The supported outcomes include allow, warn, deny, escalate, and transform.

The runtime is stateless and fail-closed. A malformed manifest, missing required path, policy-dispatch problem, or invalid transformation should yield a denial rather than a silent allow. That is useful for a security boundary, but it also carries an operational consequence: a production host needs explicit monitoring for deny spikes and policy-runtime failures. A fail-closed tool gate protects data; it can also stop legitimate work if a deployment breaks the snapshot schema or a required classifier endpoint becomes unavailable.

ACS is also not an agent framework and does not execute tools on its own. Microsoft’s own ACS tutorial is explicit that the host adapter makes the policy call and enforces the returned decision. Developers evaluating this for a Windows, .NET, Python, or Node.js agent should map their tool execution path first:

  • The host must invoke ACS before a high-risk tool call or after a sensitive tool result is returned.
  • The host must prevent execution, remove data, route the task for approval, or apply a transformation when ACS returns the matching verdict.
  • The snapshot must contain the authorization state, tool metadata, and normalized business facts that the policy actually needs.
  • The deployment must test the failure path in which ACS cannot make a decision, because fail-closed behavior is only safe when the product can handle a justified denial.

This is particularly important for multi-turn agents. ACS retains no hidden session state between decisions. If authorization was verified in an earlier turn, the host must supply a trustworthy representation of that verification at the later sensitive action. An application that merely assumes “the model saw the verification earlier in the conversation” has not created an authorization boundary.

The classifier example shows why blocking everything is not a win​

Microsoft’s second example addresses social-engineering language: requests such as an alleged manager demanding that a recorded approval step be skipped. Unlike a risk_tier, coercion is not necessarily visible in a typed business field. The post argues that a semantic classifier is more appropriate than a deterministic rule for this case.

Its 120-case test set contained 60 coercive requests, 30 legitimate requests with recorded evidence, and 30 routine legitimate requests. Microsoft reports that both a hardened prompt and an ACS classifier gate eliminated observed impermissible violations, but that the classifier preserved substantially more legitimate work. The stated permitted-behavior violation rate was 47% for the hardened prompt and 27% for the classifier, matching the baseline’s legitimate-work performance.

Again, those figures belong to the supplied demonstration. Still, the comparison illustrates a real engineering trade-off. Prompt hardening often suppresses unsafe behavior by making an agent hesitant in every adjacent case. It can therefore turn a safety intervention into an over-refusal problem. For a customer-support agent, a system that blocks properly documented requests may be technically cautious but operationally poor.

Microsoft frames this as a two-axis evaluation: impermissible behavior that must be stopped, and permissible behavior that should continue. That framing is more useful than a single “safety score.” Teams should add their own dimensions where they matter—unnecessary human escalation, incomplete task completion, latency, tool cost, and review workload—but should not allow those measurements to hide a hard security requirement.

The central technical caveat is that a classifier does not make an inherently semantic decision deterministic. In ACS, classifier output is an annotation used by the policy runtime; its quality, calibration, latency, model changes, and outage behavior remain part of the security design. Microsoft’s ASSERT-to-ACS guidance also says generated Rego and its report should be reviewed before deployment because policy generation can use an LLM. Generating a control bundle is a starting point for review, not proof that a policy is correct.

Regression gates are the durable part of the workflow​

The most reusable part of Microsoft’s proposal is the insistence on freezing the test cases before comparing fixes. If a team changes the prompt, the policy, the classifier, and the test data at the same time, it cannot tell whether the new result reflects a better control or simply an easier evaluation set.

For production teams, that suggests a workable release gate. Keep the discovered bad cases, representative permitted cases, and trace assertions in version control. Run a baseline against the unchanged set. Change one control boundary at a time. Require that forbidden actions remain blocked while legitimate paths do not regress beyond an explicitly agreed threshold. Then add newly discovered failures to the suite rather than replacing the old set.

ASSERT gives that process more scale than hand-written red-team prompts, especially for agents with multiple tools and branching workflows. ACS gives it a portable place to put deterministic rules and a structured way to combine those rules with classifier output or approval workflows. But the projects do not eliminate the difficult work: deciding what counts as authorization, ensuring every sensitive tool route passes through enforcement, and validating the result under realistic runtime conditions.

For Windows and enterprise IT teams, the immediate task is therefore narrower than “adopt agent guardrails.” Inventory each agent’s tool calls and data-return paths, identify the one service boundary that truly controls each sensitive operation, and ensure a policy decision is made there—not merely in the model prompt.