The agents/ folder: one file and what it compiles to
What one agents/ file holds, what each key compiles to, and the checks that read it.
One agents/ file is one seat’s contract: who fills it, its number, its standards, limits and approvals. SalesBuilder compiles it, and show traces every key.
---
worker: agent
aliases: [SDR]
results: [{ metric: opened-deals-and-trials, baseline: 2, target: 6, deadline: 2026-12-31 }]
standards: { response: 60m }
limits: { messages: 40 }
autonomy: assist
approvals: { to: founder }
---
The SDR seat: research, first drafts and follow-ups, with every send approved until it earns more. $ npx startup-builder show agents/sales/prospector.mdx
worker agent agents/sales/prospector.mdx:2
aliases [SDR] agents/sales/prospector.mdx:3
results [{ metric: opened-deals-and-trials, baseline: 2, target: 6, deadline: 2… agents/sales/prospector.mdx:4
standards { response: 60m } agents/sales/prospector.mdx:5
limits { messages: 40 } agents/sales/prospector.mdx:6
autonomy assist agents/sales/prospector.mdx:7
approvals { to: founder } agents/sales/prospector.mdx:8
owner SalesBuilderleaseline.app/
├── plays/
│ ├── cold-email.mdx
│ ├── warm-intros.mdx
│ ├── signup-interviews.mdx
│ ├── lead-reactivation.mdx
│ └── events-and-webinars.mdx
├── audiences/
│ ├── small-property-managers.mdx
│ ├── lapsed-leads.mdx
│ └── renewal-season.mdx
├── sequences/
│ └── cold-email-thread-founder.mdx
├── funnels/
│ └── signup.mdx
├── workflows/
│ └── outbound.mdx
├── agents/ ← this folder
│ ├── sales/prospector.mdx
│ └── marketing/content-lead.mdx
├── systems/
│ └── sequences.mdx
├── domains/
│ └── leaseline.app.mdx
├── offers/
│ ├── pro.mdx
│ └── team.mdx
├── content/
│ └── webinars/60-day-notices.mdx
├── metrics/
│ ├── q4.mdx
│ └── positive-reply-rate.mdx
└── startups.lockThe file
| Key | On the page | Compiles to | Checked by |
|---|---|---|---|
worker | Who fills it | POST /{namespace}/roles/{role}/staff: an agent or a person; a hire takes the seat with its queue and number | — |
aliases | Title | the title pages show for the seat | — |
results | Your number | the seat’s Key Result, a node or leaf of the ARR tree inside its band | S9 |
standards | Standards | the times a Stop reads, such as the 60-minute answer | — |
limits | Limits | count- and time-based caps; crossing one pauses the Play (POST /{namespace}/limits/{limit}/raise) | — |
autonomy | Autonomy | the starting rung: you approve each one, until 48 of its last 50 pass | — |
approvals | Approvals | who answers an Approval when a call passes its Limit (POST /{namespace}/approvals/{approval}/approve) | — |
Checks
| Check | It holds | What dev prints |
|---|---|---|
| S4 | The budget fits the Mandate, or opens an Approval. | plays/ |
| S9 | Each Key Result names a node or leaf of the ARR tree, and a seat’s Key Result sits in its band. | agents/ |
Refusals
| Code | Fix, then the call that clears it |
|---|---|
batch-cap | Split the batch, or approve the larger one. Then POST /{namespace}/approvals/{approval}/approve. |
claim | Cut the line, or cite the Offer term that grants it. Then POST /{namespace}/conversations/{conversation}/answer. |
clinician-hold | Ask the Compliance Officer to approve the invitation; it waits until then. Then POST /{namespace}/approvals/{approval}/approve. |
comparison-claim | Approve the changed claim once; it publishes after the approval. Then POST /{namespace}/approvals/{approval}/approve. |
concentration | Approve it as a long deal above the cap, or add creators first. Then POST /{namespace}/approvals/{approval}/approve. |
credit | Raise the credit Limit, or block the key drawing from 2 accounts. Then POST /{namespace}/limits/{limit}/raise. |
deploy-freeze | Ship it after day 5, or ship an approved fix in steps; reverts always run. Then POST /{namespace}/approvals/{approval}/approve. |
domain | Confirm the viewer yourself, or keep the report held. Then POST /{namespace}/tasks/next. |
draft-match | Approve the changed Order again; the old Card voids. Then POST /{namespace}/approvals/{approval}/approve. |
editorial | Pass it before the deadline, or the week records checked, nothing to send. Then POST /{namespace}/approvals/{approval}/approve. |
exclusive | Wait for the first offer to be declined or expire, then offer the next. Then POST /{namespace}/tasks/next. |
field-scope | Ask the admin once in writing; the field joins on their yes. Then POST /{namespace}/conversations/{conversation}/answer. |
fraud-hold | Decide pay or void on the Approval. Then POST /{namespace}/approvals/{approval}/approve. |
gift-approval | Approve it in your queue; a gift never sends on a timeout. Then POST /{namespace}/approvals/{approval}/approve. |
invitation-rest | Wait 60 days, or 180 days after 2 unanswered invitations. Then POST /{namespace}/tasks/next. |
keep-first | Let their CSM reach them first, then ask again once they are healthy. Then POST /{namespace}/tasks/next. |
late-send | Approve the next window sooner, or promote the cell; the expired send never goes. Then POST /{namespace}/approvals/{approval}/approve. |
license-allowlist | Replace the dependency, or add its license to the allowlist with your OK. Then POST /{namespace}/approvals/{approval}/approve. |
no-cash-or-travel | Send a take-home gift through gift delivery under the class cap, with its Approval. Then POST /{namespace}/approvals/{approval}/approve. |
payout-limit | Approve the run, or split it at the Limit. Then POST /{namespace}/approvals/{approval}/approve. |
pending-ceiling | Withdraw requests pending 14 days or more. Then POST /{namespace}/tasks/next. |
pilot-cap | Wait in the queue for the dated start, or end a running pilot first. Then POST /{namespace}/tasks/next. |
portfolio-caps | Take the next open date the caps allow. Then POST /{namespace}/tasks/next. |
price | Get the discount approved, or quote at the floor. Then POST /{namespace}/approvals/{approval}/approve. |
probe-limit | Approve the raise, or keep the probe at its line. Then POST /{namespace}/approvals/{approval}/approve. |
reconcile | Clear the Stripe mismatch, then send again. Then POST /{namespace}/tasks/next. |
recording-hold | Announce it at the start, under the host’s grant. Then POST /{namespace}/tasks/next. |
rival-name | Cite a dated fact for the rival, then approve the phrase. Then POST /{namespace}/approvals/{approval}/approve. |
role-unstaffed | Staff the Role, or leave it: its routes come to you. Then POST /{namespace}/roles/{role}/staff. |
screening | Review the hit yourself; nothing is released until you clear it. Then POST /{namespace}/tasks/next. |
session-gate | Send from the tray yourself; no connector gets your login. Then POST /{namespace}/tasks/next. |
store-billed | Link the store’s own refund path; no button or guarantee shows. Then POST /{namespace}/conversations/{conversation}/answer. |
terms-hold | Clear the partner’s terms; the build stays private until then. Then POST /{namespace}/tasks/next. |
tier-gate | Wait for the 28-day region read, then approve the raise. Then POST /{namespace}/approvals/{approval}/approve. |
verification | Review the List; send to the verified addresses only. Then POST /{namespace}/tasks/next. |
viewer-limit | Approve the new viewer, or keep the list as it is. Then POST /{namespace}/approvals/{approval}/approve. |
window-close | Send the pitch inside its window; a late one drops. Then POST /{namespace}/tasks/next. |
spend-limit | Raise the Limit, or wait for the month to reset. Then POST /{namespace}/limits/{limit}/raise. |
unanswered-positive | Answer the reply, then approve the resume. Then POST /{namespace}/approvals/{approval}/approve. |
Calls
You, to your agent
Seat the agent as our SDR and show me its first task, as a dry run.
curl -X POST "https://api.sb/leaseline.app/roles/role_1/staff?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"worker":"worker_1"}'
curl -X POST https://api.sb/leaseline.app/tasks/next \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
await $.Role.staff({ role: 'role_1', worker: 'worker_1' }, { mode: 'try' }) // agents/ sales/ prospector.mdx
return await $.Task.next() // the seat’s queue
npx startup-builder do Role.staff --json '{"role":"role_1","worker":"worker_1"}' --try
npx startup-builder do Task.next{
"name": "do",
"arguments": {
"code": "await $.Role.staff({ role: 'role_1', worker: 'worker_1' }, { mode: 'try' }) // agents/sales/prospector.mdx\nreturn await $.Task.next() // the seat’s queue",
"mode": "try"
}
}Response200
application/json{
"task": {
"$id": "https: //api.sb/ leaseline.app/ tasks/ task_1",
"$type": "Task",
"status": "pending",
"mode": "try"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ action_1",
"operation": "Task.next",
"status": "done"
}
}
sample| Call | What it does |
|---|---|
POST /{namespace}/roles/{role}/staff | Staff fills a Role with a Worker, human or agent, who then performs the Role’s Verbs under its Permissions. Emits Role.staffed. |
POST /{namespace}/mandates/authorize | Authorize grants an Agent a standing Mandate to perform a Verb within a Limit, without asking each time. Emits Mandate.authorized. |
POST /{namespace}/mandates/{mandate}/spend | Spend pays an outside party for a Startup with a single-use card, within a Mandate and its Limit. Emits Mandate.spent. |
POST /{namespace}/approvals/{approval}/approve | Approve allows the pending Action an Approval holds, and that Action runs. Emits Approval.approved. |
POST /{namespace}/limits/{limit}/raise | Raise lifts a Limit after an Approval allows it, and the Action that waited on it proceeds. Emits Limit.raised. |
POST /{namespace}/tasks/next | Next returns the oldest open Task the calling Worker’s Roles may claim, without claiming it. Emits Task.offered. |
POST /{namespace}/actions/{action}/redirect | Redirect changes a pending Action’s inputs or target inside its delay window, before it runs. Emits Action.redirected. |
POST /{namespace}/conversations/{conversation}/answer | Answer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened. Emits Conversation.answered. |
Compiled, not written: edit the records it reads (compile table; cap), then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.