# How we run our standup as a Slack post

Each weekday an agent reads what everyone did in Linear and GitHub, nudges anyone whose day left no trace, and posts a short team standup to Slack. It never writes to either tool.

Canonical page: https://themachine.myapps.ai/use-cases/standup-summary

All a standup really needs to tell you is who did what yesterday and who's
doing what today. Getting there is the annoying part. Either you book a meeting
for it, or you open a thread and watch half the team reply while the rest
forget. Meanwhile the answer is already sitting in Linear and GitHub. It just
needs collecting, tidying into a readable post, and a polite nudge for whoever
stayed silent.

Machine does that collecting for us. Every weekday an agent looks at each
person's work in Linear and GitHub, pings anyone whose day left no trace, and
drops a short standup into Slack. It's the standup our own team reads each
morning, and nothing about it is specific to us: any team can copy it.

- **Team:** Machine
- **Runs on:** A morning schedule, one post each weekday
- **Connected systems:** Linear · GitHub · Slack
- **Mode:** Reads the tools, changes nothing in them

## The problem

Ask a room of engineers to repeat out loud what their tickets and pull requests
already say, and you've invented the standup meeting. Swap it for an async
thread and the meeting goes away, but the chore moves onto each person. You
have to remember to post, boil your day down, and actually hit send. Whoever
skips it leaves a hole.

The usual fixes only get you partway. A bot that asks "what did you do
yesterday?" every morning still needs a human to answer it. A dashboard of
activity has the raw data, yet it won't summarize anything or point out who has
gone quiet. And neither one looks at the places where the work actually
happened, so the update is never better than the effort people put into typing
it.

## What we built

Each weekday morning, a schedule on Machine wakes an agent. It reads the
Linear issues and GitHub activity for every person on the team, writes a few
lines about each of them, spots anyone with an empty record, and posts the
whole thing to a Slack channel. People with a quiet day get a friendly nudge to
fill in what the tools can't show. The agent looks but doesn't touch: Linear
and GitHub stay exactly as it found them.

## How it works

### Start it on a weekday schedule

A **cron trigger** handles the timing. On every weekday morning it opens a new
**session**, which is a fresh cloud computer (a sandbox) used for that single
run and then thrown away. Yesterday's run leaves nothing behind. Nobody has to
kick it off, and there's no bot hanging around all day listening for messages.

### Teach it the team and the house style

The agent carries its own playbook as **skills** and **memory**. That covers
who is on the team, the Linear and GitHub handle that belongs to each person,
which repos and Linear projects count, and what a good standup line looks like
for us. If we want a different format, we edit that file, and tomorrow's post
follows it.

### Hook up Linear and GitHub for reading only

**Connectors** are scoped connections to your tools. The keys stay on our
servers, so the model never sees a raw token. Through them the agent looks at:

- **Linear**: the issues each person touched or closed recently, plus whatever
they have in flight.
- **GitHub**: commits, pull requests opened or merged, and reviews left since
the previous standup.

Both connections can read and nothing more. The agent sees the work, but it has
no way to edit an issue or push to a branch.

### Put the limits in place

We built it so the agent only reads Linear and GitHub. The one thing it writes
anywhere is the Slack message. Tickets stay where they are, PRs get no comments
from it, and nobody's work is altered. Its credentials are stored encrypted in
the **Secrets Manager** and only handed to the agents you grant them to, at the
moment a run starts.

### Post the standup and nudge the quiet ones

Once that's set up, the morning post takes care of itself. Each person gets a
few lines pulled from Linear and GitHub, arranged so the whole team can skim it
in one pass. If someone has no activity on record, the post says so and gently
asks them to add the rest of their day, such as meetings, planning or anything
that happened outside the tools. A slow day then comes with an explanation
instead of an empty slot.

> **The pattern**
> Every morning a **cron trigger** opens a fresh session that can only read
> Linear and GitHub through its **connectors**. The team list and the post
> format are kept as **skills** and **memory**. The agent writes the summary,
> nudges whoever is missing, and posts it to Slack, which is the only thing it
> ever writes.

## Guardrails

This agent sees what everyone worked on in two tools and then posts to a
channel the whole team reads. So we keep its reach small:

- **Isolation.** Each run gets a sandbox of its own. Inside it the agent reads
  the day's activity and writes the summary, and the Slack message is the only
  thing that leaves.
- **Scoped secrets.** The keys for Linear, GitHub and Slack are stored
  encrypted in the Secrets Manager and only handed to the agents you grant them
  to, when the run begins.
- **Read-only across the tools.** The Linear and GitHub connections can't
  write. Apart from the standup post, the agent leaves no mark in any system.
- **Everything is code.** The team list, the format and the permissions for
  each tool are files in the repo. They're versioned, and any change goes
  through a reviewed **change request**, not a toggle on a settings page.

## The outcome

- **No meeting:** Status arrives as a Slack post, not a calendar invite
- **Read-only:** Linear and GitHub are never changed; Slack gets one post
- **3 systems:** One daily agent across Linear, GitHub and Slack

These days the standup shows up in Slack before anyone asks for it, built from
work that was already logged, and anyone who went quiet gets flagged rather
than forgotten. No one sits through a meeting to repeat their tickets, and no
one writes up a day the tools already captured.
