Use Microsoft Agent Governance Toolkit for policy decisions and Contro1 for human approval routing, signed callbacks, and audit evidence.
Microsoft AGT decides in code what your agents may do. Contro1 adds what code cannot: a real person deciding when it matters, and proof of every decision when someone asks.
Use the integration skill
Copy this skill link into your code agent to add Microsoft Agent Governance Toolkit and Contro1 to your system.
Your agents keep their speed. AGT allows or blocks in code, and only the few calls that truly need judgment pause for a person - Contro1 makes that pause reach the right reviewer and resume safely.
One timeline finally answers "what did our agents do, and who allowed it?" Every policy decision - allowed, blocked, or escalated to a human - lands in the same history you can hand to an auditor or open during an incident.
Human attention goes where the risk actually is. A new or low-trust agent faces two reviewers; a proven one just leaves a record. Your team reviews less, and what they review matters.
A blocked agent does not have to fail. When the policy allows it, the block becomes a question to a person, and the agent continues with their answer instead of crashing the workflow.
The record survives scrutiny. Work resumes only on a cryptographically signed decision, and nothing an agent writes about itself can soften how it gets reviewed.
Where each system sits
Microsoft Agent Governance Toolkit evaluates policy before a tool or action runs. Contro1 receives the approval request when that policy decision requires a human.
Use Microsoft AGT for policy enforcement. Use Contro1 for human approval routing, signed callbacks, and audit evidence.
Bridge flow
The agent proposes a tool call.
Microsoft AGT evaluates policy and returns allow, deny, or require_approval.
For require_approval, the bridge creates a Contro1 request with policy_context.
Contro1 routes the request, enforces comment rules, tracks SLA/escalation, and stores evidence.
The runtime verifies the signed Contro1 callback and resumes only on approved status.
Request payload
The bridge fills context with machine-observed facts: the intercepted tool call, its arguments, and the policy verdict from AGT. If you also forward text the model wrote about its own intent, keep it in a separate agent_reported block - it informs the reviewer but must never change routing, risk_level, or the policy outcome, because a prompt-injected agent writes very persuasive justifications.
Policy engine or integration source, such as microsoft_agt.
policy_name
Policy file or policy set that triggered review.
rule_id
Stable rule identifier for audit and search.
rule_reason
Human-readable reason the rule required approval.
policy_version
Policy version, commit, date, or release tag.
enforcement
Decision mode, usually require_approval.
Cover every verdict, not only require_approval
AGT returns permit, forbid, or require_approval on every governed call. The bridge should record all three in Contro1, not only the one that needs a human: permit becomes an audit record (the action ran under policy, logged for the timeline), forbid becomes an audit record with warning severity (the block itself is evidence), and require_approval stays the approval request it is today.
The division of labor stays clean: AGT enforces in sub-millisecond time, Contro1 holds the accountable record. With all three verdicts recorded, one case timeline shows everything the policy decided about an agent, and the Activity view groups it per request.
permit / forbid to audit records
# permit: the action ran under policy - log it, do not pause it
centcom.log_action(
action="agt.tool_permitted",
summary=f"AGT permitted {tool_name}",
source={"integration": "microsoft-agt", "policy": policy_name},
outcome="success",
correlation_id=run_id,
)
# forbid: the block itself is evidence
centcom.log_action(
action="agt.tool_forbidden",
summary=f"AGT blocked {tool_name}: {rule_id}",
source={"integration": "microsoft-agt", "policy": policy_name},
outcome="blocked",
severity="warning",
correlation_id=run_id,
)
Bind AgentMesh identity and trust to the agent registry
AGT identifies agents with DIDs (did:mesh:analyst-001) and scores their behavior on a 0-1000 trust scale. Register the DID as the Contro1 agent identity (actor.agent_id) so every request, audit record, and evidence packet is attributed to the same agent AGT governs, and sync the trust tier into agent metadata.
Trust should also drive who reviews: map low trust tiers to stricter approval policies - two approvals, separation of duties, a senior role - and high tiers to single approval or audit-only. The agent earns autonomy the same way it earns trust, and every threshold change is visible in the evidence.
A hard forbid should stay a hard forbid. But when a policy author wants "stop and get guidance" rather than "fail", the bridge can convert the block into a free_text request: the agent asks, a person answers with decision_type: respond, and the reply returns to the workflow as input. This keeps GovernanceDenied deterministic while giving governed agents a human-guidance path AGT does not have on its own.
Operational checks: Control Map in CI and registry sync
Before deploying a policy that requires approval, verify the approval path is satisfiable: run contro1 requests control-map with the policy role and quorum in CI, and fail the policy deployment when the role is unmapped or no reviewer is on shift.
Sync the AgentMesh inventory into the Contro1 AI Registry (contro1 ai-registry import) with a trust-tier to risk-category mapping, so every AGT-governed agent appears in the EU AI Act readiness view.
Export signed evidence per agent (GET /v1/agents/:id/evidence) for compliance reviews; each packet carries the policy_context that caused each decision.
Webhook handling
Callbacks include policy_context alongside risk_level, policy_trigger, decision_context, status, response, and protocol_response. Verify X-CentCom-Signature and X-CentCom-Timestamp before doing anything with the result.
Resume only when status is approved. Denied, cancelled, timed_out, invalid signatures, and duplicate callback delivery IDs should fail closed.
Beyond the approval call, attach identity, a run trace, the tools you invoked, and the context you retrieved. Each field is optional — add what you have. The verified identity always comes from your API key; a caller-supplied actor.agent_id is recorded as a claimed sub-agent until an admin verifies it.
trace_id / parent_trace_id — link one run (and sub-agent runs) into a single trace.
tool_calls[] — what the agent tried to do, so reviewers see the actions.
retrieved_context[] — the data the decision was based on (RAG provenance).
Then export a signed evidence packet from GET /requests/:id/evidence.
Send full traceability
// POST /api/centcom/v1/requests — add these fields to the body you already send.
{
"request_type": "approval",
"title": "Refund $4,200 to customer 8831",
"source": { "integration": "microsoft-agt" },
"actor": { "agent_id": "billing-agent", "agent_name": "Billing Agent" },
"trace_id": "trc_<run id>",
"tool_calls": [{ "name": "lookup_order", "outcome": "success" }],
"retrieved_context": [{ "source": "policy:refunds", "uri": "kb://policy/refunds" }],
"continuation": { "mode": "decision" }
}
The signed webhook is cryptographic proof of a human decision. Verify it inside the system that executes the action - not inside the agent. Any tool that must never run without human sign-off (payments, deploys, data deletion) should refuse to act without a verified approval; that way no agent, including shadow agents nobody registered, can trigger it by skipping Contro1.
Verify the signature and reject timestamps older than 5 minutes (replay protection; the timestamp marks callback delivery, not request creation, so long SLAs are unaffected).
Bind the approval to the exact action parameters via metadata / correlation_id - never treat "an approval arrived" as permission for a different action.
Execute each request_id exactly once (idempotency on your side).
When in doubt, confirm state directly with GET /v1/requests/:id using a read-only API key.
Use Contro1 audit records to log actions that agents are authorized to run autonomously, and correlation_id to connect requests and logs into one case timeline.
Your ERP is the system of record for money and your CRM for customers. AI agents now take real business actions with no system of record at all. Here is what one must capture and how to stand it up fast.