Skip to content

Give before you ask

Serves the founder 3 discussions twice a day that lack their stated view, drafts from their sentence, and holds every ask until they act.

Channel
Social
Run oneMode try
You, to your agent

Hand the latest watched post to the Content Lead agent and show me what it chose and why. Don’t post.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Post.published%22%2C%20%22Prospect.engaged%22%2C%20%22Post.flagged%22)&limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# Not live yet (gaps #7)
curl -X POST "https://api.sb/leaseline.app/triggers/fire?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"like":"event_1192"}'

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22post_311%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/actions?where=on%20%3D%20%22post_311%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const { events: [last] } = await $.Event.list({ where: 'name in ("Post.published", "Prospect.engaged", "Post.flagged")', limit: 1 })   // { play } compiled to this Play’s Trigger Events
const { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' })   // the same Event again, in try mode · Not live yet, gaps #7
const { decisions: [decision] } = await $.Decision.list({ where: `on = "${subject}"` })   // what it chose, and why · Not live yet, gaps #7
const { actions } = await $.Action.list({ where: `on = "${subject}"` })   // what it did, with its checks · Not live yet, gaps #7
return { decision, actions }
npx startup-builder do Event.list --json '{"where":"name in (\"Post.published\", \"Prospect.engaged\", \"Post.flagged\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1192"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"post_311\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"post_311\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Post.published\", \"Prospect.engaged\", \"Post.flagged\")', limit: 1 })   // { play } compiled to this Play’s Trigger Events\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' })   // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` })   // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` })   // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
    "mode": "try"
  }
}
Response200application/json
{
  "decision": {
    "$id": "https://api.sb/leaseline.app/decisions/decision_421",
    "$type": "Decision",
    "choice": "reply-with-a-position",
    "reason": "Kim Alvarez asked how others time renewal notices across owners; your position #12 (per owner, 60 days out) is missing from the 14 replies",
    "stakes": "low",
    "options": [
      "reply-with-a-position",
      "make-what-they-asked",
      "credit-their-work",
      "open-the-ask",
      "founder-alone",
      "let-it-pass"
  …
sample · 4 Not live yetPreview

On PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim

action_2 puts the brief in your tray with a post-by time of 11:40; nothing posts until you write your sentence and press post.

14 per 100 against 3 before · before-after, not proof · n 42 · path → arr

Try another: the postChoiceReason
Kim Alvarez on LinkedIn: “How are you all timing renewal notices across owners?”reply-with-a-positionyour position #12 is missing from 14 replies
A thread in a property-management subreddit: “Anyone have a move-out inspection checklist?”make-what-they-askeda checklist your own Pages hold; posted with no signup
Theo Grant: rung 3, acted on 3 of your gives since Sep 30open-the-askthe give-ask guard opens
Marta Lind, a third reply from you this weeklet-it-passat her weekly ceiling of 3

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

Worth’s formula: about +6 per 100 engaged (Other Startups’ results; no lift of your own to read) × 30 engaged a month × 0.65 asks to Leads × 0.20 Leads to paid × $590 first order ARR ≈ +$138. Under First signal: At 30 engaged a month, 90 days can tell only +16 per 100 or more, so your file starts at holdout: 0 and reads before-after.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Post.published · first brief 6m 40s · 8 keys Not live yet

Start it this week

Terminal
npx startup-builder add play give-first   # 1 · writes plays/give-first.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":"give-first"}'

# 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":"give-first"}'

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

# off: the tray empties and no brief serves
curl -X PATCH https://api.sb/leaseline.app/campaigns/give-first \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
422Refusedgive-first can’t start: 2 checks fail.
CheckFixThen
use-when pass · Not live yet, gaps #8Dana, a person; 40 watched voices, 31 of them answer accounts under 1,000 followersPOST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #83 per 100: 1 of 31 People Dana replied to on her own reached rung 3 in 90 daysPOST /{namespace}/metrics/query
handle-connected failConnect Dana’s LinkedIn and Reddit Handles to read; every reply is still pressed by hand.POST /{namespace}/handles/{handle}/connect
opinion-bank failAnswer 14 more questions; drafts state only positions you hold.POST /{namespace}/content
role-unstaffed pass · Not live yet, gaps #8every hand-off goes to the founder, DanaPOST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "give-first can’t start: 2 checks fail.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "Dana, a person; 40 watched voices, 31 of them answer accounts under 1,000 followers",
      "doc": "/plays/give-first#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "3 per 100: 1 of 31 People Dana replied to on her own reached rung 3 in 90 days",
      "doc": "/plays/give-first#check-baseline",
      "then": "Metric.query"
    },
    {
      "check": "handle-connected",
      "status": "fail",
      "doc": "/plays/give-first#check-handle-connected",
      "fix": "Connect Dana’s LinkedIn and Reddit Handles to read; every reply is still pressed by hand.",
      "then": "Handle.connect"
    },
    {
      "check": "opinion-bank",
      "status": "fail",
      "observed": "6 of 20 positions",
      "doc": "/plays/give-first#check-opinion-bank",
      "fix": "Answer 14 more questions; drafts state only positions you hold.",
      "then": "Content.create"
    },
    {
      "check": "role-unstaffed",
      "status": "pass",
      "observed": "every hand-off goes to the founder, Dana",
      "doc": "/plays/give-first#check-role-unstaffed",
      "then": "Role.staff"
    }
  ]
}

