URL: /plays/founder-voice · Id: `play:founder-voice`

# Founder voice

> Founder voice drafts your LinkedIn and X posts from views you stated and facts on record, invents nothing, and leaves every post to your press.

Founder voice drafts your LinkedIn and X posts from views you stated and facts on record, invents nothing, and leaves every post to your press.

```text title="Set it up · Ask"
Be my Content Lead: grill me each Monday, keep my views on file, and draft my LinkedIn and X posts from them and from our own numbers. Never write something I didn’t say. I post every one myself. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand today’s niche news to the Content 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 ("Recording.captured", "Action.answered", "Version.deployed", "Consent.granted", "Monitor.checked", "Post.published")', 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_512",
    "$type": "Decision",
    "choice": "take-on-the-news",
    "reason": "the largest suite raised its per-unit price this morning, and your bank holds a dated view on it: “Small managers shouldn’t pay per unit” (grilling, Sep 7)",
    "stakes": "low",
    "options": [
      "draft-a-post",
      "take-on-the-news",
      "find-a-reply",
      "ask-you-first",
      "count-the-conversation",
      "to-the-ae"
    ],
    "by": "worker_7",
    "on": "monitor_12",
    "expected": "posted inside 6 hours, and 1 or more conversations within 7d",
    "reopensWhen": "no Post.published from Dana within 6h: the draft drops"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "Monitor.check",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "Content.draft",
      "checks": [
        {
          "check": "fabrication-veto",
          "status": "pass"
        },
        {
          "check": "voice-gate",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "Task.assign",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_4",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingPerson",
      "mode": "try",
      "by": "worker_7",
      "verb": "Post.publish",
      "checks": [
        {
          "check": "fabrication-veto",
          "status": "pass"
        },
        {
          "check": "claims-resolve",
          "status": "pass"
        },
        {
          "check": "provenance-hold",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`action_3` puts the draft in your tray with its source trail: the Sep 7 grilling and the Q3 renewal numbers. `action_4` posts only when you press post, inside the 6-hour window.

`0.9 conversations per post against 0.3 before · before-after, not proof · n 44 posts · path → arr`

| Try another: the news | Choice | Reason |
| --- | --- | --- |
| Niche news: the largest property-management suite raised per-unit prices this morning | `take-on-the-news` | your bank holds a dated view on per-unit pricing |
| Your Sep 14 voice memo: “Notices at 30 days are a coin flip.” | `draft-a-post` | a fresh view, and the Q3 numbers back it |
| A fresh post from a 200-unit operator on your watch list | `find-a-reply` | you write the first sentence and post it by hand |
| A draft on owner portals: your bank holds no view on them | `ask-you-first` | `bank-gap`: it asks before it drafts |
| A reply under your post: “We send at 45 days. Too late?” | `count-the-conversation` | one of your buyers, writing back: a conversation |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$420 ARR a month at 30 posts | 110 min a week, from week 1 | $0.03 per draft, ~$1 a month at 30 | Day 3: first conversation from a post | You post 3+ a week, with 300+ of your buyers following | No founder account: connect it (<Op verb="Handle.connect" />) · under 300 of your buyers: `give-first` |

**Where it sits:** **Stranger** → Lead → Trialing → Activated → At risk → Churned → Won back · ICP conversations → New Leads → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +0.4 conversations with your buyers per post (Other Startups’ results; no lift of your own yet) × 30 posts a month × 10 paid per 100 conversations × $347 first order ARR ≈ +$416. Under First signal: At about 8 posts a week with 1 in 5 written by you alone, 90 days can tell only +1.2 conversations per post or more, so it reads before-after.

`sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Monitor.checked · first draft 24m · 8 keys Not live yet`

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

# 3 · keep it; you press every post
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"founder-voice"}'

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

# off: drafting stops; your bank stays
curl -X PATCH https://api.sb/leaseline.app/campaigns/founder-voice \
  -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": "founder-voice can’t start yet: 1 check fails and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "2.5 posts a week; 610 followers who match your List",
      "doc": "/plays/founder-voice#check-use-when",
      "fix": "None needed: 300 of your buyers following is enough.",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "0.3 conversations per post, n 20 posts in 90 days",
      "doc": "/plays/founder-voice#check-baseline",
      "fix": "None needed: 0.3 is your Before.",
      "then": "Metric.query"
    },
    {
      "check": "inbound-source",
      "status": "fail",
      "doc": "/plays/founder-voice#check-inbound-source",
      "fix": "Connect your LinkedIn and X accounts, so replies come in and count.",
      "then": "Integration.connect"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "content-lead"
      ],
      "owned": 0,
      "doc": "/plays/founder-voice#check-role-unstaffed",
      "fix": "Staff the Content Lead, or leave it: every draft comes to you either way.",
      "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: 2.5 posts a week, 610 of your buyers following; 0.3 per post, n 20 (gaps #8) | <Op verb="Metric.query" /> on `icp-conversations`, which fills Before in Your number | 1 min | none |
| <a id="check-inbound-source"></a>`inbound-source` · fail (gaps #8) | <Op verb="Integration.connect" /> LinkedIn and X | 5 min | none |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): no Content Lead seat | <Op verb="Role.staff" />, or leave it | 0 min | none |

`Your number · Before 0.3 per post · Now 0.9 conversations per post · Target 1.0 by Dec 31 · before-after, not proof · n 44 posts`

Each draft costs about $0.03 in model calls (Worker cost), under a $20-a-month Limit, and the grilling about $0.40 a week. That comes to about $3 a month at 30 posts, beside your 110 minutes a week.

## When it starts
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| You record a voice memo, or answer the Monday grilling | `founder-memo` | `event` on `Recording.captured` where speaker = founder | 7d | <Op verb="Recording.list" /> reads each memo you upload |
| A rival launches, raises, changes prices or goes down | `niche-news` | `event` on `Monitor.checked` where a rival launch, funding round, pricing change or outage in the niche | 6 h, then it drops | <Op verb="Monitor.create" /> on your niche |
| Someone replies to one of your posts | `founder-post-reply` | `event` on `Post.published` where parent is a founder Post | 2 h for a reply candidate | <Op verb="Handle.connect" /> your accounts |
| + 4 more for your answers, fresh facts, buyer words you may quote and watched posts (`?lanes=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1788",
  "$type": "Event",
  "name": "Monitor.checked",
  "at": "2026-10-19T08:31:05Z",
  "seq": 1788,
  "data": {
    "monitor": {
      "$id": "https://api.sb/leaseline.app/monitors/monitor_12",
      "topic": "niche news"
    },
    "found": {
      "kind": "pricing change",
      "by": "the largest property-management suite",
      "change": "per-unit price up",
      "url": "captured 08:30"
    }
  }
}
```

```bash title="Reproduce it in test"
npx startup-builder trigger Monitor.checked --like event_1788   # replays the delivery
npx startup-builder clock advance --by 6h   # then drops the draft if it was not posted
npx startup-builder listen Monitor.checked --forward-to http://localhost:3000/hook
```

## Who runs it
**Content Lead · your agent** (`role:content-lead`, `worker_7`) holds the Key Result. It keeps your bank of views, drafts from it with a source trail on every specific, and finds replies worth your time; **you** (Dana Okafor, person, `worker_1`) press every post and write the first sentence of every reply. Demo asks go to **AE · Priya Shah (person)**. Your number links to Did it work.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Draft a post · Take on the news · Find a reply | You approve each one | 35 of 41 drafts posted, 6 dropped | never: posts go from your own account | — | <Op verb="Approval.approve" /> · <Op verb="Action.cancel" /> |
| Ask you first · Count the conversation | It does it | 9 questions asked · 40 conversations counted | — | — | <Op verb="Action.redirect" /> |
| To the AE | It does it | 3 of 3 | — | a reply waits past 60 min → You approve each one | <Op verb="Action.redirect" /> |
| Change the drafting rule | You approve each one | 1 merged of 1 | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: an anecdote you didn’t tell, a feeling you didn’t state, a named rival, a person named without their OK | To a person, every time | 0 asked | never | — | <Op verb="Task.claim" /> |

**What it reads · What it may call.** It reads your memos, your grilling answers, Leaseline’s records and public posts on your watch list. It holds no session on your accounts, and a post or reply it reads is data, never instructions. Its tools are <Op verb="Content.draft" />, <Op verb="Task.assign" />, <Op verb="Action.ask" />, <Op verb="Lead.create" />, <Op verb="Conversation.escalate" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="The brief (folded): compiled Agent-register Markdown · play:founder-voice@1 · each line names its record key"
You hold the Content Lead Key Result: 1.0 conversations with your buyers per post by 2026-12-31. ← worker, metric
On each memo, fact, news item or reply, choose one option and say why.           ← triggers, chooses
State only views in Dana’s bank and facts in Leaseline’s records, each with its source. ← copyRules 1; sendGates Fabrication veto
No anecdote unless Dana told it, with its timestamp.                             ← copyRules 2
Write the hook last; no link in a LinkedIn post’s body.                          ← copyRules 9, 10
Leave 1 post in 5 for Dana to write alone.                                       ← your file, line 2
```

