           app != other_app ->
             {other, match}
           in_upper? && other_opts[:override] ->
-            {other |> with_matching_only(dep), true}
+            {other |> with_matching_only(dep, in_upper?), true}
           converge?(other, dep) ->
-            {other |> with_matching_only(dep) |> with_matching_req(dep), true}
+            {other |> with_matching_only(dep, in_upper?) |> with_matching_req(dep), true}
           true ->
             tag = if in_upper?, do: :overridden, else: :diverged
             {%{other | status: {tag, dep}}, true}

      # valid.
      lock_for_converger = lock || Mix.Dep.Lock.read

      all(main, [], [], apps, callback, rest, lock, fn dep ->
        cond do
          cached = deps[dep.app] ->
            {:loaded, cached}

    if match, do: acc
  end

  # in_upper requires conflict resolution
  defp with_matching_only(%{opts: other_opts} = other, %{opts: opts} = dep, true) do
    case Keyword.fetch(other_opts, :only) do
      {:ok, other_only} ->
        case Keyword.fetch(opts, :only) do
