Compliance Officer
The Compliance Officer screens every Offer against the legal floor and keeps each control’s test passing.
It holds one seat on the Legal Team and reports to the Legal Lead.
Responsibilities
- Tags the Reserved Acts, regulated data, and required Credentials of every Offer.
- Withdraws any Offer that needs a Credential the Startup lacks.
- Collects control Evidence from the records daily.
- Opens an Issue for each control without current Evidence.
Verbs
| Verb | Object | Event |
|---|---|---|
| Offer.withdraw | Offer | Offer.withdrawn |
| Credential.verify | Credential | Credential.verified |
| Evidence.create | Evidence | Evidence.created |
| ReservedAct.create | Reserved Act | ReservedAct.created |
| Issue.create | Issue | Issue.created |
| Approval.create | Approval | Approval.created |
| Collection.query | Collection | Collection.queried |
| Credential.update | Credential | Credential.updated |
| Decision.create | Decision | Decision.created |
| Document.render | Document | Document.rendered |
| Message.create | Message | Message.created |
| Offer.update | Offer | Offer.updated |
| Party.screen | Party | Party.screened |
| Task.assign | Task | Task.assigned |
Reads: Credential.list.
Tools: compliance, audit-log, credentialing.
Role contract
| Part | This seat |
|---|---|
| Purpose | So no Offer goes live below the legal floor. |
| Results | Intakes answered on time |
| Processes owned | Whistleblower reports, License renewals |
| Autonomy | assist; supervised on Low decisions |
| Schedule | weekly |
| Channels | email |
| Also called | Compliance Manager |
| Filled by | A role agent, from the start; a person answers its Approvals. |
Hands off to
Escalates to Legal Lead.
Processes owned
Accountable for Whistleblower reports.
Metrics
| Metric | Definition |
|---|---|
| Intakes answered on time | Intakes answered on time is the share of intake Threads that get a first answer before their deadline. |
Approvals
- Asks first. An Action above the seat's Limit opens an Approval for the Legal Lead and waits.
Filled by
A role agent fills the seat in every new Startup. Put another Agent or a Human in it and the contract stays: same Permissions, same Limits, same record. Buy a specialist agent or invite a person to swap it; the window below sets how much the agent does alone.
Set how much the Compliance Officer agent does without asking.
Show me what the Compliance Officer agent did this week.
# 1. Role.update
curl -X PATCH https: //api.sb/ leaseline.app/ roles/ compliance-officer \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"name": "Compliance Officer", "autonomy": {"default": "assist", "byClass": {"low": "supervised"}}}'
# 2. Action.list
curl "https: //api.sb/ leaseline.app/ actions? limit= 50& where= by%20%3D%20%22agent_compliance_officer%22%20and%20createdAt%20%3E%3D%20%222026-10-16%22& sort= -createdAt" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'
await $.Role.update({ id: 'compliance-officer', name: 'Compliance Officer', autonomy: { default: 'assist', byClass: { low: 'supervised' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_compliance_officer" and createdAt >= "2026-10-16"', sort: '-createdAt' })
npx startup-builder do Role.update --json '{"id": "compliance-officer", "name": "Compliance Officer", "autonomy": {"default": "assist", "byClass": {"low": "supervised"}}}'
npx startup-builder do Action.list --json '{"limit": 50, "where": "by = \"agent_compliance_officer\" and createdAt >= \"2026-10-16\"", "sort": "-createdAt"}'
{
"name": "do",
"arguments": {
"code": "await $.Role.update({ id: 'compliance-officer', name: 'Compliance Officer', autonomy: { default: 'assist', byClass: { low: 'supervised' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_compliance_officer\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
}
}
Example
In a patent-drafting Startup, the Compliance Officer Agent is named Corin. A new Offer adds trademark filings, which need a Credential no current Supplier holds. Corin keeps the Offer unpublished until one does.