It says no, says why, and names the fix.

CheckFix (one call)Your timeWait
use-when · baseline · pass: a person founder, 40 voices; 3 per 100, n 31 (gaps #8)POST /{namespace}/metrics/query on rapport-rung, which fills Before in Your number1 minnone
handle-connected · fail (gaps #8)POST /{namespace}/handles/{handle}/connect for LinkedIn and Reddit, read only5 minnone
opinion-bank · fail (gaps #8): 6 of 20 positionsPOST /{namespace}/content: answer the 20-question grilling40 minnone
role-unstaffed · pass: every hand-off is yoursPOST /{namespace}/roles/{role}/staff only if a Content Lead person joins0 minnone

Your number · Before 3 per 100 · Now 14 per 100 · Target 15 by Dec 31 · before-after, not proof · n 42 matured

A reply costs nothing to post: you press it on your own Handle. Each brief costs $0.02 and each draft $0.01 (Worker cost), and a gift is capped at $5 of spend. That comes to about $3 a month at 6 briefs a day, plus your 2 hours a week.

When it starts

WhenTrigger idStarts onWindowHow it gets in
A voice on your watch list posts, or you share a post into the traywatched-postevent on Post.published where author on the watch list2h; served at 07:30 and 12:30POST /{namespace}/handles/{handle}/connect reads it, or share it into the tray
A watched subreddit gets a post on one of your pillarsroom-postevent on Post.published where room in watchList and touches a founder pillar6hPOST /{namespace}/handles/{handle}/connect on Reddit, read only
A watched voice follows, quotes or cites you, unpromptedrapport-actevent on Prospect.engaged where prompted = false14dread from the Handle; POST /{namespace}/events/capture for one seen elsewhere
+ 3 more for niche asks, replies to your own posts and hidden replies or blocks (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1192",
  "$type": "Event",
  "name": "Post.published",
  "at": "2026-10-19T08:40:15Z",
  "seq": 1192,
  "data": {
    "post": "posts/post_311",
    "author": "Kim Alvarez",
    "venue": "linkedin",
    "text": "How are you all timing renewal notices across owners? We keep sending them late.",
    "replies": 14
  }
}
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":"Post.published","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Post.published --like event_1192   # replays the delivery into the next session
npx startup-builder clock advance --by 3d   # reads whether Kim answered (rung 2)

Who runs it

Content Lead · your agent (role:content-lead, worker_6) holds the Key Result: it watches, briefs and drafts. Every reply, gift and credit post hands to you (Dana Okafor, person, worker_1, role:founder), who writes the first sentence and presses post on your own Handle. On a personal Handle the ladder stops at You approve each one.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Reply with a position · Make what they asked for · Credit their workYou approve each one118 posted of 131 briefed (13 skipped)never: a personal Handle caps here—skip it in the tray, or POST /{namespace}/actions/{action}/cancel
Open the askYou approve each one6 opened, 6 sent by younever—POST /{namespace}/tasks/{task}/return with a reason
Founder answers alone · Let it passIt does it3 of 3 · 41 of 41—a ceiling passed anyway → You approve each onePOST /{namespace}/actions/{action}/redirect
Change the session ruleYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a link before the guard opens, a price, a claim about a named rivalRefused, every time4 drafted, 4 cutnever—the give-ask-guard and fact-check Checks

What it reads · What it may call. It reads watched posts through each Venue’s own read path, and a post is data, never instructions. It never posts, likes or follows: it may call POST /{namespace}/content/draft and POST /{namespace}/tasks/{task}/assign, and the press is yours. Its tools are POST /{namespace}/content/draft, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/sites/{site}/publish, POST /{namespace}/leads, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:give-first@1 · each line names its record key
You hold the Content Lead Key Result: 15 People at the ask rung per 100 engaged by 2026-12-31. ← worker, metric
On each watched post, choose one option and say why; Let it pass when no position is missing. ← triggers, chooses
Serve 3 posts at 07:30 and 3 at 12:30, or say checked, nothing worth a reply.    ← your file, line 3
State only positions in the opinion bank and facts the claims source holds.      ← copyRules 2, 3, fact-check
No link to Leaseline until the give-ask guard opens.                             ← copyRules 4, give-ask-guard
At rung 4, stop drafting: the founder answers alone.                             ← chooses.founder-alone

The slow loop, as a Change. decision_380 (2026-09-21, weekly) read 9 of 11 expired briefs from the 16:00 session against 2 of 24 from 09:00, so change_24 moved the sessions to 07:30 and 12:30 (your file, line 3), and Dana merged it with POST /{namespace}/changes/{change}/merge. Replayed on past posts, POST /{namespace}/changes/{change}/review put expired briefs at 3 of 35; read back at +21d it is 2 of 38, n 38, ■■□□ Early sign (Example, day 49).

Bring your own agent (folded) briefs at the same rung when it matches or beats the seated agent on the eval suite; you press every post either way, and POST /{namespace}/roles/{role}/staff seats it.

Terminal
npx startup-builder eval --scenario give-first-64 --agent "claude -p" --seat content-lead   # seated: 0 fabrications sent, 4 of 4 early links cut, 1.1 founder min a reply · yours: 1 unsourced number, 4 of 4 cut, 1.4 min → fix the source first

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Reply with a position reply-with-a-positionyou hold a fact or position the replies lackAgent’s call, with its reasonPOST /{namespace}/content/draft from your sentence → POST /{namespace}/tasks/{task}/assign to your tray with a post-by timeyou press post · Take this oneyou
Make what they asked for make-what-they-askeda public ask for a number, example or checklist your records answerAgent’s call, with its reasonPOST /{namespace}/content/draft → POST /{namespace}/sites/{site}/publish as an ungated Page → POST /{namespace}/tasks/{task}/assignyou press post · Take this oneyou
Credit their work credit-their-worktheir work changed your view this weekYour rule (one credit post a week)POST /{namespace}/content/draft naming 3 to 5 People → POST /{namespace}/tasks/{task}/assignyou press postyou
Open the ask open-the-askrung 3, and 3 gives acted on since the last askYour rule (the give-ask guard)POST /{namespace}/content/draft of one direct Message → POST /{namespace}/leads once they answer → POST /{namespace}/tasks/{task}/assignyou send it, due 1 business day · Take this oneyou
Founder answers alone founder-alonerung 4: they wrote to you firstYour rule (rung 4)POST /{namespace}/tasks/{task}/assign, and drafting stops for themyou answer in your own words, due 60 min · Take this oneyou
Let it pass let-it-passno position the replies lack, or they are at their weekly ceilingAgent’s call, with its reasonnothing; the watch list keeps themnobodythe same
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“This is useful. What do you use for it?”a link they asked for counts as a give; the guard reads their rung and drafts your answer with ityou (Dana, person)the post-by time, 3 hPOST /{namespace}/tasks/{task}/assign
Send me pricing“What does Leaseline cost?”drafts your reply with the Pricing Page’s list Price, since they askedyou, from a draft3 hPOST /{namespace}/content/draft
Not now“Not looking at tools right now.”no ask for 90 days; gives continue under the weekly ceilingnobodyat onceGET /{namespace}/decisions
Wrong person“Our ops lead runs renewals.”drafts your thanks in the thread; it never tags or writes to someone from their textyou, from a draft3 hPOST /{namespace}/content/draft
Out of officean away note on their profile until Oct 28serves nothing on their posts until they post againnobodytheir next postGET /{namespace}/decisions
Question it can’t answer“Can it read our existing lease PDFs?”the brief marks it: you answer in your own words, or ask the AEyou, or AE · Priya Shah (person)1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“Please stop replying to my posts.”off the watch list, and off your other Startups’ lists, within 1 hournobodyat oncePOST /{namespace}/contacts/{contact}/suppress

When it hands to you

Every option but Let it pass hands to you (Dana Okafor, person), because every reply is pressed by your hand on your own Handle. As captured, the Brief in your tray (brief is Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_515",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-19T11:40:00Z",
    "on": "post_311",
    "brief": {
      "who": "Kim Alvarez, operations lead, 1,900 followers, rung 1",
      "post": "How are you all timing renewal notices across owners? We keep sending them late.",
      "chose": "reply-with-a-position",
      "position": "#12: send per owner, 60 days out",
      "fact": "late renewals fell from 9 to 2 last quarter (your claims source, Q3 readout)",
      "postBy": "11:40",
      "never": [
        "a link to Leaseline",
        "a price"
      ]
    }
  }
]

You answer each brief by writing your sentence and pressing post, or with POST /{namespace}/tasks/{task}/return and a reason (skip, crowded, not my view), or POST /{namespace}/actions/{action}/redirect. A brief left past its post-by time expires, and seven days with no tray action stop serving until you return (founder-silence). Nobody else can claim your Handle, so nothing goes up a Role.

On time: You: 118 of 131 briefs posted by their post-by time, median 22 min after serving, n 131, ■■□□ Early sign beside Other Startups’ 84 %. Your queue: counted by kind: 6 briefs a day, 1 credit post and about 1 ask a week, and 1 weekly review.

The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.

When it won’t send

Check (refuses one send)RefusesFixThen
owned-by-a-person (rule j; Not live yet, gaps #8)a reply or ask to a Person whose Lead or open Deal the AE ownsLeave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
fact-check (the fabrication veto)a draft in your name with a number, name or event no source backsCut the line, or add the source it came from.POST /{namespace}/content/draft
give-ask-guarda link to Leaseline, a pitch or a call ask before they act on 3 gives at rung 3Cut the ask; it opens after 3 gives they act on.POST /{namespace}/content/draft
engagement-ceilinga fourth engagement with one Person in a week, or a second Handle of yours in one discussionLet it pass; the ceiling resets Monday.GET /{namespace}/decisions
pestera seventh give to a Person who acted on none of 6 in 60 daysThey rotate out for 90 days; nothing to do.GET /{namespace}/decisions
no-amplificationa like, repost or reply from one of your other Startups’ Handles on yoursPost from one Handle only; ask no one to boost it.GET /{namespace}/decisions
Stop (pauses the Play)Pauses whenThen
hidden-or-blockedan author hides your reply or blocks you; 2 in 30 daysthey leave every list; the Play drops to You approve each one, with the brief shown first
callouta public bot or AI callout on your replythat Venue pauses 7 days
venue-warninga restriction notice, CAPTCHA or reach limit on your Handlethe Mandate pauses on that Venue at once
room-removal (Reddit and Hacker News)a moderator removes your replythe room goes listen-only and is read again
rung-2-floorunder 5 People at rung 2 across 150 replies on one Venuebriefs stop on that Venue
gift-take-rategifts on a Handle are taken below Other Startups’ rate for 30 daysgifts pause on that Handle
founder-silence7 days with no tray actionserving stops until you return
kill-switchyou press itPOST /{namespace}/mandates/{mandate}/pause: every Tactic and the Mandate stop at once

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

422RefusedThe reply to Nadia Brooks did not reach your tray: it links Leaseline before the give-ask guard opened.
CheckFixThen
give-ask-guard failCut the ask; it opens after 3 gives they act on.POST /{namespace}/content/draft
fact-check pass · Not live yet, gaps #1—POST /{namespace}/content/draft
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The reply to Nadia Brooks did not reach your tray: it links Leaseline before the give-ask guard opened.",
  "checks": [
    {
      "check": "give-ask-guard",
      "status": "fail",
      "doc": "/plays/give-first#check-give-ask-guard",
      "fix": "Cut the ask; it opens after 3 gives they act on.",
      "then": "Content.draft"
    },
    {
      "check": "fact-check",
      "status": "pass"
    }
  ]
}

It says no, says why, and names the fix.

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "reason": {
      "limit": "founder-silence",
      "observed": "7 days, no tray action",
      "bound": "7 days",
      "window": "the tray"
    },
    "doc": "/plays/give-first#stop-founder-silence",
    "task": "task_468"
  }
]

