Weekly Competitive Landscape Digest
Every Monday 8am Australia/Sydney: sweeps last week's (Mon-Sun) news for the core battlecard competitors plus a secondary watchlist that only qualifies on funding/acquisition/shutdown, de-dupes against a persisted seen-state store, has the Competitive Signal Analyst agent (agent-c9573861, Sonnet 4.6) score each item high/medium/noted and write a one-line 'why it matters' for a rep on a call, then posts ONE grouped message to Slack via prospect-bot-slack-api + PROSPECT_BOT_TOKEN (Brainfish Ballet App, B0BFNK3CUL9). All counts, filtering, grouping, dates and formatting are computed in code; the agent only makes the judgement call. Posts a 'quiet week' line rather than nothing when nothing clears medium, and flags battlecards the week's news contradicts. Pass weekStart=YYYY-MM-DD (a Monday) to pin a past completed week for validation; leave empty for the rolling previous week. Built from Max's competitive-intel point 3 (#growth-gtme, 21 Aug 2026).
ROSTER: build-roster reads the roster live from the Notion Battlecard Hub (database 2cb3dd0b-319d-8016-8402-c2cc7a75ec87) so Max's edits drive the sweep. Group Brainfish/Ballet + Priority Core = core arena; Group Secondary Competitors = watchlist. Falls back to a static 18-name list if NOTION_API_KEY is missing or the read returns fewer than 8 core rows, and logs which source it used. The old hardcoded 16-name list was already stale: Moveworks and UiPath were added to Notion on 24 Aug 2026 and were never swept.
SLACK: post-to-slack posts with the NATIVE Ballet Slack app (bot "ballet2", B0BUTA8LU85, installed 8 Sep 2026) by calling chat.postMessage directly with the vault secret slack:T04R8TR9L2V:bot_token, which Ballet refreshes. Do NOT go back to the custom prospect-bot-slack-api / PROSPECT_BOT_TOKEN tool (Brainfish Ballet App B0BFNK3CUL9), nor to slack-post-message / SLACK_BOT_TOKEN (brainfish_ticket, not a channel member). The 8 Sep 2026 run failed at this step after the full digest was built: metaphor.tool returned null on a transient hiccup and the step threw "slack post failed: null" with no retry, and the response check assumed a {ok, data:{ok, ts}} envelope while that proxy returns Slack's response flat, so ts was always null and the Slack-level ok was never inspected. The step now retries 429/5xx/empty/non-JSON three times with exponential backoff, checks Slack's own ok, and self-joins on not_in_channel. Default channel is C06EX7Y15F0 (#growth, private) as of 8 Sep 2026, with @ballet2 invited by NJ; pass slackChannel=C0BTKCZNEM9 to post to #gtme-digest for testing. Self-join covers PUBLIC channels only, so any new private target needs @ballet2 invited by a human first.
API NOTE: PUT /api/playbooks/<id> REPLACES the whole working copy - it is not a merge. A PUT carrying only { description } wipes name, steps, inputSchema and collectionId (done accidentally 8 Sep 2026, restored from published version 2). Always send the full config, or use the MCP update_playbook tool.
Shared by daniel · Brainfish.
Remixed 0 times on Ballet.
How it works
- Read the competitor roster from the Notion Battlecard Hub (static fallback) and compute last week's Mon-Sun window in Australia/Sydney — Working out which competitors to sweep and which week to cover...
- Run web searches per competitor plus two industry queries, normalise hits and drop anything outside the week — Sweeping the week's news across every competitor...
- Drop anything already covered in a previous digest, using the competitor_news_seen Data Table — Filtering out stories we've already covered...
- Competitive Signal Analyst scores each fresh item and writes the one-line 'why it matters' — Judging what actually matters this week...
- Group by arena, cap the message, and compute every number in code — Writing the digest...
- Post the single digest message to the target channel via the native Ballet Slack app (bot ballet2) — Posting the digest to Slack...
- Write every covered story into the competitor_news_seen Data Table, but only after the post succeeded — Remembering what we covered so next week doesn't repeat it...
- Render an HTML report of the week's digest: scored items by arena, funnel counts, stale battlecards, Slack post status — Building a visual report of this week's competitive digest...
Sample output
Created by AI. Fictional demo data — not a customer run.
Remix this playbook