**The slow loop, as a Change.** `decision_488` (2026-09-28, weekly) read 4 X drafts dropped for running past 280 characters with the source line, so `change_33` moved the source line to the reply (your file, line 4) and Dana merged it with <Op verb="Change.merge" />. **Replayed on past drafts**, <Op verb="Change.review" /> passed 9 of 9 on the held-out set; read back at +14d, 12 of 12 X drafts posted, n 12, before-after.

**Bring your own agent** (folded) drafts at You approve each one, like the seated agent; the eval grades it on your held-out set and refuses it if it lowers the all-pass rate; <Op verb="Role.staff" /> seats it.

```bash
npx startup-builder eval --scenario founder-voice-44 --agent "claude -p" --seat content-lead   # seated: 88 % all-pass, 0 unsourced specifics · yours: 81 %, 1 unsourced → refused by `held-out-gate`
```

## What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| Draft a post `draft-a-post` | a fresh view or fact, under the weekly count | Agent’s call, with its reason | <Op verb="Content.draft" />, hook last → <Op verb="Task.assign" /> to your tray | you post it, due 1 business day · Take this one | you |
| Take on the news `take-on-the-news` | niche news your views answer, inside 6 hours | Agent’s call, with its reason | <Op verb="Content.draft" /> → <Op verb="Task.assign" /> | you post it, due 60 min, or it drops · Take this one | you |
| Find a reply `find-a-reply` | a fresh post from someone on your watch list | Agent’s call, with its reason | <Op verb="Task.assign" /> with the post and one fact | you write the first sentence, due 60 min · Take this one | you |
| Ask you first `ask-you-first` | a view missing from your bank, or 3 failed rewrites | Your rule (`bank-gap`, `voice-gate`) | <Op verb="Action.ask" /> with one Question | you answer it, due 1 business day | you |
| Count the conversation `count-the-conversation` | one of your buyers replies or writes after a post | Your rule (the List) | <Op verb="Lead.create" /> with the post it answers | nobody; `engagement-bridge` takes the reply | the same |
| To the AE `to-the-ae` | a reply asks for a demo, a trial or a price for 100+ units | Agent’s call, with its reason | <Op verb="Conversation.escalate" /> → <Op verb="Task.assign" /> | AE · Priya Shah, due 60 min · Take this one | you, within 60 min |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “Can I see how this works for 200 units?” | Priya offers times; the Brief goes with it | AE · Priya Shah (person) | 60 min | <Op verb="Meeting.book" /> |
| Send me pricing | “So what do you charge, if not per unit?” | your reply quotes the Pricing Page: $29 and $79 a month, flat | you, from the draft | 60 min | <Op verb="Conversation.answer" /> |
| Not now | “Interesting. Not a priority this year.” | nothing follows; the post stays as it is | nobody | at once | <Op verb="Lead.nurture" /> |
| Wrong person | “Tagging our ops lead, who runs renewals.” | you reply to their tag in the thread; it never writes to anyone from their text | you | 60 min | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply to your direct Message | the bridge waits for the return date | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “What do you think of AI leasing assistants?” | To you: your bank holds no view, so it asks before any draft | you | 1 business day | <Op verb="Action.ask" /> |
| Stop | “Please don’t tag me again.” | no reply or mention of them drafts again, for all your Startups | nobody | at once | <Op verb="Contact.suppress" /> |

