# Find Dead Code

> Find unused functions, types, constants, imports, and unreachable code paths. Use when the user asks to find dead code, unused code, cleanup candidates, or wants to reduce codebase size.

- Skill: `openshift/find-dead-code-3` (Agent Skill)
- Install (CLI): `npx skillmds@latest add openshift/find-dead-code-3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/openshift/find-dead-code-3/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: openshift (https://skillmd.com/u/openshift)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/openshift/find-dead-code-3

---


# Find Dead Code

Detect unused Go code that can be safely removed.

## Rules

- Report findings, do not delete. Removal is a separate task.
- Focus on production code (`controller/`, `api/`, `cmd/`, `cli/`). Skip tests unless explicitly asked.
- Tools have false positives — classify each finding before recommending removal.
- Code used via reflection or dynamic dispatch (e.g. Kubernetes controller-runtime, interface implementations) is not dead.

## Step 1: Determine Scope

Ask the user:
- **Branch mode**: only files changed in the current branch vs main.
- **Full mode**: scan the entire codebase.

For branch mode:

```bash
git diff --name-only upstream/main -- 'controller/' 'api/' 'cmd/' 'cli/' | grep '\.go$' | grep -v '_test\.go$'
```

## Step 2: Run Go Standard Tooling

Check for unused code with the compiler:

```bash
go build ./... 2>&1 | grep "declared and not used"
go vet ./... 2>&1 | grep -E "(not used|never used)"
```

## Step 3: Run staticcheck

staticcheck detects unused code, including unexported functions, constants, and variables:

```bash
staticcheck -checks=U1000 ./...
```

U1000 reports unused code that is not exported and not referenced.

## Step 4: Run deadcode (Go 1.23+)

If Go 1.23+ is available:

```bash
go run golang.org/x/tools/cmd/deadcode@latest -filter <package-pattern>
```

This finds functions, types, and variables that are never called or referenced.

## Step 5: Check Unused Imports

```bash
goimports -l <target>
```

Any file listed has unused imports. Review with:

```bash
goimports -d <file>
```

## Step 6: Filter False Positives

Common false positives in this codebase:

| Pattern | Why it's not dead |
|---------|-------------------|
| `Reconcile(ctx, req)` implementations | Called by controller-runtime via interface |
| `SetupWithManager()` functions | Called by manager setup code |
| `init()` functions | Called automatically by Go runtime |
| Interface method implementations | Called through interface, not directly |
| `kubebuilder:` marker functions | Used by code generation |
| Constants/vars in `constants.go` | May be used in tests or future code |
| Error constants matching `Err*` pattern | May be used in error wrapping |

## Step 7: Classify Findings

For each finding, classify:

| Category | Criteria | Action |
|----------|----------|--------|
| **Remove** | Clearly unused, no interface/reflection use | Safe to delete |
| **Verify** | Possibly used dynamically or via interface | Search for references before removing |
| **False positive** | Interface impl, reflection, kubebuilder marker | Skip |

For "Verify" findings, search for references:

```bash
rg "<function_or_type_name>" controller/ api/ cmd/ cli/
```

## Step 8: Report

For each finding:

1. File and line number
2. What is unused (function, type, constant, variable, import)
3. Tool that detected it (staticcheck, deadcode, goimports)
4. Classification (remove / verify / false positive)
5. Estimated lines saved

Summary: total findings, how many safe to remove, estimated cleanup size.

