Reference for the dotbot triage workflow infrastructure. Initial setup was completed on 2026-04-10.
Single-select Status with these stages (in order):
- Inbox - new issue or PR, not yet looked at
- Triage - being reviewed by the steering group
- Spec/Design - needs a PRD or design before it is buildable
- Ready - triaged and ready for a contributor to pick up
- In Progress - actively being worked on
- In Review - PR open and under review
- Done - merged and shipped
- PRD link (text) - URL to the product requirements document
- Design link (text) - URL to Figma/design artifact
- Size (single-select) - XS, S, M, L, XL
- Auto-add to project - any new issue or PR in
andresharpe/dotbot(filter:is:issue,pr is:open) - Item added to project -> Status = Inbox
- Item closed -> Status = Done
- Pull request merged -> Status = Done
- Pull request linked to issue -> Status = In Review
- Triage queue - filter: label = needs-triage
- Up for grabs - filter: Status = Ready, sort by Size
- In flight - filter: Status in (In Progress, In Review)
- Require a pull request before merging
- Require 1 approval, dismiss stale reviews
- Require status check:
PR link check / check
- Automatically delete head branches: enabled
Four webhooks are provisioned on the dotbot Discord server and stored as GitHub Actions secrets:
| GitHub secret | Discord channel | Webhook name | Fires on |
|---|---|---|---|
DISCORD_DEVOPS_WEBHOOK |
#devops | GitHub - New Issues | New issue opened |
DISCORD_ADVISORY_WEBHOOK |
#advisory-steering | GitHub - Triage & Stale | Triage nudge (weekday cron), weekly stale digest |
DISCORD_CONTRIBUTORS_WEBHOOK |
#contributors | GitHub - Ready for Pickup | Issue labelled ready |
DISCORD_PR_WEBHOOK |
#pull-requests | GitHub - PR Activity | PR opened, ready for review, merged, closed |
If a webhook URL is rotated or lost, re-run the provisioning script (local tooling, gitignored):
cd ideas/team/discord-setup
npm install
npm run webhooksRequires DISCORD_BOT_TOKEN env var (KeePassXC: APIs/discord/dotbot-bot). The script is idempotent - it reuses existing webhooks by name. Copy the printed URLs into the matching GitHub Actions secrets.
| Workflow | Trigger | What it does |
|---|---|---|
notify-new-issue.json |
issues.opened |
Posts embed to #devops |
triage-nudge.json |
Weekday cron 07:00 UTC + manual | Queries needs-triage issues idle 2+ days, posts to #advisory-steering |
notify-ready.json |
issues.labeled (ready) |
Posts to #ap-contributors with size/tags |
notify-pr.json |
pull_request (opened, ready, closed) |
Posts to #pull-requests |
pr-link-check.json |
pull_request_target (opened, edited, sync) |
Fails if no Closes/Fixes/Resolves #N; override with no-issue label |
stale.json |
Monday cron 07:00 UTC + manual | Marks stale issues, posts weekly digest to #advisory-steering |
sync-labels.json |
Push to main (labels.json changed) + manual | Syncs .github/labels.json to repo labels |
Managed in .github/labels.json and synced via the sync-labels workflow. Categories:
- Status (blue) - needs-triage, ready, in-progress, blocked, help-wanted, good-first-issue
- Type (purple) - type:feature, type:bug, type:question, type:chore, type:docs
- Size (grey) - size:xs, size:s, size:m, size:l, size:xl
- Resolution (red/brown) - wontfix, duplicate, needs-info, stale, stale-triage
- Workflow (yellow) - no-issue, pinned