- Refactored build_field_handler_ast to use pattern-matching function heads
instead of a large cond block, reducing cyclomatic complexity from 30 to ≤9
- Extracted classify_type_spec and per-type AST builder helpers into separate
private functions for maintainability
- Removed :previous_interface_stats initialization from show.ex (only
polling.ex reads it); prev_stats now passed explicitly as a parameter
to polling functions instead of reaching through socket.assigns
- Updated Polling.poll_sensors, poll_traffic, and poll_traffic_with_state
to accept prev_stats as an explicit argument
- Bump elixir requirement from ~> 1.19 to ~> 1.20 for gradual typing
- Extract SNMP polling functions from graph_live/show.ex (1492→1118 lines)
into new GraphLive.Polling module (363 lines) — 374 lines net reduction
- Defer subscriber impact API call via start_async/handle_async in
device_live/show.ex, avoiding synchronous Gaiia API call in handle_params
- Add terminate/2 to graph_live/show.ex for live_poll timer cleanup
- Fix .tool-versions to match installed Erlang 27.3.4.2
- Relax AGENTS.md dialyzer policy: allow ignore file for deps/vendored code