Skip to content

Commit d3e5209

Browse files
Merge pull request #851 from valory-xyz/docs/upgrade-guide-v2-1-0
docs: add comprehensive 2.1.0 upgrade and history notes
2 parents 99808f9 + a28b514 commit d3e5209

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

.spelling

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,24 @@ v1
298298
v0
299299
ipfsdaemon
300300
py3.6
301+
toolchain
302+
runtime
303+
failover
304+
awaitable
305+
asyncio
306+
hard-coded
307+
hardcoded
308+
flag_value
309+
sync_type
310+
pytest
311+
utility
312+
behaviour
313+
2.1.x
314+
8.3.x
315+
flashbots
316+
open-aea-ledger-ethereum-flashbots
317+
resolver
318+
v8
301319
async
302320
gnosis
303321
abci
@@ -397,3 +415,4 @@ docs
397415
EIP-1559
398416
RPCs
399417
pyinstaller
418+
awaitability

HISTORY.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
# Release History - open AEA
22

3+
## 2.1.0 (upcoming)
4+
5+
AEA:
6+
- Extends Python support from `3.10-3.11` to `3.10-3.14`. #831
7+
- Adds support for pytest v8 and updates related test and utility modules. #835
8+
- Makes CLI `flag_value` defaults robust across Click processing-order changes (including `packages sync` defaults and registry flag defaults). #839 #848
9+
- Adds `AEA_PASSWORD` environment variable support for CLI password handling. #825
10+
- Fixes multiple high-impact audit findings across behaviours, multiplexer, manager, dependency installation, and registry handling. #846
11+
12+
Plugins:
13+
- Adds multiple RPC rotation with automatic failover in the Ethereum ledger plugin stack. #829
14+
- Fixes `open-aea-ledger-ethereum-flashbots` dependency constraints to be compatible with `open-aea-ledger-ethereum` in the `2.1.0rc6` line. #850
15+
16+
Tooling and dependencies:
17+
- Bumps `tomte` from `0.4.0` to `0.6.1`. #831
18+
- Updates Click range to `<8.4.0` and applies compatibility fixes for 8.3.x behaviour rules. #838 #839 #848
19+
- Updates several pinned dependencies for Python 3.12-3.14 compatibility, including `packaging==26`, `pytest>=8.2,<10`, `protobuf>=5,<6`, `requests>=2.32.5,<3`, `openapi-core==0.22.0`, `openapi-spec-validator>=0.7.0,<0.8.0`, `docker==7.1.0`, `hypothesis==6.151.9`, and `cosmpy>=0.11.0,<0.12`. #831
20+
- Removes obsolete/deprecated compatibility dependencies and paths (including `gym` and `distutils` usage). #831 #836
21+
22+
Compatibility and regression fixes:
23+
- Fixes Python 3.13/3.14 regressions in async/multiprocessing paths (including `multiprocessing.Manager` context handling and asyncio event-loop compatibility changes). #843
24+
- Reworks ready-awaitable internals to avoid Python 3.14 warnings/regressions and follow-up flaky behaviour. #831 #847
25+
- Fixes local connection cross-thread queue loop handling to avoid race conditions caused by private asyncio queue internals. #847
26+
- Adds follow-up fixes for CLI and framework regressions found after the initial interpreter/dependency bump, including critical audit issues and command behaviour corrections. #846 #847 #848
27+
28+
329
## 2.0.8 (2026-01-20)
430

531
Packages:

docs/upgrading.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,94 @@ Below we describe the additional manual steps required to upgrade between differ
99

1010
### Upgrade guide
1111