Did it work

At about 8 engaged a week, no held-back half 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 POST /{namespace}/metrics/query by node, and every node above the leaf is Not live yet (gaps #4).

14 per 100 against 3 before · before-after, not proof · n 42 · path → arr

Chose
reply-with-a-position
Why
Kim Alvarez asked how others time renewal notices across owners; your position #12 (per owner, 60 days out) is missing from the 14 replies
From
reply-with-a-position · make-what-they-asked · credit-their-work · open-the-ask · founder-alone · let-it-pass
Expects
Kim answers within 3 days (rung 2)
Reopens when
no Prospect.engaged from Kim Alvarez within 3d
By
worker_6
JSON
{
  "$id": "decisions/decision_421",
  "$type": "Decision",
  "choice": "reply-with-a-position",
  "reason": "Kim Alvarez asked how others time renewal notices across owners; your position #12 (per owner, 60 days out) is missing from the 14 replies",
  "stakes": "low",
  "options": [
    "reply-with-a-position",
    "make-what-they-asked",
    "credit-their-work",
    "open-the-ask",
    "founder-alone",
    "let-it-pass"
  ],
  "by": "worker_6",
  "on": "post_311",
  "expected": "Kim answers within 3 days (rung 2)",
  "reopensWhen": "no Prospect.engaged from Kim Alvarez within 3d"
}
NodeNow (56 days)Before (the 90 days, per 56)AddedConfidenceBasis
rapport-rung14 per 100: 6 of 42 matured engaged People reached the ask rung · 22 still maturing3 per 100: 1 of 31 People Dana replied to on her own— · Worth about +$140 a month—before-after, not proof · Other Startups’ results +6 per 100, ■■■□ Likely, n 2,310 engaged, 1 in 5 held back at random
new-leads4 Leads from the 6 asks1——before-after
new-arr ↑$941, 1 Customer on Team · Booked: credited, not all caused by this Play$0— · 2 trials still deciding—before-after, not proof
net-new-arr · arrcarried from new-arrcarried——carried

Before against after reads the People Dana gave to through the Play against the People she replied to on her own in the 90 days before, scaled to 56 days. It is not proof; Other Startups’ results, read against 1 in 5 watched voices held back at random, print beside it.

How it moves it: your sentence and one sourced specific land under a post where a watched voice is already talking, a median 41 minutes after it went up.

Guardrails: before against after: play-sourced-customers, 1 against 0, and hidden or blocked replies, 1 of 118 against 0 of 31; no Venue warning fired.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/give-first",
  "$type": "Campaign",
  "play": "play:give-first@1",
  "path": [
    "rapport-rung",
    "new-leads",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "rapport-rung",
    "unit": "per-100",
    "heldBack": 0,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 42,
    "maturing": 22,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 3,
    "workerCost": 3,
    "hours": 17,
    "pipelineArr": 1180,
    "wonArr": 941,
    "projectedArr": 138,
    "paybackDays": 4
  }
}

