skills/existential-birds/beagle/elixir-code-review

elixir-code-review

SKILL.md

Elixir Code Review

Quick Reference

Issue Type Reference
Naming, formatting, module structure references/code-style.md
With clauses, guards, destructuring references/pattern-matching.md
GenServer, Supervisor, Application references/otp-basics.md
@moduledoc, @doc, @spec, doctests references/documentation.md

Review Checklist

Code Style

  • Module names are CamelCase, function names are snake_case
  • Pipe chains start with raw data, not function calls
  • Private functions grouped after public functions
  • No unnecessary parentheses in function calls without arguments

Pattern Matching

  • Functions use pattern matching over conditionals where appropriate
  • With clauses have else handling for error cases
  • Guards used instead of runtime checks where possible
  • Destructuring used in function heads, not body

OTP Basics

  • GenServers use handle_continue for expensive init work
  • Supervisors use appropriate restart strategies
  • No blocking calls in GenServer callbacks
  • Proper use of call vs cast (sync vs async)

Documentation

  • All public functions have @doc and @spec
  • Modules have @moduledoc describing purpose
  • Doctests for pure functions where appropriate
  • No @doc false on genuinely public functions

Security

  • No String.to_atom/1 on user input (use to_existing_atom/1)
  • No Code.eval_string/1 on untrusted input
  • No :erlang.binary_to_term/1 without :safe option

Valid Patterns (Do NOT Flag)

  • Empty function clause for pattern match - def foo(nil), do: nil is valid guard
  • Using |> with single transformation - Readability choice, not wrong
  • @doc false on callback implementations - Callbacks documented at behaviour level
  • Private functions without @spec - @spec optional for internals
  • Using Kernel.apply/3 - Valid for dynamic dispatch with known module/function

Context-Sensitive Rules

Issue Flag ONLY IF
Missing @spec Function is public AND exported
Generic rescue Specific exception types available
Nested case/cond More than 2 levels deep

When to Load References

  • Reviewing module/function naming → code-style.md
  • Reviewing with/case/cond statements → pattern-matching.md
  • Reviewing GenServer/Supervisor code → otp-basics.md
  • Reviewing @doc/@moduledoc → documentation.md

Before Submitting Findings

Load and follow review-verification-protocol before reporting any issue.

Weekly Installs
21
GitHub Stars
38
First Seen
Feb 9, 2026
Installed on
codex18
gemini-cli17
opencode16
github-copilot16
amp15
kimi-cli15