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).
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 AugSections: 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
| Flag | Env | Default |
|---|---|---|
--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-run | render the payload, post nothing | |
--include-hints / --link | off | |
--hot-min-devs / --hot-min-edits / --hot-window | 2 / 4 / 48h | |
--pair-min-files / --stall-days | 2 / 3 | |
--server / --room / --repo | AGENTMASH_URL / AGENTMASH_ROOM | this 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:
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>&1It relies on the non-zero exit: a failed digest shows up as a failed job.