Daily Marketing Brief
Implements:
commons:daily-brief-pattern— 8-step orchestration sequence, unlimited hypothesis- and data-driven actions (minimum 3, no cap), no action without hypothesis, score maturing before generating new. This skill configures the pattern for the marketing domain (H-### hypotheses, marketing metric whitelist, 20-minute target).
The only skill Ed reads every morning. All marketing-related skills feed it. Target: Ed reads and executes in 20 minutes over one coffee.
Dependencies (load in order)
marketing-identity— ICP, hook, hypothesis format, banned wordscommons:brand-voice— every draft passes through thishypothesis-ledger— in-flight hypotheses and nextH-###allocationlead-tracker— funnel data (this skill triggers a fresh run, unless one already exists for today)marketing-strategy-master— current weekly theme, channel priorities, objectives
Also read:
/var/www/html/systemprompt-web/reports/sales-marketing-strategy.md— master strategy doc (domain weights, daily schedule, decision framework)social-media:daily-social-briefoutput (if available) — social media actions for cross-referencing
Note: LinkedIn, Reddit, and X/Twitter skills have moved to the
social-mediaplugin. When generating social media actions, referencesocial-media:social-identityfor platform-specific rules.
CRITICAL: Profile must be systemprompt-prod
Before this skill does anything, verify systemprompt admin session list shows systemprompt-prod as the active profile. lead-tracker enforces this on its own — but this skill also calls systemprompt analytics directly in places (for example, to pull a freshness check or a specific content stat), so the rule applies here too. If the active profile is local, switch before proceeding:
systemprompt admin session switch systemprompt-prod
The local profile reads a frozen dev DB that was last prod-synced at an earlier date; every analytics number will be silently wrong. Never run this skill against local. Every brief written by this skill must carry a Profile: systemprompt-prod line at the top.
Run Sequence
- Check today's
lead-trackerreport exists. Path:/var/www/html/systemprompt-web/reports/marketing/daily/{today}/lead-tracker.md. If missing, invokelead-trackervia the Skill tool. If it fails, degrade gracefully: write the brief with what's available, put the failure in the Headline and Instrumentation Notes, and generate whichever actions don't depend on lead-tracker data. Do not halt. Do not ask the user — the master-brief orchestrator depends on this skill returning. - Read strategy doc.
marketing-strategy-master readto get current phase, weekly theme, channel priorities. - Read in-flight and maturing hypotheses.
hypothesis-ledger in-flightandhypothesis-ledger maturing {today}. - Score any hypothesis whose
window_end<= today. For each, pullmetricvalue fromlead-tracker's JSON tail, compare to baseline + target, callhypothesis-ledger score {id} {result} {PASS|FAIL|INCONCLUSIVE} {note}. - Generate all effective actions for today — minimum 3 if any in-flight hypotheses or fresh funnel data, no maximum (see next section).
- Log each generated action via
hypothesis-ledger log— each action gets a newH-###and its full draft written todata/actions/H-###.md. - Write the brief to
/var/www/html/systemprompt-web/reports/marketing/daily/{today}/daily-brief.mdand print to Ed.
How Actions Are Chosen
No arbitrary maximum — emit every action that is hypothesis- and data-driven. Minimum 3 when the domain has any in-flight hypotheses or fresh funnel data; otherwise at least 1 maintenance action. Priority order:
- Dues: any action from the previous day's brief that Ed confirmed he'd do but wasn't scored yet (check ledger for
IN-FLIGHTrows logged yesterday that should have been actioned today). - Theme-aligned: 2–3 actions aligned to the current weekly theme from
marketing-strategy-master §6. - Channel-balanced: weighted by the channel priorities in
marketing-strategy-master §7. If the top channel is Reddit, it gets the most actions; do not over-sample a single channel unless §7 explicitly says so. - One experiment of the day: one net-new hypothesis in a channel we haven't tested in ≥7 days. Bias toward learning when data is thin.
- Floor: if
leads_new_7d == 0for 3+ consecutive days, at least one action must be a direct outreach DM (LinkedIn or email) — not a broadcast post.
Drop rules:
- Never two Reddit posts on the same day in the same subreddit.
- Never a LinkedIn post and an X post with the same body — force variation.
- If the brief would contain zero drafts because
lead-trackershows no data, emit only a baseline-gathering action: "Do nothing today, let baseline build."
Action Draft Format
Every action in the brief looks exactly like this — copy-paste ready:
### Action {N}: {Channel} — {One-line summary}
**Hypothesis:** [H-###] If we {action} on {channel} targeting {ICP-sub},
then {metric} will {direction} by {Δ} within {window} days.
Reason: {insight}.
**Metric to watch:** `{metric_name}` (current baseline: {N})
**Check back on:** {YYYY-MM-DD}
**Target URL to link:** {exactly one URL}
**Draft (copy-paste ready):**
> {the actual post / DM / PR comment / email body}
> {multiple lines ok}
**Post to:** {exact destination — subreddit name, LI feed, PR # + URL, DM recipient + LinkedIn profile URL}
**After posting:** reply `done H-###` and I'll log the URL of your post.
No placeholders in the body. No {name} except in personalised DMs where it's at the very top for Ed to replace.
Email sends route through crm:email-composer
When an H-### is an email-type action (cold outreach, DM-via-email, nurture), the draft lives in this brief but the send path is always crm:email-composer. That skill:
- Reads the Resend API key from
/var/www/html/systemprompt-web/.systemprompt/profiles/systemprompt-prod/secrets.json(resend_api_key) - Presents each email individually for Ed's
send/edit/skipapproval - POSTs to
https://api.resend.com/emailsonly onsend - Logs the Resend
idtoreports/crm/data/email-log.jsonland the interaction toreports/crm/data/interactions.jsonl
Do not instruct Ed to send from Gmail or any other client. The Resend log is the only system of record for outbound; anything sent outside that path is invisible to hypothesis scoring.
Sample curl (for reference only — email-composer runs this, not this skill):
RESEND_API_KEY=$(python3 -c "import json; d=json.load(open('/var/www/html/systemprompt-web/.systemprompt/profiles/systemprompt-prod/secrets.json')); print(d['resend_api_key'])")
curl -X POST 'https://api.resend.com/emails' \
-H "Authorization: Bearer ${RESEND_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{"from":"systemprompt.io <hello@systemprompt.io>","to":["recipient@example.com"],"subject":"...","text":"..."}'
Brief Report Structure
# Daily Marketing Brief — {YYYY-MM-DD}
**Phase:** {1|2|3|4 from strategy master}
**Weekly theme:** {from §6}
**Days since last run:** {N}
**Active hypotheses in flight:** {N}
**Leads total:** {N} **| Leads this week:** {N} **| Qualified convos this week:** {N}
---
## 1. Funnel Snapshot (1d / 7d / 31d)
| Stage | 1d | 7d (Δ% vs prev 7d) | 31d |
|---|---|---|---|
| Web sessions | ... | ... | ... |
| Repo unique views (core+template) | ... | ... | ... |
| **Unique cloners (core+template)** | ... | ... | ... |
| Feedback leads | ... | ... | ... |
| Qualified convos | ... | ... | ... |
**Target pace:** 30d unique-cloners/wk target is {T}. Current 7d is {C}. At this rate we hit {%} of target.
## 2. Hypotheses Maturing Today
For each hypothesis with `window_end <= today`:
- **[H-###]** {hypothesis one-liner}
- Metric: `{name}` Baseline: {N} Result: {N}
- Status: **{PASS|FAIL|INCONCLUSIVE}**
- Lesson: {one line}
- Diff to strategy doc: {§4 Winning Tactic | §5 Dead Hypothesis | no change}
If zero: "No hypotheses maturing today. In flight: {list of IDs and their window_end dates}."
## 3. Today's Actions ({N} — all effective, no cap)
{Action 1}
{Action 2}
{Action 3}
... (continue for every hypothesis- and data-driven action)
## 4. What I Noticed
Up to 3 bullets of observation from the data. No speculation. Examples:
- "crates.io became a template referrer for the first time — worth an experiment."
- "web_sessions dropped 18% vs prev 7d despite no content change — investigate source split."
- "959-clone spike on core on {date} was automation; ignore for lead counting but note as a distribution surface."
## 5. Instrumentation Notes
Anything `lead-tracker` couldn't measure (GSC unavailable, session expired, LinkedIn needs manual paste-in, etc.) — listed so Ed knows the blind spots of today's brief.
Length discipline: the brief must be under ~800 words of prose, excluding code/draft blocks. If it's longer, it's not a brief.
Run Modes
daily-marketing-brief # Normal run, writes report, prints to stdout
daily-marketing-brief dry # Generate the brief, don't log hypotheses to ledger
daily-marketing-brief confirm H-### {url} # After Ed posts, record the live URL in data/actions/H-###.md
After Ed Posts — Confirmation Flow
When Ed pastes done H-### {url} or says "posted H-###", run:
daily-marketing-brief confirm H-### {url}
Which:
- Appends
posted_at: {now}andlive_url: {url}todata/actions/H-###.md. - Leaves the ledger row
IN-FLIGHT— it only transitions onwindow_end. - Prints "Confirmed. Checking back on {window_end}."
Anti-Sludge Rules
- No vague prose. "Traffic is growing" is banned. "template_cloners_7d rose from 47 to 62, a 32% lift" is required.
- No motivational language. No "great work," "keep it up," "building momentum." Ed is a professional.
- No emojis anywhere in the brief. The brand-voice rules apply.
- No actions without a hypothesis. If you can't state the hypothesis, cut the action.
- No arbitrary cap on actions. Minimum 3 when data supports them, no maximum. Every action must cite a measurable hypothesis AND a data signal. If the ledger has 10 maturing today, score them all and generate as many new ones as the data supports.
- Fail loudly, not silently. If
lead-trackeris stale or the session is expired, the brief's top line says so — but still generate whichever actions don't depend on the failed source, and write the brief. Never halt waiting for user input. - The brief is for Ed's eyes only. It is not a social-media-ready artifact. It is an operator's dashboard.