URL: /plays/guest-circuit · Id: `play:guest-circuit`

# Guest circuit

> Books the founder on the niche’s shows with pitches in the founder’s own words, then turns each aired episode into a Page that brings buyers.

Books the founder on the niche’s shows with pitches in the founder’s own words, then turns each aired episode into a [Page](https://startupbuilder.dev/business/nouns/page) that brings buyers.

```text title="Set it up · Ask"
Be our Communications Lead: find the property-management shows whose listeners ask about renewals, and draft pitches I open in my own words. I record once a week at most. Turn every aired episode into a Page. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand the latest show opening to the Communications Lead 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 ("Schedule.fired", "Monitor.checked", "Post.published", "Monitor.matched", "Interview.requested", "Message.received", "Meeting.booked", "Recording.captured")', 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_423",
    "$type": "Decision",
    "choice": "pitch-the-show",
    "reason": "Rent Roll Radio’s listeners asked about late renewals in 3 episodes and it covered the topic in none of the last 20; your anecdote #4 (the 11-owner batch) is fresh to it",
    "stakes": "low",
    "options": [
      "pitch-the-show",
      "answer-the-request",
      "offer-a-take",
      "book-it",
      "after-it-airs",
      "not-now"
    ],
    "by": "worker_7",
    "on": "show_42",
    "expected": "a recording booked within 21d",
    "reopensWhen": "no Meeting.booked for show_42 within 21d"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "Content.draft",
      "checks": [
        {
          "check": "words-check",
          "status": "pass"
        },
        {
          "check": "fact-check",
          "status": "pass"
        },
        {
          "check": "fresh-anecdote",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingFounder",
      "mode": "try",
      "by": "worker_7",
      "verb": "Task.assign",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "contact-lease",
          "status": "pass"
        },
        {
          "check": "paid-slot",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`action_2` puts the pitch in your tray: you write its opening line, and it sends from your Mailbox only when you press send.

`107 per episode against 38 before · before-after, not proof · n 2 · path → arr`

| Try another: the show | Choice | Reason |
| --- | --- | --- |
| Rent Roll Radio: a call for guests; listeners asked about late renewals 3 times | `pitch-the-show` | a skipped topic and a fresh anecdote |
| A trade reporter: “Looking for property managers on renewal season, by 15:00” | `answer-the-request` | in the beat, due in 4 hours |
| The Landlord Hour host: “Can Dana join us on Nov 12?” | `book-it` | an invite: book it, then prep |
| Doorbell Dispatch: asks $400 for a guest slot | `not-now` | a paid slot leaves this Play for `sponsorships` |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$420 ARR a month at 2 | 3 h week 1, then 3 h a week | $0 per pitch; $0.03 a brief, ~$5 a month | Day 9: first recording booked | a founder who records monthly, 30 views, 5 anecdotes | No founder who records: `data-stories` · under 30 views: `founder-voice` |

**Where it sits:** **Stranger** → Lead → Trialing → Activated → At risk → Churned → Won back · ICP Visits per episode → People reached → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +60 ICP Visitors per episode (Other Startups’ results; no lift of your own to read) × 2 aired a month × 0.006 Visitors to paid × $590 first order ARR ≈ +$425. Under First signal: At 2 aired a month, 90 days give 6 episodes, so your file starts at `holdout: 0` and reads before-after.

`sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Monitor.checked · first pitch brief 7m 05s · 8 keys Not live yet`

## Start it this week
```bash
npx startup-builder add play guest-circuit   # 1 · writes plays/guest-circuit.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":"guest-circuit"}'

# 3 · keep it: you open every pitch and approve every quote
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"guest-circuit"}'

# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/guest-circuit \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":null}'

# off: the slate stops; booked recordings stay booked
curl -X PATCH https://api.sb/leaseline.app/campaigns/guest-circuit \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
```


```json title="The dry run’s 422 · 2026-08-24 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "guest-circuit can’t start: 2 checks fail and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "Dana, a person, can record 1 a week; 5 anecdotes logged",
      "doc": "/plays/guest-circuit#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "warn",
      "observed": "1 episode in 90 days, 38 ICP Visitors",
      "doc": "/plays/guest-circuit#check-baseline",
      "fix": "n 1: it reads before-after, not proof, beside Other Startups’ results.",
      "then": "Metric.query"
    },
    {
      "check": "opinion-bank",
      "status": "fail",
      "observed": "22 of 30 views",
      "doc": "/plays/guest-circuit#check-opinion-bank",
      "fix": "Answer 8 more questions; pitches state only views you hold.",
      "then": "Content.create"
    },
    {
      "check": "domain-authenticated",
      "status": "fail",
      "doc": "/plays/guest-circuit#check-domain-authenticated",
      "fix": "Add the 3 DNS records shown; it passes once they resolve, often within an hour.",
      "then": "Domain.authenticate"
    },
    {
      "check": "mailbox-warm",
      "status": "pass",
      "observed": "Dana’s Mailbox, 2 years of sent mail",
      "doc": "/plays/guest-circuit#check-mailbox-warm",
      "then": "Mailbox.warm"
    },
    {
      "check": "role-unstaffed",
      "status": "pass",
      "observed": "every hand-off goes to the founder, Dana",
      "doc": "/plays/guest-circuit#check-role-unstaffed",
      "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: a founder who records weekly; warn: 1 episode, n 1 (gaps #8) | <Op verb="Metric.query" /> on `episode-icp-visits`, which fills Before in Your number | 1 min | none |
| <a id="check-opinion-bank"></a>`opinion-bank` · fail (gaps #8): 22 of 30 views | <Op verb="Content.create" />: answer the grilling | 20 min | none |
| <a id="check-domain-authenticated"></a>`domain-authenticated` · fail | <Op verb="Domain.authenticate" /> | 10 min | until DNS resolves, often under 1 h |
| <a id="check-mailbox-warm"></a>`mailbox-warm` · <a id="check-role-unstaffed"></a>`role-unstaffed` · pass: pitches send from Dana’s own Mailbox; every hand-off is yours | <Op verb="Mailbox.warm" /> only for a new Mailbox · <Op verb="Role.staff" /> if a person joins | 0 min | none |

`Your number · Before 38 ICP Visitors per episode · Now 107 per episode · Target 120 by Dec 31 · before-after, not proof · n 2 matured`

A pitch costs nothing to send from your own Mailbox. Each pitch brief costs $0.03 and each episode Page $0.20 to draft and publish (Worker cost), and shows that ask a fee leave this Play. That comes to about $5 a month at 8 pitches a week, plus your 3 hours.

## When it starts
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| Monday’s pitch slate is due and you have open recording slots | `slate-due` | `at` on `Schedule.fired` where Monday 07:00, with open recording slots in the next 6 weeks | 7d | set by your file’s capacity line |
| A journalist asks in public for a view in your beat | `view-request` | `event` on `Post.published` where kind = 'source-request' and dueIn > 45m | 12h; dropped inside 45 min of its deadline | <Op verb="Handle.connect" /> reads it, or forward it |
| A booked episode, or a feature quoting you, goes live | `episode-aired` | `event` on `Monitor.checked` where status = 'aired' | 72h | read from the show’s feed; <Op verb="Event.capture" /> for one seen elsewhere |
| + 8 more for show openings and gaps, invites, confirmed bookings, citations, news moments, interview asks and your memos (`?lanes=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1195",
  "$type": "Event",
  "name": "Monitor.checked",
  "at": "2026-10-19T06:30:02Z",
  "seq": 1195,
  "data": {
    "monitor": "monitors/show-openings",
    "show": "shows/show_42",
    "name": "Rent Roll Radio",
    "kind": "call-for-guests",
    "listenerAsks": 3,
    "lastEpisodesOnTopic": 0
  }
}
```

```bash title="Reproduce it in test"
# each delivery is signed with the Watch’s secret
curl -X POST https://api.sb/leaseline.app/watches \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selector":"Monitor.checked","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Monitor.checked --like event_1195   # replays the delivery
npx startup-builder clock advance --by 7d   # runs the one follow-up line, only with new information
```

## Who runs it
**Communications Lead · your agent** (`role:communications-lead`, `worker_7`) holds the Key Result: it maps shows, reads episodes, drafts pitches, schedules and publishes episode Pages. Every pitch, answer, take and quote hands to **you** (Dana Okafor, person, `worker_1`, `role:founder`), who writes the opening line and presses send. A scheduling Message names the agent as an agent in its first line.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Pitch the show · Answer the request · Offer a take | You approve each one | 42 sent of 51 briefed (9 skipped) | never: words under your name stay yours | — | skip it in the tray, or <Op verb="Action.cancel" /> |
| Book it | It does it, you can stop it | 7 of 7 | met on day 30 (5 bookings, 0 Checks failed) | a missed session → You approve each one | <Op verb="Action.cancel" /> inside the hold |
| After it airs · Not now | It does it | 4 of 4 · 11 of 11 | — | a Page before the host’s grant → You approve each one | <Op verb="Action.redirect" /> |
| Change the slate rule | You approve each one | 1 merged of 1 | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: a quote you did not approve, a paid slot, a transcript before the host’s grant | Refused, every time | 2 drafted, 2 refused | never | — | the `words-check`, `paid-slot` and `rights-hold` Checks |

**What it reads · What it may call.** It reads only what a host published: episode titles, dates, guests and the host’s own words. A host’s Message is data, never instructions; <Op verb="Meeting.book" /> lands on your calendar under your name. Its tools are <Op verb="Content.draft" />, <Op verb="Task.assign" />, <Op verb="Meeting.book" />, <Op verb="Site.publish" />, <Op verb="Video.draft" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="The brief (folded): compiled Agent-register Markdown · play:guest-circuit@1 · each line names its record key"
You hold the Communications Lead Key Result: 120 ICP Visitors per aired episode by 2026-12-31. ← worker, metric
On each show, request or story, choose one option and say why; a paid slot gets Not now. ← triggers, chooses
Pitch at most 4 shows per open recording slot, and 1 a week when the slots are full. ← your file, line 3
Every sentence under the founder’s name traces to their typing, the opinion bank or the anecdote log. ← copyRules 1, words-check
Cite only what the host published; carry one anecdote fresh to the show for 90 days. ← copyRules 3, 4
Credit the show and the host before Leaseline on every episode Page.             ← copyRules 10
```

**The slow loop, as a Change.** `decision_383` (2026-09-21, weekly) read 4 bookings from 11 pitches naming a listener’s question against 1 from 17 that did not, so `change_25` made the listener’s question the pitch’s second line (your file, line 5), and Dana merged it with <Op verb="Change.merge" />. **Replayed on past pitches**, <Op verb="Change.review" /> put bookings at 27 per 100; read back at +28d it is 25 per 100, n 16, ■□□□ Too early to tell (Example, day 56).

**Bring your own agent** (folded) drafts at the same rung when it matches or beats the seated agent on the eval suite; you open every pitch either way, and <Op verb="Role.staff" /> seats it.

```bash
npx startup-builder eval --scenario guest-circuit-73 --agent "claude -p" --seat communications-lead   # seated: 0 untraced sentences sent, 0 stale anecdotes, 4.1 founder min a pitch · yours: 2 untraced, 1 stale, 5.0 min → fix the trace first
```

## What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| Pitch the show `pitch-the-show` | its audience asks about a topic it skipped in 20 episodes, and you hold a fresh anecdote | Agent’s call, with its reason | <Op verb="Content.draft" /> → <Op verb="Task.assign" /> to your tray → `guest-pitch-two-touch` once you send | you open and send it, due 1 business day · Take this one | you |
| Answer the request `answer-the-request` | a journalist’s public request in your beat, due in over 45 min | Agent’s call, with its reason | <Op verb="Content.draft" /> of fragments → <Op verb="Task.assign" /> | you write the answer, due 60 min · Take this one | you |
| Offer a take `offer-a-take` | a news story in your beat, inside its class window | Agent’s call, with its reason | <Op verb="Content.draft" /> → `newsjack-comment-offer`, no follow-up | you write the take, due 60 min · Take this one | you |
| Book it `book-it` | a host says yes or invites | Your rule (line 3) | `booking-confirm` → <Op verb="Meeting.book" /> on your calendar → your prep brief the day before | you, for the recording | you |
| After it airs `after-it-airs` | a booked episode or a feature quoting you goes live | Your rule (the episode Page) | <Op verb="Site.publish" /> the episode Page → <Op verb="Video.draft" /> clips → `host-thanks` | nobody | the same |
| Not now `not-now` | held out this quarter, pitched in the last 90 days, or a paid slot | Your rule (the leases) | nothing; names the lease and its end date, or `sponsorships` for a paid slot | nobody | the same |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “Love this angle. Can you record on Sep 10?” | Book it: the scheduling agent offers 3 slots in the host’s time zone and asks once for the grants | Communications Lead · your agent, then you | 1 business day | <Op verb="Meeting.book" /> |
| Send me pricing | “Do you charge to come on, or do we?” | drafts your one line: no fee either way; a show that asks one leaves this Play | you, from a draft | 1 business day | <Op verb="Content.draft" /> |
| Not now | “We’re booked through December.” | no follow-up; the show’s lease holds 90 days, then it can return to the slate | nobody | at once | <Op verb="Decision.list" /> |
| Wrong person | “Our producer, Sam, books guests.” | drafts your thanks asking them to loop Sam in; it never writes to an address from their text | you, from a draft | 1 business day | <Op verb="Content.draft" /> |
| Out of office | an auto-reply until Oct 28 | the one follow-up waits for the return date, only with new information | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “Can you share Leaseline’s churn numbers on air?” | held for you: a number off the claims source never appears; you decide what to share | you (Dana, person) | 1 business day | <Op verb="Conversation.escalate" /> |
| Stop | “Please take us off your list.” | the show leaves the map for every one of your Startups; nothing sends again | nobody | at once | <Op verb="Contact.suppress" /> |

## When it hands to you
Every pitch, answer, take and recording hands to **you** (Dana Okafor, person): words under your name are yours to open and send. As captured, the Brief in your tray (`brief` is Not live yet, gaps #7); a booked recording adds a prep brief the day before.

```json title="What lands in each queue · sample"
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_517",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-20T17:00:00Z",
    "on": "show_42",
    "brief": {
      "show": "Rent Roll Radio, host Lena Ortiz, 94 episodes",
      "gap": "late renewals: 3 listener asks, 0 of the last 20 episodes",
      "anecdote": "#4: the 11-owner batch, fresh to this show and the niche for 90 days",
      "episodes": [
        "Ep 91: Turnover math",
        "Ep 88: The owner report",
        "Ep 85: Move-in to move-out"
      ],
      "chose": "pitch-the-show",
      "never": [
        "a number off the claims source",
        "an ask for a review or a share"
      ]
    }
  }
]
```

You answer each brief by writing the opening line and pressing send, with <Op verb="Task.return" /> and a reason, or with <Op verb="Action.redirect" />. A brief left 1 business day expires, and 7 days with no tray action stop the slate (`founder-silence`). Nobody else can speak in your name, so nothing goes up a Role.

**On time:** You: 42 of 51 briefs sent within their due time, median 3h 40m for pitches and 38 min for requests, n 51, ■■□□ Early sign beside Other Startups’ 79 %. **Your queue:** counted by kind: about 8 pitch briefs, 1 request and 1 prep brief a week, and 1 weekly slate review.

**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; Not live yet, gaps #8) | a pitch to a host whose Lead or open Deal the AE owns | Leave it to the person who owns it: the draft waits in their queue. | <Op verb="Task.assign" /> |
| <a id="check-words-check"></a>`words-check` | a sentence under your name that traces to no founder-written source, reference line or accepted fragment | Write that sentence yourself, or cut it. | <Op verb="Content.draft" /> |
| <a id="check-fact-check"></a>`fact-check` (the fabrication veto) | a number, name, event or credential no fact backs | Cut the line, or add the source it came from. | <Op verb="Content.draft" /> |
| <a id="check-fresh-anecdote"></a>`fresh-anecdote` (email) | a pitch whose anecdote aired on that show, or any mapped show, in 90 days | Pick another anecdote from the log, or log a new one. | <Op verb="Content.draft" /> |
| <a id="check-unsure-view"></a>`unsure-view` | a view marked unsure in the opinion bank | Firm the view in the bank, or leave it out. | <Op verb="Content.create" /> |
| <a id="check-rights-hold"></a>`rights-hold` (Pages and clips) | a transcript or clip before the host’s grant is on the booking | Ask the host for the grant; the Page waits for it. | <Op verb="Message.schedule" /> |
| <a id="check-recording-hold"></a>`recording-hold` | a local backup recording with no host grant, or before everyone hears it announced | Announce it at the start, under the host’s grant. | <Op verb="Task.next" /> |
| <a id="check-paid-slot"></a>`paid-slot` (email) | a pitch to a show that asks for a fee, a purchase or an ad buy | Send it to `sponsorships` instead. | <Op verb="Task.assign" /> |
| <a id="check-disclosure"></a>`disclosure` | a recommendation of a Startup you hold an interest in, with no disclosure first | Name your interest before the recommendation. | <Op verb="Content.draft" /> |
| <a id="check-agent-label"></a>`agent-label` | the agent as a guest, unless invited as itself with a labeled voice | Send yourself, or accept only an invite to the agent by name. | <Op verb="Task.assign" /> |
| <a id="check-prep-holds"></a>`prep-holds` | round terms, unshipped Changes or a Customer without Consent in a brief, clip or Page | Cut it from the brief; the hold lists what stays out. | <Op verb="Content.draft" /> |
| <a id="check-contact-lease"></a>`contact-lease` (email) | a second pitch to one show in 90 days, or a host one of your other Startups wrote in 30 | Wait for the lease’s end date. | <Op verb="Decision.list" /> |
| <a id="check-deadline-drop"></a>`deadline-drop` (email) | a source request due inside 45 minutes, or a take outside its class window | Let it go; the next request opens a new brief. | <Op verb="Decision.list" /> |
| <a id="check-tragedy-skip"></a>`tragedy-skip` | a take on a story about a death, a disaster or violence | None: the news Monitor drops it, with no override. | <Op verb="Decision.list" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-capacity"></a>`capacity` (email) | pitches reach 4 per open recording slot, or the capacity line fills | the slate stops until a slot opens |
| <a id="stop-booking-floor"></a>`booking-floor` (email) | under 4 bookings per 100 pitches, after 75 pitches | the slate pauses; You approve each one, with the brief shown first |
| <a id="stop-complaint"></a>`complaint` (email) | one host complaint, or a pitch shown in public as generic | every pitch Tactic pauses; you hear first |
| <a id="stop-bounce"></a>`bounce` (email) | over 2 bounces in a week | the slate pauses until queued addresses verify again |
| <a id="stop-missed-session"></a>`missed-session` | a missed recording | the slate pauses until you write the host |
| <a id="stop-founder-silence"></a>`founder-silence` | 7 days with no tray action | the slate stops; you get one notice |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every Tactic pauses at once; booked recordings stay on your calendar |

The captured refusal, then the Stop that fired as a `Campaign.paused` reason (Not live yet, gaps #2); the rewrite you sent is the Landlord Hour thread in Example.

```json title="The captured refusal · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The pitch to The Landlord Hour did not reach your tray: it claims a number no fact backs.",
  "checks": [
    {
      "check": "fact-check",
      "status": "fail",
      "doc": "/plays/guest-circuit#check-fact-check",
      "fix": "Cut the line, or add the source it came from.",
      "then": "Content.draft"
    },
    {
      "check": "words-check",
      "status": "pass"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "reason": {
      "limit": "bounce",
      "observed": "3 bounces",
      "bound": "2",
      "window": "7d"
    },
    "doc": "/plays/guest-circuit#stop-bounce",
    "task": "task_470"
  }
]
```

## Did it work
At about 2 aired a month, no held-out half of shows reads within 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. Each figure’s call is <Op verb="Metric.query" /> by node, and every node above the leaf is Not live yet (gaps #4).

`107 per episode against 38 before · before-after, not proof · n 2 · path → arr`

| Node | Now (56 days) | Before (the 90 days, per 56) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `episode-icp-visits` | 107 per episode: 214 ICP Visitors from 2 matured · 2 still maturing (88 so far) | 38 per episode: 1 invited episode | — · Worth about +$420 a month | — | before-after, not proof · Other Startups’ results +60 per episode, ■■■□ Likely, n 410 episodes, 1 show in 4 held out at random |
| `icp-reached` | 302 ICP Visitors from show links and episode Pages | 24 | — | — | before-after |
| `new-arr` ↑ | $694, 2 Customers on Pro · Booked: credited, not all caused by this Play | $0 | — · 3 trials still deciding | — | before-after, not proof |
| `net-new-arr` · `arr` | carried from `new-arr` | carried | — | — | carried |

Before against after reads ICP Visitors per aired episode in the 56 days against the 90 days before, scaled, when one show invited Dana and none were pitched. It is not proof; Other Startups’ results, read with 1 tier-2 show in 4 held out at random for 90 days, print beside it.

**How it moves it:** 6 bookings from 32 pitches, each opening on a listener’s own question, and every aired episode got its Page within 48 hours.

**Guardrails:** before against after: `earned-mentions`, 4 against 1, and `play-sourced-customers`, 2 against 0; 0 host complaints.

```json title="The Campaign card · sample"
{
  "$id": "https://api.sb/leaseline.app/campaigns/guest-circuit",
  "$type": "Campaign",
  "play": "play:guest-circuit@1",
  "path": [
    "episode-icp-visits",
    "icp-reached",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "episode-icp-visits",
    "unit": "per-episode",
    "heldBack": 0,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 2,
    "maturing": 2,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 0,
    "workerCost": 9,
    "hours": 24,
    "pipelineArr": 1041,
    "wonArr": 694,
    "projectedArr": 425,
    "paybackDays": 3
  }
}
```

Outside benchmark: 33 % of human-written answers to journalist source requests were selected, against 10 % of generated ones (a source-request service’s pitch data, 2026-09-23).

**Before it · After it.** Before it: `founder-voice` fills the opinion bank and the anecdote log, and `data-stories` finds the news moments. After it: `archive-repurposing` hears each transcript, `video-ladder` the clips, and a paid slot goes to `sponsorships`.

## Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days) on a map of 64 shows, 16 of them tier 1. It briefed 51 pitches, answers and takes, Dana sent 42, and 4 episodes or features aired. Read every captured thread at `?threads=all`; three follow the tables.

| What happened, by option | Decisions | Sent by you | Booked or quoted | Aired |
| --- | --- | --- | --- | --- |
| Pitch the show | 38 | 32 | 6 booked | 3 episodes, 3 to air |
| Answer the request · Offer a take | 9 · 4 | 7 · 3 | 2 quoted · 0 | 1 feature |
| Book it · After it airs | 7 · 4 | — | 7 recordings | 4 episode Pages |
| Not now | 11 | 0 | — | — |
| **All** · Before (90 days, per 56) | **73** | **42** | **8** | **4** · 1 |
| At 2 aired a month (the Use it when volume) | about 70 in 56 days | about 40 | before-after, not proof | Other Startups’ results: +60 per episode, ■■■□ Likely, n 410 |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_126` Campaign.created | the three steps; dry run fails `opinion-bank` and `domain-authenticated` | 35 min |
| 9 | `event_290` Meeting.booked | the first recording: Rent Roll Radio, Sep 10 | — |
| 17 | `event_388` Monitor.checked | the episode aired; its Page published within 48 hours with the host’s grant | 10 min |
| 28 · 56 | `event_530` Change.merged · `event_905` Readout.created | the listener’s question as line 2: replayed at 27 per 100, read back at +28d at 25, n 16 | 5 min |
| 30 | `event_560` Role.updated | promoted: booking sends after a 2-minute hold; pitches still wait on you | — |
| 37 | `event_655` Campaign.paused | `bounce`: 3 bounces in a week; resumed after 2 addresses verified | 10 min |
| 1–56 | `event_133` Task.assigned, first of 51 | you sent 42, recorded 7 times and reviewed 8 slates, from the <Op verb="Task.next" /> log | 21 h · **total 24 h measured, 24 h asked** |

> **Dana → Lena Ortiz, Rent Roll Radio, Sep 1, 10:12** · Lena, three of your listeners asked about late renewals this year, and the last 20 episodes skipped it.¹ Last spring an owner group of 11 sent every renewal notice in one batch, and 9 went out late.² I can walk through how per-owner batches fixed it. Ep 91, 88 and 85 set it up well.³
>
> **Lena, Sep 2, 08:30** · “Yes. Can you record Sep 10?” <Op verb="Meeting.book" /> booked it on Dana’s calendar; the episode aired Sep 15, and its Page brought 131 ICP Visitors in 30 days.

```diff title="The Landlord Hour, 2026-09-08 · the draft fact-check refused, then the rewrite you sent"
- Leaseline has helped over 300 property managers stop late renewals.
+ Leaseline sends renewal notices for 41 property managers, each owner on its own 60-day batch.
```

> **A trade reporter, 2026-10-07 11:02** · asked in public for property managers on renewal season, due 15:00. The agent drafted fragments and put a Brief in Dana’s tray, due 12:02. · **Dana, 11:48** · answered in her own 70 words; the feature quoted her on Oct 13. The Brief is in When it hands to you.

¹ Only what the host published, and a listener’s own question first. ² A fresh anecdote from the log, with its numbers from the claims source. ³ Episode titles the host published.

## Your settings
```mdx title="plays/guest-circuit.mdx"
---
holdout: 0        # 2 aired a month is too few to hold 1 show in 4 back; it reads before-after
capacity: 1       # recordings a week
---
Pitch property-management shows whose listeners ask about renewals. Open each pitch on a listener’s own question.
```

```text
$ npx startup-builder show plays/guest-circuit
holdout 0 · capacity 1 a week · the listener’s question first     your file  plays/guest-circuit.mdx:2,3,5 (Ask 2026-08-24; line 5 by change_25, 2026-09-21)
family demand · worker role:communications-lead, owns never · chooses 6 (3 rule, 3 read) · sequences guest-pitch-two-touch, booking-confirm, host-thanks, newsjack-comment-offer · every pitch opened by the founder · checks owned-by-a-person + 13 · stops 7 · placements gmail, outlook, google-search, answer engines, youtube, x, linkedin    catalog  play:guest-circuit@1 (Not live yet, gaps #5)
```

### Every key from the catalog
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-show-map"></a>`show-map` | Show map scores a niche’s shows on fit, reach and openness, tiers them, checks leases and permission, and holds out 1 in 4. Starts at You approve each one. |
| Tactic | <a id="tactic-episode-read"></a>`episode-read` | Episode read turns a show’s last 10 to 20 episodes into a pitch brief: the audience’s unanswered gap, one fresh anecdote, one dated fact. Starts at Sends nothing. |
| Tactic | <a id="tactic-pitch-critic"></a>`pitch-critic` | Pitch critic briefs the human author before a pitch and checks the draft after it, returning fragments and comments and never rewritten text. Starts at Sends nothing. |
| Tactic | <a id="tactic-guest-pitch"></a>`guest-pitch` | Guest pitch builds, checks and sends a show pitch in the founder’s own words from the founder’s Mailbox, after the founder’s approval. Starts at You approve each one. |
| Tactic | <a id="tactic-pitch-follow-through"></a>`pitch-follow-through` | Pitch follow-through leases the host, sends one follow-up line only when it carries new information, and routes every reply. Starts at You approve each one. |
| Tactic | <a id="tactic-words-check"></a>`words-check` | Words check blocks any sentence sent under a Human’s name that traces to nothing the Human wrote, said or accepted, or to a dated reference. Starts at Sends nothing. |
| Tactic | <a id="tactic-booking-desk"></a>`booking-desk` | Booking desk schedules a recording session as the founder’s disclosed agent, records the host’s grants, and routes any paid slot to sponsorships. Starts at You approve each one. |
| Tactic | <a id="tactic-guest-prep"></a>`guest-prep` | Guest prep confirms each place, decides go or no-go 10 days out, briefs the host one page per guest, and sends the founder’s reminder. Starts at You approve the first wave. |
| Tactic | <a id="tactic-view-answer"></a>`view-answer` | View answer briefs the founder within 10 minutes on a journalist’s request for a view, from the founder’s own bank; the founder writes and submits. Starts at Sends nothing. |
| Tactic | <a id="tactic-newsjack-watch"></a>`newsjack-watch` | Newsjack watch scores beat news every 30 minutes, keeps stories the Dataset answers with a number, and briefs the founder within 2 hours. Starts at You approve each one. |
| Tactic | <a id="tactic-view-newsjack"></a>`view-newsjack` | View newsjack turns a beat story that needs a view into a founder-written take for 3 to 5 journalists and 3 shows, inside its window. Starts at You approve each one. |
| Tactic | <a id="tactic-episode-capture"></a>`episode-capture` | Episode capture publishes each aired episode as a Page within 24 hours: the show credited first, chapters, and the verbatim transcript when granted. Starts at It does it, you can stop it. |
| Tactic | <a id="tactic-appearance-log"></a>`appearance-log` | Appearance log writes an aired episode back into the claims source, the anecdote log and the appearances Page, and hands the transcript on. Starts at Sends nothing. |
| Tactic | <a id="tactic-clip-cut"></a>`clip-cut` | Clip cut trims real source footage into captioned clips of one claim each, which a human edits before any upload, and never generates a frame. Starts at You approve each one. |
| Tactic | <a id="tactic-host-give-back"></a>`host-give-back` | Host give-back sends the host clips, the episode Page and the founder’s thanks within 48 hours of air, promotes the show, and asks for nothing. Starts at It does it, you can stop it. |
| Tactic | <a id="tactic-aired-readout"></a>`aired-readout` | Aired readout counts episodes aired, ICP Visits per episode and transcript citations monthly, reads bookings by arm against the holdout, and pools by niche. Starts at Sends nothing. |
| Tactic | <a id="tactic-fabrication-veto"></a>`fabrication-veto` | Fabrication veto blocks any draft written in a Human’s name that states a number, name, event, quote or feeling no source supports. Starts at Sends nothing. |
| Tactic | <a id="tactic-founder-send-tray"></a>`founder-send-tray` | Founder send tray shows each approved draft with its source trail; the founder presses post by hand or through the Venue’s own posting path. 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. |
| Trigger | <a id="trigger-slate-due"></a>`slate-due` | Slate due: `at` on `Schedule.fired`, window 7d. |
| Trigger | <a id="trigger-show-opening"></a>`show-opening` | Show opening: `event` on `Monitor.checked`, window 14d. |
| Trigger | <a id="trigger-show-gap"></a>`show-gap` | Show gap: `threshold` on `Monitor.checked`, window 30d. |
| Trigger | <a id="trigger-view-request"></a>`view-request` | View request: `event` on `Post.published`, window 12h. |
| Trigger | <a id="trigger-news-moment"></a>`news-moment` | News moment: `event` on `Monitor.matched`, window 48h. |
| Trigger | <a id="trigger-interview-ask"></a>`interview-ask` | Interview ask: `event` on `Interview.requested`, window 24h. |
| Trigger | <a id="trigger-host-invite"></a>`host-invite` | Host invite: `event` on `Message.received`, window 48h. |
| Trigger | <a id="trigger-booking-confirmed"></a>`booking-confirmed` | Booking confirmed: `event` on `Meeting.booked`, window 14d. |
| Trigger | <a id="trigger-episode-aired"></a>`episode-aired` | Episode aired: `event` on `Monitor.checked`, window 72h. |
| Trigger | <a id="trigger-transcript-cited"></a>`transcript-cited` | Transcript cited: `event` on `Monitor.checked`, window 28d. |
| Trigger | <a id="trigger-founder-memo"></a>`founder-memo` | Founder memo: `event` on `Recording.captured`, window 7d. |
| Sequence | <a id="sequence-guest-pitch-two-touch"></a>`guest-pitch-two-touch` | Guest pitch two touch: 2 steps; it ends on A reply; A booking; A later reply, re-queued at its date; A no-pitch reply or an opt-out; A bounce; No new information at 7 days. |
| Sequence | <a id="sequence-booking-confirm"></a>`booking-confirm` | Booking confirm: 3 steps; it ends on A recorded session; A cancel; The host’s opt-out. |
| Sequence | <a id="sequence-host-thanks"></a>`host-thanks` | Host thanks: 2 steps; it ends on The host’s opt-out; No results opt-in at 30 days; The results note sent. |
| Sequence | <a id="sequence-newsjack-comment-offer"></a>`newsjack-comment-offer` | Newsjack comment offer: 1 steps; it ends on A reply; An opt-out or a no-pitch reply; The class window closing. |
| Benchmark | <a id="benchmark-guest-answer-selection-human"></a>`guest-answer-selection-human` | Share of human-written answers to journalist source requests that the journalist selects: 33 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23). |
| Benchmark | <a id="benchmark-guest-answer-selection-generated"></a>`guest-answer-selection-generated` | Share of fully generated answers to journalist source requests that the journalist selects: 10 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23). |
| Benchmark | <a id="benchmark-guest-journalist-filter"></a>`guest-journalist-filter` | Share of journalists on a source-request service who turned on its filter against fully generated pitches: 35 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23). |