From e8a04d01e08a15039e01b851df0696e5f157b860 Mon Sep 17 00:00:00 2001 From: Theophile Cousin Date: Sat, 13 Jun 2026 00:54:09 +0200 Subject: [PATCH 1/2] fix: sonnet heartbeat pulses + hard execution rule in every HEARTBEAT.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two live failure modes from the 2026-06-12 tenant debugging, committed as bundle contract: - heartbeat.model: sonnet on every agent (and the template). The pulse inherited agents.defaults.heartbeat.model=haiku, which lazily acked HEARTBEAT_OK instead of working the board — assigned tickets sat in todo through every wake. - Execution rule (hard) in every HEARTBEAT.md: act through tool calls, never narration; NO_REPLY only as the entire final message when steps 1-3 found nothing. A narrated 'Claim, execute, complete' followed by NO_REPLY terminated a turn with a live ticket stranded. The rule also keeps finals empty-by-default, which matters because a substantive heartbeat final used to wedge board-only agents in OpenClaw's pending-final-delivery replay loop (fixed pod-side in squad-store by sendPolicy deny; this is the belt to that suspenders). All bundle versions patch-bumped. Co-Authored-By: Claude Fable 5 --- .../agents/geo-agent/HEARTBEAT.md | 7 ++++ .../ai-seo-squad/agents/geo-agent/agent.json | 5 ++- squads/ai-seo-squad/manifest.json | 2 +- .../agents/analytics-agent/HEARTBEAT.md | 7 ++++ .../agents/analytics-agent/agent.json | 5 ++- squads/analytics-squad/manifest.json | 2 +- .../agents/reddit-agent/HEARTBEAT.md | 7 ++++ .../agents/reddit-agent/agent.json | 5 ++- squads/community-squad/manifest.json | 2 +- .../eng-squad/agents/build-agent/HEARTBEAT.md | 7 ++++ .../eng-squad/agents/build-agent/agent.json | 5 ++- .../agents/triage-agent/HEARTBEAT.md | 7 ++++ .../eng-squad/agents/triage-agent/agent.json | 5 ++- squads/eng-squad/manifest.json | 2 +- .../agents/outreach-agent/HEARTBEAT.md | 7 ++++ .../agents/outreach-agent/agent.json | 5 ++- squads/outreach-squad/manifest.json | 2 +- .../agents/google-ads-agent/HEARTBEAT.md | 7 ++++ .../agents/google-ads-agent/agent.json | 5 ++- .../agents/meta-ads-agent/HEARTBEAT.md | 7 ++++ .../agents/meta-ads-agent/agent.json | 5 ++- squads/paid-ads-squad/manifest.json | 2 +- .../agents/feedback-agent/HEARTBEAT.md | 7 ++++ .../agents/feedback-agent/agent.json | 5 ++- .../agents/pm-agent/HEARTBEAT.md | 7 ++++ .../product-squad/agents/pm-agent/agent.json | 5 ++- squads/product-squad/manifest.json | 35 +++++++++++++++---- template/agents/example-agent/HEARTBEAT.md | 7 ++++ template/agents/example-agent/agent.json | 3 +- 29 files changed, 153 insertions(+), 24 deletions(-) diff --git a/squads/ai-seo-squad/agents/geo-agent/HEARTBEAT.md b/squads/ai-seo-squad/agents/geo-agent/HEARTBEAT.md index db6a951..245b19d 100644 --- a/squads/ai-seo-squad/agents/geo-agent/HEARTBEAT.md +++ b/squads/ai-seo-squad/agents/geo-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ cofounder-briefed tickets from scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: an open PR awaiting a follow-up diff --git a/squads/ai-seo-squad/agents/geo-agent/agent.json b/squads/ai-seo-squad/agents/geo-agent/agent.json index 296371c..3a03a91 100644 --- a/squads/ai-seo-squad/agents/geo-agent/agent.json +++ b/squads/ai-seo-squad/agents/geo-agent/agent.json @@ -2,7 +2,10 @@ "id": "geo-agent", "description": "GEO/SEO strategist — daily citation audits, blog posts, JSON-LD/llms.txt engineering. Self-merges blog and technical GEO PRs.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/geo-agent/skills/geo-llmseo-playbook.md", "agents/geo-agent/skills/advanced-seo.md", diff --git a/squads/ai-seo-squad/manifest.json b/squads/ai-seo-squad/manifest.json index ec1f85a..27a60ba 100644 --- a/squads/ai-seo-squad/manifest.json +++ b/squads/ai-seo-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "ai-seo-squad", - "version": "1.5.0", + "version": "1.5.1", "description": "Single-agent GEO squad: GEO-agent runs daily citation audits, writes GEO-optimized blog posts, and ships llms.txt / JSON-LD engineering PRs.", "author": "pancake-official", "license": "MIT", diff --git a/squads/analytics-squad/agents/analytics-agent/HEARTBEAT.md b/squads/analytics-squad/agents/analytics-agent/HEARTBEAT.md index 8a26e0c..4573b00 100644 --- a/squads/analytics-squad/agents/analytics-agent/HEARTBEAT.md +++ b/squads/analytics-squad/agents/analytics-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. diff --git a/squads/analytics-squad/agents/analytics-agent/agent.json b/squads/analytics-squad/agents/analytics-agent/agent.json index 30eeffe..9d0cbb7 100644 --- a/squads/analytics-squad/agents/analytics-agent/agent.json +++ b/squads/analytics-squad/agents/analytics-agent/agent.json @@ -2,7 +2,10 @@ "id": "analytics-agent", "description": "Product analytics agent — owns the PostHog MCP, the north-star event taxonomy, and the daily DAU/WAU/MAU + engaged-users + dying-users digest.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/analytics-agent/skills/posthog-discovery.md", "agents/analytics-agent/skills/posthog-daily-analysis.md", diff --git a/squads/analytics-squad/manifest.json b/squads/analytics-squad/manifest.json index e9a6971..f7298f4 100644 --- a/squads/analytics-squad/manifest.json +++ b/squads/analytics-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "analytics-squad", - "version": "1.3.0", + "version": "1.3.1", "description": "Analytics squad (PostHog-backed): daily digest (DAU/WAU/MAU, north-star, engaged + dying), activation-funnel debugger, anomaly alerts, weekly recap. Add-ons: release tracker + auto cohorts.", "author": "pancake-official", "license": "MIT", diff --git a/squads/community-squad/agents/reddit-agent/HEARTBEAT.md b/squads/community-squad/agents/reddit-agent/HEARTBEAT.md index 5e92553..8f8edb6 100644 --- a/squads/community-squad/agents/reddit-agent/HEARTBEAT.md +++ b/squads/community-squad/agents/reddit-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ arrive as cofounder-briefed tickets from scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start — a diff --git a/squads/community-squad/agents/reddit-agent/agent.json b/squads/community-squad/agents/reddit-agent/agent.json index a6c2814..d4e35fb 100644 --- a/squads/community-squad/agents/reddit-agent/agent.json +++ b/squads/community-squad/agents/reddit-agent/agent.json @@ -2,7 +2,10 @@ "id": "reddit-agent", "description": "Reddit presence agent — monitors subreddits and drafts comments on a single purchased account via browser automation on old.reddit.com.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/reddit-agent/skills/reddit-playbook.md", "agents/reddit-agent/skills/reddit-account.md" diff --git a/squads/community-squad/manifest.json b/squads/community-squad/manifest.json index d06c8ff..4dafc6b 100644 --- a/squads/community-squad/manifest.json +++ b/squads/community-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "community-squad", - "version": "1.4.0", + "version": "1.4.1", "description": "Community squad: reddit-agent grows organic presence on Reddit — monitors subreddits, drafts value comments via the browser, warms up a single purchased account, and reports account health.", "author": "pancake-official", "license": "MIT", diff --git a/squads/eng-squad/agents/build-agent/HEARTBEAT.md b/squads/eng-squad/agents/build-agent/HEARTBEAT.md index 44bcd57..f2ad7fb 100644 --- a/squads/eng-squad/agents/build-agent/HEARTBEAT.md +++ b/squads/eng-squad/agents/build-agent/HEARTBEAT.md @@ -6,6 +6,13 @@ implementation tickets (`eng.implement_idea` with a concrete `source`) as they arise. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start — an diff --git a/squads/eng-squad/agents/build-agent/agent.json b/squads/eng-squad/agents/build-agent/agent.json index 697aa27..cbd6de5 100644 --- a/squads/eng-squad/agents/build-agent/agent.json +++ b/squads/eng-squad/agents/build-agent/agent.json @@ -2,7 +2,10 @@ "id": "build-agent", "description": "Implementation specialist — takes a specified idea, issue, or PRD and ships it end to end: branch, code, tests, and an open PR; self-merges only reversible, CI-green changes.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/build-agent/skills/implement-idea.md" ] diff --git a/squads/eng-squad/agents/triage-agent/HEARTBEAT.md b/squads/eng-squad/agents/triage-agent/HEARTBEAT.md index f296899..d42fd85 100644 --- a/squads/eng-squad/agents/triage-agent/HEARTBEAT.md +++ b/squads/eng-squad/agents/triage-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ arrive as cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. diff --git a/squads/eng-squad/agents/triage-agent/agent.json b/squads/eng-squad/agents/triage-agent/agent.json index c1198a5..05de841 100644 --- a/squads/eng-squad/agents/triage-agent/agent.json +++ b/squads/eng-squad/agents/triage-agent/agent.json @@ -2,7 +2,10 @@ "id": "triage-agent", "description": "GitHub issue triage specialist — classifies issues by P0–P3 criticality, labels them, sweeps the backlog daily, and reports issue health weekly.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/triage-agent/skills/triage-playbook.md", "agents/triage-agent/skills/github-labeling.md" diff --git a/squads/eng-squad/manifest.json b/squads/eng-squad/manifest.json index 8fd8e07..5e9e5bb 100644 --- a/squads/eng-squad/manifest.json +++ b/squads/eng-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "eng-squad", - "version": "2.4.0", + "version": "2.4.1", "description": "Engineering squad: triage-agent classifies GitHub issues P0–P3 and reports issue health; build-agent implements specified ideas, issues, and PRDs end to end as reviewable PRs.", "author": "pancake-official", "license": "MIT", diff --git a/squads/outreach-squad/agents/outreach-agent/HEARTBEAT.md b/squads/outreach-squad/agents/outreach-agent/HEARTBEAT.md index d3d784c..49421ff 100644 --- a/squads/outreach-squad/agents/outreach-agent/HEARTBEAT.md +++ b/squads/outreach-squad/agents/outreach-agent/HEARTBEAT.md @@ -9,6 +9,13 @@ crons. The reply-latency SLA is carried by the `reply-sweep` cron, and the this pulse. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start — a diff --git a/squads/outreach-squad/agents/outreach-agent/agent.json b/squads/outreach-squad/agents/outreach-agent/agent.json index 71352e4..3527625 100644 --- a/squads/outreach-squad/agents/outreach-agent/agent.json +++ b/squads/outreach-squad/agents/outreach-agent/agent.json @@ -2,5 +2,8 @@ "id": "outreach-agent", "description": "Runs the full outbound loop daily: finds 1-3 leads, advances active sequences, handles replies, and posts a digest. Decides simple vs. advanced mode autonomously based on company stage.", "model": "sonnet", - "heartbeat": { "every": "24h" } + "heartbeat": { + "every": "24h", + "model": "sonnet" + } } diff --git a/squads/outreach-squad/manifest.json b/squads/outreach-squad/manifest.json index 8bf1c51..1e4332a 100644 --- a/squads/outreach-squad/manifest.json +++ b/squads/outreach-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "outreach-squad", - "version": "0.5.0", + "version": "0.5.1", "description": "Daily outbound engine: finds leads, runs sequences, handles replies, and files a digest on the board every day. Simple mode by default, upgrades to Advanced when signals stack.", "author": "pancake-official", "license": "MIT", diff --git a/squads/paid-ads-squad/agents/google-ads-agent/HEARTBEAT.md b/squads/paid-ads-squad/agents/google-ads-agent/HEARTBEAT.md index c0963f9..70df094 100644 --- a/squads/paid-ads-squad/agents/google-ads-agent/HEARTBEAT.md +++ b/squads/paid-ads-squad/agents/google-ads-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. A diff --git a/squads/paid-ads-squad/agents/google-ads-agent/agent.json b/squads/paid-ads-squad/agents/google-ads-agent/agent.json index 958487d..09cc3e9 100644 --- a/squads/paid-ads-squad/agents/google-ads-agent/agent.json +++ b/squads/paid-ads-squad/agents/google-ads-agent/agent.json @@ -2,7 +2,10 @@ "id": "google-ads-agent", "description": "Single-account Google Ads autopilot — runs a daily optimization sweep, files a daily digest to the board, owns every reversible account operation; surfaces budget-raise asks on the board.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/google-ads-agent/skills/optimization-sweep.md", "agents/google-ads-agent/skills/daily-digest.md", diff --git a/squads/paid-ads-squad/agents/meta-ads-agent/HEARTBEAT.md b/squads/paid-ads-squad/agents/meta-ads-agent/HEARTBEAT.md index 256d4c1..f6d5012 100644 --- a/squads/paid-ads-squad/agents/meta-ads-agent/HEARTBEAT.md +++ b/squads/paid-ads-squad/agents/meta-ads-agent/HEARTBEAT.md @@ -7,6 +7,13 @@ review — arrive as cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. A diff --git a/squads/paid-ads-squad/agents/meta-ads-agent/agent.json b/squads/paid-ads-squad/agents/meta-ads-agent/agent.json index 5000d5c..068d900 100644 --- a/squads/paid-ads-squad/agents/meta-ads-agent/agent.json +++ b/squads/paid-ads-squad/agents/meta-ads-agent/agent.json @@ -2,7 +2,10 @@ "id": "meta-ads-agent", "description": "Owns one Meta Ads account: daily 09:00 diagnostic + action sweep, daily 17:00 digest, Monday weekly review that adapts to monthly and quarterly cadences. Holds spend flat autonomously; surfaces budget increases on the board.", "model": "sonnet", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/meta-ads-agent/skills/methodology/pancake-meta-ads-01-account-foundations.md", "agents/meta-ads-agent/skills/methodology/pancake-meta-ads-02-campaign-architecture.md", diff --git a/squads/paid-ads-squad/manifest.json b/squads/paid-ads-squad/manifest.json index 73d3ecc..f9e0950 100644 --- a/squads/paid-ads-squad/manifest.json +++ b/squads/paid-ads-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "paid-ads-squad", - "version": "1.3.0", + "version": "1.3.1", "description": "Paid-advertising squad: google-ads-agent and meta-ads-agent each run one ad account end to end — daily optimization, diagnostics, digests, and reviews — filed to the board.", "author": "pancake-official", "license": "MIT", diff --git a/squads/product-squad/agents/feedback-agent/HEARTBEAT.md b/squads/product-squad/agents/feedback-agent/HEARTBEAT.md index 178e0c7..3cdd159 100644 --- a/squads/product-squad/agents/feedback-agent/HEARTBEAT.md +++ b/squads/product-squad/agents/feedback-agent/HEARTBEAT.md @@ -6,6 +6,13 @@ jobs — the daily feedback harvest — arrive as cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. diff --git a/squads/product-squad/agents/feedback-agent/agent.json b/squads/product-squad/agents/feedback-agent/agent.json index 990b379..9fc196b 100644 --- a/squads/product-squad/agents/feedback-agent/agent.json +++ b/squads/product-squad/agents/feedback-agent/agent.json @@ -1,7 +1,10 @@ { "id": "feedback-agent", "description": "Feedback harvester agent — collects user feedback daily from the configured sources, deduplicates it, files it into the Notion feedback DB with priority labels, and flags recurring themes.", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/feedback-agent/skills/product-harvest-feedback.md" ] diff --git a/squads/product-squad/agents/pm-agent/HEARTBEAT.md b/squads/product-squad/agents/pm-agent/HEARTBEAT.md index 39bd050..f5b62d5 100644 --- a/squads/product-squad/agents/pm-agent/HEARTBEAT.md +++ b/squads/product-squad/agents/pm-agent/HEARTBEAT.md @@ -6,6 +6,13 @@ jobs — the daily ideas triage — arrive as cofounder-briefed tickets from the scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. diff --git a/squads/product-squad/agents/pm-agent/agent.json b/squads/product-squad/agents/pm-agent/agent.json index 7734065..1cf11fd 100644 --- a/squads/product-squad/agents/pm-agent/agent.json +++ b/squads/product-squad/agents/pm-agent/agent.json @@ -1,7 +1,10 @@ { "id": "pm-agent", "description": "Product manager agent — owns the idea-to-PRD pipeline: triages Status=New entries in the Notion ideas DB, researches each idea, writes complete PRD sub-pages, and sets the build/reject verdict.", - "heartbeat": { "every": "24h" }, + "heartbeat": { + "every": "24h", + "model": "sonnet" + }, "skills": [ "agents/pm-agent/skills/product-triage-ideas.md", "agents/pm-agent/skills/product-write-prd.md" diff --git a/squads/product-squad/manifest.json b/squads/product-squad/manifest.json index e231ba1..cc491a6 100644 --- a/squads/product-squad/manifest.json +++ b/squads/product-squad/manifest.json @@ -1,6 +1,6 @@ { "name": "product-squad", - "version": "0.1.0", + "version": "0.1.1", "description": "Product management & discovery: triages Notion product ideas into researched PRDs (build/reject verdicts) and harvests daily user feedback from your configured sources into a Notion feedback DB.", "author": "pancake-official", "license": "MIT", @@ -14,8 +14,15 @@ "summary": "Sweep the Notion ideas DB for Status=New entries; research each (feasibility, market, competition), decide build vs reject, write a full PRD sub-page, and update the entry's status and notes.", "outcome": "Every Status=New idea is moved to Todo or Rejected with a complete PRD filed as a Notion sub-page and a verdict note on the entry; a per-run digest lands on the board.", "agent": "pm-agent", - "secrets": ["team.notion"], - "tools": ["notion", "vault", "web_search", "web_fetch"] + "secrets": [ + "team.notion" + ], + "tools": [ + "notion", + "vault", + "web_search", + "web_fetch" + ] }, { "id": "product.write_prd", @@ -35,16 +42,30 @@ }, "outcome": "A complete PRD (problem, solution, scope, user stories, technical approach, steps, open questions, success metrics, research sources) filed as a Notion sub-page, with a build/reject verdict summarized on the board.", "agent": "pm-agent", - "secrets": ["team.notion"], - "tools": ["notion", "vault", "web_search", "web_fetch"] + "secrets": [ + "team.notion" + ], + "tools": [ + "notion", + "vault", + "web_search", + "web_fetch" + ] }, { "id": "product.harvest_feedback", "summary": "Run the daily feedback harvest: read the configured sources from MEMORY, collect everything new since the last run, dedupe, file into the Notion feedback DB, and flag recurring themes.", "outcome": "All new feedback since the last checkpoint is deduplicated and filed in the Notion feedback DB with priority labels; recurring themes and any P0s are flagged in the run digest; the checkpoint is advanced.", "agent": "feedback-agent", - "secrets": ["team.notion"], - "tools": ["notion", "vault", "web_fetch", "agentmail"] + "secrets": [ + "team.notion" + ], + "tools": [ + "notion", + "vault", + "web_fetch", + "agentmail" + ] } ], "required_vault_secrets": [ diff --git a/template/agents/example-agent/HEARTBEAT.md b/template/agents/example-agent/HEARTBEAT.md index 04cc0d9..4eb534c 100644 --- a/template/agents/example-agent/HEARTBEAT.md +++ b/template/agents/example-agent/HEARTBEAT.md @@ -11,6 +11,13 @@ jobs arrive as cofounder-briefed tickets from scheduled crons. This pulse fires once a day and has exactly one job: **advance the company's goal on your own initiative.** +**Execution rule (hard).** Act through TOOL CALLS, never narration. If step 1 +finds an assigned ticket, CALL claim_next_task and execute it IN THIS TURN — +do not describe what you are about to do and stop. `NO_REPLY` may only ever +be your ENTIRE final message, and only when steps 1–3 genuinely found nothing +to do. Writing NO_REPLY after announcing work terminates the session with the +work undone (this exact failure stranded a live board ticket on 2026-06-12). + 1. **Hygiene first (fast).** `claim_next_task` — if a ticket assigned to you is sitting in `todo` (a missed wake), work it and stop here. Unfinished in-flight work also beats new initiative: finish before you start. diff --git a/template/agents/example-agent/agent.json b/template/agents/example-agent/agent.json index b173c6f..69f8e30 100644 --- a/template/agents/example-agent/agent.json +++ b/template/agents/example-agent/agent.json @@ -3,7 +3,8 @@ "description": "TODO: one-line description of this agent's single, focused role.", "model": "sonnet", "heartbeat": { - "every": "24h" + "every": "24h", + "model": "sonnet" }, "skills": [ "agents/example-agent/skills/example-agent-skill.md" From bfd29734e6d797c701c1568de3a92319c8c91409 Mon Sep 17 00:00:00 2001 From: Theophile Cousin Date: Sat, 13 Jun 2026 01:45:03 +0200 Subject: [PATCH 2/2] review: pin product agents' model, sync all trace versions to bumped manifests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copilot on #38: pm-agent/feedback-agent lacked the top-level model pin every other agent carries, and the version bumps left every replay trace's setup.installed_squads on the previous bundle version (Copilot flagged eng+product; the same staleness applied to all seven bundles — synced all 34 traces). Co-Authored-By: Claude Fable 5 --- .../evals/replay/seo.audit_citations/happy-path.trace.json | 2 +- .../evals/replay/seo.ship_technical_fix/happy-path.trace.json | 2 +- .../evals/replay/seo.weekly_report/happy-path.trace.json | 2 +- .../evals/replay/seo.write_article/happy-path.trace.json | 2 +- .../evals/replay/posthog.adhoc_report/happy-path.trace.json | 2 +- .../evals/replay/posthog.daily_digest/happy-path.trace.json | 2 +- .../regression-2026-06-11-hallucinated-id.trace.json | 2 +- .../regression-2026-06-11-missing-digest.trace.json | 2 +- .../evals/replay/posthog.debug_funnel/happy-path.trace.json | 2 +- .../evals/replay/posthog.weekly_recap/happy-path.trace.json | 2 +- .../evals/replay/reddit.account_health/happy-path.trace.json | 2 +- .../evals/replay/reddit.monitor_keywords/happy-path.trace.json | 2 +- .../evals/replay/reddit.post/happy-path.trace.json | 2 +- .../evals/replay/reddit.scan_and_draft/happy-path.trace.json | 2 +- .../evals/replay/eng.implement_idea/happy-path.trace.json | 2 +- .../evals/replay/eng.sweep_open_issues/happy-path.trace.json | 2 +- .../evals/replay/eng.triage_issue/happy-path.trace.json | 2 +- .../eng.triage_issue/regression-hallucinated-id.trace.json | 2 +- .../evals/replay/eng.weekly_report/happy-path.trace.json | 2 +- .../evals/replay/outreach.find_leads/happy-path.trace.json | 2 +- .../evals/replay/outreach.run_campaign/happy-path.trace.json | 2 +- .../evals/replay/outreach.triage_replies/happy-path.trace.json | 2 +- .../evals/replay/outreach.weekly_report/happy-path.trace.json | 2 +- .../evals/replay/google.daily_digest/happy-path.trace.json | 2 +- .../evals/replay/google.optimize_account/happy-path.trace.json | 2 +- .../evals/replay/google.root_cause/happy-path.trace.json | 2 +- .../evals/replay/google.scale_budget/happy-path.trace.json | 2 +- .../evals/replay/meta.daily_digest/happy-path.trace.json | 2 +- .../evals/replay/meta.daily_operations/happy-path.trace.json | 2 +- .../evals/replay/meta.investigate/happy-path.trace.json | 2 +- .../evals/replay/meta.weekly_review/happy-path.trace.json | 2 +- squads/product-squad/agents/feedback-agent/agent.json | 1 + squads/product-squad/agents/pm-agent/agent.json | 1 + .../evals/replay/product.harvest_feedback/happy-path.trace.json | 2 +- .../evals/replay/product.triage_ideas/happy-path.trace.json | 2 +- .../evals/replay/product.write_prd/happy-path.trace.json | 2 +- 36 files changed, 36 insertions(+), 34 deletions(-) diff --git a/squads/ai-seo-squad/evals/replay/seo.audit_citations/happy-path.trace.json b/squads/ai-seo-squad/evals/replay/seo.audit_citations/happy-path.trace.json index a2ae445..a826717 100644 --- a/squads/ai-seo-squad/evals/replay/seo.audit_citations/happy-path.trace.json +++ b/squads/ai-seo-squad/evals/replay/seo.audit_citations/happy-path.trace.json @@ -9,7 +9,7 @@ "team.target_domain": "getpancake.ai", "team.target_keywords": "ai agent platform, autonomous sub-agents, agent squads, proactive ai assistant, ai cofounder" }, - "installed_squads": ["ai-seo-squad@1.5.0"] + "installed_squads": ["ai-seo-squad@1.5.1"] }, "inputs": { "keywords": "ai agent platform, autonomous sub-agents, agent squads, proactive ai assistant, ai cofounder", diff --git a/squads/ai-seo-squad/evals/replay/seo.ship_technical_fix/happy-path.trace.json b/squads/ai-seo-squad/evals/replay/seo.ship_technical_fix/happy-path.trace.json index 01b4a11..5f7c9f4 100644 --- a/squads/ai-seo-squad/evals/replay/seo.ship_technical_fix/happy-path.trace.json +++ b/squads/ai-seo-squad/evals/replay/seo.ship_technical_fix/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches an llms.txt refresh. Per advanced-seo: geo-agent claims, reads the target domain from the vault, fetches the live llms.txt and the pages it should index via web_fetch, rewrites it (one-liner, core pages, facts), ships the change as a PR via github and self-merges (squash — never edit the live file directly), files the change to wiki/Knowledge/GEO, and completes with the merged-PR link + digest. The workflow declares only web_fetch + github — no web_search, no browser.", "setup": { "vault": { "team.target_domain": "getpancake.ai" }, - "installed_squads": ["ai-seo-squad@1.5.0"] + "installed_squads": ["ai-seo-squad@1.5.1"] }, "inputs": { "target": "llms.txt", diff --git a/squads/ai-seo-squad/evals/replay/seo.weekly_report/happy-path.trace.json b/squads/ai-seo-squad/evals/replay/seo.weekly_report/happy-path.trace.json index 85f272c..36ac9b8 100644 --- a/squads/ai-seo-squad/evals/replay/seo.weekly_report/happy-path.trace.json +++ b/squads/ai-seo-squad/evals/replay/seo.weekly_report/happy-path.trace.json @@ -8,7 +8,7 @@ "vault": { "team.target_keywords": "ai agent platform, autonomous sub-agents, agent squads, proactive ai assistant, ai cofounder" }, - "installed_squads": ["ai-seo-squad@1.5.0"] + "installed_squads": ["ai-seo-squad@1.5.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/ai-seo-squad/evals/replay/seo.write_article/happy-path.trace.json b/squads/ai-seo-squad/evals/replay/seo.write_article/happy-path.trace.json index 411366c..1f892df 100644 --- a/squads/ai-seo-squad/evals/replay/seo.write_article/happy-path.trace.json +++ b/squads/ai-seo-squad/evals/replay/seo.write_article/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches a single article to close a citation gap. Per blog-writing-guide: geo-agent claims, reads the target domain from the vault, researches the buyer question and competitor coverage via web_search/web_fetch, drafts the .mdx with answer-first lede + FAQPage JSON-LD, opens the PR via github, self-merges (squash — blog posts need no human review), and completes with the merged-PR link + digest.", "setup": { "vault": { "team.target_domain": "getpancake.ai" }, - "installed_squads": ["ai-seo-squad@1.5.0"] + "installed_squads": ["ai-seo-squad@1.5.1"] }, "inputs": { "topic": "Pancake vs. building your own agent stack: an honest comparison for early-stage founders", diff --git a/squads/analytics-squad/evals/replay/posthog.adhoc_report/happy-path.trace.json b/squads/analytics-squad/evals/replay/posthog.adhoc_report/happy-path.trace.json index 82aeb6b..e6d272c 100644 --- a/squads/analytics-squad/evals/replay/posthog.adhoc_report/happy-path.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.adhoc_report/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Ad-hoc metrics pull dispatched at the canonical qualified id with html format; analytics-agent reads the read-only API key, pulls the requested metrics over web_fetch, publishes the HTML report through preview-host (publish_preview), and completes with the signed preview URL + digest.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "metrics": "DAU last 7d, top 5 events, active users", diff --git a/squads/analytics-squad/evals/replay/posthog.daily_digest/happy-path.trace.json b/squads/analytics-squad/evals/replay/posthog.daily_digest/happy-path.trace.json index 5fe69ab..9f71be6 100644 --- a/squads/analytics-squad/evals/replay/posthog.daily_digest/happy-path.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.daily_digest/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Daily digest dispatched at the canonical qualified id; analytics-agent reads the API key from the vault, queries PostHog over web_fetch, files the digest, completes with the canonical result + digest.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "date": "2026-06-11" }, "dispatch": { diff --git a/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-hallucinated-id.trace.json b/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-hallucinated-id.trace.json index 73654f7..8d27c5a 100644 --- a/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-hallucinated-id.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-hallucinated-id.trace.json @@ -6,7 +6,7 @@ "description": "Regression for the live tenant audit on 2026-06-11. The cofounder stamped tasks with `analytics-squad.daily_digest` (squad name as the entire qualified id) when the canonical form is `analytics-squad.posthog.daily_digest`. The invented stamp polluted the SigNoz workflow group-bys AND — worse — suppressed the learned-workflow nudge in complete_task (which keys on workflow_id === null), so the working recipe was never registered after a successful run. We shipped the validator in tasks plugin (apps/pancake-claw/plugins/tasks/src/squads-registry.ts → checkWorkflowId); this trace keeps a record of the exact id shape that triggered it and goes red if the dispatch.workflow stamp check ever stops catching it.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "date": "2026-06-11" }, "dispatch": { diff --git a/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-missing-digest.trace.json b/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-missing-digest.trace.json index a945b74..bf8ba63 100644 --- a/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-missing-digest.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.daily_digest/regression-2026-06-11-missing-digest.trace.json @@ -6,7 +6,7 @@ "description": "Regression for the second root cause from the 2026-06-11 audit. The analytics-agent's HEARTBEAT.md mandates a digest written to memory/YYYY-MM-DD.md before closing the turn — but the contract was prompt-only and production pods showed 0 daily-log files across all agents, so each wake started blind and re-discovered known failures (5 tasks failed in 3 days on the same eu.posthog.com host bug; ~$0.71 wasted on the latest one). We folded the digest into the terminal-task tools so it's structural — fail_task / complete_task now accept a `digest` param the plugin appends to the daily log. This trace records a terminal WITHOUT a digest and goes red if the digest check is ever loosened.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "date": "2026-06-11" }, "dispatch": { diff --git a/squads/analytics-squad/evals/replay/posthog.debug_funnel/happy-path.trace.json b/squads/analytics-squad/evals/replay/posthog.debug_funnel/happy-path.trace.json index 4162900..f6a4f91 100644 --- a/squads/analytics-squad/evals/replay/posthog.debug_funnel/happy-path.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.debug_funnel/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Manual funnel investigation dispatched at the canonical qualified id; analytics-agent reads the read-only API key, derives the signup cohort + intermediate steps + funnel conversion over web_fetch (posthog-funnel-debugger §1-4), files the breakdown to wiki/Knowledge/PostHog/FunnelDebugger/, and completes naming the biggest drop-off step plus a one-sentence hypothesis.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "window_days": 28 }, "dispatch": { diff --git a/squads/analytics-squad/evals/replay/posthog.weekly_recap/happy-path.trace.json b/squads/analytics-squad/evals/replay/posthog.weekly_recap/happy-path.trace.json index 8f67c5b..0af8e7a 100644 --- a/squads/analytics-squad/evals/replay/posthog.weekly_recap/happy-path.trace.json +++ b/squads/analytics-squad/evals/replay/posthog.weekly_recap/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Monday weekly recap dispatched at the canonical qualified id; analytics-agent reads the read-only API key from the vault, pulls 4-week trends + activation cohort table + churn count over web_fetch, files the recap to wiki/Knowledge/PostHog/Reports/weekly/, and completes with the canonical result + digest ending in the one-paragraph hypothesis.", "setup": { "vault": { "team.posthog_api_key": "phx_test_key" }, - "installed_squads": ["analytics-squad@1.3.0"] + "installed_squads": ["analytics-squad@1.3.1"] }, "inputs": { "week": "2026-W24" }, "dispatch": { diff --git a/squads/community-squad/evals/replay/reddit.account_health/happy-path.trace.json b/squads/community-squad/evals/replay/reddit.account_health/happy-path.trace.json index 777fcf1..af7138f 100644 --- a/squads/community-squad/evals/replay/reddit.account_health/happy-path.trace.json +++ b/squads/community-squad/evals/replay/reddit.account_health/happy-path.trace.json @@ -8,7 +8,7 @@ "vault": { "team.reddit_account": "{\"username\": \"quiet_builder_42\", \"password\": \"***\"}" }, - "installed_squads": ["community-squad@1.4.0"] + "installed_squads": ["community-squad@1.4.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/community-squad/evals/replay/reddit.monitor_keywords/happy-path.trace.json b/squads/community-squad/evals/replay/reddit.monitor_keywords/happy-path.trace.json index 7149c06..8a7c2ce 100644 --- a/squads/community-squad/evals/replay/reddit.monitor_keywords/happy-path.trace.json +++ b/squads/community-squad/evals/replay/reddit.monitor_keywords/happy-path.trace.json @@ -8,7 +8,7 @@ "vault": { "team.target_keywords": "ai cofounder,agent squads,autonomous agents,openclaw,acme-competitor" }, - "installed_squads": ["community-squad@1.4.0"] + "installed_squads": ["community-squad@1.4.1"] }, "inputs": { "keywords": "ai cofounder,agent squads,autonomous agents,openclaw,acme-competitor" }, "dispatch": { diff --git a/squads/community-squad/evals/replay/reddit.post/happy-path.trace.json b/squads/community-squad/evals/replay/reddit.post/happy-path.trace.json index 50007eb..48f6428 100644 --- a/squads/community-squad/evals/replay/reddit.post/happy-path.trace.json +++ b/squads/community-squad/evals/replay/reddit.post/happy-path.trace.json @@ -8,7 +8,7 @@ "vault": { "team.reddit_account": "{\"username\": \"quiet_builder_42\", \"password\": \"***\"}" }, - "installed_squads": ["community-squad@1.4.0"] + "installed_squads": ["community-squad@1.4.1"] }, "inputs": { "draft_ids": "draft-2026-06-12-1,draft-2026-06-12-3" }, "dispatch": { diff --git a/squads/community-squad/evals/replay/reddit.scan_and_draft/happy-path.trace.json b/squads/community-squad/evals/replay/reddit.scan_and_draft/happy-path.trace.json index a69cac1..d8b4852 100644 --- a/squads/community-squad/evals/replay/reddit.scan_and_draft/happy-path.trace.json +++ b/squads/community-squad/evals/replay/reddit.scan_and_draft/happy-path.trace.json @@ -9,7 +9,7 @@ "team.reddit_account": "{\"username\": \"quiet_builder_42\", \"password\": \"***\"}", "team.reddit_target_subreddits": "Entrepreneur,startups,SaaS" }, - "installed_squads": ["community-squad@1.4.0"] + "installed_squads": ["community-squad@1.4.1"] }, "inputs": { "subreddits": "Entrepreneur,startups,SaaS" }, "dispatch": { diff --git a/squads/eng-squad/evals/replay/eng.implement_idea/happy-path.trace.json b/squads/eng-squad/evals/replay/eng.implement_idea/happy-path.trace.json index 82addfc..9fea9c5 100644 --- a/squads/eng-squad/evals/replay/eng.implement_idea/happy-path.trace.json +++ b/squads/eng-squad/evals/replay/eng.implement_idea/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches an implementation ticket with a concrete source (a specified GitHub issue); build-agent claims, reads team.github_repos from the vault, grounds in the issue + thread, creates a feature branch, implements with tests, verifies lint/build/CI, opens a PR referencing the source — and leaves it open for review because the change touches public API behaviour (not reversible enough to self-merge). Completes with the PR link in the result + digest.", "setup": { "vault": { "team.github_repos": "acme/api" }, - "installed_squads": ["eng-squad@2.4.0"] + "installed_squads": ["eng-squad@2.4.1"] }, "inputs": { "source": "https://github.com/acme/api/issues/162", diff --git a/squads/eng-squad/evals/replay/eng.sweep_open_issues/happy-path.trace.json b/squads/eng-squad/evals/replay/eng.sweep_open_issues/happy-path.trace.json index 95e528a..7dc1deb 100644 --- a/squads/eng-squad/evals/replay/eng.sweep_open_issues/happy-path.trace.json +++ b/squads/eng-squad/evals/replay/eng.sweep_open_issues/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Daily-sweep cron dispatches a repo sweep; triage-agent claims, reads team.github_repos from the vault, lists open issues missing a priority/P* label, classifies and labels three of them (P1, P2, P3) with assessment comments, files the sweep as a routine board record (no notify_channel), and completes with the canonical summary + digest.", "setup": { "vault": { "team.github_repos": "acme/api" }, - "installed_squads": ["eng-squad@2.4.0"] + "installed_squads": ["eng-squad@2.4.1"] }, "inputs": { "repo": "acme/api", "since": "2026-06-11" }, "dispatch": { diff --git a/squads/eng-squad/evals/replay/eng.triage_issue/happy-path.trace.json b/squads/eng-squad/evals/replay/eng.triage_issue/happy-path.trace.json index ae1b682..d818155 100644 --- a/squads/eng-squad/evals/replay/eng.triage_issue/happy-path.trace.json +++ b/squads/eng-squad/evals/replay/eng.triage_issue/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches a single-issue triage; triage-agent claims, fetches issue, labels it P2, files a comment, completes with the canonical result + digest.", "setup": { "vault": { "team.github_repos": "acme/api" }, - "installed_squads": ["eng-squad@2.4.0"] + "installed_squads": ["eng-squad@2.4.1"] }, "inputs": { "repo": "acme/api", "issue_number": 142 }, "dispatch": { diff --git a/squads/eng-squad/evals/replay/eng.triage_issue/regression-hallucinated-id.trace.json b/squads/eng-squad/evals/replay/eng.triage_issue/regression-hallucinated-id.trace.json index dd85201..d61448f 100644 --- a/squads/eng-squad/evals/replay/eng.triage_issue/regression-hallucinated-id.trace.json +++ b/squads/eng-squad/evals/replay/eng.triage_issue/regression-hallucinated-id.trace.json @@ -6,7 +6,7 @@ "description": "Regression: cofounder stamps an INVENTED qualified id (`eng-squad.triage_issue`, dropping the `eng.` namespace) — the same failure mode the 2026-06-11 posthog-squad audit found (posthog-squad.daily_digest instead of posthog-squad.posthog.daily_digest; squad since renamed analytics-squad). This trace MUST fail the runner; if it passes, the workflow-id contract check has regressed.", "setup": { "vault": { "team.github_repos": "acme/api" }, - "installed_squads": ["eng-squad@2.4.0"] + "installed_squads": ["eng-squad@2.4.1"] }, "inputs": { "repo": "acme/api", "issue_number": 142 }, "dispatch": { diff --git a/squads/eng-squad/evals/replay/eng.weekly_report/happy-path.trace.json b/squads/eng-squad/evals/replay/eng.weekly_report/happy-path.trace.json index 3670724..2b4fd85 100644 --- a/squads/eng-squad/evals/replay/eng.weekly_report/happy-path.trace.json +++ b/squads/eng-squad/evals/replay/eng.weekly_report/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Weekly-report cron dispatches the issue-health report; triage-agent claims, reads team.github_repos from the vault, gathers the week's stats from GitHub (open vs closed, criticality mix, stale >30d, unlabeled, oldest untriaged), writes the report to the wiki, files it as a digest board record (no notify_channel), and completes with the headline numbers + digest.", "setup": { "vault": { "team.github_repos": "acme/api" }, - "installed_squads": ["eng-squad@2.4.0"] + "installed_squads": ["eng-squad@2.4.1"] }, "inputs": { "repo": "acme/api" }, "dispatch": { diff --git a/squads/outreach-squad/evals/replay/outreach.find_leads/happy-path.trace.json b/squads/outreach-squad/evals/replay/outreach.find_leads/happy-path.trace.json index 4d54a94..87a5e5c 100644 --- a/squads/outreach-squad/evals/replay/outreach.find_leads/happy-path.trace.json +++ b/squads/outreach-squad/evals/replay/outreach.find_leads/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches a lead-sourcing run (count 2). Outreach-agent claims the ticket, runs the signal-first ladder (exa semantic LinkedIn search, GitHub-stars check via web_fetch, hiring check via web_search), verifies each profile in the LinkedIn browser identity, dedupes against the MEMORY.md pipeline ledger and appends the qualified rows there (file work — no tool event), and completes with result + digest. No sequence touches are sent — that is run_campaign's job. No vault reads: the squad declares no secrets.", "setup": { "vault": {}, - "installed_squads": ["outreach-squad@0.5.0"] + "installed_squads": ["outreach-squad@0.5.1"] }, "inputs": { "icp": "Head of Growth at B2B SaaS, 20-100 ppl, just raised a seed round", "count": 2 }, "dispatch": { diff --git a/squads/outreach-squad/evals/replay/outreach.run_campaign/happy-path.trace.json b/squads/outreach-squad/evals/replay/outreach.run_campaign/happy-path.trace.json index 67d91c0..b485309 100644 --- a/squads/outreach-squad/evals/replay/outreach.run_campaign/happy-path.trace.json +++ b/squads/outreach-squad/evals/replay/outreach.run_campaign/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches a signal-first campaign (devtools-CTO ICP, volume 3). Outreach-agent claims the ticket, sources hiring-signal leads via exa + web_search, enriches via web_fetch, sends Touch 1 connection requests over the LinkedIn browser identity, appends the rows to the MEMORY.md pipeline ledger (file work — no tool event), files the routine digest ticket on the board, and completes with result + digest. No vault reads: the squad declares no secrets.", "setup": { "vault": {}, - "installed_squads": ["outreach-squad@0.5.0"] + "installed_squads": ["outreach-squad@0.5.1"] }, "inputs": { "icp": "CTO/VP Eng at seed-to-A devtools companies (5-50 ppl), hiring for platform roles", "volume": 3 }, "dispatch": { diff --git a/squads/outreach-squad/evals/replay/outreach.triage_replies/happy-path.trace.json b/squads/outreach-squad/evals/replay/outreach.triage_replies/happy-path.trace.json index d264ea1..2867ab5 100644 --- a/squads/outreach-squad/evals/replay/outreach.triage_replies/happy-path.trace.json +++ b/squads/outreach-squad/evals/replay/outreach.triage_replies/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Cofounder dispatches an ad-hoc reply sweep (the same Section-2-only pass the every-2h reply-sweep cron runs). Outreach-agent claims the ticket, sweeps LinkedIn DMs via the browser identity, answers two new replies with the qualify-first framework (Q1 to one, calendar link to a Q2-confirmed lead), updates the rows in the MEMORY.md pipeline ledger (file work — no tool event), and completes with result + digest. The workflow declares zero inputs and only the `browser` tool; no vault reads — the squad declares no secrets.", "setup": { "vault": {}, - "installed_squads": ["outreach-squad@0.5.0"] + "installed_squads": ["outreach-squad@0.5.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/outreach-squad/evals/replay/outreach.weekly_report/happy-path.trace.json b/squads/outreach-squad/evals/replay/outreach.weekly_report/happy-path.trace.json index d8502a8..a726214 100644 --- a/squads/outreach-squad/evals/replay/outreach.weekly_report/happy-path.trace.json +++ b/squads/outreach-squad/evals/replay/outreach.weekly_report/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Sunday weekly report, dispatched as a ticket. Outreach-agent claims it, computes 7-day pipeline performance from the Closed leads table and the memory/YYYY-MM-DD.md logs (all file work — no tool events), files the metrics + one Weekly Learning to MEMORY.md, and completes with result + digest. The workflow declares zero inputs and `tools: []`, so the trace must contain ONLY board tools — any external tool call here is a contract violation. No vault reads: the squad declares no secrets.", "setup": { "vault": {}, - "installed_squads": ["outreach-squad@0.5.0"] + "installed_squads": ["outreach-squad@0.5.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/google.daily_digest/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/google.daily_digest/happy-path.trace.json index af5156a..a4af55c 100644 --- a/squads/paid-ads-squad/evals/replay/google.daily_digest/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/google.daily_digest/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "18:00 PT digest cron dispatches the daily digest; google-ads-agent claims, compiles the 3-section digest from today's memory/daily log (no API calls, no vault reads — the workflow declares secrets: [] and tools: [cron]), hands the digest to the co-founder via create_task, and completes with result + digest.", "setup": { "vault": {}, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/google.optimize_account/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/google.optimize_account/happy-path.trace.json index 82b2fed..5202be1 100644 --- a/squads/paid-ads-squad/evals/replay/google.optimize_account/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/google.optimize_account/happy-path.trace.json @@ -10,7 +10,7 @@ "google_ads.oauth_refresh_token": "refresh-token-redacted", "google_ads.customer_id": "1234567890" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": { "scope": "Search campaigns" }, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/google.root_cause/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/google.root_cause/happy-path.trace.json index dcf2ae2..fd97f2a 100644 --- a/squads/paid-ads-squad/evals/replay/google.root_cause/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/google.root_cause/happy-path.trace.json @@ -10,7 +10,7 @@ "google_ads.oauth_refresh_token": "refresh-token-redacted", "google_ads.customer_id": "1234567890" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": { "metric": "CPA", "scope": "Brand Search" }, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/google.scale_budget/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/google.scale_budget/happy-path.trace.json index cfdbd8a..91761f2 100644 --- a/squads/paid-ads-squad/evals/replay/google.scale_budget/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/google.scale_budget/happy-path.trace.json @@ -10,7 +10,7 @@ "google_ads.oauth_refresh_token": "refresh-token-redacted", "google_ads.customer_id": "1234567890" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": { "campaign": "Brand Search", "change": "Raise daily budget from $120 to $160 (approved BUD-114)" }, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/meta.daily_digest/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/meta.daily_digest/happy-path.trace.json index 3215d5d..eece99d 100644 --- a/squads/paid-ads-squad/evals/replay/meta.daily_digest/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/meta.daily_digest/happy-path.trace.json @@ -11,7 +11,7 @@ "team.primary_kpi": "cpa", "team.kpi_target": "45.00" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/meta.daily_operations/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/meta.daily_operations/happy-path.trace.json index 7e44740..0e32c38 100644 --- a/squads/paid-ads-squad/evals/replay/meta.daily_operations/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/meta.daily_operations/happy-path.trace.json @@ -10,7 +10,7 @@ "team.meta_ad_account_id": "act_998877", "team.flag_thresholds": "{}" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/meta.investigate/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/meta.investigate/happy-path.trace.json index c195688..bfd4e35 100644 --- a/squads/paid-ads-squad/evals/replay/meta.investigate/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/meta.investigate/happy-path.trace.json @@ -10,7 +10,7 @@ "team.meta_ad_account_id": "act_998877", "team.flag_thresholds": "{}" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": { "entity": "Retargeting — Warm 30d (ad set 1209...884)", "question": "Why did CPA double on Friday?" }, "dispatch": { diff --git a/squads/paid-ads-squad/evals/replay/meta.weekly_review/happy-path.trace.json b/squads/paid-ads-squad/evals/replay/meta.weekly_review/happy-path.trace.json index 663ecb3..ce01a4f 100644 --- a/squads/paid-ads-squad/evals/replay/meta.weekly_review/happy-path.trace.json +++ b/squads/paid-ads-squad/evals/replay/meta.weekly_review/happy-path.trace.json @@ -11,7 +11,7 @@ "team.account_maturity_level": "developing", "team.kpi_target": "45.00" }, - "installed_squads": ["paid-ads-squad@1.3.0"] + "installed_squads": ["paid-ads-squad@1.3.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/product-squad/agents/feedback-agent/agent.json b/squads/product-squad/agents/feedback-agent/agent.json index 9fc196b..e9cebf0 100644 --- a/squads/product-squad/agents/feedback-agent/agent.json +++ b/squads/product-squad/agents/feedback-agent/agent.json @@ -1,6 +1,7 @@ { "id": "feedback-agent", "description": "Feedback harvester agent — collects user feedback daily from the configured sources, deduplicates it, files it into the Notion feedback DB with priority labels, and flags recurring themes.", + "model": "sonnet", "heartbeat": { "every": "24h", "model": "sonnet" diff --git a/squads/product-squad/agents/pm-agent/agent.json b/squads/product-squad/agents/pm-agent/agent.json index 1cf11fd..d62b0b9 100644 --- a/squads/product-squad/agents/pm-agent/agent.json +++ b/squads/product-squad/agents/pm-agent/agent.json @@ -1,6 +1,7 @@ { "id": "pm-agent", "description": "Product manager agent — owns the idea-to-PRD pipeline: triages Status=New entries in the Notion ideas DB, researches each idea, writes complete PRD sub-pages, and sets the build/reject verdict.", + "model": "sonnet", "heartbeat": { "every": "24h", "model": "sonnet" diff --git a/squads/product-squad/evals/replay/product.harvest_feedback/happy-path.trace.json b/squads/product-squad/evals/replay/product.harvest_feedback/happy-path.trace.json index 2522391..c71e360 100644 --- a/squads/product-squad/evals/replay/product.harvest_feedback/happy-path.trace.json +++ b/squads/product-squad/evals/replay/product.harvest_feedback/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Daily feedback harvest dispatched at the canonical qualified id; feedback-agent reads the Notion token from the vault, collects the window from its configured sources (forwarded-email inbox via agentmail, meeting-notes API via web_fetch), dedupes against the feedback DB, files the new items, advances the checkpoint, and completes with result + digest.", "setup": { "vault": { "team.notion": "ntn_test_token" }, - "installed_squads": ["product-squad@0.1.0"] + "installed_squads": ["product-squad@0.1.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/product-squad/evals/replay/product.triage_ideas/happy-path.trace.json b/squads/product-squad/evals/replay/product.triage_ideas/happy-path.trace.json index 128e86c..0142308 100644 --- a/squads/product-squad/evals/replay/product.triage_ideas/happy-path.trace.json +++ b/squads/product-squad/evals/replay/product.triage_ideas/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Daily ideas triage dispatched at the canonical qualified id; pm-agent reads the Notion token from the vault, sweeps the ideas DB for Status=New entries, researches the one new idea over web_search/web_fetch, files the PRD as a Notion sub-page, sets the Todo verdict, and completes with result + digest.", "setup": { "vault": { "team.notion": "ntn_test_token" }, - "installed_squads": ["product-squad@0.1.0"] + "installed_squads": ["product-squad@0.1.1"] }, "inputs": {}, "dispatch": { diff --git a/squads/product-squad/evals/replay/product.write_prd/happy-path.trace.json b/squads/product-squad/evals/replay/product.write_prd/happy-path.trace.json index 789ed79..0407ac2 100644 --- a/squads/product-squad/evals/replay/product.write_prd/happy-path.trace.json +++ b/squads/product-squad/evals/replay/product.write_prd/happy-path.trace.json @@ -6,7 +6,7 @@ "description": "Ad-hoc PRD dispatched at the canonical qualified id with idea + context inputs; pm-agent finds no matching ideas-DB entry, creates one, researches over web_search/web_fetch, files the PRD sub-page, sets the verdict, and completes with result + digest.", "setup": { "vault": { "team.notion": "ntn_test_token" }, - "installed_squads": ["product-squad@0.1.0"] + "installed_squads": ["product-squad@0.1.1"] }, "inputs": { "idea": "Let users export any board view to CSV",