From f6e5d033584d3331dd4d4c66d7baa8b6c867bf09 Mon Sep 17 00:00:00 2001 From: Rwanbt Date: Thu, 17 Sep 2026 11:13:59 +0200 Subject: [PATCH] release: 2.4.4 bridge (Multi-Forge runtime, protocol 2 lifecycle artifact) (#179) --- AGENTS.md | 2 +- CHANGELOG.md | 11 +++++++++++ README.fr.md | 4 ++-- README.md | 6 +++--- UPDATING.md | 2 +- VERSION | 2 +- ainative/__init__.py | 2 +- docs/MULTIVAULT-OPERATOR-GUIDE.md | 2 +- docs/PUBLIC-PILOT.md | 4 ++-- docs/RELEASING.md | 16 ++++++++-------- scripts/opencode_plugin_published_e2e.py | 2 +- templates/AGENTS.md | 2 +- tests/test_lifecycle_update_transport.py | 4 ++++ 13 files changed, 37 insertions(+), 22 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f9b710d..b4d8b11 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,5 @@ # Universal Engineering Rules - + diff --git a/CHANGELOG.md b/CHANGELOG.md index a2b16fc..81e8cd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,17 @@ project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [2.4.4] - 2026-09-17 + +Multi-Forge v1: the first release carrying the generic-Git lifecycle, the +feature model, the provider-neutral work policy and the Release Protocol V3 +runtime. This is the **V2 bridge release**: the runtime understands a future +(V3) lifecycle publication and reports `CLI_UPDATE_REQUIRED` with the +upgrade path, while its own lifecycle artifact deliberately remains protocol +2 (`ainative-lifecycle-v2-2.4.4.zip`) so current runtimes can consume it +(see `docs/RELEASING.md`). + + ### Added - **V2 forward bridge: a future lifecycle protocol now says so** (#157): a diff --git a/README.fr.md b/README.fr.md index 87b7845..f52afed 100644 --- a/README.fr.md +++ b/README.fr.md @@ -614,11 +614,11 @@ OpenCode et Cursor), pose `AGENTS.md` et `conventions.json`. # Relancez la ligne d'installation quand une release change le runtime du # lifecycle ; `ainative update` vous le dira (CLI_UPDATE_REQUIRED). # -# PyPI (ainative-dev-stack==2.4.3) est cable mais pas encore publie : il +# PyPI (ainative-dev-stack==2.4.4) est cable mais pas encore publie : il # manque une configuration Trusted Publisher unique sur le compte PyPI # (docs/RELEASING.md). D'ici la, la release GitHub epinglee ci-dessous est # l'installation supportee. -pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" # release epinglee (reproductible) +pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" # release epinglee (reproductible) cd /chemin/vers/votre-projet ainative setup # guide : profil, integration machine, doctor diff --git a/README.md b/README.md index 8721540..dcf0af5 100644 --- a/README.md +++ b/README.md @@ -607,11 +607,11 @@ manifest before parsing anything, and the support matrix is in `SUPPORT.md`. # Re-run the install line when a release changes the lifecycle runtime; # `ainative update` tells you when (CLI_UPDATE_REQUIRED). # -# PyPI (ainative-dev-stack==2.4.3) is wired but not yet published: it needs +# PyPI (ainative-dev-stack==2.4.4) is wired but not yet published: it needs # a one-time Trusted Publisher setup on the PyPI account (docs/RELEASING.md, # "PyPI"), so until then the pinned GitHub release below is the supported # install. -pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" # pinned release (reproducible) +pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" # pinned release (reproducible) cd your-project ainative setup # guided: profile, machine integration, doctor @@ -664,7 +664,7 @@ cp tools/ai_docs/config.sh.example tools/ai_docs/config.sh # Fill in Obsidian vault path, Python path, graphify binary # 4. Install the CLI; it configures the hook — no hand-edited JSON: -pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" +pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" ainative init --profile standard # merges ONE owned PostToolUse entry into .claude/settings.json # (hand-registered before the lifecycle existed? init adopts it idempotently.) diff --git a/UPDATING.md b/UPDATING.md index 138f7e8..50690ce 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -49,7 +49,7 @@ update each project. `ainative update` refuses the other order with ```bash # 1. the CLI / runtime -pip install --upgrade "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" +pip install --upgrade "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" # 2. each project ainative update check # is there anything newer? (works with any runtime) diff --git a/VERSION b/VERSION index 6550da6..79a6144 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4.3 \ No newline at end of file +2.4.4 diff --git a/ainative/__init__.py b/ainative/__init__.py index e078807..35004d8 100644 --- a/ainative/__init__.py +++ b/ainative/__init__.py @@ -9,6 +9,6 @@ from __future__ import annotations -__version__ = "2.4.3" +__version__ = "2.4.4" __all__ = ["__version__"] \ No newline at end of file diff --git a/docs/MULTIVAULT-OPERATOR-GUIDE.md b/docs/MULTIVAULT-OPERATOR-GUIDE.md index 53eea37..0100b7d 100644 --- a/docs/MULTIVAULT-OPERATOR-GUIDE.md +++ b/docs/MULTIVAULT-OPERATOR-GUIDE.md @@ -59,7 +59,7 @@ history only. ENFORCED-DIAGNOSTIC and ENFORCED-AUTHENTICATED are not available. 1. Install and initialize the stack (pinned release; see README for the current version): ```powershell - pip install --upgrade "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" + pip install --upgrade "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" ainative machine init # installs the method and assets for every harness ainative machine doctor # healthy, or exit 1 naming the failing asset ``` diff --git a/docs/PUBLIC-PILOT.md b/docs/PUBLIC-PILOT.md index a3e4479..ebe817f 100644 --- a/docs/PUBLIC-PILOT.md +++ b/docs/PUBLIC-PILOT.md @@ -25,7 +25,7 @@ source pilot-venv/bin/activate # Windows (PowerShell): pilot-venv\Scripts\Activate.ps1 -pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.3" +pip install "git+https://github.com/Rwanbt/ai-native-dev-stack.git@v2.4.4" ainative --version ``` @@ -33,7 +33,7 @@ The last command prints the lifecycle version, the state schema and the stack version. **Pass:** it prints them without an error. Note the versions in the feedback form. -PyPI (`pip install ainative-dev-stack==2.4.3`) is not published yet — the +PyPI (`pip install ainative-dev-stack==2.4.4`) is not published yet — the one-time trusted-publisher setup on the PyPI account is still pending. The pinned release above is the supported install for this pilot. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index f75f858..2f84482 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -19,8 +19,8 @@ reminder; the gates fail closed and none of them fixes anything silently. ```bash git checkout main && git pull --ff-only -git tag v2.4.3 -git push origin v2.4.3 +git tag v2.4.4 +git push origin v2.4.4 ``` The **Release assets** workflow then runs, in order: @@ -100,29 +100,29 @@ workflow token, and GitHub does not let one workflow's token trigger another exists, upload an already-published release with: ```bash -gh workflow run publish-pypi.yml -f tag=v2.4.3 +gh workflow run publish-pypi.yml -f tag=v2.4.4 ``` ```bash # what a user then runs -pip install ainative-dev-stack==2.4.3 +pip install ainative-dev-stack==2.4.4 # or, isolated: -pipx install ainative-dev-stack==2.4.3 +pipx install ainative-dev-stack==2.4.4 ``` ## Verifying what was published ```bash # integrity: the bytes match the published sums -gh release download v2.4.3 --dir dist +gh release download v2.4.4 --dir dist cd dist && sha256sum -c SHA256SUMS # provenance: which workflow, repository and commit produced them -gh attestation verify dist/ainative_dev_stack-2.4.3-py3-none-any.whl -R Rwanbt/ai-native-dev-stack +gh attestation verify dist/ainative_dev_stack-2.4.4-py3-none-any.whl -R Rwanbt/ai-native-dev-stack # PyPI provenance (attestations are published with the files) python -m pip install --upgrade pypi-attestations -python -m pypi_attestations verify dist/ainative_dev_stack-2.4.3-py3-none-any.whl +python -m pypi_attestations verify dist/ainative_dev_stack-2.4.4-py3-none-any.whl ``` `SHA256SUMS` alone proves integrity against the source that published it; it diff --git a/scripts/opencode_plugin_published_e2e.py b/scripts/opencode_plugin_published_e2e.py index fec6845..e6c277a 100644 --- a/scripts/opencode_plugin_published_e2e.py +++ b/scripts/opencode_plugin_published_e2e.py @@ -17,7 +17,7 @@ Usage: python scripts/opencode_plugin_published_e2e.py - python scripts/opencode_plugin_published_e2e.py --wheel dist/ainative_dev_stack-2.4.3-py3-none-any.whl + python scripts/opencode_plugin_published_e2e.py --wheel dist/ainative_dev_stack-2.4.4-py3-none-any.whl python scripts/opencode_plugin_published_e2e.py --keep """ diff --git a/templates/AGENTS.md b/templates/AGENTS.md index 2d357df..d8ae0e8 100644 --- a/templates/AGENTS.md +++ b/templates/AGENTS.md @@ -1,5 +1,5 @@ # Universal Engineering Rules - + diff --git a/tests/test_lifecycle_update_transport.py b/tests/test_lifecycle_update_transport.py index fb385dd..0403f8c 100644 --- a/tests/test_lifecycle_update_transport.py +++ b/tests/test_lifecycle_update_transport.py @@ -98,6 +98,10 @@ def setUp(self) -> None: previous = os.environ.pop(name, None) if previous is not None: self.addCleanup(os.environ.__setitem__, name, previous) + else: + # Tests set these directly; leave the process as it was found + # so a following suite never inherits a surprise selector. + self.addCleanup(os.environ.pop, name, None) def get(self, provider, server: ScriptedTransport, url: str, limit: int = 1_000_000) -> bytes: