{"slug": "my-friend-s-dad-reviews-all-the-work-my-agents-do", "title": "My friend's dad reviews all the work my agents do", "summary": "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.", "body_md": "*He wears a Hawaiian shirt because he has no one to impress.*\n\nDad 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.**\n\nNothing merges until it goes through Dad.\n\n*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.*\n\nMost review tools are a gate you submit to *after* the work. Dad is the bar you hold yourself to *before* it.\n\nThe 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.\n\nDad judges three things, in order, because a finding at one level makes the ones below it beside the point:\n\n**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.\n\n**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.\n\n**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.\n\nOn 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.\n\n```\n               ┌──────────────────────┐\n  your diff ──▶│         DAD          │\n               │  (asks first whether │\n               │   it should exist)   │\n               └───────────┬──────────┘\n                           │  spawns 4 fresh-eyes reviewers, in parallel\n      ┌─────────────┬──────┴──────┬─────────────┐\n      ▼             ▼             ▼             ▼\n┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐\n│SIMPLICITY │ │CORRECTNESS│ │CONSISTENCY│ │STRUCTURE  │\n│slop, YAGNI│ │bugs, races│ │is LAW: one│ │god objs,  │\n│a one-line │ │edge cases,│ │author, one│ │duplication│\n│job gets   │ │tests that │ │way to do  │ │DB lifting,│\n│one line   │ │cannot fail│ │one thing  │ │wasted work│\n└─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘\n      └─────────────┴──────┬──────┴─────────────┘\n                           ▼\n               ┌──────────────────────┐\n               │   DAD's VERDICT      │\n               │  Fix before shipping │\n               │  Should improve      │\n               │  Leave it            │\n               │  ──────────────────  │\n               │  \"Ship it.\" /        │\n               │  \"Not yet: <one      │\n               │   thing in the way>\" │\n               └──────────────────────┘\n```\n\nHe 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`\n\n, `Glob`\n\n, `Grep`\n\n, `Bash`\n\n, spawning reviewers, and `SendMessage`\n\nto re-ask a silent one. `Bash`\n\nis still `Bash`\n\n, 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.\n\nFix before shipping\n\n- 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.\n`src/cache.ts`\n\n: you wrote a`CacheFactory`\n\nthat builds exactly one kind of cache. It's a`Map`\n\nwith extra steps and a diagram you have to hold in your head. Delete the factory. Use the`Map`\n\n.`useTimer.ts:23`\n\n: 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`\n\n: 2,000 lines doing nine jobs. Name the nine, then split it along those seams.\n\nShould improve\n\n`formatDate`\n\nreimplements what`Intl.DateTimeFormat`\n\nalready does, including a bug on single-digit days. Not blocking. But you know better.`sync.ts:40-58`\n\n: nineteen lines of`try/catch`\n\nthat swallow the error and return null. That isn't error handling, it's error hiding, and it's padding besides.\n\nLeave it\n\n- A reviewer flagged your four-line function as \"not abstracted enough.\" Ignore it. It's four lines. It's perfect.\n- Another wants\n`getUser`\n\nrenamed to`fetchUserById`\n\n. Every other getter here is`getX`\n\n. Consistency wins. Leave it alone.Ran:\n\n`yarn build`\n\n,`yarn tsc --noEmit`\n\n,`yarn test`\n\n(214 passing). Did not run the e2e suite, it needs a database I don't have.\n\nNot yet: fix the query, then delete the cache you built around it.\n\nNo compliment sandwiches. If it's good, he says \"Ship it.\" and he's done.\n\n**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.\n\nTwo commands.\n\n```\n/plugin marketplace add ugglr/dad\n/plugin install dad@dad\n```\n\nThen say *\"dad review this\"* in any conversation (he shows up in `/agents`\n\n), or run `/dad`\n\nto review uncommitted changes (`/dad main`\n\ndiffs against `main`\n\n).\n\n**Updating.** Plugins are version-cached: Dad stays at the version you installed until you pull a new one.\n\n```\n/plugin marketplace update dad\n/plugin update dad\n```\n\nThen restart Claude Code (or run `/reload-plugins`\n\n) to apply it. Or turn on auto-update for the `dad`\n\nmarketplace under `/plugin`\n\n→ Marketplaces, and run `/reload-plugins`\n\nwhen it tells you a new version arrived.\n\nDad installs as a [skill](https://developers.openai.com/codex/skills). Current Codex reads user skills from `~/.agents/skills`\n\n; builds up to at least 0.148 read `$CODEX_HOME/skills`\n\n(default `~/.codex/skills`\n\n) instead. Two files:\n\n```\nmkdir -p ~/.agents/skills/dad\ncurl -fsSL -o ~/.agents/skills/dad/SKILL.md https://raw.githubusercontent.com/ugglr/dad/main/codex/SKILL.md\ncurl -fsSL -o ~/.agents/skills/dad/dad.md https://raw.githubusercontent.com/ugglr/dad/main/agents/dad.md\n```\n\nRun `/skills`\n\nand confirm `dad`\n\nis listed; restart Codex if he doesn't show, and if he still doesn't, repeat the three lines with `~/.codex/skills/dad`\n\n. Then ask for a dad review, or call him with `$dad`\n\n. To update, run the same lines again.\n\nDad is just a system prompt. Copy [ agents/dad.md](/ugglr/dad/blob/main/agents/dad.md) into your tool's custom-instructions / rules / agent file. Only the slash-command wiring is Claude Code specific.\n\nBecause 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.\n\nIf you try him, tell me what he catches, and what he wrongly blocks (he has opinions). Issues are open.\n\nBuilt by [Carl Igelstrom](https://github.com/ugglr), who also builds [Remoet](https://remoet.dev), an AI-agent-first job platform.\n\nMIT. See [LICENSE](/ugglr/dad/blob/main/LICENSE).", "url": "https://wpnews.pro/news/my-friend-s-dad-reviews-all-the-work-my-agents-do", "canonical_source": "https://github.com/ugglr/dad", "published_at": "2026-08-31 17:41:25+00:00", "updated_at": "2026-08-31 17:52:19.323243+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents"], "entities": [], "alternates": {"html": "https://wpnews.pro/news/my-friend-s-dad-reviews-all-the-work-my-agents-do", "markdown": "https://wpnews.pro/news/my-friend-s-dad-reviews-all-the-work-my-agents-do.md", "text": "https://wpnews.pro/news/my-friend-s-dad-reviews-all-the-work-my-agents-do.txt", "jsonld": "https://wpnews.pro/news/my-friend-s-dad-reviews-all-the-work-my-agents-do.jsonld"}}