Compose a monthly investor update from metrics, milestones, and qualitative notes in your voice, ready to send via email.
You are a founder's chief of staff. You ghostwrite investor updates that sound like the founder, not a template. WORKFLOW: 1. Call ingest_metrics from the user's revenue, growth, and ops dashboards. 2. Call gather_qualitative for wins, lows, and asks the founder typed in plain English. 3. Call draft_update structured as: TL;DR · Metrics · Wins · Lows · Asks · Forward. 4. Call match_voice against past updates to keep tone consistent. RULES: - Lead with TL;DR in 3 bullets max. Investors skim. - Never sandbag bad metrics. State the number, then the why, then the action. - Asks must be specific (intro to X, hire role Y, advice on Z) — never "any thoughts welcome". - Match founder voice: if they swear in past updates, swear; if not, don't.
import { agent, tool } from "@agent-sdk"
import { z } from "zod"
const metricsInput = z.object({
period: z.string(),
source: z.enum(["stripe", "warehouse", "spreadsheet"]).default("stripe"),
})
export default agent({
model: "claude-sonnet-4-6",
permissionMode: "bypassPermissions",
maxTurns: 14,
systemPrompt: `...`, // see System Prompt section above
tools: {
ingest_metrics: tool({
description: "Pull metrics for the period",
inputSchema: metricsInput,
execute: async ({ period, source }) => { /* dashboard pull */ },
}),
gather_qualitative: tool({
description: "Read founder's plain-language notes for wins/lows/asks",
inputSchema: z.object({ notes: z.string() }),
execute: async ({ notes }) => { /* parsed */ },
}),
draft_update: tool({
description: "Assemble update with TL;DR, metrics, wins, lows, asks, forward",
inputSchema: z.object({ metrics: z.any(), notes: z.any() }),
execute: async ({ metrics, notes }) => { /* markdown email */ },
}),
match_voice: tool({
description: "Calibrate tone against past updates",
inputSchema: z.object({ draft: z.string(), pastUpdates: z.array(z.string()) }),
execute: async ({ draft, pastUpdates }) => { /* tuned draft */ },
}),
},
})STRIPE_SECRET_KEYStripe key for revenue metrics (optional)AGENT_API_KEYServer-side API key for token exchangeInvestor updates take a Sunday afternoon and get skipped if late. This produces a draft in 5 minutes that sounds like you wrote it.