aipm: a suggest-only AI work bot that never acts on its own
Problem
Work bots fail in two directions. Autonomous ones act on incomplete context and erode trust the first time they nudge the wrong person or post something wrong, so teams mute them. Passive dashboards put the burden back on a human to go looking. The real problem is signal: the chores that keep work moving are individually small, easy to drop, and drowned out by the firehose of platform notifications. A useful bot has to find the few high-value nudges and stop there.
What we did
aipm is built on four principles. Suggest-only: the bot owns and edits only its own artifacts (its working-notes comment, its DMs); anything touching human-authored content is a proposal approved with a reaction. Low-noise: one nudge per (person, thread, signal) per quiet period, then it falls back to a digest, and mute or snooze always wins. Deterministic where it matters: detecting that an action is owed is plain logic over the thread timeline; the LLM is used only for judgment and wording, like whether a reply actually answered the question and how the nudge should read. Shadow mode first: it computes everything and posts nothing, logging what it would do, so you review the log and enable posting one capability at a time. GitHub and Slack are adapters behind a common interface, and the LLM provider is an adapter too, so the engine stays platform-neutral.
Result
The system is Cloudflare-native: Workers handle the webhook and Slack ingress, Cron Triggers run the staleness sweeps, Queues bound and retry the LLM work, Durable Objects serialize per-thread updates so it never double-nudges, D1 holds relational state, and KV deduplicates delivery ids. Workers AI sits behind AI Gateway for caching and a swappable provider, and it deploys with Wrangler. The codebase is a typed TypeScript monorepo split into a platform-neutral core and db plus separate GitHub, Slack, and LLM adapters. The result is an AI feature that is safe to leave running because the determinism is in the platform, not the prompt.
Key highlights
- Suggest-only by design: the bot drafts, a human approves with one reaction; it never edits human-authored content
- Deterministic detection, bounded LLM: thread-timeline logic decides what is owed, the model only judges and words it
- Durable Objects serialize per-thread updates so two events can never produce a double-nudge
- Low-noise budget: one nudge per (person, thread, signal), digest fallback, mute and snooze always win
- Adapter architecture: GitHub, Slack, and the LLM provider are swappable; adding a platform never touches the engine
Tech stack