12+
## `v2.0.8` to `v2.1.0`
13+
14+
- Python support is now `3.10-3.14` (previously `3.10-3.11`).
15+
- Regenerate your environment and lock files when upgrading, as several toolchain and runtime dependencies were bumped to support newer Python versions.
16+
17+
Main dependency updates to account for:
18+
19+
- `tomte: 0.4.0 -> 0.6.1`
20+
- `click: >=8.1.0,<8.3.0 -> >=8.1.0,<8.4.0`
21+
- `pytest: >=7.0.0,<8.0.0 -> >=8.2,<10`
22+
- `packaging: >=23.1,<24.0 -> ==26`
23+
- `protobuf: >=4.21.6,<4.25.0 -> >=5,<6`
24+
- `requests: ==2.28.1 -> ==2.32.5`
25+
- `openapi-core: 0.15.0 -> 0.22.0`
26+
- `openapi-spec-validator: >=0.4.0,<0.5.0 -> >=0.7.0,<0.8.0`
27+
- `docker: 4.2.0 -> 7.1.0`
28+
- `hypothesis: 6.21.6 -> 6.151.9`
29+
- `cosmpy: ==0.9.2 -> >=0.11.0,<0.12`
30+
31+
Exact APIs/functions to check:
32+
33+
### 1) Click `flag_value` default handling
34+
35+
If your downstream CLI uses Click options with `flag_value`, audit these exact patterns against Open AEA fixes:
36+
37+
- `aea/cli/utils/click_utils.py::registry_flag`
38+
- `aea/cli/utils/click_utils.py::remote_registry_flag`
39+
- `aea/cli/packages.py::sync`
40+
- `aea/cli/upgrade.py::upgrade`
41+
- `scripts/update_package_versions.py` options `--update-minor` / `--update-patch`
42+
43+
Required behaviour:
44+
45+
- Do **not** rely on decorator order to select defaults when multiple flags write to the same parameter.
46+
- Use explicit normalization in code for unset values (e.g. `if sync_type is None: sync_type = SyncTypes.THIRD_PARTY`).
47+
- Ensure upgrade command handlers consume a single `registry: str` mode rather than split boolean flags (`local` / `remote`).
48+
49+
### 2) Python 3.13/3.14 asyncio/multiprocessing compatibility
50+
51+
Audit downstream code for these exact anti-patterns and replacements:
52+
53+
- `multiprocessing.Manager()` without explicit context on Python 3.14+.
54+
- Required fix pattern: use `multiprocessing.get_context("spawn").Manager()` where process-manager context must be controlled.
55+
- Accessing private queue loop internals (e.g. `queue._loop`).
56+
- Required fix pattern: store/use explicit event loop references instead of private attributes.
57+
- Removed/unsupported asyncio APIs in modern Python:
58+
- `asyncio.StreamReader(loop=...)`
59+
- `asyncio.ensure_future(..., loop=...)`
60+
- unconditional `asyncio.get_child_watcher()` / child-watcher usage on Python 3.14+
61+
- Ready-awaitable internals relying on module-level coroutine/future objects.
62+
- Required fix pattern: use a lightweight awaitable object/factory that is loop-safe across Python 3.10-3.14.
63+
64+
### 3) Plugin dependency compatibility (Ethereum + Flashbots)
65+
66+
If you install both plugins, verify dependency constraints in your lock/constraints files:
67+
68+
- The Flashbots plugin package must be compatible with the same 2.1.x line of the Ethereum plugin package.
69+
- Reject locks where Flashbots still constrains Ethereum to `<2.1.0`.
70+
71+
Concrete verification commands to run after upgrade:
72+
73+
1. Upgrade and reinstall:
74+
- `pip install --upgrade "open-aea==2.1.0"`
75+
- or for pre-release validation: `pip install --upgrade "open-aea==2.1.0rc6"`
76+
2. Re-lock dependencies:
77+
- `pipenv lock` (or your equivalent lock workflow)
78+
3. Verify CLI default routing behaviour:
79+
- `aea packages sync` (must default to third-party sync mode)
80+
- `aea packages sync --third-party`
81+
- `aea packages sync --dev`
82+
- `aea packages sync --all`
83+
4. Verify interpreter matrix:
84+
- run your tests on Python `3.10` and `3.14`
85+
5. Verify plugin resolution when Flashbots is used:
86+
- install both `open-aea-ledger-ethereum` and `open-aea-ledger-ethereum-flashbots` in a clean environment and ensure dependency resolution succeeds.
87+
88+
Known caveat:
89+
90+
- Historical installer scripts may still contain hard-coded checks/messages for Python `3.10/3.11`. Treat package metadata and release notes as the source of truth for supported runtime versions.
91+
92+
### API compatibility notes
93+
94+
- CLI/API-surface changes:
95+
- `aea/cli/utils/click_utils.py::password_option` now always prompts on `-p` and supports `AEA_PASSWORD` for `--password`.
96+
97+
- Side-effect risk to audit in downstream code:
98+
- `aea/helpers/async_utils.py::Runnable.wait_completed` internals changed to use a lightweight ready-awaitable for loop safety on Python 3.14; callers that relied on strict `Future` type checks should switch to awaitability checks instead.
99+
12100
## `v2.0.7` to `v2.0.8`
13101

14102
- No backwards incompatible changes

0 commit comments

Comments
 (0)