URL: /plays/archive-repurposing · Id: `play:archive-repurposing`

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

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.

```text title="Set it up · Ask"
Be our Content Lead for the archive: turn every webinar and every customer call that said yes into a page, LinkedIn posts in my words and short clips, for property managers who never saw them. Quote people exactly. I edit anything about tax or contracts, and every clip. Show me what’s missing; don’t publish.
```

```text title="Run one · Ask"
Hand our latest recording to the Content Lead agent and show me what it chose and why. Don’t publish.
```

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

```json title="Run one · Response · sample"
{
  "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"
    ],
    "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"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "File.generate",
      "checks": [
        {
          "check": "source-consent",
          "status": "pass"
        },
        {
          "check": "ownership",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_7",
      "verb": "Content.draft",
      "checks": [
        {
          "check": "provenance-hold",
          "status": "pass"
        },
        {
          "check": "fact-check",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_7",
      "verb": "Video.draft",
      "checks": [
        {
          "check": "provenance-hold",
          "status": "pass"
        },
        {
          "check": "distinctness",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_4",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingTime",
      "mode": "try",
      "by": "worker_7",
      "verb": "Post.schedule",
      "checks": [
        {
          "check": "original-audience",
          "status": "pass"
        },
        {
          "check": "fact-check",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`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 recording | Choice | Reason |
| --- | --- | --- |
| Oct 16 webinar: 60-day renewal notices, 52 min, you speaking | `full-set` | 13 usable cuts, and every speaker’s Consent |
| Maple Court call, Sep 8: Ana on late fees and lease terms | `to-your-editor` | a contract topic, and a speaker other than you |
| Aug webinar: drawn into the page-only half | `page-only` | the draw holds it to a page |
| Harbor Row call: no Consent on file | `not-now` | `source-consent`: no piece until they say yes |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$390 ARR a month at 6 sources | 1 h week 1, then 90 min a week | $1.10 per source, ~$7 a month | Day 9: first contact from a clip’s link | 5+ recordings you own, a new one every 2 weeks | Under 5: `events-and-webinars` · no subscribe Form: `owned-newsletter` |

