Skip to content

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
Run oneMode try
You, to your agent

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"
  }
}
Response200application/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 yetPreview

On 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 ProspectChoiceReason
Fernhill Property Co: 46 listed units, 12 turn over before Jan 31send-the-findinga tier 1 finding, reproduced twice
Oakmont Residential: 800 units, a VP of Operations, full calendar builtfrom-the-foundera strong fit with a tier 3 build
Ridgeview Rentals: no listings page, 50 units by their own sitebenchmark-rowno finding of their own; the 50-unit row fits
Copperline Homes: no public listings, no address, no repositoryno-findingnothing reproducible; nothing sends
Ana Ruiz at Fernhill: “Can you send the full calendar?”send-the-workshe asked for the work

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/leaseline.app · 41 Customers at 2026-10-19 · on Monitor.checked · first draft 6 min after the change · 9 keys Not live yet

Also runs as: Benchmark rows.

Start it this week

Terminal
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"
422Refusedproof-of-work-outreach can’t start yet: 1 check fails and 2 warn.
CheckFixThen
use-when pass · Not live yet, gaps #8Keep 100 or more fit Prospects, or run warm-intros first.POST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #8Read it once; it fills Before in Your number.POST /{namespace}/metrics/query
domain-authenticated failAdd 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 #1Warm the Mailbox; sends ramp over 14 days.POST /{namespace}/mailboxes/{mailbox}/warm
role-unstaffed warn · Not live yet, gaps #8Staff 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.

