# Changelog
## Unreleased
## 0.14.3 - 2026-06-25
### Changed
- Hardened MAVLink XML generation by rejecting reserved identifiers before
source generation.
### Tests
- Added router coverage for subscriber cleanup and independent outbound signing
state across multiple UDP connections.
- Added a downstream compatibility smoke fixture and CI coverage for docs and
example workflows.
## 0.14.2 - 2026-06-25
### Added
- Added MAVLink XML parser hardening for include cycles, conflicting include
paths, file-size limits, include-depth limits, and include-count limits.
### Changed
- Utility cache ETS tables now store typed cache structs for visible systems,
latest messages, and parameter values. Use `XMAVLink.Util.CacheManager`
query APIs instead of relying on direct ETS payload shapes.
- Clarified the public HexDocs API surface and hid internal transport delegate
modules from generated documentation.
## 0.14.1 - 2026-06-25
### Added
- Added public utility cache query APIs for listing cached systems, reading the
latest cached message, and reading a cached parameter without direct ETS
access.
- Added a `0.14.0` migration guide and a deployment safety checklist.
### Tests
- Added deterministic malformed-frame parser coverage and parser
resynchronization coverage.
- Added connection worker lifecycle coverage for close and reconnect behavior.
## 0.14.0 - 2026-06-24
### Breaking Changes
- Formalized utility scoping around `XMAVLink.Util.Context`. Utility callers
that need non-default ETS table names should pass `context: context` instead
of relying on hard-coded global table names.
- Direct utility ETS table access should migrate from fixed names such as
`:messages`, `:systems`, `:params`, and `:sessions` to
`XMAVLink.Util.Tables.name/2` or `XMAVLink.Util.Context.tables`.
### Added
- Added `XMAVLink.Router.send_message/1..3`, a synchronous send API that
returns delivery metadata while preserving the existing `pack_and_send`
APIs.
- Added `XMAVLink.Util.Context` and `context: context` utility options so
cache, focus, parameter, arm/disarm, and SITL helpers can be scoped by
router, dialect, and table namespace.
- Added internal router architecture modules for configuration normalization,
connection-string parsing, route selection, transport behaviour contracts,
shared inbound frame parsing, and generated dialect behaviour contracts.
### Fixed
- Fixed local MAVLink sequence numbers to wrap after the full `0..255` range.
- Preserved utility focus independently for each scoped utility context.
- Deduplicated targeted route recipients when multiple learned MAVLink
addresses resolve to the same connection.
- Updated the `XMAVLink.Message` invalid-term fallback to stay compatible with
warnings-as-errors while preserving `Protocol.UndefinedError` for unknown
message structs.
## 0.13.0 - 2026-05-11
- Added `remote_forwarding: false` router/application configuration for
endpoint or GCS use cases that should receive remote MAVLink traffic locally
without forwarding it between remote links.
## 0.12.2 - 2026-05-11
- Hardened MAVLink XML generator validation for duplicate or conflicting
message module names.
## 0.12.1 - 2026-05-08
- Added router route invalidation when a `SYSTEM_TIME.time_boot_ms` decrease
indicates a remote system rebooted.
## 0.12.0 - 2026-05-08
- Added MAVLink 2 signed-frame parsing and signature trailer representation.
- Added a low-level MAVLink 2 frame signing helper for already packed frames.
- Added reusable MAVLink 2 signature validation and inbound replay-policy
helpers.
- Added inbound router and connection signing policy wiring so configured
receive paths can verify signed MAVLink 2 frames, reject replayed signatures,
and reject unsigned MAVLink 2 frames by default while signing is enabled.
- Added outbound router signing for unsigned MAVLink 2 frames sent over
signing-enabled connections, with per-connection timestamp increments.
- Added MAVLink 2 signing timestamp load/save callbacks so applications can
persist local signing timestamps across restarts.
- Made inbound `SETUP_SIGNING` frames local-only so key material is not
forwarded between MAVLink links by generic routing.
## 0.11.1 - 2026-05-08
- Made generated MAVLink 2 packers use zero-equivalent defaults for omitted
extension fields while preserving MAVLink 1 packing behavior.
- Added generator coverage for omitted and provided MAVLink 2 extension values,
including scalar, array, enum, bitmask, float, double, and char fields.
## 0.11.0 - 2026-05-08
- Added the MAVLink 1.0 spec alignment checklist and support statement, with
MAVLink 2 as the primary compatibility target.
- Made generated MAVLink 2 unpackers ignore future extension bytes for forward
compatibility with dialects that append extension fields.
- Preserved MAVLink 2 zero-length payloads, consumed unsupported signed-frame
signature trailers on stream transports, and aligned generated bitmask fields
with XML `bitmask="true"` declarations.
## 0.10.2 - 2026-05-08
- Dropped unsupported MAVLink 2 frames with incompatible flags on UDP receive
paths instead of crashing while attempting to validate a nil frame.
- Added `auto_param_request: false` utility configuration for deployments that
need to discover vehicles before automatically requesting parameter lists.
- Documented security reporting, MAVLink trust boundaries, and trusted-input
expectations for dialect XML generation.
## 0.10.1 - 2026-05-07
- Made generated dialect source deterministic and formatter-compatible by
removing timestamp/path churn, combining parsed XML inputs in stable order,
formatting the generated output before writing it, and including generated
Common output in the formatter gate.
## 0.10.0 - 2026-05-07
- Made utility supervision opt-in and documented how to start utilities for
the configured router or an explicitly supervised named router.
- Clarified that the current utility layer is scoped to one selected router per
VM while the core router API remains the multi-router integration surface.
- Changed utility focus and cache helpers to return normal `{:error, reason}`
results when utility state or MAV data is missing.
- Added bounded retry behavior and cleanup for arm/disarm, parameter request,
and parameter set helpers.
- Changed parameter query results to use MAVLink parameter names as string keys
instead of creating atoms from vehicle-provided input.
- Added configurable SITL RC forwarding destination addresses.
## 0.9.1 - 2026-05-07
- Strengthened CI release gates with formatting, warnings-as-errors, xref,
tests, and Dialyzer coverage across the supported toolchain checks.
- Clarified supported transports and MAVLink 2 limitations in public docs.
- Fixed utility process lifecycle issues in `CacheManager` and `FocusManager`.
## 0.9.0 - 2026-05-07
- Moved configured connection startup and reconnect behavior under supervised
per-router connection workers with explicit retry delays.
- Added documentation and coverage for connection worker retry/reconnect
behavior.
## 0.8.0 - 2026-05-07
- Added named router instance support while preserving the default
`XMAVLink.Router` convenience process.
- Added targetable `subscribe`, `unsubscribe`, and `pack_and_send` router APIs
for named or pid router instances.
- Isolated local subscription restart caches per named router.
## 0.7.1 - 2026-05-07
- Fixed TCP outbound forwarding to send MAVLink frames over the TCP socket
instead of attempting to use UDP send calls.
- Added TCP forwarding regression coverage for MAVLink 1 and MAVLink 2 frames.
- Reduced expected test-suite noise from generated task output and runtime logs.
## 0.7.0 - 2026-05-07
- Added per-message `source_system` and `source_component` overrides to
`XMAVLink.Router.pack_and_send/3`.
- Added heartbeat source identity options and `:heartbeats` supervisor config
for multiple local MAVLink identities sharing one router.
- Fixed outbound local sequence tracking so each local source identity uses an
independent MAVLink sequence counter.
- Preserved the existing default router identity behavior for callers that do
not pass source overrides.