Missing errors for changeset embed and input_for?

I have an schema with embeds_many :features, Feature, on_replace: :delete. The Feature struct has a number of fields, many of which get validated. One is dims. But this problem arises for all of them – I can see there are validation errors, but they are nested multiple layers down. And so never show up on the web page form. I don’t understand it…

My form uses:

<.inputs_for :let={f} field={@form[:features]}>

I put a dbg() check directly in the input core component:

def input(assigns) do
    if assigns.id == "request_features_0_dims" do
      assigns |> dbg()
    end

And this is what I get:

assigns #=> %{
  id: "request_features_0_dims",
  label: nil,
  name: "quote[features][0][dims]",
  type: "text",
  value: "0.1x",
  prompt: nil,
  field: nil,
  errors: [],
  rest: %{},
  __changed__: nil,
  __given__: %{
    id: "request_features_0_dims",
    label: nil,
    name: "quote[features][0][dims]",
    type: "text",
    value: "0.1x",
    prompt: nil,
    field: nil,
    errors: [],
    rest: %{},
    __changed__: nil,
    __given__: %{
      field: %Phoenix.HTML.FormField{
        id: "request_features_0_dims",
        name: "quote[features][0][dims]",
        errors: [],
        field: :dims,
        form: %Phoenix.HTML.Form{
          source: #Ecto.Changeset<
            action: nil,
            changes: %{dims: "0.1x"},
            errors: [dims: {"is invalid", []}],
            data: #NaiPricing.Aperture.Feature<>,
            valid?: false,
            ...
          >,
          impl: Phoenix.HTML.FormData.Ecto.Changeset,
          id: "request_features_0",
          name: "quote[features][0]",
          data: %NaiPricing.Aperture.Feature{
            id: nil,
            shape: :round,
            count: 1,
            dims: "0.1",
            tols: "0.005",
            edge: 7,
            inspect: false,
            system_id: 1,
            syslock: true,
            speed: 1.0,
            passes: 10,
            slew: 15.0,
            type: 1,
            distance: 3.14159,
            time: 3.14159,
            slew_distance: 0.2,
            slew_time: 0.01333,
            ...
          },
          action: nil,
          hidden: [{"_persistent_id", "0"}],
          params: %{
            "_persistent_id" => "0",
            "_unused_count" => "",
            "_unused_distance" => "",
            "_unused_edge" => "",
            "_unused_inspect" => "",
            "_unused_passes" => "",
            "_unused_shape" => "",
            "_unused_slew" => "",
            "_unused_slew_distance" => "",
            "_unused_slew_time" => "",
            "_unused_speed" => "",
            "_unused_syslock" => "",
            "_unused_time" => "",
            "_unused_tols" => "",
            ...
          },
          errors: [],
          options: [multipart: false],
          index: 0
        },
        value: "0.1x"
      },
      __changed__: nil
    },
    multiple: false
  },
  multiple: false
}

Notice the error in the deep nesting __given__.__given__.field.form.source.errors. Why is there all this nesting? Why isn’t it just in errors at the top leve so it will should up on the form?