USE CASES / SALESFORCE
Decide before the native tool runs.
An Agentforce agent or Einstein Bot executes inside Salesforce, on Salesforce's own runtime. Governing it from outside is not possible — so GovernorAI ships a managed package that places a decision step on the agent's path, inside the org, before the tool fires.
An Agentforce agent runs on Salesforce's own runtime, so governing it from outside is not possible. The managed package puts a decision step on the agent's path, inside the org, before the tool fires.
TWO TOPOLOGIES
Where the agent runs decides how it is governed.
Salesforce appears on both sides of the boundary, and the two cases need different mechanisms.
Topology B deliberately does not use the execute-through proxy. If it did, an allow would have already forwarded the request to Salesforce once — and the bot would then call the tool again. Decision-only means the tool runs at most once, after allow.
THE MANAGED PACKAGE
What gets installed in the org.
EnableAgent writes a GovernorAI_Config__mdt custom metadata record through the Tooling API, carrying the agent's governance state, its per-agent gateway URL and the shared proxy secret./api/v1/saas/salesforce/check/{{agent_id}} through a Named Credential, authenticated with X-Governor-Proxy-Secret.decision, reason, policy_id, rule_id and action_id — enough to show why, not just what.The package also carries the Named Credential and External Credential principal, so the shared secret is held by Salesforce's credential store rather than written into Apex, plus a permission set scoping who may invoke the action.
The package is required for any per-agent governance. Without it installed and the agent enrolled, enabling a Salesforce agent in GovernorAI annotates the agent's Description field and nothing more — a cosmetic change with no runtime effect. The tool calls bypass governance entirely. That is stated here because a governance product that silently does nothing is worse than one that says it is not connected.
Validation status. The Go backend is fully unit-tested. The Apex and metadata source has been through one scratch-org attempt, and it did not pass. A Dev Hub run created the org — after two feature names in the scratch-org definition had to be dropped because Salesforce rejected them — and then failed at the first scenario, the package deploy itself, on the shape of the external-credential principal metadata. That blocker has since been fixed and the package now carries the current form. The re-run has not happened: it needs an operator with Dev Hub access and, for the Agentforce and Einstein Bot scenarios, the licences those surfaces require. Until that run passes end to end, treat the in-org path as unproven against a real org.
Distribution. Operator-installed. The package is delivered by direct metadata deploy into the org. An AppExchange listing is a deferred decision rather than a closed one — the reasoning on record is that private distribution iterates faster while the enablement contract is still settling across real installs.