21STARK
All posts
7 min read views

Let the bot be the bad cop

The worst part of managing engineers is the nagging. So I built night-watch, a Go service that chases missing ticket IDs and tickets with no epic, by private Slack DM only. Nobody resents a robot for being consistent. Spend your authority budget on something better.

"You forgot a field" is the worst purchase an authority budget can make: maximum villainy, zero judgment required.

For a while, I made that purchase myself.

The worst part of managing engineers isn't the hard calls. It's the nagging. Every reminder costs you something. You stop being the person who unblocks the team. You become the person who shows up to say you forgot a field. Do that twice a week for a quarter and it becomes your job description.

The two rules

The bill came from two rules at work. Boring, non-negotiable.

Rule one: every PR carries a ticket ID in the title. That's our control, not SOC 2's text. The actual criterion, CC8.1, demands every change be authorized, documented, tested, and approved. It never mentions ticket IDs or PR titles. The ticket link is how we prove the trail to an auditor: one key in a title, and the whole chain from "someone decided this" to "this shipped" is walkable.

Rule two: every ticket hangs off an epic. Work with no goal is just motion with a Jira number.

Nobody argues with either rule. Everybody forgets anyway.

So someone has to chase. That someone does not need to be me.

The bad cop

I built a Go service called night-watch, on Cloud Run. It plugs into what's already there: GitHub webhooks feed it PRs, Jira Cloud feeds it tickets and epics. State lives in Cloud SQL: every nudge sent, to whom, when, and whether it resolved. The next scan closes the nudge or moves it up the ladder. No human memory involved.

Its entire output surface is one thing: a private Slack DM. No posting rights anywhere else. Audience of one, by construction.

One night in its life, top to bottom:

  • Scanned 142 PRs and 89 tickets.
  • Compliance check: 7 violations.
  • Metrics rolled up by domain and product. 5 team-lead sheets updated.
  • Private reminders sent. Public channels touched: zero.
  • Manager-escalation loop fired: 0 times.
  • Done in 9 minutes. Nobody was publicly shamed.

That last line is the entire product.

The behavior fits in two lines:

  • PR missing a ticket ID? You get a DM. Add the key, and the next scan marks the nudge resolved and goes silent. Did it right the first time? You never learn the bot exists. The compliant majority shouldn't.
  • Ticket with no epic? It sweeps the boards nightly and DMs the team lead. On that lead's working day, because it knows when your weekend is. Weekends don't line up across a distributed team; not everyone's is Saturday and Sunday, and mine isn't. A nag that lands on your day off isn't a reminder. It's a middle finger with a timestamp.

Privacy is the product

The automation is the easy part. The privacy is the point.

Sticker-style illustration of a round white robot in a police cap holding one sealed envelope and pressing a finger to its mouth in a shush gesture.

No @channel. No callout in standup. No leaderboard of the least compliant. Public shaming is cheap and it scales badly. A private word is the exact note I'd send anyway, minus me: the 6pm tone, whatever history sits between us.

Nobody resents a robot for being consistent. They resent a person for it.

That was gut, not literature. Turns out the literature agrees.

Choi and Chao ran six experiments, 2,794 participants (Personality and Social Psychology Bulletin): the same unfavorable decision is judged fairer, and accepted more, when an AI delivers it instead of a human. The driver they measured is the machine's perceived unemotionality. A robot has no mood to read and no history with you.

A 2025 Journal of Business Research study lands the same way: negative feedback from a robot is received better than the identical feedback from a person.

The boundaries are narrow. The effect holds for unfavorable calls only, and it shrinks when people are reminded that machines can be biased. Don't read this as "people prefer algorithmic management". For the small, consistent, negative message, the robot is the better messenger. That's the only message this bot carries.

A better bad cop than me

It beats me at the job on every axis. Same message to the staff engineer and the new hire. Zero hesitation. No grudge carried over from last sprint's argument. Never tired at 6pm, because it works at night.

I put myself on the exempt list. But exempt from the DM, not from the rule: my PRs carry ticket IDs like everyone else's, and the audit trail reads mine the same way; the bot just doesn't chase me.

The escalation ladder has exactly two rungs. A lead who ghosts the first DM gets a second one, with their manager copied. That's the only step in the whole machine with an audience, and it's built as the last resort.

The shape matters. Escalation widens the audience by exactly one person, and that person is already accountable for the team. Worst case, the entire enforcement system is a three-person conversation. One @channel reminder starts at worst case and stays there.

Take the audience away and compliance stops being a status game. There's no face to lose, just a missing field, so you fix the field. Mine have never reached the second rung anyway. They know me.

What this is not

A tool like this begs to be abused, so the boundaries are explicit:

  • Leaderboard: Nobody gets ranked by violation count. Ever.
  • Performance signal: Nudge history feeds no review. Per-person data exists to close the loop, not to grade the person.
  • Public dashboard: Aggregates by domain and product go to team-lead sheets, to fix process. Names stay in DMs.

I wrote about the org-scale version of this trap in What our AI tools cost, per team: the moment a fuzzy number is allowed to rate a person, the data dies. Same law here. The moment the nag log becomes ammunition, people stop fixing fields and start gaming them, and the audit trail this whole thing exists to protect goes fake.

The authority budget

Call it the authority budget. A manager's enforceable attention is finite, refills slowly, and drains fastest in the interactions where you play the villain.

Unblocking a stuck engineer is a deposit. Making the hard call and owning the fallout is a deposit. "You forgot a field" is a pure withdrawal. Nothing comes back.

Claymation scene of a tired manager holding a nearly empty jar of gold coins while a long queue of clay engineers each hold up a form with a blank gap.

The account is under pressure everywhere, not just on my floor. Gallup's State of the Global Workplace 2025: manager engagement fell from 30% to 27% in 2024 while individual contributors held flat at 18%. Gallup also attributes 70% of the variance in team engagement to the manager.

Read those together. The layer with the most leverage on the team is the layer running down. Spending what's left of it on missing Jira fields is malpractice.

A machine delivers the same message word for word and, per the research above, delivers it better. It has no budget to drain.

What's left is the half that needs a human: unblock, decide, cover for your people when it matters.

Now I get to be the good cop.

The other job runs at night, on Cloud Run, and never gets tired of it.

Get in touch

I write about AI-first engineering on LinkedIn. Specs in, production out, nobody types code. Follow along there, or send a note.

hi@21stark.com · LinkedIn opens my profile, message me from there


Or send it from here

Providing your name, email address, and message is voluntary; without them you cannot use this form. Aryeh Kiovetsky, operating as 21Stark, controls this information. We use it to receive and answer your message, and provide it to Google Cloud for hosting and storage.