Outside benchmark: no outside study measures founder replies to the ask rung, so Other Startups’ results (+6 per 100, n 2,310) stand in for one.

Before it · After it. Before it: founder-voice fills the opinion bank and community-answers reads each room into its record. After it: People at the ask rung go to engagement-bridge or warm-intros, and their Leads to instant-response.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days) on 40 watched voices and 3 subreddits. It briefed 131 posts, Dana posted 118 replies, 3 gifts and 8 credit posts, and 64 People were engaged. Read every captured thread at ?threads=all; three follow the tables.

What happened, by optionDecisionsPosted by youReached the ask rungWon (credited, not all caused by this Play)
Reply with a position11210151 on Team (+$941 ARR)
Make what they asked for · Credit their work9 · 83 · 81 · 00
Open the ask · Founder answers alone6 · 36 · 3—4 Leads, 2 trials still deciding
Let it pass410——
All · Before (90 days, per 56)1791216 of 42 matured · 1 of 31$941 · $0
At 30 engaged a month (the Use it when volume)about 56 in 56 daysabout 105before-after, not proofOther Startups’ results: +6 per 100, ■■■□ Likely, n 2,310
DayEventWhat happenedYour time
0event_122 Campaign.createdthe three steps; dry run fails handle-connected and opinion-bank15 min
0 · 2event_125 Handle.connected · event_160 Content.createdLinkedIn and Reddit read; 20 positions recorded45 min
3event_188 Prospect.engagedthe first watched voice answers your reply (rung 2)—
28 · 49event_520 Change.merged · event_871 Readout.createdsessions at 07:30 and 12:30: replayed at 3 of 35 expired, read back at +21d at 2 of 385 min
34event_640 Decision.createdthe guard opens for Kim Alvarez: rung 3, 3 gives acted on—
41event_701 Campaign.pausedfounder-silence: a week away; serving resumed the day you returned—
1–56event_131 Task.assigned, first of 179you posted 121 and skipped 13, from the POST /{namespace}/tasks/next log15.8 h · total 17 h measured, 18 h asked

