Use when analyzing and fixing Dialyzer warnings and type discrepancies in Erlang/Elixir code.
View on GitHubTheBushidoCollective/han
jutsu-dialyzer
January 24, 2026
Select agents to install to:
npx add-skill https://github.com/TheBushidoCollective/han/blob/main/jutsu/jutsu-dialyzer/skills/dialyzer-analysis/SKILL.md -a claude-code --skill dialyzer-analysisInstallation paths:
.claude/skills/dialyzer-analysis/# Dialyzer Analysis
Understanding and fixing Dialyzer warnings in Erlang and Elixir code.
## Type Specifications
### Basic Specs
```elixir
@spec add(integer(), integer()) :: integer()
def add(a, b), do: a + b
@spec get_user(pos_integer()) :: {:ok, User.t()} | {:error, atom()}
def get_user(id) do
# implementation
end
```
### Complex Types
```elixir
@type user :: %{
id: pos_integer(),
name: String.t(),
email: String.t(),
role: :admin | :user | :guest
}
@spec process_users([user()]) :: {:ok, [user()]} | {:error, String.t()}
```
### Generic Types
```elixir
@spec map_values(map(), (any() -> any())) :: map()
@spec filter_list([t], (t -> boolean())) :: [t] when t: any()
```
## Common Warnings
### Pattern Match Coverage
```elixir
# Warning: pattern match is not exhaustive
case value do
:ok -> :success
# Missing :error case
end
# Fixed
case value do
:ok -> :success
:error -> :failure
_ -> :unknown
end
```
### No Return
```elixir
# Warning: function has no local return
def always_raises do
raise "error"
end
# Fixed with spec
@spec always_raises :: no_return()
def always_raises do
raise "error"
end
```
### Unmatched Returns
```elixir
# Warning: unmatched return
def process do
{:error, "failed"} # Return value not used
:ok
end
# Fixed
def process do
case do_something() do
{:error, reason} -> handle_error(reason)
:ok -> :ok
end
end
```
### Unknown Functions
```elixir
# Warning: unknown function
SomeModule.undefined_function()
# Fixed: ensure function exists or handle dynamically
if Code.ensure_loaded?(SomeModule) and
function_exported?(SomeModule, :function_name, 1) do
SomeModule.function_name(arg)
end
```
## Type Analysis Patterns
### Union Types
```elixir
@type result :: :ok | {:ok, any()} | {:error, String.t()}
@spec handle_result(result()) :: any()
def handle_result(:ok), do: nil
def handle_result({:ok, value}), do: value
def handle_result({:error, msg}), do: Logger.error(msg)
```
### Opaque Types
```