## When it hands to you
Every draft and every reply lands in **your** tray, because it goes from your own account; demo asks go to **AE · Priya Shah (person)**. 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_646",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-19T09:31:00Z",
    "on": "monitor_12",
    "brief": {
      "news": "the largest suite raised its per-unit price, captured 08:30",
      "view": "Small managers shouldn’t pay per unit (grilling, Sep 7)",
      "fact": "41 Customers pay $29 or $79 a month, flat",
      "draft": "Per-unit pricing punishes the managers who grow. We charge $29 or $79 a month, flat, and 41 property managers chose that.",
      "window": "post by 14:31, or it drops",
      "never": [
        "the rival’s name",
        "a feeling you didn’t state"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_638",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-02T11:10:00Z",
    "on": "lead_47",
    "brief": {
      "who": "an operator with 200 units, replying to your Sep 30 post",
      "said": "Can I see how this works for 200 units?",
      "chose": "to-the-ae",
      "why": "asks for a demo, over 100 units",
      "never": [
        "a discount"
      ]
    }
  }
]
```

You and Priya answer with <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, or <Op verb="Action.redirect" />, each a one-call window. Once a person claims, the agent’s pending drafts on that thread cancel with `claimedByPerson` (Not live yet, gaps #7). A news draft unclaimed in its window drops; 7 days with no tray action fires `founder-silence`; any other Task past due goes up through <Op verb="Task.escalate" />.

**On time:** you, 35 of 41 drafts posted within their window, median 41 min, n 41, ■■□□ Early sign; AE · Priya Shah, 3 of 3 within 60 min. **Your queue:** counted by kind: about 6 drafts and 5 reply candidates a week, the Monday grilling, and 1 demo ask a fortnight for 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; Not live yet, gaps #8) | a reply draft to someone whose Lead or open Deal a person owns | Leave it to the person who owns it: the draft waits in their queue. | <Op verb="Task.assign" /> |
| <a id="check-claims-resolve"></a>`claims-resolve` (shared) | a number or fact the claims source lacks | Cut the claim, or name the record that backs it. | <Op verb="Content.draft" /> |
| <a id="check-provenance-hold"></a>`provenance-hold` (shared) | a quote or story whose source is missing or unconsented | Link the memo and its timestamp, or cut it. | <Op verb="Content.draft" /> |
| <a id="check-fabrication-veto"></a>`fabrication-veto` (the record’s Fabrication veto) | a draft with any unsourced number, name, event, quote or feeling, before you see it | It never reaches your tray; record the memo, then it drafts. | <Op verb="Content.draft" /> |
| <a id="check-voice-gate"></a>`voice-gate` | a draft that fails the voice judge or a rule check after 3 rewrites | It comes back to you as a Question. | <Op verb="Action.ask" /> |
| <a id="check-bank-gap"></a>`bank-gap` | a view your bank lacks | Answer the Question; it drafts once you have. | <Op verb="Action.answer" /> |
| <a id="check-held-out-gate"></a>`held-out-gate` | a prompt or model change that lowers the held-out all-pass rate | Keep the current prompt, or improve the change until it scores no worse. | <Op verb="Change.review" /> |
| <a id="check-engagement-ceiling"></a>`engagement-ceiling` | a 4th public engagement with one Person in a week, or a like between your own Startups’ accounts | Wait for next week; nothing likes or reposts between your accounts. | <Op verb="Task.next" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-slop-note"></a>`slop-note` | a place labels a post AI-authored, or 2 public AI callouts in 30 days | drafting on that place pauses 7 days; You approve each one, with a fresh read |
| <a id="stop-venue-warning"></a>`venue-warning` | a restriction notice, a CAPTCHA or a feature limit on your account | the Mandate on that place pauses at once |
| <a id="stop-conversation-floor"></a>`conversation-floor` | under 3 conversations across 30 posts on one place | the Play stops on that place |
| <a id="stop-founder-silence"></a>`founder-silence` | 7 days with no tray action | all drafting stops until you return |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every Tactic and the Mandate pause at once |

The captured refusal, then the Stop that fired as a `Campaign.paused` reason (Not live yet, gaps #2); the rewrite that reached your tray is the second thread in Example.

```json title="The captured refusal · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The draft did not reach your tray: “a landlord told me last week” has no source in your memos.",
  "checks": [
    {
      "check": "fabrication-veto",
      "status": "fail",
      "doc": "/plays/founder-voice#check-fabrication-veto",
      "fix": "It never reaches your tray; record the memo, then it drafts.",
      "then": "Content.draft"
    },
    {
      "check": "claims-resolve",
      "status": "pass"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "reason": {
      "limit": "founder-silence",
      "observed": "7 days with no tray action",
      "bound": "7 days",
      "window": "7d"
    },
    "doc": "/plays/founder-voice#stop-founder-silence",
    "task": "task_640"
  }
]
```

## Did it work
At about 8 posts a week, the 1 in 5 you write alone are too few for their half to read in 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. The 9 unassisted posts print in Example as what happened. Every node above the leaf is Not live yet (gaps #4).

`0.9 conversations per post against 0.3 before · before-after, not proof · n 44 posts · path → arr`

| Node | Now (56 days) | Before (the 90 days) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `icp-conversations` | 0.9 per post (40 across 44 posts) | 0.3 (6 across 20) | — | — | before-after, not proof · Other Startups’ results +0.4 per post, ■■□□ Early sign, n 7,800 posts · 6 posts inside their 7 days |
| `new-leads` | 21 Leads from post conversations | 6 | — | — | before-after |
| `new-arr` ↑ | $1,041, 3 Customers on Pro · Booked: credited, not all caused by this Play | $347, 1 Customer | — · Worth about +$420 a month | — | before-after · 4 trials still deciding |
| `net-new-arr` · `arr` | carried from `new-arr` | carried | — | — | carried |

Before against after reads 56 days against the 90 days before; it is not proof, and Other Startups’ results print beside it. The leaf counts replies and direct Messages from your buyers per post, within 7 days of publish.

**How it moves it:** you posted 5.5 times a week in your own words, each from a dated view or a sourced number, where before you posted 1.6 times a week.

**Guardrails:** before against after: Leads per conversation, 0.53 against 1.0, and public AI callouts, 0 in 44 posts; 4 trials are still deciding.

```json title="The Campaign card · sample"
{
  "$id": "https://api.sb/leaseline.app/campaigns/founder-voice",
  "$type": "Campaign",
  "play": "play:founder-voice@1",
  "path": [
    "icp-conversations",
    "new-leads",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "icp-conversations",
    "unit": "per-post",
    "heldBack": 9,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 44,
    "maturing": 6,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 0,
    "workerCost": 3,
    "hours": 14.7,
    "openArr": 1388,
    "wonArr": 1041,
    "projectedArr": 416,
    "paybackDays": 1
  }
}
```

Outside benchmark: a ghostwriter eval passed 0 to 20 % of drafts on its first prompt and 80 to 90 % by its fifth (a published experiment log, in Your settings).

**Before it · After it.** Before it: `data-stories` and the Q3 numbers give your posts their facts. After it: `engagement-bridge` messages the people who write on your posts, and `promote-winners` hears the top post past 72 hours.

## Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days): 8 Monday grillings, 61 views in your bank, 44 posts (35 drafted from the bank and 9 you wrote alone), and 62 replies you posted by hand. Read every captured thread at `?threads=all`; three follow the tables.

| What happened, by option | Decisions | Posted by you | Conversations |
| --- | --- | --- | --- |
| Draft a post · Take on the news | 33 · 8 | 29 · 6 (2 dropped at 6 h) | 29 · 4 |
| Find a reply · Ask you first | 74 · 9 | 62 replies · 9 answered | — · — |
| Count the conversation · To the AE | 40 · 3 | — · 3 hand-offs | 40 · 2 Meetings |
| **Drafted posts** · written by you alone | **35** · 9 | **35** · 9 | **33 (0.94 per post)** · 7 (0.78) |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_1745` Campaign.created | the three steps; the dry run fails `inbound-source` | 20 min |
| 0 | `event_1746` Handle.connected | LinkedIn and X connected | 5 min |
| 1 | `event_1748` Recording.captured | the first Monday grilling: 20 Questions, 14 views kept | 20 min |
| 3 | `event_1751` Lead.created | the first conversation from a post | — |
| 24 | `event_1767` Campaign.paused | `founder-silence`: 7 days of travel with no tray action; resumed on your return | — |
| 35 | `event_1772` Change.merged | the source line moves to the reply on X | 5 min |
| 1–56 | `event_1749` Task.assigned, first of 115 | grillings, posts and replies, from the <Op verb="Task.next" /> log | 14 h 10 min · **total 14.7 h measured, 14.7 h asked** |

> **Dana on LinkedIn, Sep 15, 08:10** · Notices at 30 days are a coin flip.¹ In Q3, leases noticed under 30 days renewed at 54 % (n 1,110); at 60+ days, 71 % (n 1,940).² If you send at 30, try one building at 60 this quarter.³
>
> **Replies, Sep 15–20** · 6 from property managers, 2 asking how to set it up. Ines Duarte’s reply went to `engagement-bridge`.

```diff title="A LinkedIn draft, 2026-09-22 · the draft fabrication-veto refused, then the rewrite that reached your tray"
- A landlord told me last week his renewals all slipped.
+ In our Q3 records, leases noticed under 30 days renewed at 54 % (n 1,110).
```

> **Niche news, 2026-10-19 08:30** · the largest suite raised its per-unit price · The draft went to your tray (`task_646`), due 09:31, posting window to 14:31; **Dana, 09:12** · *posted it with one word changed, from her own account.*⁴

¹ A view from your bank, dated Sep 14. ² Every number from your records, with its n. ³ One ask; no link in the body. ⁴ You press every post.

## Your settings
```mdx title="plays/founder-voice.mdx"
---
holdout: 0.2    # 1 post in 5 is written by Dana alone
---
Draft my LinkedIn and X posts from my views on file and our own numbers; put the source line in the reply on X. I post every one.
```

