From cab2da4e083a158734c0ca8cf4231a1db30306ee Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:42:28 +0200 Subject: [PATCH 01/14] chore: prepare Event 5.8.1 dependency metadata (#19) --- library.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library.json b/library.json index 3df4622..8ced8db 100644 --- a/library.json +++ b/library.json @@ -21,14 +21,14 @@ "type": "git", "url": "https://github.com/Flowduino/ESPressio-Event.git" }, - "version": "5.8.0", + "version": "5.8.1", "license": "Apache-2.0", "frameworks": "arduino", "platforms": "espressif32", "dependencies": [ { "name": "ESPressio-Threads", - "version": ">=3.1.2 <4.0.0", + "version": ">=3.1.3 <4.0.0", "url": "https://github.com/Flowduino/ESPressio-Threads.git", "platforms": "espressif32" }, @@ -41,7 +41,7 @@ { "owner": "flowduino", "name": "ESPressio-Timing", - "version": ">=2.2.2 <3.0.0" + "version": ">=2.2.3 <3.0.0" } ] } From e72cec3b2a15bc109cb130070aba6d574d893fcb Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:42:38 +0200 Subject: [PATCH 02/14] chore: prepare Event 5.8.1 Arduino metadata (#19) --- library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 6263617..28088b0 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Flowduino ESPressio-Event -version=5.8.0 +version=5.8.1 author=Simon J. Stuart maintainer=Flowduino.com sentence=Event-driven development library for ESP32 microcontrollers @@ -8,4 +8,4 @@ category=Communication url=https://github.com/Flowduino/ESPressio-Event architectures=esp32 includes=ESPressio_Event.hpp,ESPressio_EventThread.hpp,ESPressio_PrecisionEventThread.hpp -depends=ESPressio-Threads (>=3.1.2 && <4.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0),Flowduino ESPressio-Timing (>=2.2.2 && <3.0.0) +depends=ESPressio-Threads (>=3.1.3 && <4.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0),Flowduino ESPressio-Timing (>=2.2.3 && <3.0.0) From 64e2c59083c325268e69f8277ae70b52c1de8c7a Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:42:46 +0200 Subject: [PATCH 03/14] chore: update Event component version to 5.8.1 (#19) --- component.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/component.mk b/component.mk index 8941fa7..5674c90 100644 --- a/component.mk +++ b/component.mk @@ -5,7 +5,7 @@ COMPONENT_REQUIRES := ESPressio_Threads ESPressio_Observable ESPressio_Timing CXXFLAGS += -DESPRESSIO_EVENT CXXFLAGS += -DESPRESSIO_EVENT_VERSION_MAJOR=5 CXXFLAGS += -DESPRESSIO_EVENT_VERSION_MINOR=8 -CXXFLAGS += -DESPRESSIO_EVENT_VERSION_PATCH=0 -CXXFLAGS += -DESPRESSIO_EVENT_VERSION_STRING=\"5.8.0\" +CXXFLAGS += -DESPRESSIO_EVENT_VERSION_PATCH=1 +CXXFLAGS += -DESPRESSIO_EVENT_VERSION_STRING=\"5.8.1\" CXXFLAGS += -std=gnu++17 From e996f7941cca12f31bc2ec81d3d1e8a4d06d1fd3 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:43:02 +0200 Subject: [PATCH 04/14] docs: refresh Event 5.8.1 dependency chart (#19) --- ESPRESSIO_DEPENDENCY_CHART.md | 374 ++++++++-------------------------- 1 file changed, 88 insertions(+), 286 deletions(-) diff --git a/ESPRESSIO_DEPENDENCY_CHART.md b/ESPRESSIO_DEPENDENCY_CHART.md index 76f7e56..1696337 100644 --- a/ESPRESSIO_DEPENDENCY_CHART.md +++ b/ESPRESSIO_DEPENDENCY_CHART.md @@ -1,335 +1,137 @@ -# ESPressio Dependency Chart +# ESPressio Dependency Chart — Event 5.8.1 ![ESPressio Library Dependency Chart](ESPRESSIO_DEPENDENCY_CHART.png) -## Purpose - -This document describes the dependency relationships between the current ESPressio libraries and the validated release baselines used by the 2026-08-20 dependency-refresh generation. - -The chart is hierarchical: libraries with no **required** ESPressio dependencies are positioned at the top, while libraries that build on progressively more of the ESPressio ecosystem appear lower in the hierarchy. - -### Relationship notation - -- **Solid arrow** — a required ESPressio library dependency. -- **Dashed arrow** — an opt-in relationship. The dependency is required only when the consuming application selects the associated feature, integration, type, or header. -- Arrows point from the **dependent library** to the **library it consumes**. - -Optional integrations are intentionally kept out of the normal/core include path wherever possible so that a project does not acquire unrelated ESPressio dependencies simply by consuming a library. - ---- - -## ESPressio Units 0.2.1 - -**Required ESPressio dependencies: none.** - -ESPressio Units is a foundational library providing strongly typed physical quantities and unit representations. - -### Units → Serializable — opt-in - -Ordinary Unit headers do not require ESPressio Serializable. Serializable counterparts are supplied through separate `*_Serializable.hpp` headers and the `ESPressio_SerializableUnits.hpp` batch header. +## Required dependencies ```text -ordinary Unit type - -> ESPressio Units only - -Serializable Unit type - -> ESPressio Units - -> ESPressio Serializable +ESPressio Event 5.8.1 + -> ESPressio Threads >= 3.1.3 < 4.0.0 + -> ESPressio Timing >= 2.2.3 < 3.0.0 + -> ESPressio Observable >= 3.0.1 < 4.0.0 ``` ---- - -## ESPressio Observable 3.0.1 - -**Required ESPressio dependencies: none.** - -Observable is the foundational synchronous observation/notification mechanism. Version 3.0.1 adds the zero-Observer fast path used by higher-frequency consumers without changing the public Observer contract. - -It is directly consumed by: - -- ESPressio Timing; -- ESPressio Threads; -- ESPressio Event. - ---- - -## ESPressio Serializable 0.10.0 - -**Required ESPressio dependencies: none.** - -Serializable is the foundational serialization framework. Version 0.10.0 adds direct ESPB v2 binary serialization/deserialization while preserving the existing archive/tree APIs and wire representation. - -Current opt-in relationships include: - -- ESPressio Units → Serializable for Serializable Unit variants; -- ESPressio Event → Serializable for Serializable Events, runtime Serializable Event construction, and Event Transport; -- ESPressio Serial → Serializable for EventConsole/EventMonitor integrations that consume Serializable payload facilities. - ---- - -## ESPressio Timing 2.2.2 - -**Required ESPressio dependencies:** - -- ESPressio Units `>=0.2.1 <1.0.0`; -- ESPressio Observable `>=3.0.1 <4.0.0`. - -### Timing → Units — required - -Timing uses ESPressio Units for its strongly typed time representations. - -### Timing → Observable — required - -Timing exposes logical clock and synchronization lifecycle notifications through ESPressio Observable. The 2.2.2 patch explicitly raises the Observable floor to 3.0.1. - -Timing itself does not directly require Serializable. Serializable Unit time representations remain selected by the consuming application through the Units integration. - ---- - -## ESPressio Threads 3.1.2 - -**Required ESPressio dependencies:** - -- ESPressio Timing `>=2.2.2 <3.0.0`; -- ESPressio Observable `>=3.0.1 <4.0.0`. - -### Threads → Timing — required - -Threads uses Timing for PrecisionThread time-related execution and scheduling infrastructure. - -### Threads → Observable — required - -Threads uses Observable for synchronous Thread and singleton-infrastructure lifecycle notifications. - -The 3.1.2 patch raises both dependency floors to the refreshed upstream patch generation. - ---- - -## ESPressio Event 5.7.1 - -**Required ESPressio dependencies:** - -- ESPressio Threads `>=3.1.2 <4.0.0`; -- ESPressio Timing `>=2.2.2 <3.0.0`; -- ESPressio Observable `>=3.0.1 <4.0.0`. - -### Event → Threads — required - -Event uses ESPressio Threads for asynchronous Event processing and execution infrastructure. - -### Event → Timing — required - -Event uses Timing for Event lifecycle timing and the optional System Clock Event Bridge. - -### Event → Observable — required - -Observable is used directly by Event and by the Observer/Event bridge architecture. - -### Event → Serializable — opt-in - -Ordinary local Event usage does not require Serializable. - -Serializable Event support, runtime Serializable Event construction and Event Transport use ESPressio Serializable 0.10.0 or newer within the current 0.x integration line. Event 5.7 uses the 0.10.0 direct ESPB v2 binary path for normal same-schema transport while retaining the archive path for migration/compatibility cases. +The transitive required chain is: ```text -ordinary local Event - -> no Serializable requirement - -Serializable / remotely transported Event - -> ESPressio Serializable +Event 5.8.1 + -> Threads 3.1.3 + -> Timing 2.2.3 + -> Units 0.2.2 + -> Observable 3.0.1 + -> Timing 2.2.3 + -> Units 0.2.2 + -> Observable 3.0.1 + -> Observable 3.0.1 ``` ---- - -## ESPressio ESP-Now 0.2.3 - -**Required ESPressio dependencies:** - -- ESPressio Timing `>=2.2.2 <3.0.0`. - -### ESP-Now → Timing — required - -ESP-Now provides ESP-NOW-based distributed System Clock synchronization and submits transport-specific observations to ESPressio Timing. +## Optional Serializable integration -### ESP-Now → Event — opt-in +Ordinary local Event use does not require Serializable. Serializable Events, +runtime Serializable Event construction, and Event Transport require: -`ESPNowEventTransport` implements the ESPressio Event transport abstraction. The validated 0.2.3 integration baseline is ESPressio Event 5.7.1 within the 5.x line. - -Applications using ESP-Now only for communication and/or System Clock synchronization do not acquire Event or Serializable dependencies. - ---- - -## ESPressio Sockets 0.2.3 - -**Required ESPressio dependencies: none.** - -The core Sockets library deliberately has no mandatory ESPressio dependency. - -### Sockets → Event — opt-in - -UDP, TCP, TLS, WebSocket and MQTT Event Transport adapters implement the ESPressio Event transport abstraction. The validated 0.2.3 baseline is Event 5.7.1 within the 5.x line. - -### Sockets → Timing — opt-in - -Socket/SNTP System Clock synchronization implementations consume ESPressio Timing. The validated 0.2.3 baseline is Timing 2.2.2 within the 2.x line. - ---- - -## ESPressio Serial 0.3.3 +```text +ESPressio Serializable >= 0.10.1 < 1.0.0 +``` -**Required ESPressio dependencies: none.** +Serializable 0.10.1 preserves the ESPB v2 wire representation while adding +bounded/allocation-free inspection facilities. Event's transport wire format is +unchanged by this dependency refresh. -The core Serial, Console, logging and diagnostic foundations deliberately remain usable without mandatory ESPressio dependencies. +## Optional Observer-to-Event bridges -Optional integrations are independently selected: +Event 5.8.x provides opt-in bridges for Observable contracts from: -- System Clock Monitor → Timing `>=2.2.2 <3.0.0`; -- Thread Monitor → Threads `>=3.1.2 <4.0.0`; -- Event Monitor/EventConsole → Event `>=5.7.1 <6.0.0`; -- Serializable payload/JSON facilities used by Event tooling → Serializable `>=0.10.0` within the compatible 0.x integration line. +```text +Security >= 0.2.0 < 1.0.0 +Command >= 0.3.0 < 1.0.0 +Sockets >= 0.5.0 < 1.0.0 +ESP-Now >= 0.5.0 < 1.0.0 +``` ---- +These integrations must remain optional. Security, Command, Sockets and ESP-Now +do not become mandatory Event dependencies merely because bridge headers exist. -## Required-dependency hierarchy +## Current coordinated ecosystem ```text FOUNDATIONAL -├── ESPressio Units 0.2.1 -├── ESPressio Observable 3.0.1 -├── ESPressio Serializable 0.10.0 -├── ESPressio Sockets 0.2.3 -└── ESPressio Serial 0.3.3 +├── Observable 3.0.1 +├── Serializable 0.10.1 +├── Units 0.2.2 +├── Security 0.2.0 +└── Command 0.3.0 RUNTIME -└── ESPressio Timing 2.2.2 - ├── Units >=0.2.1 <1.0.0 - └── Observable >=3.0.1 <4.0.0 - -EXECUTION / COMMUNICATION -├── ESPressio Threads 3.1.2 -│ ├── Timing >=2.2.2 <3.0.0 -│ └── Observable >=3.0.1 <4.0.0 -│ -└── ESPressio ESP-Now 0.2.3 - └── Timing >=2.2.2 <3.0.0 - -EVENT INFRASTRUCTURE -└── ESPressio Event 5.7.1 - ├── Threads >=3.1.2 <4.0.0 - ├── Timing >=2.2.2 <3.0.0 - └── Observable >=3.0.1 <4.0.0 -``` - -## Opt-in cross-cutting relationships +└── Timing 2.2.3 -```text -Units - - - -> Serializable - Serializable Unit variants +EXECUTION +└── Threads 3.1.3 -Event - - - -> Serializable - Serializable Events / runtime construction / Event Transport - -ESP-Now - - - -> Event - ESP-NOW Event Transport - -Sockets - - - -> Event - socket Event Transports - -Sockets - - - -> Timing - socket/SNTP clock synchronization - -Serial - - - -> Timing - System Clock Monitor - - - -> Threads - Thread Monitor - - - -> Event - Event Monitor / EventConsole - - - -> Serializable - Event payload representation / JSON composition -``` +TRANSPORT / INTEGRATION +├── Sockets 0.5.0 +└── ESP-Now 0.5.1 ---- +EVENT +└── Event 5.8.1 -## Dependency-refresh release order +DIAGNOSTICS / OPERATOR +└── Serial 0.5.1 +``` -When only dependency baselines change, downstream patch releases must consume the already-bumped upstream patch release rather than the pre-refresh version. +## Circular-dependency audit -For the 2026-08-20 cascade the release order is: +There is one currently known reciprocal optional relationship: ```text -Observable 3.0.1 already released -Serializable 0.10.0 already released - | - v -Timing 2.2.2 - | - v -Threads 3.1.2 - | - v -Event 5.7.1 - | - +--> ESP-Now 0.2.3 - +--> Sockets 0.2.3 - +--> Serial 0.3.3 -``` - -This ensures every downstream release advertises the newest upstream patch generation that existed when that downstream release was validated. - ---- +ESP-Now - - -> Event + ESPNowEventTransport -## Architectural principle +Event - - -> ESP-Now + ESPNowTransportEventBridge +``` -The dependency graph follows a general ESPressio design rule: +Although neither edge is mandatory, this violates the desired dependency rule: +integration dependencies should cascade downstream and must not point back into +a consumer that already depends on the abstraction. -> A foundational library should expose the synchronous or transport-neutral abstraction it owns; higher-level integration libraries should opt into that abstraction rather than forcing the foundational library to depend upward. +### Preferred resolution -Examples include: +Event should remain the upstream, transport-neutral abstraction. The +ESP-Now-specific Observer-to-Event bridge should move downstream: ```text -Timing - exposes Observer notifications - Event - optionally bridges those notifications into Events + ^ + | + | optional + | +ESP-Now Event integration + ├── ESPNowEventTransport + └── ESPNowTransportEventBridge ``` -```text -Timing - exposes transport-neutral clock synchronization - -ESP-Now / Sockets - provide concrete synchronization transports -``` +A dedicated integration package would also be valid if keeping both libraries +completely unaware of one another is preferable. -```text -Event - exposes transport-neutral Event Transport +Until that relocation occurs, Event 5.8.1 does not add or strengthen any new +Event -> ESP-Now package-level dependency. The existing bridge remains available +for compatibility only. -ESP-Now / Sockets - provide concrete Event transports -``` +## Dependency-direction rule -```text -Units - provides ordinary Unit types +> A library should expose the abstraction it owns. Integration code that adds a +> new dependency belongs downstream of that abstraction. -Units + Serializable - optionally provides Serializable Unit variants -``` +Examples: ```text -Serial - provides dependency-free core console/logging facilities +Timing owns clock discipline + -> ESP-Now / Sockets provide concrete synchronization transports -Serial + selected ESPressio integrations - adds monitors and runtime Event tooling only when requested -``` +Event owns Event semantics and transport abstraction + -> ESP-Now / Sockets provide concrete Event transports -This keeps the individual libraries independently useful while allowing progressively richer ESPressio compositions without imposing unnecessary dependencies on applications that do not use those integrations. +Observable libraries own synchronous lifecycle contracts + -> Event can bridge them only when doing so does not create a reverse edge +``` From fa9e8fc4ee31a2361539c4a43e9d5f4fd68f8397 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:43:40 +0200 Subject: [PATCH 05/14] docs: record Event 5.8.1 dependency refresh (#19) --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca49fda..bb2b15a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 5.8.1 — 2026-08-20 + +### Changed +- Raised the required ESPressio Threads baseline from 3.1.2 to 3.1.3. +- Raised the required ESPressio Timing baseline from 2.2.2 to 2.2.3. +- Raised the optional ESPressio Serializable baseline from 0.10.0 to 0.10.1 for Serializable Events, runtime construction and Event Transport integrations. +- Preserved the required ESPressio Observable baseline at `>=3.0.1 <4.0.0`. +- Updated package and ESP-IDF component metadata for Event 5.8.1. +- Documented the reciprocal optional Event/ESP-Now dependency as an architectural exception: the preferred long-term resolution is to relocate `ESPNowTransportEventBridge` downstream into ESP-Now's Event integration (or a dedicated integration package), keeping Event transport-neutral. + +### Compatibility +- No Event, EventThread, listener, Observer, Event Transport, routing, bridge or wire-format API changes are introduced by this dependency-maintenance release. +- Security, Command, Sockets, ESP-Now and Serializable remain opt-in where applicable. + ## 5.8.0 — 2026-08-20 ### Added From 3a4d3f380142fa90f8c96139a243a1fdbe993fc7 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:49:07 +0200 Subject: [PATCH 06/14] ci: refresh Event 5.8.1 README on feature branch (#19) --- .github/workflows/readme-refresh.yml | 114 +++++++++++++++++++++++++++ 1 file changed, 114 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..ef75aa2 --- /dev/null +++ b/.github/workflows/readme-refresh.yml @@ -0,0 +1,114 @@ +name: Refresh dependency README + +on: + push: + branches: + - feature/19-dependency-refresh-5.8.1 + +permissions: + contents: write + +jobs: + refresh: + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: feature/19-dependency-refresh-5.8.1 + - 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 — 5.8.1 + +ESPressio Event 5.8.1 is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing the required and optional dependency baselines. + +Current dependency baselines: + +```text +Required + ESPressio Threads >= 3.1.3 < 4.0.0 + ESPressio Timing >= 2.2.3 < 3.0.0 + ESPressio Observable >= 3.0.1 < 4.0.0 + +Optional Serializable Event / Event Transport + ESPressio Serializable >= 0.10.1 < 1.0.0 + +Optional observer bridge sources + ESPressio Security >= 0.2.0 < 1.0.0 + ESPressio Command >= 0.3.0 < 1.0.0 + ESPressio Sockets >= 0.5.0 < 1.0.0 + ESPressio ESP-Now >= 0.5.0 < 1.0.0 +``` + +The 5.8.1 patch does not add new bridge APIs or alter Event wire formats. It also documents that the Sockets-specific and ESP-Now-specific bridges currently create reciprocal optional dependency edges because those transport libraries already consume Event for concrete Event transports. The preferred future architecture moves those transport-specific bridges downstream into their respective Event integration layers (or dedicated integration packages), leaving Event transport-neutral. + +''' + text = text[:start] + current + text[end:] + + dep_start = text.index('### Required dependencies') + dep_end_marker = '------------------------------------------------------------------------\n\n# What is Event-Driven Observer Pattern?' + dep_end = text.index(dep_end_marker, dep_start) + deps = '''### Required dependencies + +Normal Event applications require: + +```ini +lib_deps = + flowduino/ESPressio-Event@^5.8.1 +``` + +The mandatory dependency graph is: + +```text +ESPressio Event 5.8.1 + | + +-- ESPressio Threads >= 3.1.3 < 4.0.0 + | + +-- ESPressio Observable >= 3.0.1 < 4.0.0 + | + +-- ESPressio Timing >= 2.2.3 < 3.0.0 +``` + +Timing carries Units 0.2.2 downstream. ESPressio Serializable is **not** a mandatory Event dependency; it is required only when Serializable Events, runtime Serializable Event construction, or Event Transport are selected: + +```text +ESPressio Serializable >= 0.10.1 < 1.0.0 +``` + +Security, Command, Sockets and ESP-Now remain optional bridge dependencies only. In particular, no new package-level Event -> Sockets or Event -> ESP-Now dependency is introduced by 5.8.1. + +### Dependency direction and transport-specific bridges + +The intended rule is that dependency edges cascade downstream. Event owns transport-neutral Event semantics and `IEventTransport`; concrete transport libraries may depend on Event to implement transports. Therefore transport-specific observer bridges should ultimately live downstream with those integrations rather than make Event depend back on a concrete transport. + +Current compatibility retains the existing 5.8 bridge headers, but the preferred future locations are: + +```text +Sockets Event integration + SocketWorkerEventBridge + SocketSecuritySessionEventBridge + +ESP-Now Event integration + ESPNowTransportEventBridge +``` + +Generic bridges for genuinely upstream libraries such as Timing, Threads, Command and Security remain appropriate in Event because those libraries do not depend back on Event. + +''' + text = text[:dep_start] + deps + text[dep_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 Event 5.8.1 README (#19)' + git push origin HEAD:feature/19-dependency-refresh-5.8.1 From 4219d20c28ee683f00ea931ed06976f51f4f1293 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:51:25 +0200 Subject: [PATCH 07/14] ci: simplify Event README refresh (#19) --- .github/workflows/readme-refresh.yml | 74 ++++++---------------------- 1 file changed, 15 insertions(+), 59 deletions(-) diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml index ef75aa2..9004134 100644 --- a/.github/workflows/readme-refresh.yml +++ b/.github/workflows/readme-refresh.yml @@ -22,14 +22,11 @@ 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 — 5.8.1 - -ESPressio Event 5.8.1 is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing the required and optional dependency baselines. + current = """## Current Version — 5.8.1 -Current dependency baselines: +ESPressio Event 5.8.1 is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing dependency baselines. ```text Required @@ -47,62 +44,21 @@ Optional observer bridge sources ESPressio ESP-Now >= 0.5.0 < 1.0.0 ``` -The 5.8.1 patch does not add new bridge APIs or alter Event wire formats. It also documents that the Sockets-specific and ESP-Now-specific bridges currently create reciprocal optional dependency edges because those transport libraries already consume Event for concrete Event transports. The preferred future architecture moves those transport-specific bridges downstream into their respective Event integration layers (or dedicated integration packages), leaving Event transport-neutral. +Transport-specific Event bridges for Sockets and ESP-Now are retained for 5.8.x compatibility, but their reciprocal optional dependency edges are documented for future downstream relocation. -''' +""" text = text[:start] + current + text[end:] - - dep_start = text.index('### Required dependencies') - dep_end_marker = '------------------------------------------------------------------------\n\n# What is Event-Driven Observer Pattern?' - dep_end = text.index(dep_end_marker, dep_start) - deps = '''### Required dependencies - -Normal Event applications require: - -```ini -lib_deps = - flowduino/ESPressio-Event@^5.8.1 -``` - -The mandatory dependency graph is: - -```text -ESPressio Event 5.8.1 - | - +-- ESPressio Threads >= 3.1.3 < 4.0.0 - | - +-- ESPressio Observable >= 3.0.1 < 4.0.0 - | - +-- ESPressio Timing >= 2.2.3 < 3.0.0 -``` - -Timing carries Units 0.2.2 downstream. ESPressio Serializable is **not** a mandatory Event dependency; it is required only when Serializable Events, runtime Serializable Event construction, or Event Transport are selected: - -```text -ESPressio Serializable >= 0.10.1 < 1.0.0 -``` - -Security, Command, Sockets and ESP-Now remain optional bridge dependencies only. In particular, no new package-level Event -> Sockets or Event -> ESP-Now dependency is introduced by 5.8.1. - -### Dependency direction and transport-specific bridges - -The intended rule is that dependency edges cascade downstream. Event owns transport-neutral Event semantics and `IEventTransport`; concrete transport libraries may depend on Event to implement transports. Therefore transport-specific observer bridges should ultimately live downstream with those integrations rather than make Event depend back on a concrete transport. - -Current compatibility retains the existing 5.8 bridge headers, but the preferred future locations are: - -```text -Sockets Event integration - SocketWorkerEventBridge - SocketSecuritySessionEventBridge - -ESP-Now Event integration - ESPNowTransportEventBridge -``` - -Generic bridges for genuinely upstream libraries such as Timing, Threads, Command and Security remain appropriate in Event because those libraries do not depend back on Event. - -''' - text = text[:dep_start] + deps + text[dep_end:] + replacements = [ + ('flowduino/ESPressio-Event@^5.7.1', 'flowduino/ESPressio-Event@^5.8.1'), + ('ESPressio Event 5.7.1\n |\n +-- ESPressio Threads >= 3.1.2 < 4.0.0', 'ESPressio Event 5.8.1\n |\n +-- ESPressio Threads >= 3.1.3 < 4.0.0'), + ('+-- ESPressio Timing >= 2.2.2 < 3.0.0', '+-- ESPressio Timing >= 2.2.3 < 3.0.0'), + ('The 5.8.0 development branch retains the same mandatory graph. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 'Event 5.8.1 retains the same dependency shape. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.'), + ('required only when an application explicitly opts into Serializable\nEvents or Event Transport.', 'required only when an application explicitly opts into Serializable\nEvents or Event Transport. The validated current baseline is ESPressio Serializable >= 0.10.1 < 1.0.0.'), + ] + 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 4cd9130a0acfd490f2c7a9bd3a653dcc5b41dcb3 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:52:40 +0200 Subject: [PATCH 08/14] ci: make Event README refresh tolerant (#19) --- .github/workflows/readme-refresh.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml index 9004134..1e8aeb7 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 — 5.8.1 + start = text.find('## Latest Stable Version') + end = text.find('## Compatibility', start) + if start >= 0 and end > start: + current = """## Current Version — 5.8.1 ESPressio Event 5.8.1 is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing dependency baselines. @@ -47,18 +48,12 @@ Optional observer bridge sources Transport-specific Event bridges for Sockets and ESP-Now are retained for 5.8.x compatibility, but their reciprocal optional dependency edges are documented for future downstream relocation. """ - text = text[:start] + current + text[end:] - replacements = [ - ('flowduino/ESPressio-Event@^5.7.1', 'flowduino/ESPressio-Event@^5.8.1'), - ('ESPressio Event 5.7.1\n |\n +-- ESPressio Threads >= 3.1.2 < 4.0.0', 'ESPressio Event 5.8.1\n |\n +-- ESPressio Threads >= 3.1.3 < 4.0.0'), - ('+-- ESPressio Timing >= 2.2.2 < 3.0.0', '+-- ESPressio Timing >= 2.2.3 < 3.0.0'), - ('The 5.8.0 development branch retains the same mandatory graph. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 'Event 5.8.1 retains the same dependency shape. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.'), - ('required only when an application explicitly opts into Serializable\nEvents or Event Transport.', 'required only when an application explicitly opts into Serializable\nEvents or Event Transport. The validated current baseline is ESPressio Serializable >= 0.10.1 < 1.0.0.'), - ] - for old, new in replacements: - if old not in text: - raise SystemExit(f'missing expected README text: {old}') - text = text.replace(old, new, 1) + text = text[:start] + current + text[end:] + text = text.replace('flowduino/ESPressio-Event@^5.7.1', 'flowduino/ESPressio-Event@^5.8.1', 1) + text = text.replace('ESPressio Event 5.7.1\n |\n +-- ESPressio Threads >= 3.1.2 < 4.0.0', 'ESPressio Event 5.8.1\n |\n +-- ESPressio Threads >= 3.1.3 < 4.0.0', 1) + text = text.replace('+-- ESPressio Timing >= 2.2.2 < 3.0.0', '+-- ESPressio Timing >= 2.2.3 < 3.0.0', 1) + text = text.replace('The 5.8.0 development branch retains the same mandatory graph. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 'Event 5.8.1 retains the same dependency shape. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 1) + text = text.replace('required only when an application explicitly opts into Serializable\nEvents or Event Transport.', 'required only when an application explicitly opts into Serializable\nEvents or Event Transport. The validated current baseline is ESPressio Serializable >= 0.10.1 < 1.0.0.', 1) path.write_text(text) - name: Commit README run: | From e3218c1cb0a6f0c14c73d4dd86e73fefb7262fc4 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:56:31 +0200 Subject: [PATCH 09/14] ci: validate Event 5.8.1 against dependency candidates (#19) --- .github/workflows/tests.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9b10f53..4d495c5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,12 +19,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: 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: ESPressio-Units - name: Configure run: cmake -S ESPressio-Event/tests -B build @@ -47,18 +47,23 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: 0.2.1 + ref: feature/2-serializable-0.10.1-dependency-refresh path: project/dependencies/ESPressio-Units - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: 2.2.2 + ref: feature/5-units-0.2.2-dependency-refresh path: project/dependencies/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Threads - ref: 3.1.2 + ref: feature/45-timing-2.2.3-dependency-refresh path: project/dependencies/ESPressio-Threads + - uses: actions/checkout@v4 + with: + repository: Flowduino/ESPressio-Serializable + ref: 0.10.1 + path: project/dependencies/ESPressio-Serializable - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Security @@ -77,7 +82,7 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-ESP-Now - ref: 0.5.0 + ref: feature/10-timing-2.2.3-dependency-refresh path: project/dependencies/ESPressio-ESP-Now - uses: actions/setup-python@v5 with: @@ -109,11 +114,13 @@ jobs: ../dependencies/ESPressio-Units ../dependencies/ESPressio-Timing ../dependencies/ESPressio-Threads + ../dependencies/ESPressio-Serializable ../ESPressio-Event EOF cat > project/compile/src/main.cpp <<'EOF' #include #include + #include #include #include #include @@ -123,5 +130,5 @@ jobs: void setup() {} void loop() {} EOF - - name: Compile ESP32 optional bridges + - name: Compile ESP32 Event Transport and optional bridges run: pio run -d project/compile From f4622f93a243e1ebd2093648262bdd23f6513a33 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:00:45 +0200 Subject: [PATCH 10/14] chore: trigger Event #19 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..3427ad3 --- /dev/null +++ b/.dependency-refresh-trigger @@ -0,0 +1 @@ +temporary trigger for Event #19 dependency-refresh README normalization From a1ca2503d627fc511ac4d6e7bf178b8bdc1f891d Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:05:23 +0200 Subject: [PATCH 11/14] docs: normalize Event 5.8.1 release documentation (#19) --- README.md | 124 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 70 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 1ae5d16..73da903 100644 --- a/README.md +++ b/README.md @@ -10,49 +10,43 @@ queues, listener/observer registration, priority dispatch, high-resolution Event timing, optional Observer-to-Event bridges, and optional transport-neutral Serializable Event routing. -## Latest Stable Version +## Current Version — 5.8.1 -The latest stable version is **5.7.1**. +ESPressio Event **5.8.1** is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing the validated upstream dependency baselines. -For release-by-release history, see [CHANGELOG.md](CHANGELOG.md). - -## Current Development Version — 5.8.0 - -The `feature/observable-callback-coverage` branch targets **5.8.0** and extends Event's existing opt-in Observer-to-Event bridge architecture to the new lifecycle observer contracts introduced across the ESPressio platform. - -The new bridge families are: +Current dependency model: ```text -ESPressio Security >= 0.2.0 < 1.0.0 - TransportSecurityEventBridge +Required + ESPressio Threads >= 3.1.3 < 4.0.0 + ESPressio Timing >= 2.2.3 < 3.0.0 + ESPressio Observable >= 3.0.1 < 4.0.0 -ESPressio Command >= 0.3.0 < 1.0.0 - CommandRegistryEventBridge +Optional Serializable Event / Event Transport + ESPressio Serializable >= 0.10.1 < 1.0.0 -ESPressio Sockets >= 0.5.0 < 1.0.0 - SocketWorkerEventBridge - SocketSecuritySessionEventBridge - -ESPressio ESP-Now >= 0.5.0 < 1.0.0 - ESPNowTransportEventBridge +Optional observer bridge sources + ESPressio Security >= 0.2.0 < 1.0.0 + ESPressio Command >= 0.3.0 < 1.0.0 + ESPressio Sockets >= 0.5.0 < 1.0.0 + ESPressio ESP-Now >= 0.5.0 < 1.0.0 ``` -These are **optional integrations**. The mandatory Event dependency graph remains Threads 3.x, Observable 3.x, and Timing 2.x; Security, Command, Sockets, and ESP-Now are required only when their corresponding bridge headers are selected. +Security and Command remain valid one-way bridge dependencies: those libraries expose synchronous Observable contracts and do not depend back upon Event. -The dependency direction remains intentionally one-way: +The dependency audit for 5.8.1 identifies two reciprocal optional relationships that should not be strengthened: ```text -Security / Command / Sockets / ESP-Now - expose synchronous Observable contracts +Sockets -> Event concrete socket Event transports +Event -> Sockets SocketWorkerEventBridge / SocketSecuritySessionEventBridge -Event 5.8 - optionally consumes those contracts - and emits asynchronous Events +ESP-Now -> Event ESPNowEventTransport +Event -> ESP-Now ESPNowTransportEventBridge ``` -The originating libraries therefore do not acquire an ESPressio Event dependency. Socket worker Events are also kept separate from Socket Security Session Events so observing ordinary socket worker lifecycle does not implicitly require ESPressio Security. +For 5.8.x compatibility the existing bridge headers remain available. The preferred future architecture moves the Sockets-specific and ESP-Now-specific bridges downstream into their respective optional Event integrations, or into dedicated integration packages, leaving ESPressio Event transport-neutral. -The complete stable 5.7.1 documentation below remains intact. +For release-by-release history, see [CHANGELOG.md](CHANGELOG.md). ## Compatibility @@ -201,7 +195,6 @@ See: examples/RuntimeSerializableEvents/RuntimeSerializableEvents.ino ``` - ## License ESPressio and its component libraries are licensed under the **Apache @@ -242,28 +235,50 @@ library: ``` ini lib_deps = - flowduino/ESPressio-Event@^5.7.1 + flowduino/ESPressio-Event@^5.8.1 ``` The mandatory dependency graph is: ``` text -ESPressio Event 5.7.1 +ESPressio Event 5.8.1 | - +-- ESPressio Threads >= 3.1.2 < 4.0.0 + +-- ESPressio Threads >= 3.1.3 < 4.0.0 | +-- ESPressio Observable >= 3.0.1 < 4.0.0 | - +-- ESPressio Timing >= 2.2.2 < 3.0.0 + +-- ESPressio Timing >= 2.2.3 < 3.0.0 ``` -The 5.8.0 development branch retains the same mandatory graph. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only. - -ESPressio Units is available through the Timing dependency stack. +ESPressio Units 0.2.2 is carried by the Timing dependency stack. **ESPressio Serializable is not a mandatory Event dependency.** It is required only when an application explicitly opts into Serializable -Events or Event Transport. +Events, runtime Serializable Event construction, or Event Transport. The +validated current baseline is: + +```text +ESPressio Serializable >= 0.10.1 < 1.0.0 +``` + +Security, Command, Sockets and ESP-Now remain optional bridge dependencies only. Event 5.8.1 introduces no new mandatory dependency on any of them. + +### Dependency direction and transport-specific bridges + +The general ESPressio rule is that dependency edges cascade downstream. Event owns transport-neutral Event semantics and `IEventTransport`; concrete transport libraries may consume Event to implement transports. A transport-specific Observer-to-Event bridge should therefore live downstream with that transport integration rather than make Event depend back upon the concrete transport. + +The current 5.8.x bridge API is retained for compatibility, but the preferred future locations are: + +```text +Sockets Event integration + SocketWorkerEventBridge + SocketSecuritySessionEventBridge + +ESP-Now Event integration + ESPNowTransportEventBridge +``` + +Generic bridges for genuinely upstream libraries such as Timing, Threads, Command and Security remain appropriate within Event because those libraries do not depend back on Event. ------------------------------------------------------------------------ @@ -377,7 +392,7 @@ directly: the originating libraries expose synchronous Observer notifications, while ESPressio Event can optionally convert those notifications into asynchronous Events. -Event 5.8 extends exactly the same model to Security, Command, Sockets, and ESP-Now; it does not move ownership of those lifecycle semantics into Event. +Event 5.8 extends the same model to Security, Command, Sockets, and ESP-Now. The 5.8.1 dependency audit additionally distinguishes valid one-way bridges from transport-specific bridges that should ultimately move downstream to avoid reciprocal optional dependency edges. ------------------------------------------------------------------------ @@ -1076,8 +1091,8 @@ Serializable explicitly: ``` ini lib_deps = - flowduino/ESPressio-Event@^5.7.1 - flowduino/ESPressio-Serializable@^0.10.0 + flowduino/ESPressio-Event@^5.8.1 + flowduino/ESPressio-Serializable@^0.10.1 ``` ## `SerializableEvent` @@ -1169,10 +1184,10 @@ does not require ESPressio Serializable. ESPressio Event can optionally convert synchronous Observer notifications from other ESPressio libraries into asynchronous Events. -The important dependency direction is: +For genuinely upstream libraries, the dependency direction is: ``` text -Timing / Threads / Security / Command / Sockets / ESP-Now +Timing / Threads / Security / Command expose synchronous Observer APIs Event @@ -1182,6 +1197,8 @@ Event The originating libraries therefore do not need to depend upward on Event. +Sockets and ESP-Now are special cases in 5.8.x because each already optionally consumes Event to implement concrete Event transports. Their existing bridges remain available for compatibility, but should move downstream in a future integration relocation. + ## System Clock Event Bridge Timing 2.2 System Clock Observer notifications can be bridged using: @@ -1265,7 +1282,7 @@ Bridge batch headers are: The ordinary bridges do not require ESPressio Serializable. -## Security Event Bridge (5.8.0 development) +## Security Event Bridge `TransportSecurityEventBridge` observes one selected `Security::TransportSecurity` instance and emits asynchronous Events for configuration changes, session establishment/reset, replay-protection resets, and security failures. @@ -1278,13 +1295,13 @@ bridge.Initialize(security); The bridge is instance-oriented because `TransportSecurity` is application-owned state rather than a process singleton. -## Command Registry Event Bridge (5.8.0 development) +## Command Registry Event Bridge `CommandRegistryEventBridge` converts command registration/unregistration lifecycle notifications from the process-wide `CommandRegistry` into Events. It deliberately does not convert normal Command execution callbacks or middleware into a competing Event execution mechanism. -## Socket Event Bridges (5.8.0 development) +## Socket Event Bridges -Socket lifecycle is split according to dependency ownership: +For 5.8.x compatibility, socket lifecycle bridges remain split according to dependency ownership: ``` text SocketWorkerEventBridge @@ -1296,13 +1313,15 @@ SocketSecuritySessionEventBridge -> requires Sockets + Security ``` -This separation prevents ordinary Socket worker observation from acquiring an unnecessary Security dependency. +Because Sockets also implements concrete Event transports, these bridge implementations should ultimately move downstream into Sockets' optional Event integration to eliminate the reciprocal optional dependency edge. -## ESP-Now Transport Event Bridge (5.8.0 development) +## ESP-Now Transport Event Bridge `ESPNowTransportEventBridge` converts the ESP-NOW transport's initialization, shutdown, peer lifecycle, and send-result observer notifications into asynchronous Events while leaving protocol receive delivery with the existing ESP-NOW handler mechanism. -All new 5.8 bridges remain dormant until explicitly initialized. +Because ESP-Now also implements `ESPNowEventTransport`, this bridge should ultimately move downstream into ESP-Now's optional Event integration to eliminate the reciprocal optional dependency edge. + +All 5.8 bridge families remain dormant until explicitly initialized. ------------------------------------------------------------------------ @@ -1459,9 +1478,7 @@ payload length ``` The payload uses the ESPressio Serializable **ESPB v2 binary wire format**. -Event 5.7 uses Serializable's direct binary path for the normal same-schema -transport case, while retaining the existing `BinaryArchive` path as a -compatibility and schema-migration fallback. +Event 5.8.1 validates against Serializable 0.10.1 while preserving the existing wire representation and direct binary transport path, with the archive path retained for compatibility/schema-migration cases. ## EventTransportManager observation @@ -1471,7 +1488,6 @@ inbound/outbound diagnostics. ------------------------------------------------------------------------ - ## Event Transport Transaction Observation Version 5.5 adds a unified, transport-neutral observation surface for complete Event Transport transaction activity. @@ -1699,4 +1715,4 @@ TransportMessageID HopCount ``` -This is a compatibility fix only; Event dispatch behaviour and public Event Transport semantics are unchanged. +This is a compatibility fix only; Event dispatch behaviour and public Event Transport semantics are unchanged. \ No newline at end of file From 68e9006ea990169977e1ce4e29d55d9dd0bdc8f7 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:05:41 +0200 Subject: [PATCH 12/14] chore: remove temporary Event README helper (#19) --- .github/workflows/readme-refresh.yml | 65 ---------------------------- 1 file changed, 65 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 1e8aeb7..0000000 --- a/.github/workflows/readme-refresh.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Refresh dependency README - -on: - push: - branches: - - feature/19-dependency-refresh-5.8.1 - -permissions: - contents: write - -jobs: - refresh: - if: github.actor != 'github-actions[bot]' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: feature/19-dependency-refresh-5.8.1 - - 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 — 5.8.1 - -ESPressio Event 5.8.1 is a dependency-maintenance patch over 5.8.0. It retains the expanded Observable-to-Event bridge surface while refreshing dependency baselines. - -```text -Required - ESPressio Threads >= 3.1.3 < 4.0.0 - ESPressio Timing >= 2.2.3 < 3.0.0 - ESPressio Observable >= 3.0.1 < 4.0.0 - -Optional Serializable Event / Event Transport - ESPressio Serializable >= 0.10.1 < 1.0.0 - -Optional observer bridge sources - ESPressio Security >= 0.2.0 < 1.0.0 - ESPressio Command >= 0.3.0 < 1.0.0 - ESPressio Sockets >= 0.5.0 < 1.0.0 - ESPressio ESP-Now >= 0.5.0 < 1.0.0 -``` - -Transport-specific Event bridges for Sockets and ESP-Now are retained for 5.8.x compatibility, but their reciprocal optional dependency edges are documented for future downstream relocation. - -""" - text = text[:start] + current + text[end:] - text = text.replace('flowduino/ESPressio-Event@^5.7.1', 'flowduino/ESPressio-Event@^5.8.1', 1) - text = text.replace('ESPressio Event 5.7.1\n |\n +-- ESPressio Threads >= 3.1.2 < 4.0.0', 'ESPressio Event 5.8.1\n |\n +-- ESPressio Threads >= 3.1.3 < 4.0.0', 1) - text = text.replace('+-- ESPressio Timing >= 2.2.2 < 3.0.0', '+-- ESPressio Timing >= 2.2.3 < 3.0.0', 1) - text = text.replace('The 5.8.0 development branch retains the same mandatory graph. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 'Event 5.8.1 retains the same dependency shape. Security, Command, Sockets, and ESP-Now remain optional bridge dependencies only.', 1) - text = text.replace('required only when an application explicitly opts into Serializable\nEvents or Event Transport.', 'required only when an application explicitly opts into Serializable\nEvents or Event Transport. The validated current baseline is ESPressio Serializable >= 0.10.1 < 1.0.0.', 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 Event 5.8.1 README (#19)' - git push origin HEAD:feature/19-dependency-refresh-5.8.1 From d22062345cab21affd58a845f1db904691153df1 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:05:47 +0200 Subject: [PATCH 13/14] chore: remove temporary Event dependency-refresh trigger (#19) --- .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 3427ad3..0000000 --- a/.dependency-refresh-trigger +++ /dev/null @@ -1 +0,0 @@ -temporary trigger for Event #19 dependency-refresh README normalization From 2cfffa06127b381c886b64e2218ef6a1a5db03ec Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:36:32 +0200 Subject: [PATCH 14/14] ci: validate released dependency cascade (#19) --- .github/workflows/tests.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4d495c5..e0537f2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,12 +19,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: 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: ESPressio-Units - name: Configure run: cmake -S ESPressio-Event/tests -B build @@ -47,17 +47,17 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: feature/2-serializable-0.10.1-dependency-refresh + ref: 0.2.2 path: project/dependencies/ESPressio-Units - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: feature/5-units-0.2.2-dependency-refresh + ref: 2.2.3 path: project/dependencies/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Threads - ref: feature/45-timing-2.2.3-dependency-refresh + ref: 3.1.3 path: project/dependencies/ESPressio-Threads - uses: actions/checkout@v4 with: @@ -82,7 +82,7 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-ESP-Now - ref: feature/10-timing-2.2.3-dependency-refresh + ref: 0.5.1 path: project/dependencies/ESPressio-ESP-Now - uses: actions/setup-python@v5 with: