Proof-of-work outreach
Sends each Prospect one finished piece of your product’s work, made from their own public data, in a plain email that asks for nothing.
- Channel
- Email and inboxes
- Kind
- Outreach
Be our SDR: for each property manager on our list, build the 90-day turnover calendar Leaseline would send, from the units they list publicly, and email it plainly, asking for nothing. Big accounts get a note from me. Half get my usual first email, as today. Show me what’s missing; don’t send.
# Not live yet (gaps #2)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"proof-of-work-outreach"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'proof-of-work-outreach' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2
npx startup-builder do Campaign.create --json '{"play":"proof-of-work-outreach"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'proof-of-work-outreach' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2",
"mode": "try"
}
}application/json{
"type": "https: //startupbuilder.dev/ errors/ refused",
"title": "Refused",
"status": 422,
"detail": "proof-of-work-outreach can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "a List of 214 fit Prospects; the calendar runs on public listings",
"doc": "/plays/ proof-of-work-outreach#check-use-when",
"fix": "Keep 100 or more fit Prospects, or run warm-intros first.",
"then": "Metric.query"
},
…
Hand our latest Prospect whose public listings changed to the SDR agent and show me what it chose and why. Don’t send.
curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Opening.published%22%2C%20%22Company.filed%22%2C%20%22Review.published%22%2C%20%22Company.funded%22%2C%20%22Monitor.checked%22%2C%20%22Visit.recorded%22%2C%20%22Question.asked%22%2C%20%22Page.viewed%22%2C%20%22Conversation.answered%22)&limit=1" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl -X POST "https://api.sb/leaseline.app/triggers/fire?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"like":"event_5204"}'
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22prospect_88%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/actions?where=on%20%3D%20%22prospect_88%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { events: [last] } = await $.Event.list({ where: 'name in ("Opening.published", "Company.filed", "Review.published", "Company.funded", "Monitor.checked", "Visit.recorded", "Question.asked", "Page.viewed", "Conversation.answered")', limit: 1 }) // { play } compiled to this Play’s Trigger Events
const { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7
const { decisions: [decision] } = await $.Decision.list({ where: `on = "${subject}"` }) // what it chose, and why · Not live yet, gaps #7
const { actions } = await $.Action.list({ where: `on = "${subject}"` }) // what it did, with its checks · Not live yet, gaps #7
return { decision, actions }
npx startup-builder do Event.list --json '{"where":"name in (\"Opening.published\", \"Company.filed\", \"Review.published\", \"Company.funded\", \"Monitor.checked\", \"Visit.recorded\", \"Question.asked\", \"Page.viewed\", \"Conversation.answered\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_5204"}' --try # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"prospect_88\""}' # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"prospect_88\""}' # Not live yet (gaps #7){
"name": "do",
"arguments": {
"code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Opening.published\", \"Company.filed\", \"Review.published\", \"Company.funded\", \"Monitor.checked\", \"Visit.recorded\", \"Question.asked\", \"Page.viewed\", \"Conversation.answered\")', limit: 1 }) // { play } compiled to this Play’s Trigger Events\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` }) // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` }) // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
"mode": "try"
}
}application/json{
"decision": {
"$id": "https: //api.sb/ leaseline.app/ decisions/ decision_548",
"$type": "Decision",
"choice": "send-the-finding",
"reason": "a tier 1 finding that reproduced twice: 12 of the 46 units Fernhill lists turn over before Jan 31, from its listings page on Oct 18",
"stakes": "low",
"options": [
"send-the-finding",
"from-the-founder",
"benchmark-row",
"printed-letter",
"open-a-fix",
"send-the-work",
…
sample · 4 Not live yetPreviewOn POST /{namespace}/processes/{process}/enableOff POST /{namespace}/processes/{process}/pauseTake this one POST /{namespace}/tasks/{task}/claim
action_3 is the noindex Sample Page with the calendar, its source, date and correction line. action_4 is the plain email to Fernhill’s Ana Ruiz (contact_31), waiting for your approval: every proof email is approved before it sends.
+9.0 qualified replies per 100 · ■■□□ Early sign · n 288 · path → arr
| Try another: the Prospect | Choice | Reason |
|---|---|---|
| Fernhill Property Co: 46 listed units, 12 turn over before Jan 31 | send-the-finding | a tier 1 finding, reproduced twice |
| Oakmont Residential: 800 units, a VP of Operations, full calendar built | from-the-founder | a strong fit with a tier 3 build |
| Ridgeview Rentals: no listings page, 50 units by their own site | benchmark-row | no finding of their own; the 50-unit row fits |
| Copperline Homes: no public listings, no address, no repository | no-finding | nothing reproducible; nothing sends |
| Ana Ruiz at Fernhill: “Can you send the full calendar?” | send-the-work | she asked for the work |
- 1 h week 1, then 20 min a week
- Your time
- Day 2: the first Meeting booked
- First signal
Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Proof reply rate → New Leads → New Customers ↑ → ARR added each week → ARR
Worth’s formula: about +9.0 qualified replies per 100 × 170 Prospects a month × 0.12 replies to paid (your last 90 days) × $547 first order ARR ≈ +$1,004. Under First signal: About 7 weeks to tell a +6 lift at 170 a month (5 to read, 2 to mature); at 100 a month, about 11 weeks.
sample · api.sb/
Also runs as: Benchmark rows.
Start it this week
npx startup-builder add play proof-of-work-outreach # 1 · writes plays/proof-of-work-outreach.mdx (Not live yet, gaps #5)
# 2 · dry run; below, its 422 on 2026-08-24
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"proof-of-work-outreach"}'
# 3 · keep it, at You approve each one
curl -X POST https://api.sb/leaseline.app/campaigns \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"proof-of-work-outreach"}'
# on
curl -X POST https://api.sb/leaseline.app/processes/outbound/enable \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# off: nothing sends; live Sample Pages keep their stated expiry
curl -X POST https://api.sb/leaseline.app/processes/outbound/pause \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"| Check | Fix | Then |
|---|---|---|
use-when pass · Not live yet, gaps #8 | Keep 100 or more fit Prospects, or run warm-intros first. | POST /{namespace}/metrics/query |
baseline pass · Not live yet, gaps #8 | Read it once; it fills Before in Your number. | POST /{namespace}/metrics/query |
domain-authenticated fail | Add the 3 DNS records for leaseline-mail.com; it passes once they resolve. | POST /{namespace}/domains/{domain}/authenticate |
mailbox-warm warn · Not live yet, gaps #1 | Warm the Mailbox; sends ramp over 14 days. | POST /{namespace}/mailboxes/{mailbox}/warm |
role-unstaffed warn · Not live yet, gaps #8 | Staff the AE, or leave it: requests for the work come to you. | POST /{namespace}/roles/{role}/staff |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "proof-of-work-outreach can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "a List of 214 fit Prospects; the calendar runs on public listings",
"doc": "/plays/proof-of-work-outreach#check-use-when",
"fix": "Keep 100 or more fit Prospects, or run warm-intros first.",
"then": "Metric.query"
},
{
"check": "baseline",
"status": "pass",
"observed": "4.2 qualified replies per 100 plain first emails, n 140 in 90 days",
"doc": "/plays/proof-of-work-outreach#check-baseline",
"fix": "Read it once; it fills Before in Your number.",
"then": "Metric.query"
},
{
"check": "domain-authenticated",
"status": "fail",
"observed": "leaseline-mail.com, the outbound Domain, has no DNS records",
"doc": "/plays/proof-of-work-outreach#check-domain-authenticated",
"fix": "Add the 3 DNS records for leaseline-mail.com; it passes once they resolve.",
"then": "Domain.authenticate"
},
{
"check": "mailbox-warm",
"status": "warn",
"observed": "dana@leaseline-mail.com, day 0 of warm-up",
"doc": "/plays/proof-of-work-outreach#check-mailbox-warm",
"fix": "Warm the Mailbox; sends ramp over 14 days.",
"then": "Mailbox.warm"
},
{
"check": "role-unstaffed",
"status": "warn",
"roles": [
"sales-lead"
],
"owned": 9,
"doc": "/plays/proof-of-work-outreach#check-role-unstaffed",
"fix": "Staff the AE, or leave it: requests for the work come to you.",
"then": "Role.staff"
}
]
}It says no, says why, and names the fix.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
use-when · baseline · pass: 214 fit Prospects; 4.2 per 100, n 140 (gaps #8) | POST /{namespace}/metrics/query on proof-reply-rate, which fills Before in Your number | 1 min | none |
domain-authenticated · fail: the outbound Domain | POST /{namespace}/domains/{domain}/authenticate on leaseline-mail.com | 10 min | until DNS resolves, often under 1 h |
mailbox-warm · warn (gaps #1): day 0 of warm-up | POST /{namespace}/mailboxes/{mailbox}/warm | 2 min | 14 days at rising volume |
role-unstaffed · warn (gaps #8): 9 of your open Leads have a person owner, you | POST /{namespace}/roles/{role}/staff, or leave it: requests for the work come to you, and your 9 get drafts in your queue | 0 min | none |
Your number · Before 4.2 · Now 13.2 qualified replies per 100 · Target 12 by Dec 31 · ■■□□ Early sign · n 288 matured
Each proof check costs $0.02, each Sample Page $0.12 to build and re-run, and each email $0.04 from your outbound Domain (Worker cost); a printed letter costs $1.40. That comes to about $31 a month at 170 Prospects and $18 at 100.
When it starts
| When | Trigger id | Starts on | Window | How it gets in |
|---|---|---|---|---|
| A Prospect’s public listings page changes | public-surface-change | event on Monitor.checked where the changed surface is one the Product's cheapest Verb can assess | a draft within 1 h; sent within 14d | POST /{namespace}/monitors/{monitor}/check on each Prospect’s listings page, daily |
| A Prospect posts a leasing or operations opening | hiring | event on Opening.published where the opening is for the role the Product serves or replaces | 30d | the same Monitor, on their careers page |
| Someone opens their own Sample Page | sample-viewed | event on Page.viewed where path = the Person's own Sample Page; it raises the next touch's score and never starts a Message alone | raises the next touch’s score; never starts one alone | the Sample Page reports POST /{namespace}/events/capture |
+ 10 more for filings, reviews, funding, tech changes, open issues, public asks, forwards, dates and referrals (?lanes=) |
{
"$id": "https://api.sb/leaseline.app/events/event_5204" ,
"$type": "Event",
"name": "Monitor.checked",
"at": "2026-10-18T06:00:12Z" ,
"seq": 5204,
"data": {
"prospect": "prospect_88",
"organization": "organization_41",
"monitor": "monitor_88",
"url": "https://fernhillpc.example/listings" ,
"changed": true,
"units": 46
}
}npx startup-builder trigger Monitor.checked --like event_5204 # replays the change
npx startup-builder clock advance --by 14d # runs the monthly sequence’s day-14 step, which ends on any reply
npx startup-builder listen Monitor.checked --forward-to http://localhost:3000/hook Who runs it
SDR · your agent (role:, worker_2) holds the Key Result. It hands requests for the work to AE · Priya Shah (person) (role:, worker_3, staffed on day 9), and founder notes and repository fixes to you (Dana Okafor, person, worker_1), who send them under your own name. Your number links to Did it work.
| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
|---|---|---|---|---|---|
| Send the finding · Send a benchmark row · Printed letter | You approve each one | 118 of 121 (3 refused) · 22 of 22 · 6 of 6 | at 200 passed with 0 confirmed errors; capped here until then | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse |
| Send the work · No finding | It does it | 19 of 19 · 34 of 34 | — | a request waits past 5 min → unanswered-delivery | POST /{namespace}/actions/{action}/redirect |
| From the founder · Open a fix | You do it, from the draft | 9 of 9 · 0 | never: they go out under your name | — | POST /{namespace}/tasks/{task}/claim |
| Change the proof template | You approve each one | 1 merged of 1 | never | — | POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert |
| Never: a question in the first email, a named employee, an estimate of their revenue | Refused, every time | 3 drafts refused | never | — | nothing; the Checks hold it |
What it reads · What it may call. It reads only the Prospect’s public pages, never past an auth wall, a rate limit or a robots refusal (fetch). A Sample Page view raises the next touch’s score and never appears in a Message. Its tools are POST /{namespace}/tasks/{task}/assign, POST /{namespace}/changes/{change}/review, POST /{namespace}/conversations/{conversation}/answer, POST /{namespace}/meetings/book, and any other call becomes an Approval under the Role’s Mandate.
You hold the SDR Key Result: 12 qualified replies per 100 by 2026-12-31. ← worker, metric
On each Trigger, choose one option and say why; no finding sends nothing. ← triggers, chooses, finding
The first email asks for nothing: no meeting, no call, no question mark. ← copyRules 2
One finding with its number; the rest wait on the Sample Page. ← copyRules 4
Over 300 units, draft a note for Dana to send herself. ← your file, line 5
Never write to a Lead or Deal a person owns: draft it into their queue. ← worker.owns, owned-by-a-person The slow loop, as a Change. decision_517 (2026-09-28, weekly) read that emails naming the turnover count in the first line drew 15.0 qualified replies per 100 against 9.8 with it in the second, so change_31 moved the finding line first (the template) and Dana merged it with POST /{namespace}/changes/{change}/merge. Replayed on past sends, POST /{namespace}/changes/{change}/review put the agent half at 14.1 per 100; read back at +21d it is 13.6, n 66, ■□□□ Too early to tell beside Other Startups’ +8.0 (Example, day 56).
Bring your own agent (folded) starts at You approve each one whatever it scores, because every proof email here is approved before it sends; POST /{namespace}/roles/{role}/staff seats it.
npx startup-builder eval --scenario proof-of-work-outreach-288 --agent "claude -p" --seat prospector # seated: 13.2 per 100, every claim traced, 0 Checks failed sent · yours: 11.4, 2 claims untraced What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
|---|---|---|---|---|---|
Send the finding send-the-finding | a reproducible tier 1 or 2 finding | Your rule (line 4) | proof-of-work-monthly: the plain email, one link, no question | you approve it · Take this one | you |
From the founder from-the-founder | a strong fit with a tier 3 build, over 300 units | Agent’s call, with its reason | proof-of-work-monthly-founder, drafted → POST /{namespace}/tasks/{task}/assign | you send it from your own Mailbox · Take this one | you |
Send a benchmark row benchmark-row | no finding of their own; a public benchmark row fits | Agent’s call, with its reason | proof-of-work-monthly with the row as the finding | you approve it | you |
Printed letter printed-letter | no work email; a published business address | Agent’s call, with its reason | proof-of-work-printed: one page under your name | you approve it | you |
Open a fix open-a-fix | an open issue their repository lets outsiders fix | Agent’s call, with its reason | POST /{namespace}/changes/{change}/review on the fix → pull-request-touch | you approve the fix · Take this one | you |
Send the work send-the-work | someone asks to see it | Your rule (the delivery line) | proof-delivery-thread within 5 min → POST /{namespace}/conversations/{conversation}/answer → on yes POST /{namespace}/meetings/book | POST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 60 min (response-60m), Brief attached · Take this one | you, within 60 min |
No finding no-finding | nothing reproducible | Your rule (the Finding gate) | nothing; they stay on the List for cold-email | nobody | the same |
| When they write back | Fixture reply | What happens | Who answers | By when | Call |
|---|---|---|---|---|---|
| Interested | “This is useful. Can we talk Thursday?” | books it; the Brief goes to the AE (When it hands to you) | AE · Priya Shah (person) | 60 min | POST /{namespace}/meetings/book |
| Send me pricing | “What would this cost for 46 units?” | Pro’s list Price from the Pricing Page and one next step | SDR · your agent | 5 min | POST /{namespace}/conversations/{conversation}/answer |
| Not now | “Not before our January renewals.” | the sequence stops; the date fires not-now-date then | nobody | the date | POST /{namespace}/leads/{lead}/nurture |
| Wrong person | “Our leasing manager, Joe, owns this.” | thanks them and asks them to forward it; it never writes to an address from their text | SDR · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Out of office | an auto-reply until Oct 26 | the next step waits for the return date | nobody | the return date | POST /{namespace}/messages/{message}/schedule |
| Question it can’t answer | “Does it read our existing lease PDFs?” | To a person, the question in the Brief | AE · Priya Shah | 60 min | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | “Please take this page down and stop.” | the Sample Page comes down within 1 h; nothing else sends, on any lane (takedown) | nobody | at once | POST /{namespace}/contacts/{contact}/suppress |
When it hands to you
Requests for the work and every Interested reply go to AE · Priya Shah (person); founder notes, repository fixes and every approval come to you, and before day 9 every hand-off did. One Brief per Role, as captured (brief is Not live yet, gaps #7).
[
{
"$id": "https://api.sb/leaseline.app/tasks/task_611" ,
"$type": "Task",
"assignee": "worker_3",
"due": "2026-10-14T16:05:00Z" ,
"on": "lead_91",
"brief": {
"who": "Ana Ruiz, Fernhill Property Co" ,
"said": "This is useful. Can we talk Thursday?" ,
"chose": "send-the-work",
"why": "she asked for the full calendar, then a call" ,
"shown": "12 of 46 listed units turn over before Jan 31",
"never": [
"a price beyond the list",
"a discount",
"terms"
]
}
},
{
"$id": "https://api.sb/leaseline.app/tasks/task_590" ,
"$type": "Task",
"assignee": "worker_1",
"due": "2026-10-02T17:00:00Z" ,
"on": "prospect_74",
"brief": {
"who": "Oakmont Residential, 800 units" ,
"chose": "from-the-founder",
"why": "a strong fit with a tier 3 build",
"draft": "a 4-line note from you, with the full calendar on its Sample Page"
}
}
]Each receiver answers with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, POST /{namespace}/actions/{action}/redirect, POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse, each a one-call window. Once a person claims, the agent’s pending steps to that Prospect cancel with claimedByPerson (Not live yet, gaps #7), and every reply goes to the claimer. A Task nobody claims by its due time goes up a Role through POST /{namespace}/tasks/{task}/escalate (AE to you), and person-promise fires.
On time: AE · Priya Shah, 17 of 18 claimed within 60 min, median 24 min, ■■□□ Early sign, n 18; you, 9 of 9 founder notes within 1 business day, n 9. Your queue: about 30 approvals a week, read in 2 sittings, plus 1 weekly review, 2 founder notes and 3 hand-offs to Priya.
The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.
When it won’t send
| Check (refuses one send) | Refuses | Fix | Then |
|---|---|---|---|
owned-by-a-person (rule j; gaps #8) | an email to a Contact whose Lead or open Deal a person owns, or whose Conversation a person claimed | Leave it to the person who owns it: the draft waits in their queue. | POST /{namespace}/tasks/{task}/assign |
customer-collision (gaps #1) | a proof email to an active Customer | Send it to their CSM instead. | POST /{namespace}/leads/{lead}/assign |
finding (the record’s Finding gate) | a draft with no reproducible finding | Send a benchmark row, or leave them for cold-email. | POST /{namespace}/monitors/{monitor}/check |
claims-resolve (hub) | a sentence about the Prospect or about Leaseline that no snapshot or Fact backs | Cut the sentence, or cite the snapshot that holds it. | POST /{namespace}/content/draft |
sample-rule (the record’s Sample rule hold) | an output that reads a data kind with no verified Sample rule | Add the Sample rule for that data kind, then re-run. | POST /{namespace}/changes/{change}/review |
organization-lock (the record’s Organization lock) | a second open Sample to one company, from any of your Startups | Wait until the first Sample expires or they answer. | GET /{namespace}/decisions |
fingerprint (the record’s Fingerprint stop) | an email too like many recent ones in its cell | Rewrite the work line from this Prospect’s own finding. | POST /{namespace}/content/draft |
mailbox-warm (gaps #1) | an email from a Mailbox still in warm-up past its day’s limit | Warm the Mailbox; sends ramp over 14 days. | POST /{namespace}/mailboxes/{mailbox}/warm |
| Stop (pauses the Play) | Pauses when | Then |
|---|---|---|
fetch | an auth wall, a rate limit or a robots refusal on a host | all fetching from that host stops; it never retries another way |
confirmed-error | 2 confirmed errors in sent outputs of one class in 30 days | the class pauses and restarts at You approve each one |
reproduction | reproduction failures over 10 % of a class’s findings in a week | the class pauses |
takedown | any takedown request | the Sample Page comes down within 1 h; POST /{namespace}/contacts/{contact}/suppress at their chosen scope |
yield-floor (email) | under 2 qualified replies per 100 delivered, after 200 delivered | the class stops in that List slice |
cost | cost per qualified reply over $150 after 200 delivered | the class drops one tier |
wrong-target | over 5 % wrong person, wrong company or untraced claims in the monthly hand check of 50 | minting halts |
unanswered-delivery | a request for the work unanswered past 5 min | new sends pause until it is answered |
kill-switch | you press it | POST /{namespace}/processes/{process}/pause on outbound; a second press expires every live Sample Page |
+ 1 more for the GitHub lane: pull requests (?lanes=) |
The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the rewrite that sent is the Birch Lane thread in Example.
| Check | Fix | Then |
|---|---|---|
claims-resolve fail | Cut the sentence, or cite the snapshot that holds it. | POST /{namespace}/content/draft |
finding pass | — | POST /{namespace}/monitors/{monitor}/check |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The email to Birch Lane Rentals did not send: it states a revenue figure no snapshot holds.",
"checks": [
{
"check": "claims-resolve",
"status": "fail",
"doc": "/plays/proof-of-work-outreach#check-claims-resolve",
"fix": "Cut the sentence, or cite the snapshot that holds it.",
"then": "Content.draft"
},
{
"check": "finding",
"status": "pass"
}
]
}It says no, says why, and names the fix.
[
{
"reason": {
"limit": "unanswered-delivery",
"observed": "7m 40s",
"bound": "5m",
"window": "1 request"
},
"doc": "/plays/proof-of-work-outreach#stop-unanswered-delivery" ,
"task": "task_602"
}
]Did it work
Both halves are read from the same random assignment, made once the finding gate ran (rules m–o): the agent half got the proof email, your half your plain first email. Each figure’s call is POST /{namespace}/metrics/query by node and by arm; every node above the leaf is Not live yet (gaps #4).
+9.0 qualified replies per 100 · ■■□□ Early sign · n 288 · path → arr
- Chose
- send-the-finding
- Why
- a tier 1 finding that reproduced twice: 12 of the 46 units Fernhill lists turn over before Jan 31, from its listings page on Oct 18
- From
- send-the-finding · from-the-founder · benchmark-row · printed-letter · open-a-fix · send-the-work · no-finding
- Expects
- a qualified reply by day 14
- Reopens when
- no Conversation.answered from prospect_88 within 14d
- By
- worker_2
JSON
{
"$id": "decisions/decision_548",
"$type": "Decision",
"choice": "send-the-finding",
"reason": "a tier 1 finding that reproduced twice: 12 of the 46 units Fernhill lists turn over before Jan 31, from its listings page on Oct 18",
"stakes": "low",
"options": [
"send-the-finding",
"from-the-founder",
"benchmark-row",
"printed-letter",
"open-a-fix",
"send-the-work",
"no-finding"
],
"by": "worker_2",
"on": "prospect_88",
"expected": "a qualified reply by day 14",
"reopensWhen": "no Conversation.answered from prospect_88 within 14d"
}| Node | Agent half | Your half | Added | Confidence | Basis |
|---|---|---|---|---|---|
proof-reply-rate | 13.2 per 100 (19 of 144) | 4.2 (6 of 144) | +9.0 [2.6, 15.4] | ■■□□ Early sign | held back at random · n 288 · 32 still maturing |
new-leads | 10.4 per 100 (15 of 144) | 3.5 (5 of 144) | +6.9 [1.1, 12.8] | ■■□□ Early sign | the same assignment |
new-arr ↑ | $1,642, 3 Customers (1 Team, 2 Pro) · Booked: credited, not all caused by this Play | $347, 1 Customer | +$1,295 [−$1,032, +$3,220] · Worth about +$1,000 a month · Not carrying up yet | ■□□□ Too early to tell (3 vs 1 Customers) | the same · 6 Deals still deciding |
net-new-arr · arr | +$1,642 | +$347 | +$1,295, carried: it moves no other bridge term | ■□□□ Too early to tell | carried from new-arr |
The leaf counts qualified replies (Interested, a referral, an objection with a reason, Not now with a date) within 14 days per 100 Prospects assigned (rule m), to 200 matured in each half; at 144 and 144 so far the Experiment runs on.
How it moves it: each first email carried one finished count about the Prospect’s own units, where your half’s email carried none.
Guardrails: treated against held back: Meetings per qualified reply, 0.63 against 0.67 (opened-deals-and-trials per reply), and stop requests, 1.4 % against 1.1 %.
{
"$id": "https://api.sb/leaseline.app/campaigns/proof-of-work-outreach" ,
"$type": "Campaign",
"play": "play:proof-of-work-outreach@1" ,
"path": [
"proof-reply-rate",
"new-leads",
"new-arr",
"net-new-arr",
"arr"
],
"experiment": {
"metric": "proof-reply-rate",
"unit": "per-100",
"heldBack": 160,
"decision": null
},
"readout": {
"value": 9,
"n": 288,
"maturing": 32,
"interval": [
2.6,
15.4
],
"readability": "C",
"basis": "held-back",
"pooled": false
},
"ledger": {
"spend": 8,
"workerCost": 21,
"hours": 4.1,
"pipelineArr": 6564,
"wonArr": 1642,
"projectedArr": 1004,
"paybackDays": 6
}
}Outside benchmark: this Play’s catalog record carries no sourced range yet, so Other Startups’ results stand in: +8.0 qualified replies per 100, ■■■□ Likely, n 4,120.
Before it · After it. Before it: account-visits and the List feed it fit Prospects; benchmark-rows runs inside it. After it: closer-handoff hears each Meeting it books, buying-committee hears a Sample read in 3 or more places, and lead-nurture holds Not now with a date.
Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days). 354 Prospects were checked, 34 had no finding and stayed on the List, and 320 were assigned at random, 160 to each half; 288 have matured and 32 are still maturing. Read every captured thread at ?threads=; three follow the tables.
| What happened, agent half, by option | Sent | Qualified replies | Won (credited, not all caused by this Play) |
|---|---|---|---|
| Send the finding | 121 | 14 | 2 on Pro (+$694 ARR) |
| From the founder · Send a benchmark row · Printed letter | 9 · 22 · 6 | 3 · 2 · 0 | 1 on Team (+$948 ARR) · 0 · 0 |
| Send the work · Open a fix · No finding | 19 · 0 · 34 held | — · — · — | the requests above |
| Agent half · your half | 158 · 160 sent | 19 of 144 matured · 6 of 144 | $1,642 · $347 |
| At 100 Prospects a month (the Use it when volume) | about 187 in 56 days | held back at random, half | Other Startups’ results: +8.0 per 100, ■■■□ Likely, n 4,120 |
| Day | Event | What happened | Your time |
|---|---|---|---|
| 0 | event_5003 Campaign.created | the three steps; the dry run fails domain-authenticated | 20 min |
| 0–14 | event_5008 Mailbox.warmed | dana@leaseline-mail.com ramps to 30 a day | 2 min |
| 2 | event_5021 Meeting.booked | the first Meeting: Kinship Rentals asked for the full calendar | — |
| 9 | event_5070 Role.staffed | AE · Priya Shah (person) takes role: | — |
| 35 · 56 | event_5144 Change.merged · event_5201 Readout.created | the finding line first: replayed at 14.1 per 100, read back at +21d at 13.6, n 66 | 5 min |
| 44 | event_5167 Campaign.paused | unanswered-delivery: a request waited 7 min 40 s; resumed at once | 3 min |
| 1–56 | event_5012 Approval.created, first of 158 | you approved 155 emails in 2 sittings a week; claims-resolve refused 3 drafts, each rewritten once and sent; 9 founder notes | 3 h 12 min · total 4.1 h measured, 4 h asked |
Leaseline → Ana Ruiz at Fernhill, Oct 13 08:10 · From the 46 units on fernhillpc.example/listings, checked Oct 12: 12 turn over before Jan 31.¹ The calendar of notices Leaseline would send for them is here: leaseline-mail.com/s/fernhill.² *Signed with the Role’s disclosure line.*³
Ana, Oct 13 15:58 · “This is useful. Can you send the full calendar?” The full calendar went into the thread at 16:01.
Ana, 16:04 · “Can we talk Thursday?”
POST /{namespace}/meetings/bookbooked it on Priya’s calendar, and the Brief reached her at 16:05 (When it hands to you).
- With about $2M in rent a year, missing even one renewal costs you.
+ From the 31 units on birchlanerentals.example, checked Sep 15: 7 turn over before Dec 15. Oakmont Residential, 2026-10-01 · a tier 3 build: the full 800-unit calendar · The agent, 09:30 · drafted a 4-line note for Dana and assigned it (
task_590) · Dana, from her own Mailbox, 14:12 · sent it as drafted, with one line of her own.⁴
¹ One finding with its number, from a public source and a date; no question. ² Exactly one link, on the outbound Domain, to a noindex Sample Page with its source and correction line. ³ The fixed signature line, compiled from the Role’s disclosure Setting. ⁴ A person’s edit, labeled on the Sample Page.
Your settings
---
holdout: 0.5 # half the Prospects get Dana’s plain first email, as today
---
Send each Prospect the 90-day turnover calendar from their public listings, finding first.
Over 300 units, draft a note for Dana to send herself. $ npx startup-builder show plays/proof-of-work-outreach
holdout 0.5 · the calendar, finding first · founder note over 300 units your file plays/proof-of-work-outreach.mdx:2,4,5 (Ask 2026-08-24; line 4 by change_31, 2026-09-28)
worker role:prospector, owns never · chooses 7 (3 rule, 4 read) · sequences proof-of-work-monthly, proof-of-work-monthly-founder, proof-of-work-printed, proof-delivery-thread, pull-request-touch · approval every-send · checks owned-by-a-person, customer-collision, finding, claims-resolve, sample-rule, organization-lock, fingerprint, mailbox-warm · stops 10 (9 shown) · placements gmail, outlook, yahoo-mail, linkedin, github, postal-mail catalog play:proof-of-work-outreach@1 (Not live yet, gaps #5) Every key from the catalog
Compiled, not written: edit the Play record proof-of-work-outreach and its Leaseline run, 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.