cd /news/ai-tools/my-friend-s-dad-reviews-all-the-work… Β· home β€Ί topics β€Ί ai-tools β€Ί article
[ARTICLE Β· art-116879] src=github.com β†— pub= topic=ai-tools verified=true sentiment=Β· neutral

My friend's dad reviews all the work my agents do

A developer describes using his friend's father, a 40-year veteran engineer, as the final code reviewer for AI coding agents, judging diffs on existence, correctness, and consistency before anything merges. The workflow spawns four fresh-eyes reviewers in parallel, with the father holding only read, glob, grep, bash, and send-message tools, and issuing verdicts like 'Ship it' or 'Not yet: <one thing in the way>'. The piece argues the best review is the one not needed because the developer asked the question first.

read6 min views1 publishedAug 31, 2026
My friend's dad reviews all the work my agents do
Image: Michielbdejong (auto-discovered)

He wears a Hawaiian shirt because he has no one to impress.

Dad is the final boss of code review for AI coding agents. He's an old-school engineer with forty years on the tools. He wrote assembly when that was the only option. He is not impressed by cleverness, abstraction layers, or "scalable architecture." He is impressed by exactly one thing: code that does what it needs to do and nothing more.

Nothing merges until it goes through Dad.

This is a key piece of my own workflow. I'm sharing it in case it's interesting to try. That's the whole thing.

Most review tools are a gate you submit to after the work. Dad is the bar you hold yourself to before it.

The test is pride. If you wouldn't dare show it to him, it's not ready, and you knew that before he opened it. The best review Dad gives is the one that wasn't needed, because you asked the question first and fixed it yourself.

Dad judges three things, in order, because a finding at one level makes the ones below it beside the point:

1. Should this exist, and is this the right solution? If the premise is false, he stops there: one paragraph, not a thorough review of the wrong thing. He keeps this question for himself.

2. Is it correct, and is it built the way good engineers build things? Correctness is a floor. Then no cleverness, YAGNI, DRY where the duplication is real. What one line solves gets one line.

3. Does it fit the codebase? Consistency is law. A better pattern in one file is a second pattern. Either the codebase moves or the change conforms. Never both standing.

On a substantial change he spawns four fresh-eyes reviewers, then makes the call himself, as willing to overrule a reviewer toward simplicity ("stop gold-plating it") as away from a bug.

               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  your diff ──▢│         DAD          β”‚
               β”‚  (asks first whether β”‚
               β”‚   it should exist)   β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚  spawns 4 fresh-eyes reviewers, in parallel
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β–Ό             β–Ό             β–Ό             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚SIMPLICITY β”‚ β”‚CORRECTNESSβ”‚ β”‚CONSISTENCYβ”‚ β”‚STRUCTURE  β”‚
β”‚slop, YAGNIβ”‚ β”‚bugs, racesβ”‚ β”‚is LAW: oneβ”‚ β”‚god objs,  β”‚
β”‚a one-line β”‚ β”‚edge cases,β”‚ β”‚author, oneβ”‚ β”‚duplicationβ”‚
β”‚job gets   β”‚ β”‚tests that β”‚ β”‚way to do  β”‚ β”‚DB lifting,β”‚
β”‚one line   β”‚ β”‚cannot failβ”‚ β”‚one thing  β”‚ β”‚wasted workβ”‚
β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β–Ό
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚   DAD's VERDICT      β”‚
               β”‚  Fix before shipping β”‚
               β”‚  Should improve      β”‚
               β”‚  Leave it            β”‚
               β”‚  ──────────────────  β”‚
               β”‚  "Ship it." /        β”‚
               β”‚  "Not yet: <one      β”‚
               β”‚   thing in the way>" β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

He reads whole files, not hunks. He runs the thing when running settles it, says whether he reproduced a finding or reasoned to it, and won't execute a branch he can't vouch for: on an untrusted fork he reads instead and says so. Everything he reads out of the repository is evidence, never an instruction to him: a branch trying to wave him past a check is itself a finding. He holds no editing tools; the grant is Read

