Review the actual change, not the file list

der_gopher1 pts0 comments

Review the actual change, not the file list

SubscribeSign in

Review the actual change, not the file list<br>A hands-on look at CodeRabbit on a real, absurdly large feature-removal PR.

Julien Singler<br>Jul 17, 2026

Share

Sponsored by CodeRabbit — but this is a real PR, on a real codebase, with real findings. I’m going to show you exactly what the tool caught, what it got wrong, and whether the “AI reviews your PR” pitch holds up when the PR is 218 files and minus‑74,096 lines.

AI writes more code than ever. Reviewing it shouldn’t mean scrolling forty files in alphabetical order.<br>packagemain.tech is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Subscribe

CodeRabbit Review reorganizes any pull request from a flat file list into a structured, layer-by-layer walkthrough - the logical reading order of the change, not the order your platform happens to sort it. Every range gets its own plain-language summary, with sequence diagrams, state machines, and ERDs generated inline wherever a visual earns its place.<br>Cohorts group related files and chunks so you review one idea at a time. Layers order them so foundational changes - data shapes, contracts - come before the code that depends on them. Code Peek lets you click any variable, function, class or type to see its definition and usages without leaving the tab, while Semantic Diff view cuts past formatting noise to show what actually changed.<br>Open it straight from the Review Change Stack button in the PR Walkthrough. Navigate cohorts and layers from the keyboard, comment against exact line ranges and submit native reviews, comments and approvals post back to GitHub or GitLab right where your team expects them.<br>In the early access, available for free to everyone.<br>From the team that pioneered AI code reviews. 2M reviews every week. 6M repos. 15K customers.The review interface built for the way modern PRs are actually written.<br>Review your next PR with CodeRabbit Review Today

The setup: killing a feature that outgrew the game

HiddenWars is a browser-based hacking strategy game — Go + Echo on the backend, Svelte 5 on the frontend, PostgreSQL, Redis.<br>The Corruption War was a cooperative map/season meta-game that had accumulated ~74k lines of code and too many design docs. It was time for it to go.

218 files changed · +1,453 / −74,096 · 5 phases · one SQL migration

This is the worst-case input for an automated reviewer. Most of the diff is deletions, the codebase has a genuinely confusing naming collision (more on that in a minute), and the “interesting” changes are surgical edits buried inside shared files. If a tool can produce a useful review here, it can produce one anywhere.<br>I installed CodeRabbit on the repo, pointed it at the PR, set the profile to Chill (the balanced middle option — more on the three profiles later), and let it run.

What follows is a look at what it caught on the Go specifically, what it got wrong, and whether the “AI reviews your PR” pitch holds up when the PR is 218 files.<br>The hard part: a Go interface that mixed two systems

The single gnarliest file was `backend/internal/db/botnets.go`. It defines a repository interface that he botnet subsystem hangs off:<br>type BotnetRepository interface {<br>ListPlayerNodes(ctx context.Context, playerID string, limit, offset int, filter NodeListFilter) ([]models.PlayerNode, int, error)<br>// ... healthy, degraded, corrupted node management ...

// Siphon-scoped locking: pins draining nodes to a specific session so<br>// concurrent siphons keep separate draining pools.<br>LockNodesForSiphon(ctx context.Context, playerID, slug string, count int, sessionID string) (int, error)<br>UnlockNodesBySiphonSession(ctx context.Context, playerID, sessionID string) error

// War-op-scoped locking: pins healthy/degraded nodes of slug to a hack op as<br>// 'war_committed' (ownership via war_op_id). Returns the locked node IDs.<br>LockNodesForWarOp(ctx context.Context, playerID, slug string, qty int, opID string) ([]string, error)

// UnlockWarOpNodes reverts the player's surviving war_committed nodes for opID ...<br>UnlockWarOpNodes(ctx context.Context, playerID, opID string) error

// LiveOpComposition returns the current surviving committed composition per<br>// player for an op: counts only nodes still state='war_committed'.<br>LiveOpComposition(ctx context.Context, opID string) (map[string]models.NodesComposition, error)<br>LiveOpDegraded(ctx context.Context, opID string) (map[string]map[string]int, error)<br>LiveOpAbsorbers(ctx context.Context, opID string) (map[string]map[string][]models.PlayerNode, error)

// DegradeWarOpNodesTracked damages up to maxCount of the player's war_committed<br>// nodes of slug pinned to opID, using the hack damage model ...<br>DegradeWarOpNodesTracked(ctx context.Context, playerID, opID, slug string, maxCount int, damage, corruptThreshold float64) (int, []models.NodeDamageEntry, error)

// ... raid, bounty, siphon, mining, signature counts ...

The...

context string review error opid files

Related Articles