skip to content
agentmash get started
docsthe weekly digest

what you see

the weekly digest

The live board tells you what is happening right now. The digest tells you what happened, and — more usefully — where the team kept landing on top of itself.

It is not available to customers yet: it is not on npm, and it runs from a checkout of AgentMash, which is private. From a checkout, --repo names the repository whose room it reads (or --server and --room).

bash
node digest/agentmash-digest.mjs --repo ../acme-api                 # last 7 days, to your terminal
node digest/agentmash-digest.mjs --repo ../acme-api --since 24h --to slack --webhook "$SLACK_WEBHOOK"
node digest/agentmash-digest.mjs --repo ../acme-api --to telegram --webhook "$BOT_TOKEN" --chat-id -1001234567
node digest/agentmash-digest.mjs --repo ../acme-api --to json | jq '.hot_zones'

It reads the room over HTTP and posts to a webhook. Nothing about it runs inside the coordination server, which stays a coordination server: no scheduler, no outbound credentials in the database, no background job that can wedge the process every hook depends on. From a checkout it needs no scheduler: typing the command gets the whole thing, and a scheduler puts it in a channel. When it fails, it fails in the cron log, not in everyone's editor.

What it says

HOT ZONES
  2+ people, 4+ edits, two of them 48h apart or less
  server/src/billing/invoice.ts  alice, bob, carol · 41 edits · still hot from last period
  dashboard/src/panels/          carol, dan · 5 edits across 4 files · new this period
  server/src/routes/webhooks.ts  alice, bob · 4 edits · new this period

  Who keeps meeting whom
  alice + bob — 2 shared files, last Sun 30 Aug

Sections: who worked on what · where work concentrated · hot zones and the pairs of people who keep colliding · what stalled · how it compares with the period before. A quiet week gets two lines instead of five empty headings, and a room with two events says exactly that.

What makes a hot zone

A file is hot when, inside the period, it drew 2+ distinct developers, took 4+ edits, and two of those edits, by different people, were 48 hours apart or less. That last clause is the one that matters: two people in a file a week apart is a handoff, and reporting it as a collision trains people to ignore the digest. Two people in it inside two days is the team stepping on itself.

A directory is hot when it clears the same bars but no single file inside it does — several people, several files, one boundary. That is the architecture statement: nobody is fighting over a line of code and the module is still drawing a crowd.

Every threshold moves: --hot-min-devs, --hot-min-edits, --hot-window, --pair-min-files, --stall-days. A pair of people is only reported once they have met in --pair-min-files distinct files (default 2), because a single shared file is already on the line above it.

Prompt text is withheld by default

task_hint is a teammate's verbatim prompt. The dashboard shows it to whoever holds the room id — which is the repo, and therefore the team. A Slack or Telegram channel is a wider audience: guests, other teams, indefinite history, search. Prompts are also the single most likely place for a pasted secret, a customer name, or a half-formed thought nobody meant to publish.

So no digest — text, JSON, Slack or Telegram — contains prompt text unless you pass --include-hints. Without it the digest still says what each person worked on, from paths and branches, which are derived rather than verbatim.

The dashboard link is withheld from posted messages for the same class of reason: the room id is the room's credential, so pasting the link into a channel grants everyone in it read and write access to the room. --link adds it when that is what you want.

Options

FlagEnvDefault
--since <7d|24h|90m>7d
--to <text|json|slack|telegram>text
--webhook <url>AGENTMASH_DIGEST_WEBHOOK—
--chat-id <id> (Telegram)AGENTMASH_DIGEST_CHAT_ID—
--dry-runrender the payload, post nothing
--include-hints / --linkoff
--hot-min-devs / --hot-min-edits / --hot-window2 / 4 / 48h
--pair-min-files / --stall-days2 / 3
--server / --room / --repoAGENTMASH_URL / AGENTMASH_ROOMthis repo's config.json
--timeout <ms>10000

Keep the webhook in the environment, not in config.json — that file is committed. Slack takes an incoming webhook URL; Telegram takes the bot token (or the full sendMessage URL) plus a chat id.

Exit codes: 0 posted or printed · 1 network, server or webhook failure · 2 bad usage. Every request is capped by --timeout, so a dead server or a hung webhook ends in seconds with a message naming the URL and the cause, never in a job that hangs until the runner kills it.

Scheduling it

Monday 09:00 UTC, from a machine that has both the repo and AgentMash checked out:

cron
0 9 * * 1 cd /srv/agentmash && node digest/agentmash-digest.mjs --repo /srv/acme-api --to slack --webhook "$SLACK_WEBHOOK" >> /var/log/agentmash-digest.log 2>&1

It relies on the non-zero exit: a failed digest shows up as a failed job.

from README.md, “Weekly digest”