Skip to content

The content/ folder: one file and what it compiles to

What one content/ file holds, what each key compiles to, and the checks that read it.

One content/ file is one piece: who wrote it, what it came from, where it goes and what it moves. SalesBuilder compiles it, and show traces every key.

content/webinars/60-day-notices.mdx
---
author: dana                     # a person: drafted only from her words
from: gathering:60-day-notices   # the replay and transcript
distribute: { newsletter: { issue: 47 }, posts: { handles: [dana-linkedin], count: 6 }, clips: { count: 3 }, page: /guides/60-day-notices }
metric: registrant-deals
---
show
$ npx startup-builder show content/webinars/60-day-notices.mdx
author      dana                                                                      content/webinars/60-day-notices.mdx:2
from        gathering:60-day-notices                                                  content/webinars/60-day-notices.mdx:3
distribute  { newsletter: { issue: 47 }, posts: { handles: [dana-linkedin], count: …  content/webinars/60-day-notices.mdx:4
metric      registrant-deals                                                          content/webinars/60-day-notices.mdx:5
owner       SalesBuilder
leaseline.app
leaseline.app/
├── plays/
│   ├── cold-email.mdx
│   ├── warm-intros.mdx
│   ├── signup-interviews.mdx
│   ├── lead-reactivation.mdx
│   └── events-and-webinars.mdx
├── audiences/
│   ├── small-property-managers.mdx
│   ├── lapsed-leads.mdx
│   └── renewal-season.mdx
├── sequences/
│   └── cold-email-thread-founder.mdx
├── funnels/
│   └── signup.mdx
├── workflows/
│   └── outbound.mdx
├── agents/
│   ├── sales/prospector.mdx
│   └── marketing/content-lead.mdx
├── systems/
│   └── sequences.mdx
├── domains/
│   └── leaseline.app.mdx
├── offers/
│   ├── pro.mdx
│   └── team.mdx
├── content/   ← this folder
│   └── webinars/60-day-notices.mdx
├── metrics/
│   ├── q4.mdx
│   └── positive-reply-rate.mdx
└── startups.lock

The file

KeyOn the pageCompiles toChecked by
authorAuthorwho it speaks for: a person’s pieces use only their words, an agent’s are fact-checkedS7
fromMade fromthe source it is drafted from (POST /{namespace}/content/draft)S6
distributeGoes toone call per output: POST /{namespace}/messages/{message}/broadcast, POST /{namespace}/posts/{post}/schedule, POST /{namespace}/videos/draft, a PageS6
metricMovesthe leaf each piece is credited on, watched by POST /{namespace}/metrics/{metric}/watchS1

Checks

CheckIt holdsWhat dev prints
S1The Metric’s parent chain reaches arr: the Result card’s path.metrics/q4.mdx:5 S1 keyResults[1].metric: demo-requests has no parent chain to arr. Set its parent: opened-deals-and-trials.
S6Content from and distribute handles resolve.content/webinars/60-day-notices.mdx:4 S6 distribute.posts.handles: dana-x is not a connected account. Did you mean dana-linkedin?
S7Every body rule compiles to an Evaluator that runs as POST /{namespace}/actions/{action}/evaluate on each draft before its window opens.plays/cold-email.mdx:5 S7 body: “sound friendly” compiles to no Evaluator. Write what a draft must hold or must leave out.

Refusals

CodeFix, then the call that clears it
announced-onlyCut it; name the integration as a product fact. Then POST /{namespace}/content/draft.
approved-pagesCut the sentence, or publish the Page that says it. Then POST /{namespace}/sites/{site}/publish.
categoryDrop the Audience rule or framing the Venue would reject. Then POST /{namespace}/content/draft.
cherry-pickRestore the Metric, or show its Withheld count in the log. Then POST /{namespace}/content/draft.
claims-resolveCut the claim, or name the record that backs it. Then POST /{namespace}/content/draft.
content-evalsFix the lines the Evaluator lists, then publish again. Then POST /{namespace}/content/draft.
disclosureName your interest before the recommendation. Then POST /{namespace}/content/draft.
display-consentAsk the reviewer once; the Review shows when they agree. Then POST /{namespace}/messages/{message}/schedule.
distinctnessDraft a new open or a new fact. Then POST /{namespace}/videos/draft.
duplicate-pageMerge it into the Page that owns the intent. Then POST /{namespace}/content/draft.
evaluatorFix the lines the Evaluator lists, then submit the phrase again. Then POST /{namespace}/content/draft.
fabrication-vetoSource the specific or cut it, then draft again. Then POST /{namespace}/content/draft.
fact-checkCut the claim, or name the record that backs it. Then POST /{namespace}/content/draft.
fingerprintRewrite the reason line from this company’s own Event. Then POST /{namespace}/content/draft.
fresh-anecdotePick another anecdote from the log, or log a new one. Then POST /{namespace}/content/draft.
give-ask-guardCut the ask; it opens after 3 gives they act on. Then POST /{namespace}/content/draft.
holdout-floorSpend holds at the last winning Limit; refresh the concepts instead. Then POST /{namespace}/content/draft.
knowledgeName only the job on screen, or the Customer’s own words. Then POST /{namespace}/content/draft.
leak-scanRemove the Customer detail from the log, then publish. Then POST /{namespace}/content/draft.
line-claimSay “Made with” and the Brand, and nothing about the Customer. Then POST /{namespace}/content/draft.
listing-guardShow the listing with no guarantee and no timer. Then POST /{namespace}/content/draft.
mention-budgetStrip the mention, or skip the answer. Then POST /{namespace}/content/draft.
no-conditional-seatRemove the condition from the invitation, then draft it again. Then POST /{namespace}/content/draft.
number-tokenReplace the quantity with a record token, then compile the log. Then POST /{namespace}/content/draft.
old-employerCut the line about the old company; offer only their own setup. Then POST /{namespace}/content/draft.
partner-claimSay “works with” and the tool’s name until the Agreement is signed. Then POST /{namespace}/content/draft.
prep-holdsCut it from the brief; the hold lists what stays out. Then POST /{namespace}/content/draft.
proofCut the claim or add the sponsor label, then send it again. Then POST /{namespace}/content/draft.
provenance-holdCut the line, or cite its timestamp in the transcript. Then POST /{namespace}/content/draft.
raiseCut the raise or forecast mention, then compile the log. Then POST /{namespace}/content/draft.
review-replyThank them and name the fix; ask nothing about the rating. Then POST /{namespace}/content/draft.
rewardRemove the reward. Then POST /{namespace}/content/draft.
stale-outputRefresh the ready output, then approve it once. Then POST /{namespace}/content/draft.
store-ruleFix the field to the listing spec; it submits once it passes. Then POST /{namespace}/content/draft.
synthetic-mediaUse a real Customer’s words with their yes, or show the product instead. Then POST /{namespace}/content/draft.
testimonialCut the line, or record a person who gave Consent. Then POST /{namespace}/videos/draft.
thread-linkLink your own Site instead. Then POST /{namespace}/content/draft.
vote-askCut the ask; say it is live and what it does. Then POST /{namespace}/content/draft.
watched-eventCut it; lead with what the Person announced or asked. Then POST /{namespace}/content/draft.
words-checkWrite that sentence yourself, or cut it. Then POST /{namespace}/content/draft.

Calls

content/ compiledMode try
You, to your agent

Draft issue 47 from the webinar, send it, and watch what it earns, as a dry run.

curl -X POST "https://api.sb/leaseline.app/content/draft?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"article","brief":"Example brief"}'

curl -X POST "https://api.sb/leaseline.app/messages/message_1/broadcast?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"audience":"audience_1"}'

curl -X POST "https://api.sb/leaseline.app/metrics/metric_1/watch?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"threshold":1,"direction":"above"}'
import { $ } from 'startup-builder'

await $.Content.draft({ kind: 'article', brief: 'Example brief' }, { mode: 'try' })   // content/webinars/60-day-notices.mdx
await $.Message.broadcast({ message: 'message_1', audience: 'audience_1' }, { mode: 'try' })   // the newsletter issue
return await $.Metric.watch({ metric: 'metric_1', threshold: 1, direction: 'above' }, { mode: 'try' })   // registrant-deals
npx startup-builder do Content.draft --json '{"kind":"article","brief":"Example brief"}' --try
npx startup-builder do Message.broadcast --json '{"message":"message_1","audience":"audience_1"}' --try
npx startup-builder do Metric.watch --json '{"metric":"metric_1","threshold":1,"direction":"above"}' --try
{
  "name": "do",
  "arguments": {
    "code": "await $.Content.draft({ kind: 'article', brief: 'Example brief' }, { mode: 'try' })   // content/webinars/60-day-notices.mdx\nawait $.Message.broadcast({ message: 'message_1', audience: 'audience_1' }, { mode: 'try' })   // the newsletter issue\nreturn await $.Metric.watch({ metric: 'metric_1', threshold: 1, direction: 'above' }, { mode: 'try' })   // registrant-deals",
    "mode": "try"
  }
}
Response200application/json
{
  "watch": {
    "$id": "https://api.sb/leaseline.app/watches/watch_1",
    "$type": "Watch",
    "selector": "Example selector",
    "url": "https://leaseline.app"
  },
  "metric": {
    "$id": "https://api.sb/leaseline.app/metrics/metric_1",
    "$type": "Metric",
    "query": "Example query",
    "status": "draft"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Metric.watch",
    "status": "done"
  }
}
sample
CallWhat it does
POST /{namespace}/content/draftDraft writes Content of one kind from a brief, such as an article for a question the help center could not answer. Emits Content.drafted.
POST /{namespace}/content/{content}/publishPublish puts a Content draft live on its Site and every Interface, once it passes the Evals for its kind. Emits Content.published.
POST /{namespace}/posts/{post}/publishPublish sends a Post out through its Handle once every claim it states resolves to a live record. Emits Post.published.
POST /{namespace}/videos/draftDraft writes a Video’s timeline from a Startup’s records, its Brand and a Template, with a draft mark on every frame. Emits Video.drafted.
POST /{namespace}/videos/{video}/finalizeFinalize lifts a Video’s draft mark once every claim it makes reads from a live record, so its cuts can be published. Emits Video.finalized.
POST /{namespace}/keywords/{keyword}/measureMeasure records a Keyword’s monthly search volume, difficulty, cost per click and trend in one locale. Emits Keyword.measured.
POST /{namespace}/gatherings/{gathering}/registerRegister gives a Contact a place at a Gathering, or a waitlist place when the Gathering is full. Emits Gathering.registered.
POST /{namespace}/reviews/{review}/publishPublish shows a Review on the Startup’s Pages with its rating counted, whatever the rating. Emits Review.published.
Not live yetUse today
Content.refreshGaps #2. Today: POST /{namespace}/content/draft with a brief.
Content.withdrawGaps #2. Today: POST /{namespace}/content/draft with a brief.
Gathering.scheduleGaps #2. Today: POST /{namespace}/content/draft with a brief.

Compiled, not written: edit the records it reads (compile table; cap), 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.

Contents