# 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.
