The problem
PolicyEvaluator wraps AGT's v4 Cedar backend:
# src/cmcp_runtime/policy/evaluator.py
from agent_os.policies.backends import CedarBackend
That module no longer exists upstream. microsoft/agent-governance-toolkit#3444 replaced the v4 policy language with ACS v5 across the Python runtime and deleted agent_os/policies/backends.py. On AGT main there is no CedarBackend outside a migration CLI helper.
We do not notice because agent-governance-toolkit-core>=4.0 resolves to 4.1.0, tagged 2026-06-09, which still ships the module. Every release after it on that line has moved on.
Why this matters now
It is already blocking security work. #471 needs cryptography>=49.0 to close two reachable advisories, and the agt-core releases that permit it are the same ones that removed the API we import. The short-term answer there is a 4.1.1 backport, which is the right call for a CVE fix but does not change the underlying position: we are one dependency resolution away from a broken gateway, and pip will make that choice for us the moment our floor moves or 4.1.0 is yanked.
The exposure is not marginal either. Cedar evaluation is the enforcement path. If it breaks, cMCP allows or denies nothing correctly, and the demos, the web console, and every conformance claim go with it.
What needs deciding
- Migrate to ACS v5. Understand what replaces
CedarBackend, whether policy bundle hashing and the mode="auto" cedarpy/cli/builtin selection have equivalents, and what happens to the annotation extraction in _advice_for_deny that reaches into _build_cedar_request. That last one already depends on a private attribute, so it will not survive untouched.
- Or vendor the evaluation we need. We use a small surface:
evaluate(context), _build_cedar_request, and the backend-mode selection. cedarpy is already a direct dependency of ours. Owning ~200 lines against cedarpy directly would end the coupling, at the cost of maintaining it.
- Or pin exactly and accept it.
agent-governance-toolkit-core==4.1.0 makes the current state explicit instead of accidental, and buys time. It also means never taking an upstream fix again, including security fixes to agt-core itself.
Option 3 is worth doing immediately regardless of which of 1 or 2 wins, because >=4.0 currently lets pip pick a release that would break us silently.
First step
Pin agent-governance-toolkit-core==4.1.0 in pyproject.toml with a comment pointing here, so the constraint is deliberate. Then decide between migrating and vendoring.
The problem
PolicyEvaluatorwraps AGT's v4 Cedar backend:That module no longer exists upstream. microsoft/agent-governance-toolkit#3444 replaced the v4 policy language with ACS v5 across the Python runtime and deleted
agent_os/policies/backends.py. On AGTmainthere is noCedarBackendoutside a migration CLI helper.We do not notice because
agent-governance-toolkit-core>=4.0resolves to 4.1.0, tagged 2026-06-09, which still ships the module. Every release after it on that line has moved on.Why this matters now
It is already blocking security work. #471 needs
cryptography>=49.0to close two reachable advisories, and the agt-core releases that permit it are the same ones that removed the API we import. The short-term answer there is a 4.1.1 backport, which is the right call for a CVE fix but does not change the underlying position: we are one dependency resolution away from a broken gateway, and pip will make that choice for us the moment our floor moves or 4.1.0 is yanked.The exposure is not marginal either. Cedar evaluation is the enforcement path. If it breaks, cMCP allows or denies nothing correctly, and the demos, the web console, and every conformance claim go with it.
What needs deciding
CedarBackend, whether policy bundle hashing and themode="auto"cedarpy/cli/builtin selection have equivalents, and what happens to the annotation extraction in_advice_for_denythat reaches into_build_cedar_request. That last one already depends on a private attribute, so it will not survive untouched.evaluate(context),_build_cedar_request, and the backend-mode selection.cedarpyis already a direct dependency of ours. Owning ~200 lines againstcedarpydirectly would end the coupling, at the cost of maintaining it.agent-governance-toolkit-core==4.1.0makes the current state explicit instead of accidental, and buys time. It also means never taking an upstream fix again, including security fixes to agt-core itself.Option 3 is worth doing immediately regardless of which of 1 or 2 wins, because
>=4.0currently lets pip pick a release that would break us silently.First step
Pin
agent-governance-toolkit-core==4.1.0inpyproject.tomlwith a comment pointing here, so the constraint is deliberate. Then decide between migrating and vendoring.