Kim Alvarez, LinkedIn, Sep 2, 07:41 · “How are you all timing renewal notices across owners? We keep sending them late.”

Dana, 08:20 · Per owner, 60 days out, never one batch for the whole portfolio.¹ Late renewals fell from 9 to 2 last quarter once each owner got their own list.² What broke for you, the date or the owner?

Kim, Sep 2, 10:05 · answered; on Sep 18 she quoted Dana’s line in her own post (rung 3). On day 34 the guard opened, and Dana’s direct Message offered the per-owner calendar she asked about.³ Kim booked a call on Oct 1.

Nadia Brooks, 2026-09-15 · the draft give-ask-guard cut, then the reply you posted
- We built Leaseline for exactly this: leaseline.app/renewals
+ Send each owner their own batch 60 days out; one portfolio-wide batch is where the dates slip.

Marta Lind, 2026-10-06 14:52 · wrote to Dana first: “Can we talk about how you set this up?” That is rung 4, so the agent stopped drafting and put a Brief in Dana’s tray, due 15:52. · Dana, 15:20 · answered in her own words and offered two times. The Brief is in When it hands to you.

¹ Your sentence first, from position #12 in the opinion bank. ² One sourced specific, from your claims source. ³ The ask, only after the guard opened.

Your settings

plays/give-first.mdx
---
holdout: 0                  # 8 engaged a week is too few to hold 1 in 5 back; it reads before-after
sessions: [07:30, 12:30]    # property managers post early
venues: [linkedin, reddit]
---
Watch the 40 property-management voices I named. Never link Leaseline before the guard opens.
Text
$ npx startup-builder show plays/give-first
holdout 0 · sessions 07:30, 12:30 · venues linkedin, reddit     your file  plays/give-first.mdx:2,3,4 (Ask 2026-08-24; line 3 by change_24, 2026-09-21)
family demand · worker role:content-lead, owns never · chooses 6 (3 rule, 3 read) · every post pressed by the founder · checks owned-by-a-person, fact-check, give-ask-guard, engagement-ceiling, pester, no-amplification · stops 8 · placements x, linkedin, reddit, hacker-news, github    catalog  play:give-first@1 (Not live yet, gaps #5)

Every key from the catalog

Key Id What it is
Tactic watch-list Watch list keeps 20 to 300 niche People who publish to an audience, ranked by reach, openness and follow-back, with a holdout. Starts at Sends nothing.
Tactic reply-brief Reply brief serves the founder 3 fresh Posts twice a day, each matched to a stated position the discussion lacks, or serves nothing. Starts at Sends nothing.
Tactic seeded-reply Seeded reply turns the founder’s raw sentence into a short sourced reply, checks it, and leaves the press of post to the founder. Starts at You approve each one.
Tactic give-ask-guard Give-ask guard holds every ask until the Person, the room and the Handle each have enough giving on record, and logs every refusal. Starts at Sends nothing.
Tactic gift-on-ask Gift on ask answers a public request with a tested, sourced gift made for that request, which the founder posts with no gate. Starts at You approve each one.
Tactic credit-post Credit post names 3 to 5 People each week whose work changed the founder’s view, with what each supplied and no link to the Startup. Starts at You approve each one.
Tactic rapport-read Rapport read projects each watched Person’s rapport rung from their own acts, and writes People reaching the ask rung per 100 engaged. Starts at Sends nothing.
Tactic 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 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 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 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 room-rules-compile Room read reads each community place’s sidebar, pinned posts and top answers weekly into its room record and sets the room’s mode. Starts at You approve each one.
Tactic room-check Room check is the Guard every community answer passes: mode, caps, karma floor, mention budget, links, duplicates and siblings, downgrading what it refuses. Starts at Sends nothing.
Tactic engagement-bridge Engagement bridge message: A Human sends one direct Message, drafted by the agent, to a Person who wrote to the Human’s Handle first, quoting that Person’s words. Starts at You approve each one.
Trigger watched-post Watched post: event on Post.published, window 2h.
Trigger room-post Room post: event on Post.published, window 6h.
Trigger niche-ask Niche ask: event on Post.published, window 24h.
Trigger founder-post-reply Founder post reply: event on Post.published, window 2h.
Trigger rapport-act Rapport act: event on Prospect.engaged, window 14d.
Trigger negative-act Negative act: event on Post.flagged, window 1y.

Compiled, not written: edit the Play record give-first and its Leaseline run, then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.