# Changelog

All notable changes to `mgf-tele-core` are documented here.

The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
the project follows [SemVer](https://semver.org/spec/v2.0.0.html). Per
the 0.x window ([SemVer 0.x](https://semver.org/#spec-item-4) and rule
**AP-03** from `mgf-standard/docs/standards/API_DESIGN.md`), MINOR
releases MAY break the public API. Pin tightly:

```toml
mgf-tele-core = ">=0.X.0,<0.Y"   # one minor at a time
```

The release-engineering discipline that produces this changelog is in
[`mgf-standard/docs/standards/RELEASING.md`](https://codeberg.org/magogi-admin/mgf_common/src/branch/main/docs/standards/RELEASING.md).

---

## [0.1.9] - 2026-07-14

### Changed
- **Released what was stranded on `main`.** `main` had moved past `v0.1.8` while still
  declaring `0.1.8`, so the *published* `0.1.8` was different code under the same version
  number. Two things consumers never received:
  - the **Apache-2.0 relicence** (landed on main 2026-07-12; every published wheel still
    carried `License: MIT`, with no `NOTICE` — a relicence is not real until it is released);
  - the **widened `mgf-common` pin** (`<1.0`, was `<0.50`). The stale published cap
    backtracked the whole federation's co-install to `mgf-common` 0.49.2.

  `REL-13` could not see this: it compares declared version to *registry* version, and both
  said `0.1.8`. The drift was main-vs-tag content. `mgf/tools/verify_release_currency.py`
  now catches the class — *a fix that isn't released isn't shipped.*

## [0.1.8] - 2026-06-26

### Changed
- Release the **mgf-common 0.49** pin (`<0.50`) onto devpi so the full
  fleet co-installs at the 0.49 cornerstone (devpi backfill; no API change).

## [0.1.7] - 2026-06-16

### Changed
- Widened the `mgf-common` pin to `<0.48` — mgf-common 0.47 is the pure-library release (the end-user CLI moved to `mgf-fed[cli]`); the importable API is unchanged.
- Regenerated `.woodpecker` so the supervisor lane calls `mtest` (the moved `mgf-common test` frontend is gone).

## [Unreleased]

## [0.1.6] - 2026-06-09

### Added
- **AP-13**: `mgf.tele.core.__version__` now present (was missing), mirrors `pyproject.toml`, in `__all__`, CI tag-coherence-gated.
- Tag-driven Codeberg publish chain (build→tag-coherence→smoke→publish→verify-codeberg) + sbom on the existing CI; PUBLIC_API.md/json + generator + pins; SCOPE.md; [standards] extra; PR-01 UI-forbid import-linter contract; doc-bucket charters.


Nothing yet.

---

## [0.1.5] — 2026-06-06 — federation cohort: mgf-common 0.46 walk

Walk the `mgf-common` pin ceiling `<0.46 → <0.47` to accept the
library-API-neutral `mgf-common 0.46.0` (CLI-only release: new
`federation`/`design` commands + a `doctor --standards` gate; no library
surface change).

---

## [0.1.4] — 2026-06-04 — federation cohort: mgf-common 0.45 walk

PATCH: pin widened to `mgf-common>=0.41,<0.46` to accept mgf-common 0.45
(Codeberg cutover — PKG-01..12). `mgf-*` resolve from the `codeberg-mgf`
index (PKG-06). No API change.

---

## [0.1.3] — 2026-06-01 — federation cohort: adopt mgf-common 0.44

Pin widened to `mgf-common>=0.41,<0.45` — accepts the **mgf-common 0.44** line,
which extracted the engineering-standards corpus + the federation contract into
the new `mgf-standard` sibling (pulled in transitively). The `FEDERATION.md`
pointer stub + `.claude/commands/sync.md` now point at `mgf-standard`. No API
change. This release **unblocks `mgf-tele-teltonika`** (which pins
`mgf-tele-core>=0.1,<0.2`) from resolving mgf-common 0.44.

---

## [0.1.2] — 2026-05-28 — federation cohort publish (mgf-common 0.42.x)

Federation cohort wave: mgf-tele-core accepts **mgf-common 0.42.x** (pin widened to
`>=0.41,<0.43`) and ships to PyPI, carrying the previously-unpublished 0.1.1 work.

---

## [0.1.1] — 2026-05-28 — test hardening + reliability tests

### Added

- Adopt `mgf-test-supervisor` + TS-04 + coverage gate + tier-0 smoke.
- Provider-lifecycle + error-hierarchy completeness tests (coverage 100%).
- `USERS.md` (DOC-16).

### Notes

- Test + dev-config only; no public API change.

---

## [0.1.0] — 2026-05-28 — maiden voyage (vendor-neutral telematics seam)

> **Maiden voyage** — extracted from PlasmaMapper's ingest path
> (ADR-010's two-layer seam) as the foundation of the `mgf-tele-*`
> family. `mgf-tele-core` defines the vendor-neutral seam; per-vendor
> codec packages (`mgf-tele-teltonika`, later `mgf-tele-queclink`, …)
> depend on this and never the other way. PlasmaMapper is consumer #1.

### Added

- **`TelematicsProvider`** — the device-session ABC:
  `open_session` / `receive_packet` / `send_command` /
  `close_session`. A consumer wires a concrete provider into its
  ingest loop; the provider owns the device session while a
  per-vendor codec is a pure `bytes → DecodedAvlRecord` dependency
  injected into it.
- **Session / command vocabulary** — `SessionHandle`,
  `TrackerCommand`, `CommandAck`: the seam's command/session types.
- **Codec-agnostic AVL frame types** — `GeoPoint`,
  `DecodedAvlRecord`, `ReceivedPacket`, `ParseStatus`. Every vendor
  codec normalises its wire format to these. Frame types are frozen
  (rule DP-03) and timestamps are UTC at the boundary (DP-12).
  `receive_packet` always returns the raw bytes even on decode
  failure (`parse_status` ≠ `"ok"`) so the consumer can persist a
  forensic record a future codec update may recover.
- **Typed error hierarchy** — `TelematicsError` plus
  `MalformedPacketError`, `ChecksumError`, `UnsupportedCodecError`,
  `MalformedHandshakeError`, `UnknownTrackerError`, and
  `SessionClosedError`. All subclass
  `mgf.common.exceptions.AppError`.
- **`mgf.tele.core.mock.MockTelematicsProvider`** — scripted
  in-memory provider (`MockTelematicsProvider(batches=[…])`) so
  consumers can drive their ingest logic deterministically with no
  socket and no vendor codec. The production core never imports the
  mock (enforced by an import-linter forbidden contract).

### Engineering

- PEP 420 implicit namespace package (no top-level `mgf/__init__.py`);
  the wheel ships `src/mgf/` as-is so `mgf.tele.core` coexists as a
  sibling of `mgf.common`.
- `mgf-common>=0.41,<0.42` runtime dependency. AP-03 0.x window pin
  discipline applies — bump in lock-step with mgf-common's next minor.
