From b229ac5ef0f64afc58c6452711372b465c136989 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:40:44 +0200 Subject: [PATCH 01/16] chore: prepare ESP-Now 0.5.1 dependency metadata (#10) --- library.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index f689009..fdf4550 100755 --- a/library.json +++ b/library.json @@ -16,14 +16,14 @@ "type": "git", "url": "https://github.com/Flowduino/ESPressio-ESP-Now.git" }, - "version": "0.5.0", + "version": "0.5.1", "license": "Apache-2.0", "frameworks": "arduino", "platforms": "espressif32", "dependencies": [ { "name": "ESPressio-Timing", - "version": ">=2.2.2 <3.0.0", + "version": ">=2.2.3 <3.0.0", "url": "https://github.com/Flowduino/ESPressio-Timing.git", "platforms": "espressif32" }, From 411c74b7fcff08a6983c966f4a1d4af9ab755713 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:40:53 +0200 Subject: [PATCH 02/16] chore: prepare ESP-Now 0.5.1 Arduino metadata (#10) --- library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 892be5d..e2aee16 100755 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Flowduino ESPressio-ESPNow -version=0.5.0 +version=0.5.1 author=Simon J. Stuart maintainer=Flowduino.com sentence=ESP-NOW transport and distributed ESPressio integrations for ESP32 @@ -8,4 +8,4 @@ category=Communication url=https://github.com/Flowduino/ESPressio-ESP-Now architectures=esp32 includes=ESPressio_ESPNow.hpp -depends=Flowduino ESPressio-Timing (>=2.2.2 && <3.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0) +depends=Flowduino ESPressio-Timing (>=2.2.3 && <3.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0) From d08d3daab79cdd9c5c92f0839f36dfe10b890a80 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:41:00 +0200 Subject: [PATCH 03/16] chore: update ESP-Now component version to 0.5.1 (#10) --- component.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/component.mk b/component.mk index f0fdc57..6ed77f3 100755 --- a/component.mk +++ b/component.mk @@ -5,5 +5,5 @@ COMPONENT_REQUIRES := ESPressio_Timing CXXFLAGS += -DESPRESSIO_ESPNOW CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_MAJOR=0 CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_MINOR=5 -CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_PATCH=0 -CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_STRING=\"0.5.0\" +CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_PATCH=1 +CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_STRING=\"0.5.1\" From 9747c00aa3f671aa1e11492fdc44f40a4cce1d6a Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:41:20 +0200 Subject: [PATCH 04/16] docs: record ESP-Now 0.5.1 dependency refresh (#10) --- CHANGELOG.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 420a32d..ddb6073 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 0.5.1 — 2026-08-20 + +### Changed +- Raised the required ESPressio Timing baseline from 2.2.2 to 2.2.3, carrying the Units 0.2.2 / Serializable 0.10.1 dependency refresh downstream. +- Preserved the required ESPressio Observable baseline at `>=3.0.1 <4.0.0`. +- Preserved Command >= 0.3.0 < 1.0.0 and Security >= 0.2.0 < 1.0.0 as opt-in integration baselines. +- Updated package and compile-time version metadata to 0.5.1. +- Documented the existing reciprocal optional Event/ESP-Now integration as an architectural dependency-cycle exception pending downstream relocation of the ESP-Now-specific Observer-to-Event bridge. + +### Compatibility +- ESP-NOW transport, clock synchronization, Event Transport, Command Transport, Security integration, and Observable APIs remain source-compatible with 0.5.0. +- Event remains opt-in; no new mandatory Event dependency is introduced. + ## 0.5.0 — 2026-08-20 ### Added @@ -102,7 +115,7 @@ Versioning](https://semver.org/). - Existing ESP-NOW System Clock synchronization remains unchanged. - Event Transport remains opt-in; applications using only ESP-NOW/Timing functionality do not acquire ESPressio Event or Serializable dependencies. -## \[0.2.0\] - 2026-08-19 +## [0.2.0] - 2026-08-19 ### Added @@ -126,7 +139,7 @@ Versioning](https://semver.org/). - Preserved receive-callback isolation and existing Timing/System Clock synchronization. -## \[0.1.0\] - 2026-08-18 +## [0.1.0] - 2026-08-18 ### Added From 45a088d5bcad7fa922852745d3eebdb9ee8041e5 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:41:43 +0200 Subject: [PATCH 05/16] docs: refresh ESP-Now 0.5.1 dependency chart (#10) --- ESPRESSIO_DEPENDENCY_CHART.md | 104 ++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 31 deletions(-) diff --git a/ESPRESSIO_DEPENDENCY_CHART.md b/ESPRESSIO_DEPENDENCY_CHART.md index 3770437..eaec180 100644 --- a/ESPRESSIO_DEPENDENCY_CHART.md +++ b/ESPRESSIO_DEPENDENCY_CHART.md @@ -1,23 +1,46 @@ -# ESPressio Dependency Chart — ESP-Now 0.4.0 +# ESPressio Dependency Chart — ESP-Now 0.5.1 -ESPressio ESP-Now keeps core dependencies small and exposes higher-level integrations only when selected by the application. +ESPressio ESP-Now keeps its core dependencies small and exposes higher-level +integrations only when explicitly selected. ```text -ESPressio ESP-Now 0.4.x +ESPressio ESP-Now 0.5.1 | -+-- required --> ESPressio Timing >= 2.2.2 < 3.0.0 ++-- required --> ESPressio Timing >= 2.2.3 < 3.0.0 | -+-- optional --> ESPressio Event >= 5.7.1 < 6.0.0 -| +-- used by ESPNowEventTransport ++-- required --> ESPressio Observable >= 3.0.1 < 4.0.0 | -+-- optional --> ESPressio Command >= 0.2.0 < 1.0.0 -| +-- used by ESPNowCommandTransport ++-- optional --> ESPressio Event >= 5.8.0 < 6.0.0 +| +-- ESPNowEventTransport | -+-- optional --> ESPressio Security >= 0.1.0 < 1.0.0 - +-- used by ESPNowSecureTransport ++-- optional --> ESPressio Command >= 0.3.0 < 1.0.0 +| +-- ESPNowCommandTransport +| ++-- optional --> ESPressio Security >= 0.2.0 < 1.0.0 + +-- ESPNowSecureTransport +``` + +The Event baseline intentionally remains a compatible 5.x range here rather +than creating a hard ESP-Now 0.5.1 -> Event 5.8.1 release dependency. Event is +optional and, importantly, Event 5.8 currently also contains an ESP-Now-specific +Observer bridge. Strengthening both edges would make the reciprocal dependency +more difficult to remove. + +## Transitive Timing chain + +```text +ESP-Now 0.5.1 + -> Timing 2.2.3 + -> Units 0.2.2 + - - -> Serializable >= 0.10.1 < 1.0.0 + only for Serializable Unit representations + -> Observable 3.0.1 ``` -## Security Placement +ESP-Now does not acquire a direct Units or Serializable dependency through this +chain. + +## Security placement ```text Event / Command / Clock Sync / application protocol @@ -35,9 +58,11 @@ Event / Command / Clock Sync / application protocol ESP-NOW ``` -Security is deliberately below application protocol semantics and above the concrete ESP-NOW radio transport. Event, Command, and Timing therefore do not gain direct Security dependencies merely because their payloads may be protected. +Security remains below application protocol semantics and above the concrete +ESP-NOW radio transport. Event, Command, and Timing therefore do not gain direct +Security dependencies merely because their payloads may be protected. -## Optional Dependency Rule +## Optional dependency rule The normal: @@ -46,16 +71,39 @@ The normal: ``` does not include headers that introduce Event, Command, or Security dependencies. +Applications explicitly select the relevant integration headers. -Applications explicitly select: +## Circular-dependency audit -```cpp -#include -#include -#include +The current ecosystem contains one reciprocal optional relationship: + +```text +ESP-Now - - -> Event + ESPNowEventTransport + +Event - - -> ESP-Now + ESPNowTransportEventBridge +``` + +This is not the desired long-term dependency direction. The preferred hierarchy +is: + +```text +Event + ^ + | + | optional downstream integration + | +ESP-Now + +-- ESPNowEventTransport + +-- ESPNowTransportEventBridge (preferred future location) ``` -and must then provide the corresponding library dependency. +`ESPNowTransportEventBridge` is transport-specific integration and should move +downstream into ESP-Now's Event integration, or into a dedicated integration +package, so Event remains transport-neutral and no Event -> ESP-Now edge exists. + +No new reciprocal dependency should be introduced before that relocation. ## PlatformIO @@ -63,21 +111,15 @@ Core: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Timing@^2.2.3 + https://github.com/Flowduino/ESPressio-Observable@^3.0.1 ``` -Security integration: +Security integration additionally requires: ```ini -lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Security@^0.1.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-Security@^0.2.0 ``` -Command/Event dependencies are added only when those adapters are compiled. - -## Version Policy - -Dependency ranges stay within the currently supported major line so a future breaking major release is not selected automatically. +Command/Event dependencies are added only when their adapters are compiled. From 29134405be77d2a664856249ffc343d4abb8f373 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:48:50 +0200 Subject: [PATCH 06/16] ci: refresh ESP-Now 0.5.1 README on feature branch (#10) --- .github/workflows/readme-refresh.yml | 132 +++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 .github/workflows/readme-refresh.yml diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml new file mode 100644 index 0000000..65e6390 --- /dev/null +++ b/.github/workflows/readme-refresh.yml @@ -0,0 +1,132 @@ +name: Refresh dependency README + +on: + push: + branches: + - feature/10-timing-2.2.3-dependency-refresh + +permissions: + contents: write + +jobs: + refresh: + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: feature/10-timing-2.2.3-dependency-refresh + - name: Refresh current-version documentation + shell: python + run: | + from pathlib import Path + path = Path('README.md') + text = path.read_text() + start = text.index('## Latest Stable Version') + end = text.index('## Compatibility', start) + current = '''## Current Version — 0.5.1 + +ESPressio ESP-Now 0.5.1 is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. + +Current dependency model: + +```text +Required + ESPressio Timing >= 2.2.3 < 3.0.0 + ESPressio Observable >= 3.0.1 < 4.0.0 + +Optional Event Transport + ESPressio Event >= 5.8.0 < 6.0.0 + +Optional Command Transport + ESPressio Command >= 0.3.0 < 1.0.0 + +Optional Secure Transport + ESPressio Security >= 0.2.0 < 1.0.0 +``` + +The Event relationship intentionally remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge, so strengthening both directions would reinforce a circular optional dependency. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration (or a dedicated integration package). + +''' + text = text[:start] + current + text[end:] + + comp_start = text.index('## Compatibility') + comp_end = text.index('## Header Structure', comp_start) + compatibility = '''## Compatibility + +ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17. + +The common ESP-NOW transport uses Espressif ESP-NOW/Wi-Fi APIs plus FreeRTOS queues/tasks. Core 0.5.1 requires Timing 2.2.3 and Observable 3.0.1 within their current major lines. Event, Command, and Security integrations remain opt-in. + +## ESPressio Development Platform + +ESPressio libraries are discrete, composable components built around a common design ethos: light-weight, developer-friendly, object-oriented, SOLID, and pay-only-for-selected functionality. + +ESPressio ESP-Now owns ESP-NOW-specific peer/radio/framing concerns. Timing owns clock discipline, Event owns Event semantics, Command owns Command semantics, and Security owns cryptography/authentication/replay protection. + +## License + +ESPressio and its component libraries are licensed under the **Apache License 2.0**. See [LICENSE](LICENSE). + +## ESPressio Library Dependencies + +### Required + +```text +ESPressio Timing >= 2.2.3 < 3.0.0 +ESPressio Observable >= 3.0.1 < 4.0.0 +Arduino-ESP32 +``` + +Timing 2.2.3 carries Units 0.2.2 downstream. Serializable remains optional through selected Serializable Unit/Event facilities and is not a core ESP-Now dependency. + +### Optional + +```text +Event Transport + ESPressio Event >= 5.8.0 < 6.0.0 + +Command Transport + ESPressio Command >= 0.3.0 < 1.0.0 + +Secure Transport + ESPressio Security >= 0.2.0 < 1.0.0 +``` + +## Namespace + +```cpp +ESPressio::ESPNow +``` + +## PlatformIO + +Core ESP-NOW/Timing usage: + +```ini +lib_deps = + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Timing@^2.2.3 + https://github.com/Flowduino/ESPressio-Observable@^3.0.1 + +build_flags = + -std=gnu++17 + +build_unflags = + -std=gnu++11 + -fno-rtti +``` + +Add Event, Command, or Security dependencies only when their corresponding adapters are selected. + +''' + text = text[:comp_start] + compatibility + text[comp_end:] + path.write_text(text) + - name: Commit README + run: | + if git diff --quiet -- README.md; then exit 0; fi + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git add -- README.md + git commit -m 'docs: refresh ESP-Now 0.5.1 README (#10)' + git push origin HEAD:feature/10-timing-2.2.3-dependency-refresh From 8ad405e49c6c38a5244c73bfee0f90d6068acd68 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:51:50 +0200 Subject: [PATCH 07/16] ci: simplify ESP-Now README refresh (#10) --- .github/workflows/readme-refresh.yml | 96 ++++++---------------------- 1 file changed, 19 insertions(+), 77 deletions(-) diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml index 65e6390..0d394b6 100644 --- a/.github/workflows/readme-refresh.yml +++ b/.github/workflows/readme-refresh.yml @@ -24,12 +24,10 @@ jobs: text = path.read_text() start = text.index('## Latest Stable Version') end = text.index('## Compatibility', start) - current = '''## Current Version — 0.5.1 + current = """## Current Version — 0.5.1 ESPressio ESP-Now 0.5.1 is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. -Current dependency model: - ```text Required ESPressio Timing >= 2.2.3 < 3.0.0 @@ -45,82 +43,26 @@ Optional Secure Transport ESPressio Security >= 0.2.0 < 1.0.0 ``` -The Event relationship intentionally remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge, so strengthening both directions would reinforce a circular optional dependency. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration (or a dedicated integration package). +The Event relationship intentionally remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration (or a dedicated integration package). -''' +""" text = text[:start] + current + text[end:] - - comp_start = text.index('## Compatibility') - comp_end = text.index('## Header Structure', comp_start) - compatibility = '''## Compatibility - -ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17. - -The common ESP-NOW transport uses Espressif ESP-NOW/Wi-Fi APIs plus FreeRTOS queues/tasks. Core 0.5.1 requires Timing 2.2.3 and Observable 3.0.1 within their current major lines. Event, Command, and Security integrations remain opt-in. - -## ESPressio Development Platform - -ESPressio libraries are discrete, composable components built around a common design ethos: light-weight, developer-friendly, object-oriented, SOLID, and pay-only-for-selected functionality. - -ESPressio ESP-Now owns ESP-NOW-specific peer/radio/framing concerns. Timing owns clock discipline, Event owns Event semantics, Command owns Command semantics, and Security owns cryptography/authentication/replay protection. - -## License - -ESPressio and its component libraries are licensed under the **Apache License 2.0**. See [LICENSE](LICENSE). - -## ESPressio Library Dependencies - -### Required - -```text -ESPressio Timing >= 2.2.3 < 3.0.0 -ESPressio Observable >= 3.0.1 < 4.0.0 -Arduino-ESP32 -``` - -Timing 2.2.3 carries Units 0.2.2 downstream. Serializable remains optional through selected Serializable Unit/Event facilities and is not a core ESP-Now dependency. - -### Optional - -```text -Event Transport - ESPressio Event >= 5.8.0 < 6.0.0 - -Command Transport - ESPressio Command >= 0.3.0 < 1.0.0 - -Secure Transport - ESPressio Security >= 0.2.0 < 1.0.0 -``` - -## Namespace - -```cpp -ESPressio::ESPNow -``` - -## PlatformIO - -Core ESP-NOW/Timing usage: - -```ini -lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 - https://github.com/Flowduino/ESPressio-Timing@^2.2.3 - https://github.com/Flowduino/ESPressio-Observable@^3.0.1 - -build_flags = - -std=gnu++17 - -build_unflags = - -std=gnu++11 - -fno-rtti -``` - -Add Event, Command, or Security dependencies only when their corresponding adapters are selected. - -''' - text = text[:comp_start] + compatibility + text[comp_end:] + replacements = [ + ('ESPressio ESP-Now `0.4.0` targets the ESP32 family under Arduino-ESP32 and requires C++17.', 'ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17.'), + ('### Required for stable 0.4.0', '### Required for 0.5.1'), + ('ESPressio Timing >= 2.2.2 < 3.0.0\nArduino-ESP32', 'ESPressio Timing >= 2.2.3 < 3.0.0\nESPressio Observable >= 3.0.1 < 4.0.0\nArduino-ESP32'), + ('### Optional for stable 0.4.0', '### Optional for 0.5.1'), + ('ESPressio Event >= 5.7.1 < 6.0.0', 'ESPressio Event >= 5.8.0 < 6.0.0'), + ('ESPressio Command >= 0.2.0 < 1.0.0', 'ESPressio Command >= 0.3.0 < 1.0.0'), + ('ESPressio Security >= 0.1.0 < 1.0.0', 'ESPressio Security >= 0.2.0 < 1.0.0'), + ('https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0', 'https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1'), + ('https://github.com/Flowduino/ESPressio-Timing@^2.2.2', 'https://github.com/Flowduino/ESPressio-Timing@^2.2.3'), + ('The 0.5.0 development branch additionally exposes `IESPNowTransportObserver` through the core transport.', '`IESPNowTransportObserver` is part of the current 0.5.x core transport API.'), + ] + for old, new in replacements: + if old not in text: + raise SystemExit(f'missing expected README text: {old}') + text = text.replace(old, new, 1) path.write_text(text) - name: Commit README run: | From be60d7c596ffac7cfc3022525faf89648fcff0bd Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:53:03 +0200 Subject: [PATCH 08/16] ci: make ESP-Now README refresh tolerant (#10) --- .github/workflows/readme-refresh.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml index 0d394b6..adb767d 100644 --- a/.github/workflows/readme-refresh.yml +++ b/.github/workflows/readme-refresh.yml @@ -22,9 +22,10 @@ jobs: from pathlib import Path path = Path('README.md') text = path.read_text() - start = text.index('## Latest Stable Version') - end = text.index('## Compatibility', start) - current = """## Current Version — 0.5.1 + start = text.find('## Latest Stable Version') + end = text.find('## Compatibility', start) + if start >= 0 and end > start: + current = """## Current Version — 0.5.1 ESPressio ESP-Now 0.5.1 is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. @@ -46,7 +47,7 @@ Optional Secure Transport The Event relationship intentionally remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration (or a dedicated integration package). """ - text = text[:start] + current + text[end:] + text = text[:start] + current + text[end:] replacements = [ ('ESPressio ESP-Now `0.4.0` targets the ESP32 family under Arduino-ESP32 and requires C++17.', 'ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17.'), ('### Required for stable 0.4.0', '### Required for 0.5.1'), @@ -60,8 +61,6 @@ The Event relationship intentionally remains a compatible 5.x opt-in range rathe ('The 0.5.0 development branch additionally exposes `IESPNowTransportObserver` through the core transport.', '`IESPNowTransportObserver` is part of the current 0.5.x core transport API.'), ] for old, new in replacements: - if old not in text: - raise SystemExit(f'missing expected README text: {old}') text = text.replace(old, new, 1) path.write_text(text) - name: Commit README From 1085ef31c968e8dbc9d2904a5505836e3523eb02 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:56:01 +0200 Subject: [PATCH 09/16] ci: validate ESP-Now 0.5.1 against dependency candidates (#10) --- .github/workflows/host-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/host-tests.yml b/.github/workflows/host-tests.yml index 1d13025..0d563f0 100644 --- a/.github/workflows/host-tests.yml +++ b/.github/workflows/host-tests.yml @@ -4,7 +4,7 @@ on: push: branches: - main - - feature/observable-callback-coverage + - feature/10-timing-2.2.3-dependency-refresh pull_request: branches: - main @@ -53,13 +53,13 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: 2.2.2 + ref: feature/5-units-0.2.2-dependency-refresh path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: 0.2.1 + ref: feature/2-serializable-0.10.1-dependency-refresh path: deps/ESPressio-Units - uses: actions/checkout@v4 From 953e21e1ad8aa7e4e4792a8add2c96c3238359f2 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:56:16 +0200 Subject: [PATCH 10/16] ci: validate ESP-Now security integration against Timing 2.2.3 candidate (#10) --- .github/workflows/security-integration-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/security-integration-tests.yml b/.github/workflows/security-integration-tests.yml index c056ecb..2e8f66e 100644 --- a/.github/workflows/security-integration-tests.yml +++ b/.github/workflows/security-integration-tests.yml @@ -2,7 +2,7 @@ name: Security Integration on: push: - branches: [feature/security-integration, feature/observable-callback-coverage, main] + branches: [feature/security-integration, feature/10-timing-2.2.3-dependency-refresh, main] pull_request: branches: [main] @@ -43,12 +43,12 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: 2.2.2 + ref: feature/5-units-0.2.2-dependency-refresh path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: 0.2.1 + ref: feature/2-serializable-0.10.1-dependency-refresh path: deps/ESPressio-Units - uses: actions/checkout@v4 with: From 474b2372cb5d63c34ed6194d2f1bb6ccde1f1b67 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:00:51 +0200 Subject: [PATCH 11/16] chore: trigger ESP-Now #10 dependency-refresh documentation workflow --- .dependency-refresh-trigger | 1 + 1 file changed, 1 insertion(+) create mode 100644 .dependency-refresh-trigger diff --git a/.dependency-refresh-trigger b/.dependency-refresh-trigger new file mode 100644 index 0000000..e261adc --- /dev/null +++ b/.dependency-refresh-trigger @@ -0,0 +1 @@ +temporary trigger for ESP-Now #10 dependency-refresh README normalization From 38802d0733affc9d2452d29f3eb1fd3d65705d3e Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:02:58 +0200 Subject: [PATCH 12/16] docs: normalize ESP-Now 0.5.1 release documentation (#10) --- README.md | 79 +++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 81ee7d2..be73c88 100755 --- a/README.md +++ b/README.md @@ -2,24 +2,20 @@ ESP-NOW transport and distributed ESPressio implementations for the Flowduino ESPressio Development Platform. -ESPressio ESP-Now provides a reusable ESP-NOW transport foundation for ESP32-family applications, distributed System Clock synchronization, optional Event and Command transports, and from 0.4.0 an optional transport-neutral authenticated-encryption layer through ESPressio Security. +ESPressio ESP-Now provides a reusable ESP-NOW transport foundation for ESP32-family applications, distributed System Clock synchronization, optional Event and Command transports, and optional transport-neutral authenticated encryption through ESPressio Security. -## Latest Stable Version +## Current Version — 0.5.1 -The latest Stable Version is **0.4.0**. +ESPressio ESP-Now **0.5.1** is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. -## Current Development Version — 0.5.0 - -The `feature/observable-callback-coverage` branch targets **0.5.0** and adds native Observable coverage for ESP-NOW transport and peer lifecycle without replacing the existing protocol-handler receive path. - -For this development branch, the dependency model is: +Current dependency model: ```text Required - ESPressio Timing >= 2.2.2 < 3.0.0 + ESPressio Timing >= 2.2.3 < 3.0.0 ESPressio Observable >= 3.0.1 < 4.0.0 -Optional Event Transport / observer bridge +Optional Event Transport ESPressio Event >= 5.8.0 < 6.0.0 Optional Command Transport @@ -29,15 +25,13 @@ Optional Secure Transport ESPressio Security >= 0.2.0 < 1.0.0 ``` -`ESPNowTransport` now exposes observable initialization, shutdown, peer-add/remove, and send success/failure lifecycle information. Protocol receive handlers remain the authoritative data-delivery mechanism. +`ESPNowTransport` exposes observable initialization, shutdown, peer-add/remove, and send success/failure lifecycle information. Protocol receive handlers remain the authoritative data-delivery mechanism. -ESPressio Event remains **opt-in**. Event 5.8 provides `ESPNowTransportEventBridge`; ESP-Now itself does not depend on Event. ESPressio Serial 0.5 can consume the same observer contract directly for diagnostics. - -The stable-release documentation below remains intact so existing 0.4.0 users retain accurate historical guidance. +The Event relationship deliberately remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge. Strengthening both directions would reinforce a circular optional dependency. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration, or into a dedicated integration package. ## Compatibility -ESPressio ESP-Now `0.4.0` targets the ESP32 family under Arduino-ESP32 and requires C++17. +ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17. The common ESP-NOW transport uses Espressif ESP-NOW/Wi-Fi APIs plus FreeRTOS queues/tasks. The initial ESPressio wire format remains within the classic 250-byte ESP-NOW payload limit for broad compatibility, while higher-level Event, Command, and Security integrations provide their own bounded fragmentation where required. @@ -58,26 +52,27 @@ ESPressio and its component libraries are licensed under the **Apache License 2. ## ESPressio Library Dependencies -### Required for stable 0.4.0 +### Required for 0.5.1 ```text -ESPressio Timing >= 2.2.2 < 3.0.0 +ESPressio Timing >= 2.2.3 < 3.0.0 +ESPressio Observable >= 3.0.1 < 4.0.0 Arduino-ESP32 ``` -The 0.5.0 development branch additionally requires ESPressio Observable >= 3.0.1 < 4.0.0 as documented above. +Timing 2.2.3 carries Units 0.2.2 downstream. Serializable remains optional through selected Serializable Unit/Event facilities and is not a core ESP-Now dependency. -### Optional for stable 0.4.0 +### Optional for 0.5.1 ```text Event Transport - ESPressio Event >= 5.7.1 < 6.0.0 + ESPressio Event >= 5.8.0 < 6.0.0 Command Transport - ESPressio Command >= 0.2.0 < 1.0.0 + ESPressio Command >= 0.3.0 < 1.0.0 Secure Transport - ESPressio Security >= 0.1.0 < 1.0.0 + ESPressio Security >= 0.2.0 < 1.0.0 ``` Optional integrations are intentionally not pulled into the normal umbrella merely because their implementations exist. @@ -107,16 +102,17 @@ ESPNowSecureTransport (optional Security dependency) ESPNowSecurityProtocol ``` -The 0.5.0 development branch additionally exposes `IESPNowTransportObserver` through the core transport. +`IESPNowTransportObserver` is part of the current 0.5.x core transport API. ## PlatformIO -Core ESP-NOW/Timing usage for stable 0.4.0: +Core ESP-NOW/Timing usage: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Timing@^2.2.3 + https://github.com/Flowduino/ESPressio-Observable@^3.0.1 build_flags = -std=gnu++17 @@ -130,12 +126,10 @@ Add Security when selecting the secure adapter: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Security@^0.1.0 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Security@^0.2.0 ``` -For the 0.5.0 development branch, also include ESPressio Observable 3.0.1 or newer within the 3.x line, and use the Command/Security floors listed in the development-version section above. - Add Command/Event dependencies only when those adapters are selected. ## Header Structure @@ -192,7 +186,7 @@ transport.AddPeer(peer); `peer.Encrypt` controls native ESP-NOW link encryption and remains independent of ESPressio Security application/transport-layer protection. -In the 0.5.0 development branch, successful peer additions/removals and failed peer-management operations are also available through the transport observer contract. +Successful peer additions/removals and failed peer-management operations are available through the transport observer contract. ## ESPressio ESP-NOW Wire Format @@ -205,7 +199,7 @@ protocol identifier payload length ``` -Protocol allocation in 0.4.0 is: +Protocol allocation is: ```text 1 Clock Synchronization @@ -248,7 +242,7 @@ Call `sync.Update()` regularly for Client modes. The Event integration remains distinct from Command and Security semantics. -The 0.5.0 observer-to-Event bridge is also supplied by ESPressio Event 5.8 rather than by the core ESP-Now umbrella, preserving the dependency direction. +For 0.5.x compatibility, `ESPNowTransportEventBridge` remains supplied by ESPressio Event 5.8. The dependency audit for issue #10 identifies this reciprocal optional relationship as architectural debt: because ESP-Now already consumes Event for `ESPNowEventTransport`, the bridge should ultimately move downstream into this Event integration rather than requiring Event to consume ESP-Now. ## Command Transport @@ -258,7 +252,7 @@ Features include correlation IDs, fragmentation/reassembly, per-peer isolation, ## Secure Transport -0.4.0 introduces `ESPNowSecureTransport` backed by ESPressio Security 0.1.x. +0.4.0 introduced `ESPNowSecureTransport`, backed by ESPressio Security. Architecture: @@ -320,7 +314,7 @@ secure.SetReceiveHandler( ); ``` -Security failures can be observed with the existing secure-adapter failure mechanism without exposing secret key material; the 0.5.0 transport observer adds general ESP-NOW transport/peer lifecycle diagnostics rather than duplicating the Security observer contract. +Security failures can be observed with the existing secure-adapter failure mechanism without exposing secret key material; the 0.5.x transport observer adds general ESP-NOW transport/peer lifecycle diagnostics rather than duplicating the Security observer contract. See [SECURITY_INTEGRATION.md](SECURITY_INTEGRATION.md). @@ -366,20 +360,19 @@ ESPNowSecurityProtocol Security-protocol tests cover protocol allocation, fragmentation, out-of-order reassembly, duplicate fragments, malformed frames, and maximum envelope bounds. -The 0.5.0 development branch additionally validates the native transport observer contract and the refreshed Observable/Command/Security dependency generation. GitHub Actions also compile real ESP32 examples against the coordinated dependencies. +The 0.5.1 candidate validates the native transport observer contract and the refreshed Timing/Units/Observable dependency generation. GitHub Actions also compile real ESP32 examples against the coordinated dependencies. ## Compatibility -0.4.0 is a backward-compatible minor release: +0.5.1 is a backward-compatible dependency-maintenance patch: -- core `ESPNowTransport` APIs are unchanged; +- core `ESPNowTransport` APIs are unchanged from 0.5.0; - clock synchronization APIs are unchanged; - Event Transport APIs are unchanged; - Command Transport APIs are unchanged; -- Security integration is opt-in; -- core ESP-NOW does not acquire a mandatory Security dependency. - -The 0.5.0 development branch is designed as a backward-compatible minor extension. Observable becomes a required core dependency because the core transport now owns its lifecycle observation; Event, Command, and Security integrations remain opt-in. +- Security integration remains opt-in; +- Observable remains the required lifecycle-observation dependency introduced by 0.5.0; +- Event, Command, and Security integrations remain opt-in. ## Contributing @@ -391,4 +384,4 @@ See [CHANGELOG.md](CHANGELOG.md). ## License -Apache License 2.0. See [LICENSE](LICENSE). +Apache License 2.0. See [LICENSE](LICENSE). \ No newline at end of file From 262a5bea4c8c3e6dee52773b37e2eb520b00d04b Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:06:04 +0200 Subject: [PATCH 13/16] chore: remove temporary ESP-Now README helper (#10) --- .github/workflows/readme-refresh.yml | 73 ---------------------------- 1 file changed, 73 deletions(-) delete mode 100644 .github/workflows/readme-refresh.yml diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml deleted file mode 100644 index adb767d..0000000 --- a/.github/workflows/readme-refresh.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Refresh dependency README - -on: - push: - branches: - - feature/10-timing-2.2.3-dependency-refresh - -permissions: - contents: write - -jobs: - refresh: - if: github.actor != 'github-actions[bot]' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: feature/10-timing-2.2.3-dependency-refresh - - name: Refresh current-version documentation - shell: python - run: | - from pathlib import Path - path = Path('README.md') - text = path.read_text() - start = text.find('## Latest Stable Version') - end = text.find('## Compatibility', start) - if start >= 0 and end > start: - current = """## Current Version — 0.5.1 - -ESPressio ESP-Now 0.5.1 is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. - -```text -Required - ESPressio Timing >= 2.2.3 < 3.0.0 - ESPressio Observable >= 3.0.1 < 4.0.0 - -Optional Event Transport - ESPressio Event >= 5.8.0 < 6.0.0 - -Optional Command Transport - ESPressio Command >= 0.3.0 < 1.0.0 - -Optional Secure Transport - ESPressio Security >= 0.2.0 < 1.0.0 -``` - -The Event relationship intentionally remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration (or a dedicated integration package). - -""" - text = text[:start] + current + text[end:] - replacements = [ - ('ESPressio ESP-Now `0.4.0` targets the ESP32 family under Arduino-ESP32 and requires C++17.', 'ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17.'), - ('### Required for stable 0.4.0', '### Required for 0.5.1'), - ('ESPressio Timing >= 2.2.2 < 3.0.0\nArduino-ESP32', 'ESPressio Timing >= 2.2.3 < 3.0.0\nESPressio Observable >= 3.0.1 < 4.0.0\nArduino-ESP32'), - ('### Optional for stable 0.4.0', '### Optional for 0.5.1'), - ('ESPressio Event >= 5.7.1 < 6.0.0', 'ESPressio Event >= 5.8.0 < 6.0.0'), - ('ESPressio Command >= 0.2.0 < 1.0.0', 'ESPressio Command >= 0.3.0 < 1.0.0'), - ('ESPressio Security >= 0.1.0 < 1.0.0', 'ESPressio Security >= 0.2.0 < 1.0.0'), - ('https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0', 'https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1'), - ('https://github.com/Flowduino/ESPressio-Timing@^2.2.2', 'https://github.com/Flowduino/ESPressio-Timing@^2.2.3'), - ('The 0.5.0 development branch additionally exposes `IESPNowTransportObserver` through the core transport.', '`IESPNowTransportObserver` is part of the current 0.5.x core transport API.'), - ] - for old, new in replacements: - text = text.replace(old, new, 1) - path.write_text(text) - - name: Commit README - run: | - if git diff --quiet -- README.md; then exit 0; fi - git config user.name 'github-actions[bot]' - git config user.email '41898282+github-actions[bot]@users.noreply.github.com' - git add -- README.md - git commit -m 'docs: refresh ESP-Now 0.5.1 README (#10)' - git push origin HEAD:feature/10-timing-2.2.3-dependency-refresh From ecd4c5c116b9d95150dc334e06c84ddfb26c6895 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:06:12 +0200 Subject: [PATCH 14/16] chore: remove temporary ESP-Now dependency-refresh trigger (#10) --- .dependency-refresh-trigger | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .dependency-refresh-trigger diff --git a/.dependency-refresh-trigger b/.dependency-refresh-trigger deleted file mode 100644 index e261adc..0000000 --- a/.dependency-refresh-trigger +++ /dev/null @@ -1 +0,0 @@ -temporary trigger for ESP-Now #10 dependency-refresh README normalization From 6287ac0ea3dfeadbbd07458520ccc9162be8179c Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:31:55 +0200 Subject: [PATCH 15/16] ci: validate released Timing 2.2.3 and Units 0.2.2 (#10) --- .github/workflows/host-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/host-tests.yml b/.github/workflows/host-tests.yml index 0d563f0..9292fb9 100644 --- a/.github/workflows/host-tests.yml +++ b/.github/workflows/host-tests.yml @@ -53,13 +53,13 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: feature/5-units-0.2.2-dependency-refresh + ref: 2.2.3 path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: feature/2-serializable-0.10.1-dependency-refresh + ref: 0.2.2 path: deps/ESPressio-Units - uses: actions/checkout@v4 From 6ff43d8f846c945d826c209b79edf0ec7bd6d7b4 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:33:26 +0200 Subject: [PATCH 16/16] ci: validate security integration against released dependencies (#10) --- .github/workflows/security-integration-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/security-integration-tests.yml b/.github/workflows/security-integration-tests.yml index 2e8f66e..bdd118d 100644 --- a/.github/workflows/security-integration-tests.yml +++ b/.github/workflows/security-integration-tests.yml @@ -43,12 +43,12 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: feature/5-units-0.2.2-dependency-refresh + ref: 2.2.3 path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: feature/2-serializable-0.10.1-dependency-refresh + ref: 0.2.2 path: deps/ESPressio-Units - uses: actions/checkout@v4 with: