URL: /plays/proof-of-work-outreach · Id: `play:proof-of-work-outreach`

# 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.

Sends each [Prospect](https://startupbuilder.dev/business/nouns/prospect) one finished piece of your product’s work, made from their own public data, in a plain email that asks for nothing.

```text title="Set it up · Ask"
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.
```

```text title="Run one · Ask"
Hand our latest Prospect whose public listings changed to the SDR agent and show me what it chose and why. Don’t send.
```

```ts title="Run one · SDK"
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 }
```

```json title="Run one · Response · sample"
{
  "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",
      "no-finding"
    ],
    "by": "worker_2",
    "on": "prospect_88",
    "expected": "a qualified reply by day 14",
    "reopensWhen": "no Conversation.answered from prospect_88 within 14d"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Monitor.check",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Flag.evaluate",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Page.create",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_4",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_2",
      "verb": "Message.schedule",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "customer-collision",
          "status": "pass"
        },
        {
          "check": "finding",
          "status": "pass"
        },
        {
          "check": "claims-resolve",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`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 |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$1,000 ARR a month at 170 | 1 h week 1, then 20 min a week | $0.18 per Prospect, ~$31 a month at 170 | Day 2: the first Meeting booked | 100+ fit Prospects, a Verb that runs on public data | Under 100: `warm-intros` · needs their private data: `cold-email` |

**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](/plays/benchmark-rows).

## Start it this week
```bash
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"
```


```json title="The dry run’s 422 · 2026-08-24 · sample"
{
  "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"
    }
  ]
}
```

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · <a id="check-baseline"></a>`baseline` · pass: 214 fit Prospects; 4.2 per 100, n 140 (gaps #8) | <Op verb="Metric.query" /> on `proof-reply-rate`, which fills Before in Your number | 1 min | none |
| <a id="check-domain-authenticated"></a>`domain-authenticated` · fail: the outbound Domain | <Op verb="Domain.authenticate" /> on leaseline-mail.com | 10 min | until DNS resolves, often under 1 h |
| <a id="check-mailbox-warm"></a>`mailbox-warm` · warn (gaps #1): day 0 of warm-up | <Op verb="Mailbox.warm" /> | 2 min | 14 days at rising volume |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): 9 of your open Leads have a person owner, you | <Op verb="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 | <Op verb="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 <Op verb="Event.capture" /> |
| + 10 more for filings, reviews, funding, tech changes, open issues, public asks, forwards, dates and referrals (`?lanes=all`) | | | | |

```json title="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
  }
}
```

```bash title="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.

| 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 | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Send the work · No finding | It does it | 19 of 19 · 34 of 34 | — | a request waits past 5 min → `unanswered-delivery` | <Op verb="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 | — | <Op verb="Task.claim" /> |
| Change the proof template | You approve each one | 1 merged of 1 | never | — | <Op verb="Change.merge" /> · <Op verb="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 <Op verb="Task.assign" />, <Op verb="Change.review" />, <Op verb="Conversation.answer" />, <Op verb="Meeting.book" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="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 <Op verb="Change.merge" />. **Replayed on past sends**, <Op verb="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; <Op verb="Role.staff" /> seats it.

```bash
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 → <Op verb="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 | <Op verb="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 → <Op verb="Conversation.answer" /> → on yes <Op verb="Meeting.book" /> | <Op verb="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 | <Op verb="Meeting.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 | <Op verb="Conversation.answer" /> |
| Not now | “Not before our January renewals.” | the sequence stops; the date fires `not-now-date` then | nobody | the date | <Op verb="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 | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply until Oct 26 | the next step waits for the return date | nobody | the return date | <Op verb="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 | <Op verb="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 | <Op verb="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).

```json title="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 <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, <Op verb="Action.redirect" />, <Op verb="Approval.approve" /> or <Op verb="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 <Op verb="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:** <Op verb="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 |
| --- | --- | --- | --- |
| <a id="check-owned-by-a-person"></a>`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. | <Op verb="Task.assign" /> |
| <a id="check-customer-collision"></a>`customer-collision` (gaps #1) | a proof email to an active Customer | Send it to their CSM instead. | <Op verb="Lead.assign" /> |
| <a id="check-finding"></a>`finding` (the record’s Finding gate) | a draft with no reproducible finding | Send a benchmark row, or leave them for cold-email. | <Op verb="Monitor.check" /> |
| <a id="check-claims-resolve"></a>`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. | <Op verb="Content.draft" /> |
| <a id="check-sample-rule"></a>`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. | <Op verb="Change.review" /> |
| <a id="check-organization-lock"></a>`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. | <Op verb="Decision.list" /> |
| <a id="check-fingerprint"></a>`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. | <Op verb="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. | <Op verb="Mailbox.warm" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-fetch"></a>`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 |
| <a id="stop-confirmed-error"></a>`confirmed-error` | 2 confirmed errors in sent outputs of one class in 30 days | the class pauses and restarts at You approve each one |
| <a id="stop-reproduction"></a>`reproduction` | reproduction failures over 10 % of a class’s findings in a week | the class pauses |
| <a id="stop-takedown"></a>`takedown` | any takedown request | the Sample Page comes down within 1 h; <Op verb="Contact.suppress" /> at their chosen scope |
| <a id="stop-yield-floor"></a>`yield-floor` (email) | under 2 qualified replies per 100 delivered, after 200 delivered | the class stops in that List slice |
| <a id="stop-cost"></a>`cost` | cost per qualified reply over $150 after 200 delivered | the class drops one tier |
| <a id="stop-wrong-target"></a>`wrong-target` | over 5 % wrong person, wrong company or untraced claims in the monthly hand check of 50 | minting halts |
| <a id="stop-unanswered-delivery"></a>`unanswered-delivery` | a request for the work unanswered past 5 min | new sends pause until it is answered |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | <Op verb="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.

```json title="The captured refusal · sample"
{
  "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"
    }
  ]
}
```


```json title="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 <Op verb="Metric.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`

| 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 %.

```json title="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 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:sales-lead` | — |
| 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?” <Op verb="Meeting.book" /> booked it on Priya’s calendar, and the Brief reached her at 16:05 (When it hands to you).

```diff title="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
```mdx title="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 | <a id="tactic-prospect-mint"></a>`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 | <a id="tactic-warm-shelf"></a>`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 | <a id="tactic-proof-check"></a>`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 | <a id="tactic-proof-build"></a>`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 | <a id="tactic-proof-compose"></a>`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 | <a id="tactic-send-gate-check"></a>`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 | <a id="tactic-cold-email-send"></a>`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 | <a id="tactic-linkedin-send-tray"></a>`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 | <a id="tactic-reply-matrix"></a>`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 | <a id="tactic-proof-delivery"></a>`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 | <a id="tactic-proof-pull-request"></a>`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 | <a id="tactic-fidelity-ratchet"></a>`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 | <a id="tactic-proof-quality-watch"></a>`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 | <a id="tactic-sending-stop-loss"></a>`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 | <a id="trigger-hiring"></a>`hiring` | Opening published: `event` on `Opening.published`, window 30d. |
| Trigger | <a id="trigger-public-filing"></a>`public-filing` | Public filing: `event` on `Company.filed`, window 14d. |
| Trigger | <a id="trigger-competitor-complaint"></a>`competitor-complaint` | Competitor complaint: `event` on `Review.published`, window 7d. |
| Trigger | <a id="trigger-funding"></a>`funding` | Funding: `at` on `Company.funded`, window 45d. |
| Trigger | <a id="trigger-technology-change"></a>`technology-change` | Technology change: `event` on `Monitor.checked`, window 30d. |
| Trigger | <a id="trigger-pricing-visit"></a>`pricing-visit` | Pricing visit: `event` on `Visit.recorded`, window 72h. |
| Trigger | <a id="trigger-public-surface-change"></a>`public-surface-change` | Public surface change: `event` on `Monitor.checked`, window 14d. |
| Trigger | <a id="trigger-open-issue"></a>`open-issue` | Open issue: `state` on `Monitor.checked`, window 30d. |
| Trigger | <a id="trigger-public-ask"></a>`public-ask` | Public ask: `event` on `Question.asked`, window 24h. |
| Trigger | <a id="trigger-sample-viewed"></a>`sample-viewed` | Sample viewed: `event` on `Page.viewed`, window 30d. |
| Trigger | <a id="trigger-sample-forwarded"></a>`sample-forwarded` | Sample forwarded: `threshold` on `Page.viewed`, window 14d. |
| Trigger | <a id="trigger-not-now-date"></a>`not-now-date` | Not now date: `at` on `Conversation.answered`, window 14d. |
| Trigger | <a id="trigger-referral-named"></a>`referral-named` | Referral named: `event` on `Conversation.answered`, window 7d. |
| Sequence | <a id="sequence-proof-of-work-monthly"></a>`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 | <a id="sequence-proof-of-work-monthly-founder"></a>`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 | <a id="sequence-proof-of-work-printed"></a>`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 | <a id="sequence-proof-delivery-thread"></a>`proof-delivery-thread` | Proof delivery thread: 1 steps; it ends on Any reply; A booked Meeting; Suppression at any scope. |
| Sequence | <a id="sequence-pull-request-touch"></a>`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. |