Skip to content

Archive repurposing

Turns each webinar, recording or consented call you have into a page, posts and clips for people who never saw it, in the speaker’s words.

Channel
Social
Run oneMode try
You, to your agent

Hand our latest recording to the Content Lead agent and show me what it chose and why. Don’t publish.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Source.added%22%2C%20%22Visit.recorded%22%2C%20%22Post.published%22%2C%20%22Change.merged%22%2C%20%22Consent.withdrawn%22%2C%20%22Message.received%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_1420"}'

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

const { events: [last] } = await $.Event.list({ where: 'name in ("Source.added", "Visit.recorded", "Post.published", "Change.merged", "Consent.withdrawn", "Message.received")', 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 (\"Source.added\", \"Visit.recorded\", \"Post.published\", \"Change.merged\", \"Consent.withdrawn\", \"Message.received\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1420"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"source_31\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"source_31\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Source.added\", \"Visit.recorded\", \"Post.published\", \"Change.merged\", \"Consent.withdrawn\", \"Message.received\")', 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_491",
    "$type": "Decision",
    "choice": "full-set",
    "reason": "the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker",
    "stakes": "low",
    "options": [
      "full-set",
      "page-only",
      "more-like-the-winner",
      "dub-it",
      "to-your-editor",
      "not-now"
  …
sample · 4 Not live yetPreview

On POST /{namespace}/processes/{process}/enableOff POST /{namespace}/processes/{process}/pauseTake this one POST /{namespace}/tasks/{task}/claim

action_3 is the 5 clips, which wait for your edit (You approve each one); action_4 is the 6 quote posts on the company account, sent after a 1-day hold you can stop.

23 new contacts in 56 days against 4 before · before-after, not proof · n 17 matured · path → arr

Try another: the recordingChoiceReason
Oct 16 webinar: 60-day renewal notices, 52 min, you speakingfull-set13 usable cuts, and every speaker’s Consent
Maple Court call, Sep 8: Ana on late fees and lease termsto-your-editora contract topic, and a speaker other than you
Aug webinar: drawn into the page-only halfpage-onlythe draw holds it to a page
Harbor Row call: no Consent on filenot-nowsource-consent: no piece until they say yes

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

Worth’s formula: about +2.4 new contacts per source (Other Startups’ results; no lift of your own yet) × 6 sources a month × 0.39 contacts to Leads × 0.20 Leads to paid × $347 first order ARR ≈ +$390. Under First signal: At 1 page-only source a month, one Startup needs about 6 months to fill a held-back half, so your file reads before-after and pools with Other Startups.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Source.added · first slate 38m after the upload · 4 keys Not live yet

Start it this week

Terminal
npx startup-builder add play archive-repurposing   # 1 · writes plays/archive-repurposing.mdx (Not live yet, gaps #5)

# 2 · dry run; below, its 422 on the day-0 Startup (clock at 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":"archive-repurposing"}'

# 3 · keep it, at You approve each one
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"archive-repurposing"}'

# on
curl -X POST https://api.sb/leaseline.app/processes/content-marketing/enable \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# off: no upload, post or dub; published pieces stay
curl -X POST https://api.sb/leaseline.app/processes/content-marketing/pause \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
422Refusedarchive-repurposing can’t start yet: 1 check fails and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #814 recordings: 6 webinars, 8 customer calls; 1 new webinar every 2 weeksPOST /{namespace}/metrics/query
baseline warn · Not live yet, gaps #8n 4: it reads before-after, not proof, beside Other Startups’ results.POST /{namespace}/metrics/query
source-consent failAsk the 8 customer speakers once for their yes; until then only your webinars run.POST /{namespace}/consents
role-unstaffed pass · Not live yet, gaps #8Content Lead is your agent; edits come to youPOST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "archive-repurposing can’t start yet: 1 check fails and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "14 recordings: 6 webinars, 8 customer calls; 1 new webinar every 2 weeks",
      "doc": "/plays/archive-repurposing#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "warn",
      "observed": "4 new contacts from the replay page in 90 days",
      "doc": "/plays/archive-repurposing#check-baseline",
      "fix": "n 4: it reads before-after, not proof, beside Other Startups’ results.",
      "then": "Metric.query"
    },
    {
      "check": "source-consent",
      "status": "fail",
      "doc": "/plays/archive-repurposing#check-source-consent",
      "fix": "Ask the 8 customer speakers once for their yes; until then only your webinars run.",
      "then": "Consent.create"
    },
    {
      "check": "role-unstaffed",
      "status": "pass",
      "observed": "Content Lead is your agent; edits come to you",
      "doc": "/plays/archive-repurposing#check-role-unstaffed",
      "then": "Role.staff"
    }
  ]
}

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

CheckFix (one call)Your timeWait
use-when · pass: 14 recordings (gaps #8)POST /{namespace}/metrics/query on archive-contacts1 minnone
baseline · warn: 4 in 90 daysPOST /{namespace}/metrics/query; it fills Before in Your number0 minnone
source-consent · fail: 8 customer speakers with no yes on file (Not live yet)POST /{namespace}/consents from each speaker’s answer to one ask10 mintheir answers; 3 said yes in 2 days
role-unstaffed · pass (gaps #8)—0 minnone

Your number · Before 4 per 90 days · Now 23 new contacts in 56 days · Target 40 by Dec 31 · before-after, not proof · n 17 matured

Transcription and cutting cost about $0.80 per hour of recording, and each drafted piece $0.02 from your Domain (Worker cost); clips post from your own accounts at no charge. That comes to about $1.10 per source and $7 a month at 6 sources, held by a $40 Limit.

When it starts

WhenTrigger idStarts onWindowHow it gets in
A recording or consented call lands in your librarysource-addedevent on Source.added where a recording, webinar, episode, consented Meeting or support Conversationthe slate within 1 h; ignored after 30 dPOST /{namespace}/files with the recording, or your webinar tool through POST /{namespace}/integrations/connect
An old source has 3+ unused cuts and no piece in 60 daysarchive-backlogstate on Source.added where older than 30 days, 3 or more unused cuts, and no piece in 60 daysonce a weekthe library itself
A piece ranks in your top tenth for new contactsderivative-outlierthreshold on Post.published where 7-day new contacts in your top tenth, 5 or more14 dits coded link’s POST /{namespace}/leads
+ 4 more for language demand, fact changes, Consent withdrawals and Venue notices (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1420",
  "$type": "Event",
  "name": "Source.added",
  "at": "2026-10-19T10:15:22Z",
  "seq": 1420,
  "data": {
    "source": {
      "$id": "https://api.sb/leaseline.app/sources/source_31",
      "kind": "webinar",
      "title": "60-day renewal notices, per owner",
      "minutes": 52,
      "speakers": [
        "Dana Okafor"
      ]
    },
    "cuts": 13
  }
}
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":"Source.added","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Source.added --like event_1420   # replays the upload
npx startup-builder clock advance --by 1d   # runs the quote posts’ 1-day hold (action_4)

Who runs it

Content Lead · your agent (role:content-lead, worker_7) holds the Key Result. It hands every clip, every cut tagged tax or contract, every speaker other than you and every dub to you (Dana Okafor, person, worker_1), the editor. Your number links to Did it work.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Make the full set: quote posts and the pageIt does it, you can stop it34 of 34 quote posts approved uneditedmet on day 30 (the first 30 quote posts)a comment Stop → You approve each onePOST /{namespace}/actions/{action}/cancel inside the 1-day hold
Make the full set: clips and posts in your wordsYou approve each one, on every rung31 clips, 4 trimmed · 16 posts, 1 rewrittennever—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Page only · Make more like the winner · Not nowIt does it3 of 3 · 2 of 2 · 3 held——POST /{namespace}/actions/{action}/redirect
Dub it · To your editorYou approve each one, on every rung0 dubs · 2 of 2 editednever—POST /{namespace}/tasks/{task}/claim
Never: a changed quote, a voice but the speaker’s own, footage you don’t ownTo a person, every time1 refused, 0 publishednever—POST /{namespace}/processes/{process}/pause

What it reads · What it may call. It reads the transcript, the cuts and your fact records; a quote, caption or post matches its transcript word for word, except at a marked ellipsis, and every claim reads from a fact or a timestamp. Its tools are POST /{namespace}/content/draft, POST /{namespace}/posts/{post}/schedule, POST /{namespace}/videos/draft, POST /{namespace}/pages, POST /{namespace}/sites/{site}/publish, POST /{namespace}/experiments/{experiment}/start, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:archive-repurposing@1 · each line names its record key
You hold the Content Lead Key Result: 40 new contacts from the archive by 2026-12-31. ← worker, metric
On each new or backlogged source, choose one option and say why.                 ← triggers, chooses
Quote every speaker word for word; mark every cut with an ellipsis.              ← provenance-hold
Every clip, and every cut about tax or contracts, waits for Dana’s edit.         ← your file, line 4
Never post a piece where its source first aired.                                 ← original-audience

The slow loop, as a Change. decision_458 (2026-10-12, weekly) read clips under 40 seconds bringing 9 of the 14 clip contacts, so change_29 moved the clip length to 20 to 40 seconds and Dana merged it. Replayed on past clips, POST /{namespace}/changes/{change}/review put contacts per clip at 0.61; read back at +7d it is 0.55, n 11 clips, ■□□□ Too early to tell (Example, day 49).

Bring your own agent (folded) starts at You approve each one for every piece, and earns the quote-post rung when it matches the seated agent with 0 changed quotes.

Terminal
npx startup-builder eval --scenario archive-repurposing-14 --agent "claude -p" --seat content-lead   # seated: 1.6 contacts per source, 0 changed quotes, $1.10 a source · yours: 1.4, 1 changed quote → You approve each one

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Make the full set full-set3+ usable cuts and every speaker’s ConsentYour rule (line 4)POST /{namespace}/content/draft the page and posts → POST /{namespace}/videos/draft the clips → POST /{namespace}/posts/{post}/scheduleyou edit the clips · Take this oneyou
Page only page-onlydrawn page-only, or under 3 cutsYour rule (the draw)POST /{namespace}/pages → POST /{namespace}/sites/{site}/publishnobodythe same
Make more like the winner more-like-the-winnera piece in your top tenthAgent’s call, with its reasonPOST /{namespace}/content/draft 2 more from the same cut → POST /{namespace}/experiments/{experiment}/startnobodythe same
Dub it in your own voice dub-ita language with 200+ visits or 10 sign-ups a monthAgent’s call, with its reasonPOST /{namespace}/videos/draft with your own cloned Voiceyou, and a fluent reviewer for the first 10 · Take this oneyou
To your editor to-your-editortax or contract, or another speakerYour rule (line 4)POST /{namespace}/tasks/{task}/assign with the cut and its transcriptyou, due 2 business days · Take this oneyou
Not now not-nowno Consent, or a Venue noticeYour rule (the consent hold)nothing; names the holder: source-consent or strikenobodythe same
When they write backFixture replyWhat happensWho answersBy whenCall
Interesteda comment on a clip: “Where do I set this up?”replies with the source page’s coded linkContent Lead · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Send me pricing“How much is it for 80 units?”replies with the Pricing Page’s list Price and nothing it lacksContent Lead · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Not nowa new subscriber: “Just reading for now.”nothing else sends but the newsletter they asked fornobodyat oncePOST /{namespace}/leads/{lead}/nurture
Wrong person“Sending this to our office manager.”replies with the page they can forward; it never writes to a name from their textContent Lead · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply to the welcome issue, until Oct 30the next issue waits for the return datenobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Does the 60-day rule apply to month-to-month leases?”To you, the question in the Brief; it states nothing your records lackyou2 business daysPOST /{namespace}/conversations/{conversation}/escalate
Stopa speaker: “Please take my clip down.”their Consent is withdrawn; their cuts hide and their posts come down within 1 hnobody1 hPOST /{namespace}/consents/{consent}/withdraw

When it hands to you

Every clip, every cut about tax or contracts, every other speaker and every dub comes to you, the editor. What lands in your queue, as captured: the Brief, then the Approval (brief, draft, route and checks are Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_293",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-09-15T17:00:00Z",
    "on": "source_22",
    "brief": {
      "what": "the Maple Court call, Sep 8: Ana on late fees and lease terms",
      "chose": "to-your-editor",
      "why": "a contract topic, and a speaker other than you",
      "consent": "Ana said yes on Sep 9 (consent_44)",
      "cuts": 4
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/approvals/approval_81",
    "$type": "Approval",
    "verdict": null,
    "deadline": "2026-10-21T17:00:00Z",
    "draft": "5 clips from “60-day renewal notices, per owner”, 22 to 38 seconds, captions from the transcript",
    "route": "full-set",
    "checks": [
      {
        "check": "provenance-hold",
        "status": "pass"
      },
      {
        "check": "distinctness",
        "status": "pass"
      }
    ]
  }
]

You answer with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse, each a one-call window, and an Approval unanswered by its deadline expires and the clips never post. A week with no edit holds every clip and issue (editor).

On time: you, 19 of 20 edits by their deadline, median 1 day, ■■□□ Early sign, n 20 (the 20th expired, and those clips never posted). Your queue: counted by kind: in week 1, 1 consent ask and 1 slate; since, about 1 slate of 5 clips and 2 posts a week, and 1 editor cut a fortnight.

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
source-consentany piece from a source with a speaker other than you and no Consent on fileAsk the speaker once for their yes; nothing of theirs runs until then.POST /{namespace}/consents
provenance-holda quote, caption or post that differs from its transcript, except at a marked ellipsisCut the line, or cite its timestamp in the transcript.POST /{namespace}/content/draft
fact-checka piece with a claim that reads from no fact record and no timestampCut the claim, or name the record that backs it.POST /{namespace}/content/draft
advice-reviewa cut tagged tax or contract without your editEdit it, or leave it unpublished.POST /{namespace}/tasks/{task}/claim
distinctnessa piece too close to one on the same account in 90 days, or to one of your other Startups’ on that VenuePick another cut, or reframe it.POST /{namespace}/content/draft
ownershipfootage or audio you don’t own, with no written grant on fileRecord the owner’s grant, or leave it out.PATCH /{namespace}/files/{id}
original-audiencea piece in the same format, in the feed or list where its source first airedPost it elsewhere; a dub on the original video is fine.POST /{namespace}/posts/{post}/schedule
Stop (pauses the Play)Pauses whenThen
consent-withdrawna speaker withdraws their Consenttheir cuts hide, posts come down and dubs go, within 1 h
strikea Venue sends a strike, label, removal or reach limitthat account pauses and the piece type quarantines across your Startups within 1 h
new-audience-floorunder 50 % of new contacts are new to you, over 30 days, at 30 contactsthe lowest piece type pauses and re-slates
contact-floora piece type with 20 published and no contact in 60 daysit stops until a Variant tests
commentcomments calling a piece fake or mistranslated over 5 %, on 2 pieces in a weekit returns to You approve each one
editorno edit for 7 daysevery clip and issue holds, one rung down on every account
spend-limittranscription, dub and model spend reach the $40 Limitthe queue holds; POST /{namespace}/limits/{limit}/raise with your OK
kill-switchyou press itevery upload, post and dub pauses; POST /{namespace}/processes/{process}/enable after review
+ 2 more for dubs, none made yet: voice-consent and dub-floor (?lanes=all)

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

422RefusedThe quote post from the Sep 18 webinar did not schedule: it differs from the transcript.
CheckFixThen
provenance-hold fail · Not live yet, gaps #1Cut the line, or cite its timestamp in the transcript.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 quote post from the Sep 18 webinar did not schedule: it differs from the transcript.",
  "checks": [
    {
      "check": "provenance-hold",
      "status": "fail",
      "observed": "at 31:12 Dana said “most”, the draft says “every”",
      "doc": "/plays/archive-repurposing#check-provenance-hold",
      "fix": "Cut the line, or cite its timestamp in the transcript.",
      "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": "editor",
      "observed": "7 days with no edit, Sep 28 to Oct 5",
      "bound": "7 days",
      "window": "7d"
    },
    "doc": "/plays/archive-repurposing#stop-editor",
    "note": "clips and issues held; quote posts ran on"
  }
]

Did it work

At 1 page-only source a month, 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; every node above the leaf is Not live yet (gaps #4).

23 new contacts in 56 days against 4 before · before-after, not proof · n 17 matured · path → arr

Chose
full-set
Why
the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker
From
full-set · page-only · more-like-the-winner · dub-it · to-your-editor · not-now
Expects
6 or more new contacts from its pieces within 30d
Reopens when
under 2 new contacts from source_31 by day 14
By
worker_7
JSON
{
  "$id": "decisions/decision_491",
  "$type": "Decision",
  "choice": "full-set",
  "reason": "the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker",
  "stakes": "low",
  "options": [
    "full-set",
    "page-only",
    "more-like-the-winner",
    "dub-it",
    "to-your-editor",
    "not-now"
  ],
  "by": "worker_7",
  "on": "source_31",
  "expected": "6 or more new contacts from its pieces within 30d",
  "reopensWhen": "under 2 new contacts from source_31 by day 14"
}
NodeNow (56 days)Before (the 90 days, per 56)AddedConfidenceBasis
archive-contacts23 new contacts through coded links (17 matured) · 71 % new to you2.5 from the replay page— · Worth about +$390 a month—before-after, not proof · Other Startups’ results +2.4 per source, ■■□□ Early sign, n 312 sources
new-leads9 Leads from those contacts1 per 56 days——before-after
new-arr ↑$347, 1 Customer on Pro · Booked: credited, not all caused by this Play$0——before-after · 2 trials still deciding
net-new-arr · arrcarried from new-arrcarried——carried

The leaf counts consented contacts whose first Consent came through a piece’s coded link or Form, within 30 days of the click; before against after reads one window against the 90 days before it, scaled to 56 days. It is not proof, and Other Startups’ results print beside it.

How it moves it: 11 recordings reached LinkedIn, YouTube and the newsletter as 11 pages, 50 posts and 31 clips with coded links, where before they sat on one replay page.

Guardrails: before against after: organic-share of visits, 33 % against 30 %, and unsubscribes from the newsletter issues that carried a cut, 0.4 % against 0.5 %.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/archive-repurposing",
  "$type": "Campaign",
  "play": "play:archive-repurposing@1",
  "path": [
    "archive-contacts",
    "new-leads",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "archive-contacts",
    "unit": "count",
    "heldBack": 3,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 17,
    "maturing": 6,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 13,
    "workerCost": 2,
    "hours": 11.6,
    "wonArr": 347,
    "projectedArr": 390,
    "paybackDays": 14
  }
}

Outside benchmark: 61 % of viewers in one 2026 survey said a dub should say it was made with AI (a localization firm’s survey of 1,000 viewers).

Before it · After it. Before it: events-and-webinars and founder-voice make the recordings. After it: owned-newsletter sends each week’s issue built on one cut, and instant-response answers anyone the pieces send.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days). The library held 14 sources: 6 webinars and 8 customer calls; 3 customers said yes in 2 days and 2 more later, so 11 sources cleared. 3 were drawn page-only. No language passed 200 visits a month, so nothing was dubbed. Read every captured piece at ?threads=all; three follow the tables.

