microsoft / microsoft/agent-governance-toolkit
[Feature]: Re-integrate Cedarling through the ACS v5 policy extension point
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 6.3k
- Forks
- 1.1k
- Avg merge
- 5d 11h
- Merged PRs (30d)
- 142
Description
Package
agentmesh-integrations
Problem Statement
Cedarling was removed in #3451 during the v4-to-v5 policy language switch. The old CedarlingBackend implemented the v4 ExternalPolicyBackend contract and imported agent_os.policies.BackendDecision; both are gone in v5, so the adapter had nothing left to plug into. It was not dropped on technical merit. ACS v5 added a custom policy extension point, agent_control_specification.PolicyDispatcher, but nothing uses it for Cedarling yet. The bundled Cedar dispatcher only handles permit/forbid, so signed policy stores, JWT/token-based principal resolution (multi-issuer, tokens passed per request), Cedar schema validation, and existing Cedarling policy stores deployed outside AGT have no path back.
How does this feature impact your work and what are you trying to achieve?
Agents that authorize against signed, multi-issuer Cedarling policy stores used cedarling-agentmesh before #3451. The v5 upgrade removed it, and the bundled dispatcher does not do token resolution or signed-store verification, so those policies cannot run in AGT today. The v5 PolicyDispatcher hook lets Cedarling run through the native runtime without patching AGT core.
Timeline
No response
Proposed Solution
• Add an opt-in package integrations/cedarling-acs/ with a CedarlingPolicyDispatcher implementing the v5 PolicyDispatcher protocol (evaluate(invocation) -> Mapping).
• Pass it as policy_dispatcher= to NativeRuntimeClient.from_path / from_url / from_manifest_chain; None keeps the bundled Cedar dispatcher, ours replaces it. No core change.
• Wrap cedarling-python in-process (HTTP mode stays removed) as an optional extra agt-integrations[cedarling] with a guarded import.
• Map the ACS invocation (principal, action, resource, context, tokens) to a Cedarling AuthorizeRequest; reuse the old adapter's _tool_to_cedar_action (snake_case to CamelCase Action) and per-request tokens shape.
• Map allow to a Cedarling permit; map deny to a forbid and to any error, missing cedarling-python, or malformed invocation (fail closed); an escalate the resolver refuses becomes a deny, same as the old adapter.
• Do not log JWTs. Keep Cedarling's signature/issuer checks and signed-store verification intact.
Alternatives Considered
No response
Priority
Nice to have
Contribution
- I would be willing to submit a PR for this feature
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the v5 PolicyDispatcher protocol and the NativeRuntimeClient.from_path, from_url, and from_manifest_chain entry points. Use integrations/cedarling-acs/ and the old adapter's _tool_to_cedar_action as the stated integration boundaries. Done means an optional guarded cedarling-python dispatcher maps invocations correctly, preserves token and signed-store checks, and fails closed without logging JWTs.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- authorization, security
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100