Skip to content

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

Reads: Credential.list.

Tools: compliance, audit-log, credentialing.

Role contract

PartThis seat
PurposeSo no Offer goes live below the legal floor.
ResultsIntakes answered on time
Processes ownedWhistleblower reports, License renewals
Autonomyassist; supervised on Low decisions
Scheduleweekly
Channelsemail
Also calledCompliance Manager
Filled byA role agent, from the start; a person answers its Approvals.

Hands off to

Escalates to Legal Lead.

Processes owned

Accountable for Whistleblower reports.

Metrics

MetricDefinition
Intakes answered on timeIntakes answered on time is the share of intake Threads that get a first answer before their deadline.

Approvals

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.

The agent in this seat
You, to your agent

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.