What happened, by optionSourcesPiecesNew contacts (what happened)
Make the full set88 pages, 16 posts in your words, 34 quote posts, 31 clips19
Page only · Make more like the winner3 · 23 pages · 4 more clips1 · 3
Dub it · To your editor · Not now0 · 2 · 3— · 2 edited · ——
All, against before11 sources96 pieces23 · before: 4 in 90 days · $347 won (credited, not all caused by this Play)
At 5 recordings (the Use it when volume)about 4 a monthbefore-after, not proofOther Startups’ results: +2.4 per source, ■■□□ Early sign, n 312 sources
DayEventWhat happenedYour time
0event_1116 Campaign.createdthe three steps; the dry run fails source-consent30 min
2event_1129 Consent.created, first of 53 customer speakers said yes10 min
3event_1137 Approval.created, first of 20the first slate: 1 page, 5 clips, 2 posts in your words, 6 quote posts50 min
9event_1170 Lead.createdthe first new contact, from a clip’s coded link—
30event_1282 Role.updatedpromoted: quote posts send after a 1-day hold—
35event_1311 Campaign.pausededitor: 7 days with no edit; clips held, resumed when you edited—
49event_1366 Change.mergedclips 20 to 40 seconds: replayed at 0.61 contacts a clip, read back at +7d at 0.555 min
1–56event_1138 Task.created, first of 22slates and editor cuts from the POST /{namespace}/tasks/next log9.8 h · total 11.6 h measured, 12 h asked

