{
  "jimothyPipeline": 1,
  "name": "Quarterly investor update",
  "description": "Drafts the quarterly investor update from your metrics and briefings, with a board member’s questions to answer first.",
  "icon": "workflow",
  "color": "#7c3aed",
  "repo": {
    "mode": "inplace",
    "localPath": ""
  },
  "concurrency": 1,
  "variables": {
    "company": "Acme, Series B, $18M ARR, reporting tool for finance teams",
    "asks": "Intros to VP Sales candidates with mid-market SaaS experience.",
    "updatesFolder": "updates"
  },
  "steps": [
    {
      "id": "gather",
      "name": "This quarter’s files",
      "type": "shell",
      "description": "Lists the files added or changed in the last 100 days, leaving out past updates.",
      "timeoutMinutes": 2,
      "command": "u={{vars.updatesFolder}}; find . -type f -mtime -100 -not -path \"./$u/*\" -not -name '.*' | sort | head -300"
    },
    {
      "id": "draft",
      "name": "Draft the update",
      "type": "agent",
      "description": "Reads the files and drafts the update with metrics, highlights, lowlights and asks.",
      "harnessId": "claude-code",
      "model": "opus",
      "dependsOn": [
        "gather"
      ],
      "timeoutMinutes": 40,
      "prompt": "Draft the quarterly investor update for {{vars.company}} for the quarter that just ended.\n\nFiles from the quarter:\n{{steps.gather.output}}\n\nRead them (do not modify anything). Compute any metric changes with a script, not in your head. Write in Markdown:\n# <Company> · <Quarter> update\n## TL;DR (three bullets)\n## Metrics (table: metric, this quarter, last quarter, change; only metrics the files support)\n## Highlights\n## Lowlights (be candid: misses, churn, delays, and what we're doing about them)\n## Priorities next quarter\n## Asks\n{{vars.asks | default:\"(no standing asks)\"}}\n\nCite the source file in brackets after each number. Under 900 words.{{#if steps.approve.output}}\n\nYour previous draft was rejected with this feedback, and the board questions below were raised. Rewrite it:\n{{steps.approve.output}}{{/if}}"
    },
    {
      "id": "questions",
      "name": "Board member read",
      "type": "agent",
      "description": "A skeptical board member reads the draft and lists the questions it raises.",
      "harnessId": "anthropic-api",
      "model": "claude-opus-5",
      "dependsOn": [
        "draft"
      ],
      "timeoutMinutes": 10,
      "systemPrompt": "You are an experienced, skeptical board member at {{vars.company}}.",
      "prompt": "Read this draft investor update:\n\n{{steps.draft.output}}\n\nList the questions you would ask on the board call, most important first: numbers that don't reconcile, trends it glosses over, lowlights without a plan, metrics conspicuously missing. One line each, at most eight."
    },
    {
      "id": "approve",
      "name": "Approve update",
      "type": "approval",
      "description": "Shows you the draft and the board questions. Reject with answers to fold them in.",
      "dependsOn": [
        "questions"
      ],
      "loopBackTo": "draft",
      "maxLoops": 3,
      "approvalMessage": "**Questions a board member would ask**\n\n{{steps.questions.output}}\n\nReject with answers to fold them into the update, or approve to save it.\n\n---\n\n{{steps.draft.output}}"
    },
    {
      "id": "save",
      "name": "Save update",
      "type": "shell",
      "description": "Saves the approved update in the updates folder.",
      "dependsOn": [
        "approve"
      ],
      "timeoutMinutes": 1,
      "command": "mkdir -p {{vars.updatesFolder}} && f={{vars.updatesFolder}}/update-$(date +%F).md && printf '%s\\n' {{steps.draft.output}} > \"$f\" && echo \"Saved $(pwd)/$f\""
    }
  ]
}