DEV Community

Oscar Caldera
Oscar Caldera

Posted on

Your team approved it in Slack. The code shipped something else.

It doesn't happen dramatically. It happens quietly.

Two weeks before the PR, someone in #product-decisions writes:
"Only admins can export user data. Confirmed." Three people react
with a thumbs up. The tech lead says "got it."

Then the sprint moves fast. The developer who wrote that export
service wasn't in that Slack thread. Or they were, and forgot.
Or they remembered but misread the scope. The PR looks fine.
The reviewer checks logic and style. Nobody checks it against
what was actually decided.

It merges. It ships. A customer exports data they shouldn't see.

Decisions on Slack are stored by Mo

The real problem isn't the code

Code reviewers are good at catching bad code. They're not designed
to remember every product decision made in Slack six sprints ago.

That's not a process failure. It's a memory problem. Decisions
live in Slack. Code lives in GitHub. Nothing connects them.

So the drift happens silently:

  • Decision: "Users can't delete their own account — legal requires 30-day hold"
  • PR: removes the deletion delay "to simplify the flow"

  • Decision: "Feature X is behind a flag until Q3"

  • PR: removes the flag check

  • Decision: "Payments go through Stripe only — no fallback"

  • PR: adds a PayPal fallback "just in case"

Every one of those was approved somewhere. None of them made it
to the diff review.


What we built

We ran into this enough at our agency that we built Mo — a bot
that sits between Slack and GitHub.

When someone tags @mo in a channel to approve a decision, Mo
stores it. When a PR opens, Mo checks the diff against every
stored decision and flags conflicts before the merge.

It doesn't review code quality. It doesn't care about naming
conventions or test coverage. It only asks one question: does
this PR contradict something the team explicitly approved?

If it does, it blocks the merge and shows exactly which decision
is being violated and where in the diff. → hey-mo.io


Why this is hard to catch otherwise

You could try to solve this with documentation. Write every
decision into Confluence or Notion. The problem is that nobody
does it consistently under deadline pressure, and even when they
do, nobody checks it during PR review.

You could try to solve it with better PR templates. "Did you
check the decision log?" Same problem — it becomes a checkbox
nobody reads.

The only fix that works is making the check automatic and
putting it exactly where developers already are: in the PR
itself, before merge.

Mo checking the PR on GitHub

If this has burned your team, I'd be curious how you handled
it — and if you want to try Mo, it's at hey-mo.io.
7-day free trial.

Top comments (0)