A 28-second clip, Sep 3, from the Aug 21 webinar at 14:05 · Dana: “When one owner’s renewals run late, it’s usually the hand-off between leasing and accounting, not the lease.”¹ Posted on YouTube with the source page’s coded link.²

Sep 4 · 2 new contacts through the link; one, Wrenfield’s office manager, started a trial on Sep 11 and took Pro on Sep 25 (+$347 ARR).

A quote post, 2026-09-19 · provenance-hold refused it, then the one that posted
- “Every renewal you send 60 days out saves you a vacancy.” Dana Okafor
+ “Most renewals you send 60 days out save you a vacant month.” Dana Okafor, at 31:12

The Maple Court call, 2026-09-09 10:00 · Ana on late fees and lease terms: a contract topic, and a speaker other than Dana, so To your editor sent Dana the 4 cuts (task_293, due Sep 15). Dana cut 1 and approved 3 on Sep 14 at 16:20, and the posts quote Ana by name.³

¹ The words match the transcript at 14:05. ² Each piece carries its own coded link. ³ A speaker other than you, and every contract topic, waits for your edit.

Your settings

plays/archive-repurposing.mdx
---
holdout: 0.2      # 1 back-catalog source in 5 gets a page only, for the pool
---
Every clip, and every cut about tax or contracts, waits for my edit.
Clips run 20 to 40 seconds.
Text
$ npx startup-builder show plays/archive-repurposing
holdout 0.2 · the edit rule · clip length    your file  plays/archive-repurposing.mdx:2,4,5 (Ask 2026-08-24; line 5 by change_29, 2026-10-12)
family demand · process content-marketing · worker role:content-lead, owns never · chooses 6 (4 rule, 2 read) · approval every-send · checks source-consent, provenance-hold, fact-check, advice-review, distinctness, ownership, original-audience · stops 8 + 2 for dubs    catalog  play:archive-repurposing@1 (Not live yet, gaps #5)

Every key from the catalog

Key Id What it is
Tactic archive-ingest Archive ingest turns a consented first-party recording, call or Thread into indexed source cuts with speaker, timestamps, claims, advice class and audience. Starts at Sends nothing.
Tactic derivative-slate Derivative slate plans one source’s derivatives for Venues its original audience never reached, within fixed caps, spread over 21 days. Starts at It does it, you can stop it.
Tactic source-page Source page publishes one transcript Page per source as the coded consent point every derivative links to, with localized twins for dubbed languages. Starts at Sends nothing.
Tactic quote-post-draft Quote post draft posts a speaker’s exact words, attributed by name, on Handles the source never reached, and hands founder cuts to the send tray. Starts at It does it, you can stop it.
Tactic 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 own-voice-dub Own-voice dub renders a consenting speaker’s words in their cloned Voice for Markets that send demand, labeled AI-dubbed and checked by a fluent human. Starts at It does it, you can stop it.
Tactic archive-readout Archive readout credits consented Contacts to derivatives by code, reads new-audience share and the Page-only holdout, and logs a Decision per type. Starts at Sends nothing.
Tactic issue-draft Issue draft assembles one weekly issue from one fact record, one human source cut and one live Offer, with every paragraph linked to its source. Starts at Sends nothing.
Tactic editorial-pass Editorial pass: Puts a human editor on every issue to check its fact and its take against their sources, cut generic lines, and approve or hold it. Starts at You approve each one.
Tactic first-person-draft First-person draft: Turns a Human's own seed into a draft that passes a voice judge and a fabrication veto, for that Human to approve and send. Starts at You approve each one.
Tactic claims-check Claims check maps every draft sentence to an approved source or the Person’s own words, and holds anything else before it reaches anyone. Starts at Sends nothing.
Tactic summoned-reply Summoned reply: Answers a Person who tagged the agent Handle once, from the claims source, and routes each unsummoned reply to a Human as a draft. Starts at You approve each one.
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 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 draft-loop Consumer draft loop uploads each cut as a private, labeled draft that a human finishes with a native sound and publishes, then reads it back. Starts at You approve each one.
Tactic synthetic-media-check Synthetic media check classes each render, labels each realistic synthetic person, voice or scene, and refuses invented testimonials and unconsented likenesses. Starts at Sends nothing.
Trigger source-added Source added: event on Source.added, window 30d.
Trigger archive-backlog Archive backlog: state on Source.added, window 7d.
Trigger market-demand Market demand: threshold on Visit.recorded, window 30d.
Trigger derivative-outlier Derivative outlier: threshold on Post.published, window 14d.
Trigger fact-changed Fact changed: event on Change.merged, window 24h.
Trigger consent-withdrawn Consent withdrawn: event on Consent.withdrawn, window 1h.
Trigger venue-notice Venue notice: event on Message.received, window 90d.
Benchmark archive-dub-disclosure-intent Share of young US consumers who say AI disclosure raises or does not change their purchase intent: 73 % (IAB consumer survey The AI Gap Widens., 2026-01-15).

Compiled, not written: edit the Play record archive-repurposing 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.