Resolving Hex dependencies... Resolution completed in 0.068s Unchanged: circular_buffer 1.0.0 elixir_make 0.9.0 flow 1.2.4 gen_stage 1.3.2 interactive_cmd 0.1.4 jason 1.4.4 multigraph 0.16.1-mg.3 nerves 1.14.1 nerves_discovery 0.1.2 nerves_logging 0.2.4 nerves_runtime 0.13.12 nerves_system_bbb 2.29.3 nerves_system_br 1.33.5 nerves_system_grisp2 0.17.3 nerves_system_mangopi_mq_pro 0.15.3 nerves_system_osd32mp1 0.24.3 nerves_system_qemu_aarch64 0.3.3 nerves_system_rpi 2.0.2 nerves_system_rpi0 2.0.2 nerves_system_rpi0_2 2.0.2 nerves_system_rpi2 2.0.2 nerves_system_rpi3 2.0.2 nerves_system_rpi4 2.0.2 nerves_system_rpi5 2.0.2 nerves_system_x86_64 1.33.3 nerves_toolchain_aarch64_nerves_linux_gnu 13.2.0 nerves_toolchain_armv6_nerves_linux_gnueabihf 13.2.0 nerves_toolchain_armv7_nerves_linux_gnueabihf 13.2.0 nerves_toolchain_ctng 1.10.0 nerves_toolchain_riscv64_nerves_linux_gnu 13.2.0 nerves_toolchain_x86_64_nerves_linux_musl 13.2.0 nerves_uevent 0.1.5 property_table 0.3.3 ring_logger 0.11.5 runic 0.1.0-alpha.7 shoehorn 0.9.3 tablet 0.3.2 telemetry 1.4.1 toolshed 0.4.2 uboot_env 1.0.2 uniq 0.6.2 All dependencies have been fetched ==> jason Compiling 10 files (.ex) Generated jason app ==> tablet Compiling 2 files (.ex) Generated tablet app ==> elixir_make Compiling 8 files (.ex) Generated elixir_make app ==> nerves_discovery Compiling 5 files (.ex) Generated nerves_discovery app ==> interactive_cmd Compiling 1 file (.ex) Generated interactive_cmd app ==> nerves HOST_CC port.o HOST_LD port Compiling 50 files (.ex) Generated nerves app ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod Checking for prebuilt Nerves artifacts... Found nerves_system_x86_64 in cache /home/nerves/.nerves/artifacts/nerves_system_x86_64-portable-1.33.3 Found nerves_toolchain_x86_64_nerves_linux_musl in cache /home/nerves/.nerves/artifacts/nerves_toolchain_x86_64_nerves_linux_musl-linux_aarch64-13.2.0 ==> nerves ==> nerves_system_br Generated nerves_system_br app ==> nerves_toolchain_ctng Compiling 1 file (.ex) Generated nerves_toolchain_ctng app ==> nerves_toolchain_x86_64_nerves_linux_musl Generated nerves_toolchain_x86_64_nerves_linux_musl app ==> nerves_system_x86_64 Generated nerves_system_x86_64 app ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod ==> gen_stage Compiling 10 files (.ex) Generated gen_stage app ==> circular_buffer Compiling 1 file (.ex) Generated circular_buffer app ==> multigraph Compiling 16 files (.ex) warning: a struct for Multigraph is expected on struct update: %Multigraph{g | vertices: vs, vertex_labels: ls, out_edges: oe, in_edges: ie, edges: em} but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1193:9 g = prune_vertex_from_edge_index(g, v_id, v) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1202 │ %__MODULE__{g | vertices: vs, vertex_labels: ls, out_edges: oe, in_edges: ie, edges: em} │ ~ │ └─ lib/multigraph.ex:1202:7: Multigraph.delete_vertex/2 warning: a struct for Multigraph is expected on struct update: %Multigraph{ g | in_edges: Map.put(ie, v2_id, in_neighbors), out_edges: Map.put(oe, v1_id, out_neighbors), edges: Map.put(meta, edge_key, edge_meta), edge_properties: ep } but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1314:7 g = if g.multigraph do edge = Multigraph.Edge.new(v1, v2, label: label, weight: weight, properties: properties) index_multigraph_edge(g, edge_key, edge) else g end when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1322 │ %__MODULE__{ │ ~ │ └─ lib/multigraph.ex:1322:5: Multigraph.do_add_edge/4 warning: a struct for Multigraph is expected on struct update: %Multigraph{g | edge_index: Map.put(g.edge_index, partition, new_edge_partition)} but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1338:50 g when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1355 │ %__MODULE__{ │ ~ │ └─ lib/multigraph.ex:1355:7: Multigraph.index_multigraph_edge/3 warning: a struct for Multigraph is expected on struct update: %Multigraph{ g | in_edges: Map.put(g.in_edges, v2_id, v2_in), out_edges: Map.put(g.out_edges, v1_id, v1_out), edges: Map.delete(g.edges, {v1_id, v2_id}) } but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1455:9 g = prune_all_edge_indexes(g, {v1_id, v1}, {v2_id, v2}) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1457 │ g = %__MODULE__{ │ ~ │ └─ lib/multigraph.ex:1457:11: Multigraph.do_split_edge/4 warning: a struct for Multigraph is expected on struct update: %Multigraph{g | edges: Map.put(em, edge_key, new_meta), edge_properties: ep} but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1584:15 g = index_multigraph_edge( prune_edge_index(g, {v1_id, v1}, {v2_id, v2}, old_label), {v1_id, v2_id}, Multigraph.Edge.new(v1, v2, label: new_label, weight: new_weight, properties: new_properties) ) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1596 │ %__MODULE__{g | edges: Map.put(em, edge_key, new_meta), edge_properties: ep} │ ~ │ └─ lib/multigraph.ex:1596:13: Multigraph.do_update_labelled_edge/5 warning: a struct for Multigraph is expected on struct update: %Multigraph{ g | in_edges: Map.put(ie, v2_id, v2_in), out_edges: Map.put(oe, v1_id, v1_out), edges: meta } but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1654:9 g = prune_all_edge_indexes(g, {v1_id, v1}, {v2_id, v2}) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1659 │ %__MODULE__{ │ ~ │ └─ lib/multigraph.ex:1659:7: Multigraph.do_delete_edge/3 warning: a struct for Multigraph is expected on struct update: %Multigraph{acc | edge_index: updated_edge_index} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/multigraph.ex:1726:43 acc when defining the variable "acc", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1753 │ %__MODULE__{acc | edge_index: updated_edge_index} │ ~ │ └─ lib/multigraph.ex:1753:7: Multigraph.prune_edge_key_from_partitions/5 warning: a struct for Multigraph is expected on struct update: %Multigraph{ g | in_edges: Map.put(ie, v2_id, v2_in), out_edges: Map.put(oe, v1_id, v1_out), edges: meta } but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1838:9 g = prune_edge_index(g, {v1_id, v1}, {v2_id, v2}, label) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1847 │ %__MODULE__{ │ ~ │ └─ lib/multigraph.ex:1847:11: Multigraph.do_delete_edge/4 warning: a struct for Multigraph is expected on struct update: %Multigraph{g | edges: meta} but got type: dynamic() where "g" was given the type: # type: dynamic() # from: lib/multigraph.ex:1838:9 g = prune_edge_index(g, {v1_id, v1}, {v2_id, v2}, label) when defining the variable "g", you must also pattern match on "%Multigraph{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1856 │ %__MODULE__{g | edges: meta} │ ~ │ └─ lib/multigraph.ex:1856:11: Multigraph.do_delete_edge/4 Generated multigraph app ==> nerves_logging CC kmsg_tailer.o LD kmsg_tailer Compiling 5 files (.ex) Generated nerves_logging app ==> uniq Compiling 4 files (.ex) Generated uniq app ==> ring_logger Compiling 7 files (.ex) Generated ring_logger app ==> shoehorn Compiling 8 files (.ex) Generated shoehorn app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling telemetry ==> flow Compiling 9 files (.ex) Generated flow app ==> runic Compiling 87 files (.ex) warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{acc | components: components} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/workflow/private.ex:38:77 acc when defining the variable "acc", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 42 │ %Workflow{acc | components: components} │ ~ │ └─ lib/workflow/private.ex:42:15: Runic.Workflow.Private.register_component/2 warning: a struct for Multigraph.Edge is expected on struct update: %Multigraph.Edge{edge | v1: parent_component} but got type: dynamic(%{..., v1: %Runic.Workflow.Root{}, v2: term()}) where "edge" was given the type: # type: dynamic(%{..., v1: %Runic.Workflow.Root{}, v2: term()}) # from: lib/workflow/component.ex:1749:46 %{v1: %Runic.Workflow.Root{}, v2: _} = edge when defining the variable "edge", you must also pattern match on "%Multigraph.Edge{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1750 │ new_edge = %Multigraph.Edge{edge | v1: parent_component} │ ~ │ └─ lib/workflow/component.ex:1750:22: Runic.Component.Runic.Workflow.connect/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.add_edge( Multigraph.replace_vertex(wrk.graph, conj, updated_conj), referenced_condition, updated_conj, label: :flow) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:808:61 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 830 │ %Workflow{ │ ~ │ └─ lib/workflow/component.ex:830:11: Runic.Component.Runic.Workflow.Rule.resolve_condition_refs/2 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.add_edge(wrk.graph, referenced_condition, target_node, label: :flow) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:808:61 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 839 │ %Workflow{ │ ~ │ └─ lib/workflow/component.ex:839:11: Runic.Component.Runic.Workflow.Rule.resolve_condition_refs/2 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, reaction_edge)} but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow.ex:1276:33 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1289 │ %__MODULE__{ │ ~ │ └─ lib/workflow.ex:1289:9: Runic.Workflow.from_log/1 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, edge)} but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:341:33 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 343 │ %Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, edge)} │ ~ │ └─ lib/workflow/component.ex:343:11: Runic.Component.Runic.Workflow.Map.connect/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ workflow | graph: graph, components: components, before_hooks: before_hooks, after_hooks: after_hooks, build_log: workflow.build_log ++ [event] } but got type: dynamic() where "workflow" was given the type: # type: dynamic() # from: lib/workflow.ex:1795:28 workflow when defining the variable "workflow", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1892 │ %__MODULE__{ │ ~ │ └─ lib/workflow.ex:1892:5: Runic.Workflow.do_remove_component/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.update_labelled_edge(wrk.graph, v1, v2, :joined, label: :join_satisfied) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/invokable.ex:990:44 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 991 │ %Workflow{ │ ~ │ └─ lib/workflow/invokable.ex:991:11: Runic.Workflow.Invokable.Runic.Workflow.Join.invoke/3 Generated runic app ==> uboot_env Compiling 5 files (.ex) Generated uboot_env app ==> property_table Compiling 8 files (.ex) Generated property_table app ==> nerves_uevent CC uevent.o LD uevent Compiling 5 files (.ex) Generated nerves_uevent app ==> nerves_runtime Compiling 14 files (.ex) Generated nerves_runtime app ==> toolshed Compiling 5 files (.ex) Generated toolshed app ==> nerves_compatibility_test Compiling 2 files (.ex) Generated nerves_compatibility_test app |nerves| Building OTP Release... * [Nerves] validating vm.args * skipping runtime configuration (config/runtime.exs not found) * creating _build/x86_64/rel/nerves_compatibility_test/releases/0.1.0/vm.args Updating base firmware image with Erlang release... Copying rootfs_overlay: /work/proj/_build/x86_64/nerves/rootfs_overlay Copying rootfs_overlay: /work/proj/rootfs_overlay Building /work/proj/_build/x86_64/nerves/images/nerves_compatibility_test.fw... Firmware UUID: owner-tip (98e1b91b-c93a-5027-4808-30806e2e9cec) Firmware built successfully! 🎉 Now you may install it to a MicroSD card using `mix burn` or upload it to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`. * Cleaning runic ==> nerves ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod ==> runic Compiling 87 files (.ex) warning: a struct for Multigraph.Edge is expected on struct update: %Multigraph.Edge{edge | v1: parent_component} but got type: dynamic(%{..., v1: %Runic.Workflow.Root{}, v2: term()}) where "edge" was given the type: # type: dynamic(%{..., v1: %Runic.Workflow.Root{}, v2: term()}) # from: lib/workflow/component.ex:1749:46 %{v1: %Runic.Workflow.Root{}, v2: _} = edge when defining the variable "edge", you must also pattern match on "%Multigraph.Edge{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1750 │ new_edge = %Multigraph.Edge{edge | v1: parent_component} │ ~ │ └─ lib/workflow/component.ex:1750:22: Runic.Component.Runic.Workflow.connect/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.add_edge( Multigraph.replace_vertex(wrk.graph, conj, updated_conj), referenced_condition, updated_conj, label: :flow) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:808:61 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 830 │ %Workflow{ │ ~ │ └─ lib/workflow/component.ex:830:11: Runic.Component.Runic.Workflow.Rule.resolve_condition_refs/2 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.add_edge(wrk.graph, referenced_condition, target_node, label: :flow) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:808:61 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 839 │ %Workflow{ │ ~ │ └─ lib/workflow/component.ex:839:11: Runic.Component.Runic.Workflow.Rule.resolve_condition_refs/2 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, reaction_edge)} but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow.ex:1276:33 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1289 │ %__MODULE__{ │ ~ │ └─ lib/workflow.ex:1289:9: Runic.Workflow.from_log/1 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, edge)} but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/component.ex:341:33 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 343 │ %Workflow{wrk | graph: Multigraph.add_edge(wrk.graph, edge)} │ ~ │ └─ lib/workflow/component.ex:343:11: Runic.Component.Runic.Workflow.Map.connect/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{acc | components: components} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/workflow/private.ex:38:77 acc when defining the variable "acc", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 42 │ %Workflow{acc | components: components} │ ~ │ └─ lib/workflow/private.ex:42:15: Runic.Workflow.Private.register_component/2 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ wrk | graph: Multigraph.update_labelled_edge(wrk.graph, v1, v2, :joined, label: :join_satisfied) } but got type: dynamic() where "wrk" was given the type: # type: dynamic() # from: lib/workflow/invokable.ex:990:44 wrk when defining the variable "wrk", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 991 │ %Workflow{ │ ~ │ └─ lib/workflow/invokable.ex:991:11: Runic.Workflow.Invokable.Runic.Workflow.Join.invoke/3 warning: a struct for Runic.Workflow is expected on struct update: %Runic.Workflow{ workflow | graph: graph, components: components, before_hooks: before_hooks, after_hooks: after_hooks, build_log: workflow.build_log ++ [event] } but got type: dynamic() where "workflow" was given the type: # type: dynamic() # from: lib/workflow.ex:1795:28 workflow when defining the variable "workflow", you must also pattern match on "%Runic.Workflow{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 1892 │ %__MODULE__{ │ ~ │ └─ lib/workflow.ex:1892:5: Runic.Workflow.do_remove_component/3 Generated runic app ==> nerves_compatibility_test Generated nerves_compatibility_test app |nerves| Building OTP Release... * [Nerves] validating vm.args * skipping runtime configuration (config/runtime.exs not found) * creating _build/x86_64/rel/nerves_compatibility_test/releases/0.1.0/vm.args Updating base firmware image with Erlang release... Copying rootfs_overlay: /work/proj/_build/x86_64/nerves/rootfs_overlay Copying rootfs_overlay: /work/proj/rootfs_overlay Building /work/proj/_build/x86_64/nerves/images/nerves_compatibility_test.fw... Firmware UUID: owner-tip (98e1b91b-c93a-5027-4808-30806e2e9cec) Firmware built successfully! 🎉 Now you may install it to a MicroSD card using `mix burn` or upload it to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`.