```text
$ npx startup-builder show plays/founder-voice
holdout 0.2 · views on file only · source line in the X reply · you post every one     your file  plays/founder-voice.mdx:2,4 (Ask 2026-08-24; line 4 by change_33, 2026-09-28)
family demand · process content-marketing · worker role:content-lead, owns never · chooses 6 (2 rule, 4 read) · approval every-send · checks owned-by-a-person, claims-resolve, provenance-hold, fabrication-veto + 4 · stops 5 · placements linkedin, x    catalog  play:founder-voice@1 (Not live yet, gaps #5)
```

### Every key from the catalog
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-opinion-bank"></a>`opinion-bank` | Opinion bank turns a weekly 20-Question grilling and the founder’s voice memos into dated positions, the only views a draft may state. Starts at Sends nothing. |
| Tactic | <a id="tactic-founder-draft"></a>`founder-draft` | Founder draft turns the founder’s raw sentence, cited positions and verified facts into a Post draft, hook last, with a source trail on every specific. 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-voice-eval"></a>`voice-eval` | Voice eval passes a draft only when a founder-aligned judge and every rule check agree, and re-runs a held-out set before any prompt change. 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-reply-finder"></a>`reply-finder` | Reply finder surfaces 3 fresh Posts a day from ICP people; the founder writes each reply’s first sentence and posts it by hand. Starts at You approve each one. |
| Tactic | <a id="tactic-icp-conversation-count"></a>`icp-conversation-count` | ICP conversation count attributes each reply and direct Message to the founder Post it answers and counts those from people who match the ICP. Starts at Sends nothing. |
| Trigger | <a id="trigger-founder-memo"></a>`founder-memo` | Founder memo: `event` on `Recording.captured`, window 7d. |
| Trigger | <a id="trigger-founder-answer"></a>`founder-answer` | Founder answer: `event` on `Action.answered`, window 7d. |
| Trigger | <a id="trigger-fresh-fact"></a>`fresh-fact` | Fresh fact: `event` on `Version.deployed`, window 14d. |
| Trigger | <a id="trigger-icp-quote"></a>`icp-quote` | ICP quote: `event` on `Consent.granted`, window 30d. |
| Trigger | <a id="trigger-niche-news"></a>`niche-news` | Niche news: `event` on `Monitor.checked`, window 6h. |
| Trigger | <a id="trigger-watched-post"></a>`watched-post` | Watched post: `event` on `Post.published`, window 2h. |
| Trigger | <a id="trigger-founder-post-reply"></a>`founder-post-reply` | Founder post reply: `event` on `Post.published`, window 2h. |
| Benchmark | <a id="benchmark-ghostwriter-eval-pass-first-prompt"></a>`ghostwriter-eval-pass-first-prompt` | Share of ghostwriter drafts passing every eval on the first prompt version: 0–20 % (A published ghostwriter experiment log, 2025-06-19). |
| Benchmark | <a id="benchmark-ghostwriter-eval-pass-fifth-prompt"></a>`ghostwriter-eval-pass-fifth-prompt` | Share of ghostwriter drafts passing every eval on the fifth prompt version: 80–90 % (A published ghostwriter experiment log, 2025-06-19). |