Dead code

We find and remove dead code with the full power of the engine.

Finding it draws on the whole resolved model — every type, every reference, every entry point. Removal is model-based: every consequence is accounted for, the cut itself is surgical, and what it leaves behind gets pruned and simplified. You can validate and approve at every step, from whole clusters down to a single member.

How removal works

A removal is three kinds of change.

Cascade

Deadness is transitive. A dead class takes with it everything nothing else reaches: its callees, its fields, the interface it was the last to implement. We compute that closure and remove it as one cluster.

Repair

What stays has to be made correct again: call sites, overrides, signatures, imports. Each edit comes from the resolved types, so the right one differs at every site.

Pruning

Removal leaves things that can be simplified: a parameter with one value left, an interface with one implementer, a wrapper around nothing. Those come as proposals.

Review

You go through it cluster by cluster.

A class that nothing names except a string looks unreachable. CodeLaser follows class names written as strings, once the methods that read them are declared, so it does not report as dead what a string still reaches.

What is left is out of reach of any static analysis — a name assembled at run time, a class a framework finds by scanning. That is why findings go past a person before anything is removed.

Every cluster comes with what it was derived from. In the viewer you can see what one contains, follow how its removal would propagate, and mark it to keep, to delete, or to come back to.

Those decisions are carried across runs, so nothing you have already judged is asked twice. Take a batch now and leave the rest — that is what makes it something a team can work down gradually.

A dead-code cluster with its source on the left and its reference graph on the right
Every tree of dead code can be inspected side by side with the source code and marked as dead, alive, or held for review.
The detection plan inside the workbench, with the run console open beneath it
Detection runs as a plan in the workbench. The console underneath shows the run that produced these findings, and the same run repeats on demand.

Recurrence

It accumulates every sprint.

A feature flag retired, a caller deleted, an experiment abandoned. The work is never finished. The first pass is a project; everything after it is a plan you build once.

That plan runs detection on whatever schedule suits you and classifies what comes back. Findings that match a decision you have already taken need nobody. The rest are surfaced. You decide where that line sits.

Classified

Each finding is matched against the decisions already taken and the pattern it fits.

Handled

Categories you have cleared before can go without being asked about again.

Surfaced

Anything new, and anything near an entry point, goes to a person.

Measured

Tested against Claude Code on four open-source projects.

Same projects, same list of roots. The engine finished each in under seven minutes, and every result was clean. Claude took 8 to 14 times as long, and in five of its six attempts its changes compiled but broke a build, a test suite or a public API.