* data: refactor 4/7 interfaces
* data: address PR #775 review feedback
Fix the two CI test regressions caused by the package split:
- ``factory._load_ble_interface`` no longer keeps a stale module-level
``BLEInterface`` cache that survived ``monkeypatch`` teardown across
tests. The package-level attribute is now the single cache; the
``factory.py`` global was removed. This unblocks
``test_load_ble_interface_sets_global``.
- ``interfaces/__init__.py`` re-resolves ``SerialInterface`` and
``TCPInterface`` from ``meshtastic.*`` at package-load time so that a
test that pops ``data.mesh_ingestor.interfaces`` from ``sys.modules``
and re-imports picks up the freshly registered classes rather than
whatever a cached ``factory.py`` first resolved. This unblocks
``test_interfaces_patch_handles_preimported_serial``.
Restore 100% patch coverage on the interfaces subpackage by:
- Adding tests for previously uncovered, testable paths:
``_extract_host_node_id(None)``, ``_ensure_channel_metadata``,
``_normalise_nodeinfo_packet`` (None input + dict-conversion fallback),
``_resolve_lora_message`` (radio_section paths), ``_modem_preset``
(preset attr fallback + unparseable value), ``_camelcase_enum_name``
separator-only input, ``_region_frequency`` no-digit enum name,
``_ensure_radio_metadata`` unresolvable-message path, plus the
unknown-section recursive branch of ``_candidate_node_id``.
- Marking genuinely unreachable defensive branches with
``pragma: no cover`` (BLE receive loop body, upstream API regression
guards, patch re-entry guard, unreachable ``NoAvailableMeshInterface``
fallback).
* chore: refactor codebase before meshcore release
* data: run black
* fix: resolve SonarCloud S1244/S5796 reliability issues in test files
Replace floating-point equality comparisons with pytest.approx() to
satisfy S1244, and replace the `is` identity operator with id()-based
comparison to satisfy S5796.
* fix: remove duplicate encrypted_flag assignment in store_packet_dict
The encrypted_flag was computed identically on lines 307 and 345 with no
mutation of `encrypted` between them. Remove the dead second assignment.