From bcbf9325b78163c87ca5834807a57443d253d0da Mon Sep 17 00:00:00 2001 From: chris-colinsky Date: Wed, 17 Jun 2026 17:23:51 -0700 Subject: [PATCH 1/2] chore(release): v0.14.0 Real release of v0.14.0 (retry & reliability; pinned spec v0.53.0 -> v0.60.0). Bump the package version from 0.14.0rc1 to 0.14.0 across pyproject, __version__, test_smoke, and the lockfile; regenerate the bundled AGENTS.md version stamp. The CHANGELOG [0.14.0] section is already dated 2026-06-17 (no drift). Tagging v0.14.0 publishes to PyPI and creates the GitHub Release. rc1 verified on TestPyPI (install, version, [otel] import, hello-world against a live LLM). --- pyproject.toml | 2 +- src/openarmature/AGENTS.md | 2 +- src/openarmature/__init__.py | 2 +- tests/test_smoke.py | 2 +- uv.lock | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 61b2a8d..a53e65d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "hatchling.build" [project] name = "openarmature" -version = "0.14.0rc1" +version = "0.14.0" description = "Workflow framework for LLM pipelines and tool-calling agents." readme = "README.md" requires-python = ">=3.12" diff --git a/src/openarmature/AGENTS.md b/src/openarmature/AGENTS.md index 78b52f2..9e4a4f2 100644 --- a/src/openarmature/AGENTS.md +++ b/src/openarmature/AGENTS.md @@ -1,6 +1,6 @@ # OpenArmature — Agent documentation -*This is the agent guide bundled with the openarmature Python package, version 0.14.0rc1 (spec v0.60.0). For the full docs site see [openarmature.ai](https://openarmature.ai). For the canonical spec text see [openarmature.org/capabilities](https://openarmature.org/capabilities/). For project-specific conventions for the code you're editing, see the host project's `AGENTS.md` or `CLAUDE.md`.* +*This is the agent guide bundled with the openarmature Python package, version 0.14.0 (spec v0.60.0). For the full docs site see [openarmature.ai](https://openarmature.ai). For the canonical spec text see [openarmature.org/capabilities](https://openarmature.org/capabilities/). For project-specific conventions for the code you're editing, see the host project's `AGENTS.md` or `CLAUDE.md`.* ## TL;DR diff --git a/src/openarmature/__init__.py b/src/openarmature/__init__.py index 3c301e9..c502c6f 100644 --- a/src/openarmature/__init__.py +++ b/src/openarmature/__init__.py @@ -24,7 +24,7 @@ sessions opening the project find the bundled docs automatically. """ -__version__ = "0.14.0rc1" +__version__ = "0.14.0" __spec_version__ = "0.60.0" # Proposal 0052 (spec observability §5.1 / §8.4.1): canonical # package-registry name for this implementation. Surfaces on every diff --git a/tests/test_smoke.py b/tests/test_smoke.py index 06b92fb..a4f0635 100644 --- a/tests/test_smoke.py +++ b/tests/test_smoke.py @@ -8,7 +8,7 @@ def test_package_versions() -> None: - assert openarmature.__version__ == "0.14.0rc1" + assert openarmature.__version__ == "0.14.0" assert openarmature.__spec_version__ == "0.60.0" diff --git a/uv.lock b/uv.lock index d9eee6a..14f1f40 100644 --- a/uv.lock +++ b/uv.lock @@ -925,7 +925,7 @@ wheels = [ [[package]] name = "openarmature" -version = "0.14.0rc1" +version = "0.14.0" source = { editable = "." } dependencies = [ { name = "httpx" }, From 8721d7cff1327b53c65d9a4a52c7c6eed9f952b0 Mon Sep 17 00:00:00 2001 From: chris-colinsky Date: Wed, 17 Jun 2026 17:21:22 -0700 Subject: [PATCH 2/2] Fix degrade extra-outputs key in fan-out example The fan-out-with-retry degrade mode supplied its extra_outputs value under the parent field name (`topics`) in degraded_update, but proposal 0066 reads degraded_update in the subgraph's field-name space. The subgraph field is `topic` (extra_outputs={topics: topic}), so the parent-keyed entry was ignored, leaving the slot null (0069) and tripping BatchState.topics: list[str] validation in degrade mode. Key the degraded value by the subgraph field `topic` (the doc walkthrough already documents `topic: other`). Caught running MODE=degrade against the v0.14.0rc1 artifact; the example smoke test only exercises fail_fast, so it slipped through #161. --- examples/fan-out-with-retry/main.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/fan-out-with-retry/main.py b/examples/fan-out-with-retry/main.py index e1133f9..1cad450 100644 --- a/examples/fan-out-with-retry/main.py +++ b/examples/fan-out-with-retry/main.py @@ -336,11 +336,14 @@ def build_graph(mode: str = "fail_fast") -> CompiledGraph[BatchState]: # partial in place of the instance result, so the batch finishes # instead of aborting (fail_fast) or dropping the instance # (collect). Retry stays inner so it still sees raw transients - # first. The degraded mapping is keyed the way the fan-out - # projects an instance: the collect_field (``summary``) plus - # each parent extra_outputs key (``topics``). + # first. The degraded mapping is keyed in the subgraph's + # field-name space (proposal 0066): the collect_field (``summary``) + # plus each extra_outputs subgraph field (``topic``, which the + # fan-out projects to the parent ``topics`` list). Supplying + # ``topic`` keeps the slot non-null so the ``list[str]`` parent + # field validates (an omitted source would be a null slot, §9.3). degrade = FailureIsolationMiddleware( - degraded_update={"summary": "(unavailable)", "topics": "other"}, + degraded_update={"summary": "(unavailable)", "topic": "other"}, event_name="headline_degraded", ) instance_middleware = (degrade, retry, timing)