Summary
#2478 adds a require_approval verdict plus the approval-chain execution layer (human, LLM judge, and webhook approvers, action binding per ADR-0030, configurable timeouts, and audit linkage) to the Python PolicyEvaluator and govern(). This issue tracks bringing the same approval-chain execution to the other AGT language SDKs, so governance behavior stays consistent across the ecosystem.
The Python wiring is landing under #3067 (PolicyEvaluator / govern integration after ADR-0030). This tracker is the single place to follow the non-Python work.
What Python adds (#2478, #3067)
- A
require_approval verdict that pauses execution and routes the decision to an approval chain.
- Approval chains: an ordered list of approvers that short-circuits on the first deny.
- Approver types: human (notification plus vote with a timeout), LLM judge (a model votes allow or deny with a reason, with verdict caching), and webhook (POST the context, expect a JSON verdict).
- Action-bound, fail-closed coordination per ADR-0030 (action binding plus digest, with a configurable timeout that defaults to deny).
- Audit records for the approval request, each vote, and the final verdict.
Gap in other SDKs
All four SDKs already recognize the require_approval verdict and carry an approver count, but none implement the approval-chain execution layer (no coordinator, no approver types, no timeout or audit linkage):
| SDK |
Path |
Current state |
| TypeScript |
agent-governance-typescript/ |
require_approval is a valid policy action in src/policy.ts, no chain execution |
| .NET |
agent-governance-dotnet/ |
PolicyAction.RequireApproval plus an Approvers list in Policy/PolicyDecision.cs, no chain execution |
| Rust |
agent-governance-rust/ |
a "requires-approval" decision plus min_approvals in agentmesh/src/policy.rs, no chain execution |
| Go |
agent-governance-golang/ |
RequiresApproval plus MinApprovals in packages/agentmesh/policy.go, no chain execution |
Proposed work
For each SDK, port the approval-chain execution layer on top of the verdict support that already exists:
- route a
require_approval verdict to an ordered approval chain that short-circuits on the first deny
- implement at least the webhook approver as the MVP, then human and LLM judge approvers where the SDK has the surface for them
- honor the action-bound, fail-closed semantics from ADR-0030 (action binding plus digest, timeout defaults to deny)
- record the approval request, votes, and final verdict on the audit trail
- add tests covering the allow, deny, and timeout paths
One PR per language keeps each change reviewable. Where an approver type does not map cleanly onto a given SDK runtime, note it as not applicable rather than forcing it.
References
Summary
#2478 adds a
require_approvalverdict plus the approval-chain execution layer (human, LLM judge, and webhook approvers, action binding per ADR-0030, configurable timeouts, and audit linkage) to the Python PolicyEvaluator andgovern(). This issue tracks bringing the same approval-chain execution to the other AGT language SDKs, so governance behavior stays consistent across the ecosystem.The Python wiring is landing under #3067 (PolicyEvaluator /
governintegration after ADR-0030). This tracker is the single place to follow the non-Python work.What Python adds (#2478, #3067)
require_approvalverdict that pauses execution and routes the decision to an approval chain.Gap in other SDKs
All four SDKs already recognize the
require_approvalverdict and carry an approver count, but none implement the approval-chain execution layer (no coordinator, no approver types, no timeout or audit linkage):agent-governance-typescript/require_approvalis a valid policy action insrc/policy.ts, no chain executionagent-governance-dotnet/PolicyAction.RequireApprovalplus anApproverslist inPolicy/PolicyDecision.cs, no chain executionagent-governance-rust/min_approvalsinagentmesh/src/policy.rs, no chain executionagent-governance-golang/RequiresApprovalplusMinApprovalsinpackages/agentmesh/policy.go, no chain executionProposed work
For each SDK, port the approval-chain execution layer on top of the verdict support that already exists:
require_approvalverdict to an ordered approval chain that short-circuits on the first denyOne PR per language keeps each change reviewable. Where an approver type does not map cleanly onto a given SDK runtime, note it as not applicable rather than forcing it.
References
governafter ADR-0030)