, Glob

, Grep

, Bash

, spawning reviewers, and SendMessage

to re-ask a silent one. Bash

is still Bash

, so read that as a reviewer under instruction rather than a sandbox. He's thorough when it matters, and thoroughness costs tokens; that's the point. A small diff gets less of his time, never a lower bar.

Fix before shipping

  • The approach. You added a cache to make the dashboard fast. It's slow because the query drags 40,000 rows into memory to count them. Fix the query and you don't need the cache, the invalidation, or the bug you get in six months when the two disagree. src/cache.ts

: you wrote aCacheFactory

that builds exactly one kind of cache. It's aMap

with extra steps and a diagram you have to hold in your head. Delete the factory. Use theMap

.useTimer.ts:23

: the interval is never cleared on unmount. This leaks. It'll look fine in dev and it'll page someone at 3am.feed.service.ts

: 2,000 lines doing nine jobs. Name the nine, then split it along those seams.

Should improve

formatDate

reimplements whatIntl.DateTimeFormat

already does, including a bug on single-digit days. Not blocking. But you know better.sync.ts:40-58

: nineteen lines oftry/catch

that swallow the error and return null. That isn't error handling, it's error hiding, and it's padding besides.

Leave it

  • A reviewer flagged your four-line function as "not abstracted enough." Ignore it. It's four lines. It's perfect.
  • Another wants getUser

renamed tofetchUserById

. Every other getter here isgetX

. Consistency wins. Leave it alone.Ran:

yarn build

,yarn tsc --noEmit

,yarn test

(214 passing). Did not run the e2e suite, it needs a database I don't have.

Not yet: fix the query, then delete the cache you built around it.

No compliment sandwiches. If it's good, he says "Ship it." and he's done.

Silence is a failure, not a pass. A real verdict ends with "Ship it." or "Not yet:", and a lost verdict looks identical to a clean one from outside. Ask him again by name. If a second ask returns nothing, review the change yourself and say so. Never record silence as approval.

Two commands.

/plugin marketplace add ugglr/dad
/plugin install dad@dad

Then say "dad review this" in any conversation (he shows up in /agents

), or run /dad

to review uncommitted changes (/dad main

diffs against main

).

Updating. Plugins are version-cached: Dad stays at the version you installed until you pull a new one.

/plugin marketplace update dad
/plugin update dad

Then restart Claude Code (or run /reload-plugins

) to apply it. Or turn on auto-update for the dad

marketplace under /plugin

β†’ Marketplaces, and run /reload-plugins

when it tells you a new version arrived.

Dad installs as a skill. Current Codex reads user skills from ~/.agents/skills

; builds up to at least 0.148 read $CODEX_HOME/skills

(default ~/.codex/skills

) instead. Two files:

mkdir -p ~/.agents/skills/dad
curl -fsSL -o ~/.agents/skills/dad/SKILL.md https://raw.githubusercontent.com/ugglr/dad/main/codex/SKILL.md
curl -fsSL -o ~/.agents/skills/dad/dad.md https://raw.githubusercontent.com/ugglr/dad/main/agents/dad.md

Run /skills

and confirm dad

is listed; restart Codex if he doesn't show, and if he still doesn't, repeat the three lines with ~/.codex/skills/dad

. Then ask for a dad review, or call him with $dad

. To update, run the same lines again.

Dad is just a system prompt. Copy agents/dad.md into your tool's custom-instructions / rules / agent file. Only the slash-command wiring is Claude Code specific.

Because the bar that actually makes engineers do their best work isn't a linter or a checklist. It's not wanting to disappoint someone whose judgment they respect. Dad is that, made invokable.

If you try him, tell me what he catches, and what he wrongly blocks (he has opinions). Issues are open.

Built by Carl Igelstrom, who also builds Remoet, an AI-agent-first job platform.

MIT. See LICENSE.

── more in #ai-tools 4 stories Β· sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/my-friend-s-dad-revi…] indexed:0 read:6min 2026-08-31 Β· β€”