CheckFix (one call)Your timeWait
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 number1 minnone
domain-authenticated · fail: the outbound DomainPOST /{namespace}/domains/{domain}/authenticate on leaseline-mail.com10 minuntil DNS resolves, often under 1 h
mailbox-warm · warn (gaps #1): day 0 of warm-upPOST /{namespace}/mailboxes/{mailbox}/warm2 min14 days at rising volume
role-unstaffed · warn (gaps #8): 9 of your open Leads have a person owner, youPOST /{namespace}/roles/{role}/staff, or leave it: requests for the work come to you, and your 9 get drafts in your queue0 minnone

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

WhenTrigger idStarts onWindowHow it gets in
A Prospect’s public listings page changespublic-surface-changeevent on Monitor.checked where the changed surface is one the Product's cheapest Verb can assessa draft within 1 h; sent within 14dPOST /{namespace}/monitors/{monitor}/check on each Prospect’s listings page, daily
A Prospect posts a leasing or operations openinghiringevent on Opening.published where the opening is for the role the Product serves or replaces30dthe same Monitor, on their careers page
Someone opens their own Sample Pagesample-viewedevent on Page.viewed where path = the Person's own Sample Page; it raises the next touch's score and never starts a Message aloneraises the next touch’s score; never starts one alonethe Sample Page reports POST /{namespace}/events/capture
+ 10 more for filings, reviews, funding, tech changes, open issues, public asks, forwards, dates and referrals (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$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
  }
}
Reproduce it in test
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:prospector, worker_2) holds the Key Result. It hands requests for the work to AE · Priya Shah (person) (role:sales-lead, 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.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Send the finding · Send a benchmark row · Printed letterYou approve each one118 of 121 (3 refused) · 22 of 22 · 6 of 6at 200 passed with 0 confirmed errors; capped here until then—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Send the work · No findingIt does it19 of 19 · 34 of 34—a request waits past 5 min → unanswered-deliveryPOST /{namespace}/actions/{action}/redirect
From the founder · Open a fixYou do it, from the draft9 of 9 · 0never: they go out under your name—POST /{namespace}/tasks/{task}/claim
Change the proof templateYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a question in the first email, a named employee, an estimate of their revenueRefused, every time3 drafts refusednever—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.

The brief (folded): compiled Agent-register Markdown · play:proof-of-work-outreach@1 · each line names its record key
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.

Terminal
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

OptionPicked whenDecided byRunsHands toIf it’s just you
Send the finding send-the-findinga reproducible tier 1 or 2 findingYour rule (line 4)proof-of-work-monthly: the plain email, one link, no questionyou approve it · Take this oneyou
From the founder from-the-foundera strong fit with a tier 3 build, over 300 unitsAgent’s call, with its reasonproof-of-work-monthly-founder, drafted → POST /{namespace}/tasks/{task}/assignyou send it from your own Mailbox · Take this oneyou
Send a benchmark row benchmark-rowno finding of their own; a public benchmark row fitsAgent’s call, with its reasonproof-of-work-monthly with the row as the findingyou approve ityou
Printed letter printed-letterno work email; a published business addressAgent’s call, with its reasonproof-of-work-printed: one page under your nameyou approve ityou
Open a fix open-a-fixan open issue their repository lets outsiders fixAgent’s call, with its reasonPOST /{namespace}/changes/{change}/review on the fix → pull-request-touchyou approve the fix · Take this oneyou
Send the work send-the-worksomeone asks to see itYour rule (the delivery line)proof-delivery-thread within 5 min → POST /{namespace}/conversations/{conversation}/answer → on yes POST /{namespace}/meetings/bookPOST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 60 min (response-60m), Brief attached · Take this oneyou, within 60 min
No finding no-findingnothing reproducibleYour rule (the Finding gate)nothing; they stay on the List for cold-emailnobodythe same
When they write backFixture replyWhat happensWho answersBy whenCall
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 minPOST /{namespace}/meetings/book
Send me pricing“What would this cost for 46 units?”Pro’s list Price from the Pricing Page and one next stepSDR · your agent5 minPOST /{namespace}/conversations/{conversation}/answer
Not now“Not before our January renewals.”the sequence stops; the date fires not-now-date thennobodythe datePOST /{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 textSDR · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply until Oct 26the next step waits for the return datenobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Does it read our existing lease PDFs?”To a person, the question in the BriefAE · Priya Shah60 minPOST /{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)nobodyat oncePOST /{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).

What lands in each queue · sample
[
  {
    "$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)RefusesFixThen
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 claimedLeave 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 CustomerSend it to their CSM instead.POST /{namespace}/leads/{lead}/assign
finding (the record’s Finding gate)a draft with no reproducible findingSend 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 backsCut 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 ruleAdd 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 StartupsWait 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 cellRewrite 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 limitWarm the Mailbox; sends ramp over 14 days.POST /{namespace}/mailboxes/{mailbox}/warm
Stop (pauses the Play)Pauses whenThen
fetchan auth wall, a rate limit or a robots refusal on a hostall fetching from that host stops; it never retries another way
confirmed-error2 confirmed errors in sent outputs of one class in 30 daysthe class pauses and restarts at You approve each one
reproductionreproduction failures over 10 % of a class’s findings in a weekthe class pauses
takedownany takedown requestthe 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 deliveredthe class stops in that List slice
costcost per qualified reply over $150 after 200 deliveredthe class drops one tier
wrong-targetover 5 % wrong person, wrong company or untraced claims in the monthly hand check of 50minting halts
unanswered-deliverya request for the work unanswered past 5 minnew sends pause until it is answered
kill-switchyou press itPOST /{namespace}/processes/{process}/pause on outbound; a second press expires every live Sample Page
+ 1 more for the GitHub lane: pull requests (?lanes=all)

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.

422RefusedThe email to Birch Lane Rentals did not send: it states a revenue figure no snapshot holds.
CheckFixThen
claims-resolve failCut 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.

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "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"
}
NodeAgent halfYour halfAddedConfidenceBasis
proof-reply-rate13.2 per 100 (19 of 144)4.2 (6 of 144)+9.0 [2.6, 15.4]■■□□ Early signheld back at random · n 288 · 32 still maturing
new-leads10.4 per 100 (15 of 144)3.5 (5 of 144)+6.9 [1.1, 12.8]■■□□ Early signthe 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 tellcarried 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 %.

The Campaign card · sample
{
  "$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=all; three follow the tables.

What happened, agent half, by optionSentQualified repliesWon (credited, not all caused by this Play)
Send the finding121142 on Pro (+$694 ARR)
From the founder · Send a benchmark row · Printed letter9 · 22 · 63 · 2 · 01 on Team (+$948 ARR) · 0 · 0
Send the work · Open a fix · No finding19 · 0 · 34 held— · — · —the requests above
Agent half · your half158 · 160 sent19 of 144 matured · 6 of 144$1,642 · $347
At 100 Prospects a month (the Use it when volume)about 187 in 56 daysheld back at random, halfOther Startups’ results: +8.0 per 100, ■■■□ Likely, n 4,120
DayEventWhat happenedYour time
0event_5003 Campaign.createdthe three steps; the dry run fails domain-authenticated20 min
0–14event_5008 Mailbox.warmeddana@leaseline-mail.com ramps to 30 a day2 min
2event_5021 Meeting.bookedthe first Meeting: Kinship Rentals asked for the full calendar—
9event_5070 Role.staffedAE · Priya Shah (person) takes role:sales-lead—
35 · 56event_5144 Change.merged · event_5201 Readout.createdthe finding line first: replayed at 14.1 per 100, read back at +21d at 13.6, n 665 min
44event_5167 Campaign.pausedunanswered-delivery: a request waited 7 min 40 s; resumed at once3 min
1–56event_5012 Approval.created, first of 158you approved 155 emails in 2 sittings a week; claims-resolve refused 3 drafts, each rewritten once and sent; 9 founder notes3 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/book booked it on Priya’s calendar, and the Brief reached her at 16:05 (When it hands to you).

Birch Lane Rentals, 2026-09-16 · the draft claims-resolve refused, then the rewrite that sent
- 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

plays/proof-of-work-outreach.mdx
---
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.
Text
$ 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

Key Id What it is
Tactic prospect-mint Prospect mint: Turns Monitor Events on watched Organizations into verified Prospects, each with a live reason, grouped into cells of 50 or fewer. Starts at Sends nothing.
Tactic warm-shelf Warm shelf: Keeps a checked finding ready for each of the 200 best-fit watched Organizations, so a fired Trigger needs only a diff before the draft. Starts at Sends nothing.
Tactic proof-check Proof check: Runs the Product’s cheapest Verb on an Organization’s public data and returns a reproducible, scored finding with its tier, or a no-finding result. Starts at Sends nothing.
Tactic proof-build Proof build: Turns a finding into the Product’s own finished output, traced sentence by sentence and re-run, on a noindex sample page. Starts at Sends nothing.
Tactic proof-compose Proof compose: Writes the work line and the finding line into the founder’s template, checks the draft survives inbox summaries, and lints it to ask for nothing. Starts at You approve each one.
Tactic send-gate-check Send gate check: Checks Suppression, a live reason, the Market, the basis stamp, the Person-month grant, the facts and the labels before any cold Message exists. Starts at Sends nothing.
Tactic cold-email-send Cold email send: Sends a passed draft as plain text from an outbound Mailbox with tracking off, records it with its reason and stamp, and handles bounces. Starts at It does it, you can stop it.
Tactic linkedin-send-tray LinkedIn send tray shows each request and Message with its reason, for the Human to check, copy and send in the Venue’s own app. Starts at You approve each one.
Tactic reply-matrix Reply matrix: Labels every outreach reply with one of 11 labels, maps it to one of seven reply kinds, and runs that kind’s move by its deadline. Starts at You approve each one.
Tactic proof-delivery Proof delivery: Sends the finished work into the thread within 5 minutes of a Person asking for it, with one finding and a walk-through offer. Starts at Sends nothing.
Tactic proof-pull-request Proof pull request: Opens one tested fix for an open issue in an Organization’s public repository that takes outside fixes, after a human approves. Starts at You approve each one.
Tactic fidelity-ratchet Fidelity ratchet: Sets the day’s send envelope from each Domain’s complaint headroom, and moves compute to fewer, bigger outputs when headroom falls. Starts at Sends nothing.
Tactic proof-quality-watch Proof quality watch: Reads reproductions, corrections, takedowns, cost and pull-request outcomes, and pauses, demotes or stops a class, the pull-request path or the Play. Starts at Sends nothing.
Tactic sending-stop-loss Sending stop loss: Reads the Play’s own bounces, replies and seed tests on every send, and rests, pauses or retires a Mailbox, Domain, cell or the Play. Starts at Sends nothing.
Trigger hiring Opening published: event on Opening.published, window 30d.
Trigger public-filing Public filing: event on Company.filed, window 14d.
Trigger competitor-complaint Competitor complaint: event on Review.published, window 7d.
Trigger funding Funding: at on Company.funded, window 45d.
Trigger technology-change Technology change: event on Monitor.checked, window 30d.
Trigger pricing-visit Pricing visit: event on Visit.recorded, window 72h.
Trigger public-surface-change Public surface change: event on Monitor.checked, window 14d.
Trigger open-issue Open issue: state on Monitor.checked, window 30d.
Trigger public-ask Public ask: event on Question.asked, window 24h.
Trigger sample-viewed Sample viewed: event on Page.viewed, window 30d.
Trigger sample-forwarded Sample forwarded: threshold on Page.viewed, window 14d.
Trigger not-now-date Not now date: at on Conversation.answered, window 14d.
Trigger referral-named Referral named: event on Conversation.answered, window 7d.
Sequence proof-of-work-monthly Proof of work monthly: 6 steps; it ends on Any reply; A bounce; Suppression at any scope; A takedown; A booked Meeting; An open Deal; A missing Reason; NO_FINDING on re-check.
Sequence proof-of-work-monthly-founder Proof of work monthly founder: 6 steps; it ends on Any reply; A bounce; Suppression at any scope; A takedown; A booked Meeting; An open Deal; A missing Reason; The Mandate paused or revoked.
Sequence proof-of-work-printed Proof of work printed: 4 steps; it ends on Any reply; A returned letter; Suppression at any scope; A takedown; A booked Meeting; An open Deal; A missing Reason.
Sequence proof-delivery-thread Proof delivery thread: 1 steps; it ends on Any reply; A booked Meeting; Suppression at any scope.
Sequence pull-request-touch Pull request touch: 4 steps; it ends on A withdrawal; A close as spam; Suppression of the repository or the buyer; A booked Meeting.

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.