Another dialyzer issue

Dialyzer detects error in this code (type mismatch):

defmodule Foo do
  @type options() :: [
          {:k1, integer()}
          | {:k2, boolean()}
        ]

  @spec foo(options()) :: options()
  def foo(a), do: a

  def bar() do
    # error
    foo(k2: 10)
  end
end

but doesn’t in this code:

defmodule Foo do
  @type options() :: [
          {:k1, integer()}
          | {:k2, integer()}
          | {:k3, integer()}
          | {:k4, integer()}
          | {:k5, integer()}
          | {:k6, boolean()}
        ]

  @spec foo(options()) :: options()
  def foo(a), do: a

  def bar() do
    # error
    foo(k6: 10)
  end
end

Why?

When types reach a certain level of complexity, dialyzer simplifies them.

Your type has probably been simplified to [{atom, integer | boolean}], but thats just a guess.