Governance & Control Center
Sally lets agents act, but never blindly. The Control Center is Sally's safe-autonomy layer: agents propose work, workspace trust policies decide what runs automatically and what waits, and humans approve anything risky — with normalized evidence and an append-only event ledger behind every decision. Safe, reversible work (memory, notes, tasks, drafts) can auto-run; risky actions (sends, publishes, deletions, deploys, exports, bulk updates) are quarantined for a person to approve.
This is the mechanism behind Sally's one permission model: an agent's reach is never broader than the credential behind it, and even inside that reach, trust policies and approvals govern what it can do without a human.
Proposals
A proposal is an agent's request to perform one or more actions. Instead of firing an action directly, an agent submits a proposal carrying the actions plus evidence for why they should happen. Sally evaluates it against the workspace trust policy and either auto-executes it, or parks it as pending for human review.
Each proposal has a status: PENDING, APPROVED, DENIED, AUTO_EXECUTED, EXECUTED, BLOCKED, or CANCELLED. A person can approve, deny, or execute a pending proposal from the Control Center; agents can watch their own proposals resolve.
MCP tools: proposal.create, proposal.list, proposal.get, proposal.resolve, proposal.execute.
Trust policies
Trust policies are how you tune autonomy per brand. A policy is scoped to a workspace and a source — where the request comes from: HUMAN, MCP, CHATGPT, CODEX, CREWAI, PI, AGENT, or SYSTEM — and can optionally target a specific agent identity.
Each policy sets:
allowedActions— the action types this source may take.requireEvidence— whether proposals must carry evidence (on by default).maxActionsPerProposal— how many actions a single proposal may bundle (default 5).maxActionsPerDay— a daily action cap for the source (default 50).yolo— when set, this source's proposals auto-execute regardless of action type. Use with care.
When a proposal arrives, Sally evaluates it in order: check evidence, check the caps, then decide. If yolo is on, it auto-executes. Otherwise, it auto-executes only when every action is explicitly allowed and none is risky; anything else routes to human approval.
The action taxonomy: safe, risky, yolo
Sally classifies actions so the same proposal is handled consistently everywhere.
Safe actions are reversible and low-blast-radius, and can auto-run under a permissive policy:
memory.create,memory.intake.executecrm.activity.add,crm.follow_up.addtask.create,task.update,task.move,task.handoff.createtask.todo.*comment.add,task.comment.addblocker.create,approval.requestnewsletter.draft.create
Risky actions are always quarantined for approval — they leave Sally, touch customers, or can't be easily undone:
email.send,newsletter.sendpublish.external,code.deploydata.export,record.deletecrm.bulk_update,marketing.bulk_update,external.write_back
Yolo isn't an action type — it's the escape hatch on a trust policy that lets a trusted source auto-execute anything, risky included.
Approvals
When a proposal or a handoff needs a human decision, Sally creates a typed approval request so the question reaches the right person with the right framing. Each request carries a question, options, an agent recommendation, and a status.
Approval types:
PUBLISHINGLIVE_DEPLOYCREDENTIALPAYMENT_DATACUSTOMER_DATACLIENT_DECISIONDESTRUCTIVE_ACTION
Marketing mass sends always route through approval rather than executing directly — see Marketing. Agents can request an approval as a first-class step (approval.request is a safe action), and approvals surface in a task's context and in project.runtime_context.
Blockers
A blocker is a first-class "cannot proceed until a human resolves X" object. Rather than guessing or improvising, an agent raises a structured blocker, which moves the task to Blocked and records what input it needs.
Blocker types: CREDENTIAL, ACCESS, STAGING_FAILURE, ARCHITECTURE_CONFLICT, TEST_FAILURE, CLIENT_DECISION, LIVE_APPROVAL, DEPENDENCY, AMBIGUITY (default), and TOOLING_FAILURE. Each has a status (OPEN, RESOLVED, CANCELLED), a summary, and a requiredInput field.
Blockers are created through the handoff flow (see below), not a standalone tool. They surface in project.runtime_context, in task.get, and in task.resume_context so the next worker — human or agent — sees exactly what's outstanding.
Handoffs and evidence
The handoff is Sally's signature agent-to-human workflow, and where evidence discipline is enforced. task.handoff.create hands work back with a structured brief instead of a vague comment: a decision needed, a context summary, a recommendation, next-step instructions, and risks.
Depending on state, one handoff can:
- create a real blocker and move the task to Blocked,
- create an approval request and move the task to Review, or
- move the task to a suggested status when it's simply done.
Every handoff and proposal records normalized evidence with a consistent shape:
sources— what the agent looked atchecksPerformed— what it verifieddecisions— what it decidedassumptions— what it took as givenrisks— what could go wrongoutputs— what it producedconfidence— how sure it isnextSteps— what comes next
The inverse, task.resume_context, returns the latest handoff, its evidence, open blockers, pending approvals, recent decisions, and a computed recommended next action — so agent work is resumable, not restartable. As a safety measure, agent-supplied evidence and action JSON is scanned and secret-like values are rejected, so credentials don't leak into the ledger.
MCP tools: task.handoff.create, task.resume_context, project.runtime_context. See Projects & tasks for the full handoff flow.
The operational-event ledger
Every governance decision writes to an append-only operational-event ledger — the audit trail of how autonomy actually played out. Event types include CONTEXT_READ, RECOMMENDATION_CREATED, ACTION_PROPOSED, APPROVAL_REQUESTED, RESOLVED, ACTION_EXECUTED, the BLOCKER_* events, MEMORY_WRITTEN, and EXTERNAL_RESULT.
Reading context writes a CONTEXT_READ event; proposing writes ACTION_PROPOSED; approving and executing write their own events. Each decision also writes a corresponding entry to the security audit log, so governance activity is visible both operationally (what agents did and why) and for compliance (see Security).
Automation governance
Beyond individual proposals, Sally governs whether and how automated workflows run.
- Per project — automation config controls whether the project's workflow is enabled, its default agent, whether live actions require approval (on by default), and whether work is staged before going live (on by default). Only one active workflow job runs per project at a time.
- Deployment-wide — an automation governance policy sets the allowed runtime types, which roles may start workflows, the maximum concurrent workflow jobs, and whether starting a workflow requires approval.
Because Sally is runtime-agnostic, these controls apply to any connected agent — Sally's own reference worker, Claude, ChatGPT, or your own runtime — through the same trust policies, approvals, and evidence rules. Connectivity is tracked too: revoking an agent connection cancels its active jobs and runs.
For agents
If you're building or connecting an agent, the governed loop is: call sally.context (or project.runtime_context) to ground yourself, decide what to do, then proposal.create with evidence. Safe, allowed work returns executed; risky work returns pending for a human, and you can raise a blocker or an approval request explicitly. See Connect your agent.
Roadmap
Some governance-adjacent surfaces are declared but not yet wired end-to-end:
- External work-item sync. Sally can reference external items (
LINEAR,JIRA,GITHUB), but only native Sally items are fully exercised today; treat cross-tool sync as not-yet. - Per-tenant security policy. Password, session, 2FA, audit, and key policies are currently deployment-global rather than per-customer (aside from a per-account two-factor requirement) — see Security.