Step 1 — Read last month's update (read-only)
Open the most recent update in {{updates_folder}} and extract:
- Last month's figures for every metric this skill tracks (see Step 4).
- The section order, headings, and tone to reuse verbatim this month.
- Any plan targets or context it referenced (e.g. "Q-target MRR", "board-approved runway floor").
If {{updates_folder}} has no prior update yet, use the Format table below
as the default structure and note in the draft that this is the first run.
Step 2 — Pull revenue metrics from Stripe (read-only)
Pull for the current calendar month:
| Metric |
Definition |
| MRR |
Sum of active subscription value, normalized to monthly |
| MRR growth |
(this month MRR − last month MRR) / last month MRR |
| Revenue |
Total collected revenue for the month |
| New / expansion / churned MRR |
Movement components behind the net MRR delta |
Step 3 — Pull product and finance metrics from Postgres (read-only)
Query for the current calendar month:
| Metric |
Definition |
| Active accounts |
Accounts with qualifying activity in the month |
| Account growth |
Net new active accounts vs. last month |
| Burn |
Net cash spent in the month (cash out − cash in, excluding financing) |
| Runway |
Current cash balance ÷ trailing average monthly burn |
Step 4 — Compare to last month and to plan
For every metric in Steps 2–3, compute both deltas:
- Vs. last month — absolute and percentage change from Step 1's figures.
- Vs. plan — variance against the plan target for this metric (from Step 1
if it was recorded there, else from the plan targets held in memory/skill
configuration for {{projectName}}).
Flag anything moving more than one plan-implied standard deviation, or any
metric moving in the wrong direction two months running, as a line the
narrative must address explicitly — don't bury a miss in a table.
Step 5 — Write the narrative
Match last month's section order exactly. A typical structure:
- Headline — one or two sentences on the month's overall trajectory.
- Metrics table — MRR, growth, revenue, active accounts, burn, runway,
each with last month and plan comparisons.
- What moved and why — the flagged variances from Step 4, with the
likely driver (a launch, a lost account, a pricing change, etc.) stated
plainly rather than hedged.
- Asks / notable items — anything the founder has flagged as needing
investor visibility this month (hiring, fundraising, a specific ask).
Write the commentary as a draft for a founder to edit, not a finished
statement — flag genuine uncertainty (e.g. "likely driven by X — confirm")
rather than asserting a cause you can't verify from the data.
Step 6 — Draft into a new document
Create a new document under {{updates_folder}} (do not overwrite last
month's), named/dated for the current month, following Step 5's structure.
This document is the only thing that leaves the sandbox.
Step 7 — Report where it landed
State the new document's name and location under {{updates_folder}} so the
founder can find, edit, and send it. Do not send, share, or publish it
yourself.
1---2name: investor-update-draft3description: Monthly investor-update runbook. Reads last month's update from {{updates_folder}} for the prior numbers and the format to match, pulls MRR and revenue from Stripe and active accounts, growth, burn, and runway from Postgres, compares every metric to last month and to plan, and drafts this month's update as a new document — read-only across every connected system.4---56<skill name="investor-update-draft">78<overview>9Turn three read-only sources — Postgres, Stripe, and last month's update — into10one finished first draft. A monthly cron spawns a fresh session with no memory11of prior runs; this skill is what makes the draft consistent month over12month: which metrics to report, how each is defined, the plan targets to13compare against, and the exact section order and tone to match. The agent14never writes back to a source system — the new draft document is the only15thing it produces.16</overview>1718<when-to-load>19- The monthly cron fires the investor-update draft.20- A human asks for this month's draft ahead of schedule, or asks why a21 specific metric moved.22</when-to-load>2324<workflow>2526## Step 1 — Read last month's update (read-only)2728Open the most recent update in {{updates_folder}} and extract:2930- Last month's figures for every metric this skill tracks (see Step 4).31- The section order, headings, and tone to reuse verbatim this month.32- Any plan targets or context it referenced (e.g. "Q-target MRR", "board-approved runway floor").3334If {{updates_folder}} has no prior update yet, use the **Format** table below35as the default structure and note in the draft that this is the first run.3637## Step 2 — Pull revenue metrics from Stripe (read-only)3839Pull for the current calendar month:4041| Metric | Definition |42|---|---|43| MRR | Sum of active subscription value, normalized to monthly |44| MRR growth | `(this month MRR − last month MRR) / last month MRR` |45| Revenue | Total collected revenue for the month |46| New / expansion / churned MRR | Movement components behind the net MRR delta |4748## Step 3 — Pull product and finance metrics from Postgres (read-only)4950Query for the current calendar month:5152| Metric | Definition |53|---|---|54| Active accounts | Accounts with qualifying activity in the month |55| Account growth | Net new active accounts vs. last month |56| Burn | Net cash spent in the month (cash out − cash in, excluding financing) |57| Runway | Current cash balance ÷ trailing average monthly burn |5859## Step 4 — Compare to last month and to plan6061For every metric in Steps 2–3, compute both deltas:6263- **Vs. last month** — absolute and percentage change from Step 1's figures.64- **Vs. plan** — variance against the plan target for this metric (from Step 165 if it was recorded there, else from the plan targets held in memory/skill66 configuration for {{projectName}}).6768Flag anything moving more than one plan-implied standard deviation, or any69metric moving in the wrong direction two months running, as a line the70narrative must address explicitly — don't bury a miss in a table.7172## Step 5 — Write the narrative7374Match last month's section order exactly. A typical structure:75761. **Headline** — one or two sentences on the month's overall trajectory.772. **Metrics table** — MRR, growth, revenue, active accounts, burn, runway,78 each with last month and plan comparisons.793. **What moved and why** — the flagged variances from Step 4, with the80 likely driver (a launch, a lost account, a pricing change, etc.) stated81 plainly rather than hedged.824. **Asks / notable items** — anything the founder has flagged as needing83 investor visibility this month (hiring, fundraising, a specific ask).8485Write the commentary as a draft for a founder to edit, not a finished86statement — flag genuine uncertainty (e.g. "likely driven by X — confirm")87rather than asserting a cause you can't verify from the data.8889## Step 6 — Draft into a new document9091Create a new document under {{updates_folder}} (do not overwrite last92month's), named/dated for the current month, following Step 5's structure.93This document is the only thing that leaves the sandbox.9495## Step 7 — Report where it landed9697State the new document's name and location under {{updates_folder}} so the98founder can find, edit, and send it. Do not send, share, or publish it99yourself.100101</workflow>102103<guardrails>104- **Read-only, always.** Postgres and Stripe are read-only connectors; the105 agent cannot change a record in either, even if the connector would106 technically permit it.107- **Never overwrite history.** Last month's update (and every prior one) is108 read-only. The agent only ever adds a new document; it never edits or109 replaces a past one.110- **One output.** The new draft document under {{updates_folder}} is the only111 thing that leaves the sandbox — no emails, no chat posts, no other writes.112- **No memory between runs.** Each run is a fresh session. Recompute every113 metric from the current state of Postgres and Stripe, and re-derive last114 month's figures from the update it wrote rather than assuming anything115 carried over.116- **Scoped secrets.** Postgres, Stripe, and document access are brokered117 server-side through connectors; no raw credential is ever pasted into chat.118- **The founder sends, not the agent.** The agent's job ends at a finished119 draft. It never emails, messages, or publishes the update to investors.120</guardrails>121122</skill>