**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
```bash
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"
```


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

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · pass: 14 recordings (gaps #8) | <Op verb="Metric.query" /> on `archive-contacts` | 1 min | none |
| <a id="check-baseline"></a>`baseline` · warn: 4 in 90 days | <Op verb="Metric.query" />; it fills Before in Your number | 0 min | none |
| <a id="check-source-consent"></a>`source-consent` · fail: 8 customer speakers with no yes on file (Not live yet) | <Op verb="Consent.create" /> from each speaker’s answer to one ask | 10 min | their answers; 3 said yes in 2 days |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · pass (gaps #8) | — | 0 min | none |

`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
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| A recording or consented call lands in your library | `source-added` | `event` on `Source.added` where a recording, webinar, episode, consented Meeting or support Conversation | the slate within 1 h; ignored after 30 d | <Op verb="File.create" /> with the recording, or your webinar tool through <Op verb="Integration.connect" /> |
| An old source has 3+ unused cuts and no piece in 60 days | `archive-backlog` | `state` on `Source.added` where older than 30 days, 3 or more unused cuts, and no piece in 60 days | once a week | the library itself |
| A piece ranks in your top tenth for new contacts | `derivative-outlier` | `threshold` on `Post.published` where 7-day new contacts in your top tenth, 5 or more | 14 d | its coded link’s <Op verb="Lead.create" /> |
| + 4 more for language demand, fact changes, Consent withdrawals and Venue notices (`?lanes=all`) | | | | |

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

```bash title="Reproduce it in test"
# each delivery is signed with the Watch’s secret
curl -X POST https://api.sb/leaseline.app/watches \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selector":"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.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Make the full set: quote posts and the page | It does it, you can stop it | 34 of 34 quote posts approved unedited | met on day 30 (the first 30 quote posts) | a `comment` Stop → You approve each one | <Op verb="Action.cancel" /> inside the 1-day hold |
| Make the full set: clips and posts in your words | You approve each one, on every rung | 31 clips, 4 trimmed · 16 posts, 1 rewritten | never | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Page only · Make more like the winner · Not now | It does it | 3 of 3 · 2 of 2 · 3 held | — | — | <Op verb="Action.redirect" /> |
| Dub it · To your editor | You approve each one, on every rung | 0 dubs · 2 of 2 edited | never | — | <Op verb="Task.claim" /> |
| Never: a changed quote, a voice but the speaker’s own, footage you don’t own | To a person, every time | 1 refused, 0 published | never | — | <Op verb="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 <Op verb="Content.draft" />, <Op verb="Post.schedule" />, <Op verb="Video.draft" />, <Op verb="Page.create" />, <Op verb="Site.publish" />, <Op verb="Experiment.start" />, <Op verb="Task.assign" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="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**, <Op verb="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.

```bash
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
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| Make the full set `full-set` | 3+ usable cuts and every speaker’s Consent | Your rule (line 4) | <Op verb="Content.draft" /> the page and posts → <Op verb="Video.draft" /> the clips → <Op verb="Post.schedule" /> | you edit the clips · Take this one | you |
| Page only `page-only` | drawn page-only, or under 3 cuts | Your rule (the draw) | <Op verb="Page.create" /> → <Op verb="Site.publish" /> | nobody | the same |
| Make more like the winner `more-like-the-winner` | a piece in your top tenth | Agent’s call, with its reason | <Op verb="Content.draft" /> 2 more from the same cut → <Op verb="Experiment.start" /> | nobody | the same |
| Dub it in your own voice `dub-it` | a language with 200+ visits or 10 sign-ups a month | Agent’s call, with its reason | <Op verb="Video.draft" /> with your own cloned Voice | you, and a fluent reviewer for the first 10 · Take this one | you |
| To your editor `to-your-editor` | tax or contract, or another speaker | Your rule (line 4) | <Op verb="Task.assign" /> with the cut and its transcript | you, due 2 business days · Take this one | you |
| Not now `not-now` | no Consent, or a Venue notice | Your rule (the consent hold) | nothing; names the holder: `source-consent` or `strike` | nobody | the same |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | a comment on a clip: “Where do I set this up?” | replies with the source page’s coded link | Content Lead · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Send me pricing | “How much is it for 80 units?” | replies with the Pricing Page’s list Price and nothing it lacks | Content Lead · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Not now | a new subscriber: “Just reading for now.” | nothing else sends but the newsletter they asked for | nobody | at once | <Op verb="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 text | Content Lead · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply to the welcome issue, until Oct 30 | the next issue waits for the return date | nobody | the return date | <Op verb="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 lack | you | 2 business days | <Op verb="Conversation.escalate" /> |
| Stop | a speaker: “Please take my clip down.” | their Consent is withdrawn; their cuts hide and their posts come down within 1 h | nobody | 1 h | <Op verb="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).

```json title="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 <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, <Op verb="Approval.approve" /> or <Op verb="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:** <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 |
| --- | --- | --- | --- |
| `source-consent` | any piece from a source with a speaker other than you and no Consent on file | Ask the speaker once for their yes; nothing of theirs runs until then. | <Op verb="Consent.create" /> |
| <a id="check-provenance-hold"></a>`provenance-hold` | a quote, caption or post that differs from its transcript, except at a marked ellipsis | Cut the line, or cite its timestamp in the transcript. | <Op verb="Content.draft" /> |
| <a id="check-fact-check"></a>`fact-check` | a piece with a claim that reads from no fact record and no timestamp | Cut the claim, or name the record that backs it. | <Op verb="Content.draft" /> |
| <a id="check-advice-review"></a>`advice-review` | a cut tagged tax or contract without your edit | Edit it, or leave it unpublished. | <Op verb="Task.claim" /> |
| <a id="check-distinctness"></a>`distinctness` | a piece too close to one on the same account in 90 days, or to one of your other Startups’ on that Venue | Pick another cut, or reframe it. | <Op verb="Content.draft" /> |
| <a id="check-ownership"></a>`ownership` | footage or audio you don’t own, with no written grant on file | Record the owner’s grant, or leave it out. | <Op verb="File.update" /> |
| <a id="check-original-audience"></a>`original-audience` | a piece in the same format, in the feed or list where its source first aired | Post it elsewhere; a dub on the original video is fine. | <Op verb="Post.schedule" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-consent-withdrawn"></a>`consent-withdrawn` | a speaker withdraws their Consent | their cuts hide, posts come down and dubs go, within 1 h |
| <a id="stop-strike"></a>`strike` | a Venue sends a strike, label, removal or reach limit | that account pauses and the piece type quarantines across your Startups within 1 h |
| <a id="stop-new-audience-floor"></a>`new-audience-floor` | under 50 % of new contacts are new to you, over 30 days, at 30 contacts | the lowest piece type pauses and re-slates |
| <a id="stop-contact-floor"></a>`contact-floor` | a piece type with 20 published and no contact in 60 days | it stops until a Variant tests |
| <a id="stop-comment"></a>`comment` | comments calling a piece fake or mistranslated over 5 %, on 2 pieces in a week | it returns to You approve each one |
| <a id="stop-editor"></a>`editor` | no edit for 7 days | every clip and issue holds, one rung down on every account |
| <a id="stop-spend-limit"></a>`spend-limit` | transcription, dub and model spend reach the $40 Limit | the queue holds; <Op verb="Limit.raise" /> with your OK |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every upload, post and dub pauses; <Op verb="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.

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


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

| Node | Now (56 days) | Before (the 90 days, per 56) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `archive-contacts` | 23 new contacts through coded links (17 matured) · 71 % new to you | 2.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-leads` | 9 Leads from those contacts | 1 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` · `arr` | carried from `new-arr` | carried | — | — | 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 %.

```json title="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 option | Sources | Pieces | New contacts (what happened) |
| --- | --- | --- | --- |
| Make the full set | 8 | 8 pages, 16 posts in your words, 34 quote posts, 31 clips | 19 |
| Page only · Make more like the winner | 3 · 2 | 3 pages · 4 more clips | 1 · 3 |
| Dub it · To your editor · Not now | 0 · 2 · 3 | — · 2 edited · — | — |
| **All**, against before | **11** sources | **96** pieces | **23** · 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 month | before-after, not proof | Other Startups’ results: +2.4 per source, ■■□□ Early sign, n 312 sources |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_1116` Campaign.created | the three steps; the dry run fails `source-consent` | 30 min |
| 2 | `event_1129` Consent.created, first of 5 | 3 customer speakers said yes | 10 min |
| 3 | `event_1137` Approval.created, first of 20 | the first slate: 1 page, 5 clips, 2 posts in your words, 6 quote posts | 50 min |
| 9 | `event_1170` Lead.created | the first new contact, from a clip’s coded link | — |
| 30 | `event_1282` Role.updated | promoted: quote posts send after a 1-day hold | — |
| 35 | `event_1311` Campaign.paused | `editor`: 7 days with no edit; clips held, resumed when you edited | — |
| 49 | `event_1366` Change.merged | clips 20 to 40 seconds: replayed at 0.61 contacts a clip, read back at +7d at 0.55 | 5 min |
| 1–56 | `event_1138` Task.created, first of 22 | slates and editor cuts from the <Op verb="Task.next" /> log | 9.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).

```diff title="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
```mdx title="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 | <a id="tactic-archive-ingest"></a>`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 | <a id="tactic-derivative-slate"></a>`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 | <a id="tactic-source-page"></a>`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 | <a id="tactic-quote-post-draft"></a>`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 | <a id="tactic-clip-cut"></a>`clip-cut` | Clip cut trims real source footage into captioned clips of one claim each, which a human edits before any upload, and never generates a frame. Starts at You approve each one. |
| Tactic | <a id="tactic-own-voice-dub"></a>`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 | <a id="tactic-archive-readout"></a>`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 | <a id="tactic-issue-draft"></a>`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 | <a id="tactic-editorial-pass"></a>`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 | <a id="tactic-first-person-draft"></a>`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 | <a id="tactic-claims-check"></a>`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 | <a id="tactic-summoned-reply"></a>`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 | <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-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-draft-loop"></a>`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 | <a id="tactic-synthetic-media-check"></a>`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 | <a id="trigger-source-added"></a>`source-added` | Source added: `event` on `Source.added`, window 30d. |
| Trigger | <a id="trigger-archive-backlog"></a>`archive-backlog` | Archive backlog: `state` on `Source.added`, window 7d. |
| Trigger | <a id="trigger-market-demand"></a>`market-demand` | Market demand: `threshold` on `Visit.recorded`, window 30d. |
| Trigger | <a id="trigger-derivative-outlier"></a>`derivative-outlier` | Derivative outlier: `threshold` on `Post.published`, window 14d. |
| Trigger | <a id="trigger-fact-changed"></a>`fact-changed` | Fact changed: `event` on `Change.merged`, window 24h. |
| Trigger | <a id="trigger-consent-withdrawn"></a>`consent-withdrawn` | Consent withdrawn: `event` on `Consent.withdrawn`, window 1h. |
| Trigger | <a id="trigger-venue-notice"></a>`venue-notice` | Venue notice: `event` on `Message.received`, window 90d. |
| Benchmark | <a id="benchmark-archive-dub-disclosure-intent"></a>`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). |