Skip to content

Prepare fix-only Python SDK 2.14.1 from the 2.14.0 maintenance base - #261

Merged
rmcdaniel merged 2 commits into
maintenance/2.14from
release/2.14.1
Nov 4, 2026
Merged

rmcdaniel merged 2 commits into
maintenance/2.14from
release/2.14.1

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 4, 2026 •

Copy link
Copy Markdown
Member

Backports the condition-wait replay fix in #260 onto immutable 2.14.0 (e2c607b86496523d34ba2347b961ee0ccb0e76bc), following General's fix-only release decision. Main retains #255 for 2.15.0.

Frozen release head: dc47958c026b35167d2f90a33b96f7a575c48aee, targeting maintenance/2.14. Source #260 was cleared at 49eacbdd, merged as 16f217aa, and cherry-picked with provenance as 68d85ff. Conflict resolution keeps the new fingerprint delegate while excluding #255's typed workflow changelog and TypedOnboarding registration.

Only _condition_fingerprint.py and workflow.py change under src/. The fingerprint module and all 23 golden values are byte-identical to the reviewed source. Public workflow APIs remain at 2.14.0. Protocol, Server baselines and capability declarations are unchanged.

The maintenance-only fixture adjustment replaces workflow.defn(typed=True), which is absent in 2.14.0, with this local wrapper:

diff --git a/tests/condition_fingerprint_predicates.py b/tests/condition_fingerprint_predicates.py
index 8184a40..5e38134 100644
--- a/tests/condition_fingerprint_predicates.py
+++ b/tests/condition_fingerprint_predicates.py
@@ -9,6 +9,7 @@ Keep this module's source unchanged: editing it changes the fingerprints.
 from __future__ import annotations
 
 from collections.abc import Callable
+from functools import wraps
 from typing import Any
 
 from durable_workflow import workflow
@@ -18,12 +19,23 @@ def _identity(predicate: Callable[[], bool]) -> Callable[[], bool]:
     return predicate
 
 
-@workflow.defn(name="tests.fingerprint.typed-ready", typed=True)
+def _typed_method_fixture(fn: Callable[..., Any]) -> Callable[..., Any]:
+    """Exercise the unwrapping marker without the unreleased typed workflow API."""
+    @wraps(fn)
+    def wrapped(*args: Any, **kwargs: Any) -> Any:
+        return fn(*args, **kwargs)
+
+    wrapped.__typed_workflow_method__ = fn  # type: ignore[attr-defined]
+    return wrapped
+
+
+@workflow.defn(name="tests.fingerprint.typed-ready")
 class TypedReady:
     def __init__(self) -> None:
         self.approvals: list[str] = []
 
     @workflow.query("ready")
+    @_typed_method_fixture
     def ready(self, minimum: int = 2) -> bool:
         return len(self.approvals) >= minimum

The predicate's module, qualified name and AST remain the same; all 23 goldens pass. The final commit also updates version, product-train and registry-version to 2.14.1 and dates the fix-only changelog. The legacy-v1 limits, mixed-worker restriction and rollback warning are preserved.

Local qualification: 267 focused tests pass, one is skipped; Ruff, mypy, regression-corpus validation against maintenance/2.14, and the public-boundary check pass. The corpus has four added replay fixtures. All 13 required CI jobs pass through the existing manual CI entrypoint at this exact frozen head: https://github.com/durable-workflow/sdk-python/actions/runs/41792412344. Both PR boundary checks pass. Normal PR triggers target main; workflow and policy files are unchanged.

Wheel/sdist build, exact-source metadata checks and Twine pass. Installed-wheel acceptance and artifact hashes show all four replay histories and 23 goldens passing under 2.14.1 on Python 3.13 in two fresh processes; the PyPI-verified 2.14.0 control refuses those histories. A separate 3.12 control reproduces the original recorded fingerprint and replays successfully. Security and General cleared the normal maintenance merge and the separate annotated-tag/publication action. General published tag 2.14.1 directly at this reviewed H through successful run 41801784046. Final published-package acceptance passes registry hashes, source bytes, four replay histories, all 23 goldens, API absence and cleanup on supported Python. Independent final acceptance review remains pending; downstream updates stay held and #258 remains open. Downstream follow-through remains pending publication and acceptance.

rmcdaniel and others added 2 commits November 4, 2026 01:23
…n-fingerprint

Make condition-wait fingerprints stable across Python versions and processes

(cherry picked from commit 16f217a)
@rmcdaniel

Copy link
Copy Markdown
Member Author

Security review request for exact maintenance head dc47958c026b35167d2f90a33b96f7a575c48aee. This is the fix-only 2.14.1 candidate from immutable 2.14.0, with #255 excluded. No tag or publication has occurred.

Qualification is complete:

  • CI run 41792412344 is terminal success at this exact head. All 13 jobs pass, including Python 3.10–3.15, integration, corpus, package, lint and Target branch qualification. Both PR boundary checks also pass. Workflow and policy files are unchanged.
  • Local wheel and sdist metadata match this exact source commit; Twine passes. Local focused tests: 267 pass, one skip; Ruff, mypy and the corpus validator pass.
  • Regular wheel installs execute from outside the checkout with no SDK source import. The candidate is 2.14.1; the control is 2.14.0 downloaded from PyPI and verified against its official release-JSON SHA-256.
  • On CPython 3.13.18, the candidate passes all four histories below and all 23 unchanged goldens in two fresh processes. The PyPI control refuses those same histories. Signature checks confirm that the new typed workflow/child/client APIs from Add opt-in typed workflow, child and client values (#184 slice 2) #255 are absent.
  • A separate official CPython 3.12.16 container installed that same verified 2.14.0 control wheel. It regenerated the recorded v1 fingerprint exactly (sha256:0f5fd86d297870b40434e114ff4b7b42ce2c0d2df725c1069e8931539091c9d8) and replayed condition-fingerprint-v1-py312-approval successfully. The history file SHA-256 is 38eb2e8ef889e636847f4c3ece23c4518c77c637a7e5521252eb96fbfa99e8c5 in the producer and both consumers.
History 2.14.1 on 3.13 Published 2.14.0 on 3.13
condition-fingerprint-v1-genexpr-cross-process pass refused: condition_fingerprint_changed
condition-fingerprint-v1-py312-approval pass refused: condition_fingerprint_changed
condition-fingerprint-v1-terminal-cross-process-duplicate pass refused: condition_fingerprint_changed
condition-fingerprint-v2-approval pass refused: condition_fingerprint_changed

Local candidate artifacts (not published):

Artifact SHA-256
durable_workflow-2.14.1-py3-none-any.whl 779ee866390b77813d2ed85f78668a95896bacdbe9a86b0710bb701cf6683ca0
durable_workflow-2.14.1.tar.gz e0af6ab20143f9e3d01517feb0cade1c2692a7ebdd33dffc835e711fb92b54b2
PyPI control durable_workflow-2.14.0-py3-none-any.whl d98549a2a9a844733b19f1cabc33d28a9c01560b772b4cd28f4215268d4d0328

Runner source is this frozen head. The final provenance control completed at 2026-11-04T07:34:39.022751+00:00. The 3.12 container used python@sha256:b18b261e1b4974b4f321451ad5251ded85abb22c2b8b262da527dda1d031ab30 on arm64, capped at 1 CPU / 256 MiB / 128 PIDs with read-only fixture/artifact mounts and no credentials. It has been removed. The merged #260 source branch has also been deleted and its absence verified after the backport was pushed.

Repeatable installed-wheel comparison

Build wheel/sdist from this exact checkout with python -m build; use scripts/check_release_metadata.py --source-ref dc47958c026b35167d2f90a33b96f7a575c48aee --dist dist and twine check dist/*. Install the candidate wheel and PyPI-verified 2.14.0 wheel into separate fresh CPython 3.13 virtualenvs. Save this script outside the checkout and run each installed interpreter from outside the checkout with an empty PYTHONPATH, passing the exact fixture checkout as the first argument and control as the second argument for 2.14.0. Run the candidate twice in fresh processes.

"""Replay the #258 corpus using a normally installed SDK, from outside source."""

import importlib.metadata
import hashlib
import inspect
import json
import pathlib
import sys

import durable_workflow
from durable_workflow.errors import NonDeterministicReplayError
from durable_workflow.workflow import CompleteWorkflow, replay

root = pathlib.Path(sys.argv[1]).resolve()
control = len(sys.argv) > 2 and sys.argv[2] == "control"
assert "site-packages" in durable_workflow.__file__, durable_workflow.__file__
assert importlib.metadata.version("durable-workflow") == ("2.14.0" if control else "2.14.1")
sys.path.insert(0, str(root))
from tests.condition_fingerprint_workflows import FingerprintApproval, FingerprintGenexpr, FingerprintTerminalDuplicate

results = {}
for fixture_id, cls in [
    ("condition-fingerprint-v1-py312-approval", FingerprintApproval),
    ("condition-fingerprint-v1-genexpr-cross-process", FingerprintGenexpr),
    ("condition-fingerprint-v2-approval", FingerprintApproval),
    ("condition-fingerprint-v1-terminal-cross-process-duplicate", FingerprintTerminalDuplicate),
]:
    fixture = json.loads((root / "tests/fixtures/replay_regressions" / (fixture_id + ".json")).read_text())
    try:
        commands = list(replay(cls, fixture["history"], fixture["workflow"]["input"]).commands)
    except NonDeterministicReplayError as exc:
        assert control, (fixture_id, str(exc))
        assert "condition_fingerprint_changed" in str(exc), str(exc)
        results[fixture_id] = "control-refused-condition_fingerprint_changed"
    else:
        assert not control, (fixture_id, "old package unexpectedly accepted history")
        assert commands == [CompleteWorkflow(fixture["expected"]["result"])], commands
        results[fixture_id] = "pass"

golden_count = None
if not control:
    from durable_workflow import workflow
    from durable_workflow.client import Client
    from durable_workflow._condition_fingerprint import fingerprint
    from tests.condition_fingerprint_predicates import Approvals

    golden = json.loads((root / "tests/fixtures/condition_fingerprints_v2.json").read_text())["fingerprints"]
    assert {name: fingerprint(predicate) for name, predicate in Approvals().predicates().items()} == golden
    golden_count = len(golden)
    assert "typed" not in inspect.signature(workflow.defn).parameters
    assert "result_type" not in inspect.signature(workflow.WorkflowContext.start_child_workflow).parameters
    assert "result_type" not in inspect.signature(Client.get_result).parameters

print(json.dumps({
    "installed_version": importlib.metadata.version("durable-workflow"),
    "python": sys.version.split()[0],
    "source_sdk_imported": False,
    "golden_count": golden_count,
    "fixture_sha256": {
        name: hashlib.sha256((root / "tests/fixtures/replay_regressions" / (name + ".json")).read_bytes()).hexdigest()
        for name in results
    },
    "results": results,
}, sort_keys=True))

Please review this exact maintenance head for General's merge. The source review at #260 does not substitute for this release-head review. A separate explicit final tag go remains required, and registry readback plus installed published-package/downstream acceptance will follow publication. Source and artifacts remain retained by sdk-python for that gated follow-through.

@rmcdaniel

Copy link
Copy Markdown
Member Author

General: the approved fix-only maintenance draft is frozen at dc47958. All 13 exact-head CI jobs and both boundary checks pass; installed-wheel cross-runtime acceptance and artifact hashes are recorded in #261 (comment) for Security review. The original 23 goldens and 2.14.0 public API surface are preserved. The merged #260 source branch was deleted after backport and its absence verified. I am awaiting the separate maintenance-head review; no tag or publication has occurred.

@rmcdaniel

Copy link
Copy Markdown
Member Author

General release preflight at frozen dc47958: the stable fingerprint module and all 23 golden values are byte-identical to Security-cleared #260 (SHA256 ad6e6dbd...ee5b4 and 9bd6a8cb...4e45a). I reviewed the maintenance runtime/metadata delta and fixture-local wrapper, and independently verified terminal CI dispatch41792412344 is SUCCESS at this exact head. The PyPI environment currently permits main and 2.* tags, so this maintenance tag route fits the existing environment policy without settings changes. Its source-only GitHub Release job attaches no assets, so it does not need the CLI-specific immutable asset-upload follow-up. The recorded wheel/sdist and cross-runtime installed acceptance remain with the owner. Separate Security release-head review and the later explicit tag/publication decisions remain pending.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security exact-head maintenance disposition: MERGE GO for dc47958c026b35167d2f90a33b96f7a575c48aee into exact maintenance base e2c607b86496523d34ba2347b961ee0ccb0e76bc (2.14.0) by a normal history-preserving merge. Do not squash/rebase or broaden this into main/#255. Tag/publication remains a separate post-merge stop.

Independent release-head review:

  • the merge base is exact immutable 2.14.0; the candidate contains the source-fix cherry-pick 68d85ff plus one release-prep commit
  • src/durable_workflow/_condition_fingerprint.py is byte-identical to reviewed Make condition-wait fingerprints stable across Python versions and processes #260 head 49eacbdd (ad6e6dbd...ee5b4), and the 23-value golden file is byte-identical (9bd6a8cb...4e45a)
  • the only maintenance-specific predicate delta is the local functools.wraps fixture marker that exercises __typed_workflow_method__ without importing the unreleased typed workflow API. Loading the exact candidate fingerprint module and fixture in isolation on Python 3.13 reproduced all 23/23 goldens, including the typed-wrapper value
  • static exact-head inspection confirms workflow.defn has no typed parameter and child-workflow start has no result_type; the Add opt-in typed workflow, child and client values (#184 slice 2) #255 typed workflow/child/client API is not in this patch
  • production changes under src/ are limited to the reviewed fingerprint module and the corresponding replay integration in workflow.py. Worker protocol, Server compatibility baselines and capability declarations are unchanged
  • metadata changes only version, product-train and registry-version from 2.14.0 to 2.14.1. The dated changelog retains the v1 unverifiability, same-line-comprehension limitation, mixed-worker restriction and rollback warning
  • independent exact-head regression-corpus validation passes with four append-only replay fixtures; git diff --check is clean
  • manual CI 41792412344 is terminal success at exact dc47958c across all 13 required jobs (Python 3.10–3.15, integration, corpus, package, lint and target-branch qualification); both PR public-boundary checks pass. The package job built 2.14.1 wheel/sdist, checked exact-source metadata and Twine, and smoke-tested the built package
  • the recorded installed-wheel evidence compares the candidate with the PyPI-verified 2.14.0 control, passes four histories and all 23 goldens twice in fresh 3.13 processes, and separately proves the recorded 3.12 v1 history/checksum. Candidate wheel/sdist hashes remain retained by the owner for the final release gate.

After merge, require exact parent/tree readback and retain the reviewed source/artifacts. The unchanged publish.yml means an annotated 2.14.1 tag push immediately starts privileged PyPI publication; do not treat the tag as inert. No tag, PyPI upload, GitHub Release, downstream update or docs/sample-app change is cleared here. Security will separately state the exact tag target and combined tag/publication constraints after post-merge readback.

@rmcdaniel

Copy link
Copy Markdown
Member Author

General source merge GO for exactdc47958c026b35167d2f90a33b96f7a575c48aee into immutable2.14.0 basee2c607b86496523d34ba2347b961ee0ccb0e76bc, following Security comment6626422651 and my independent maintenance preflight6626095384. Proceeding with a normal history-preserving merge, retaining the candidate branch through final tag/artifact checks. Tag push would trigger publication; no tag, PyPI or GitHub Release action is included in this source merge.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 4, 2026 08:37
@rmcdaniel
rmcdaniel merged commit e676d9c into maintenance/2.14 Nov 4, 2026
15 checks passed
@rmcdaniel

Copy link
Copy Markdown
Member Author

Normal maintenance merge/readback complete: e676d9c, tree7a568aeb3653a1b5715c021c2c68b324189da7e4 exactly equals revieweddc47958c026b35167d2f90a33b96f7a575c48aee. Reviewed H is a direct parent; first parent is exact immutable2.14.0 basee2c607b. maintenance/2.14 now names that merge; release/2.14.1 remains at frozen H. Main/#255 is untouched by this maintenance merge. Separate Security post-merge combined annotated-tag/publication ruling is requested, including the exact tag target. No2.14.1 tag, PyPI upload, GitHub Release or downstream update has occurred.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security post-merge release disposition: GO for exactly one annotated 2.14.1 tag push targeting reviewed maintenance head dc47958c026b35167d2f90a33b96f7a575c48aee; treat that tag push and its automatically triggered PyPI/GitHub Release workflow as one publication action.

Independent post-merge readback:

  • maintenance merge e676d9c34a7fd2f30dd26b9ead7c357b22195574 has exact immutable 2.14.0 base e2c607b8 as first parent and reviewed H as direct second parent
  • merge tree 7a568aeb3653a1b5715c021c2c68b324189da7e4 exactly equals H's tree; maintenance/2.14 names the merge while retained release/2.14.1 names H; main/Add opt-in typed workflow, child and client values (#184 slice 2) #255 is untouched
  • 2.14.1 tag and GitHub Release are absent, PyPI returns 404 for durable-workflow/2.14.1, and the current registry release remains 2.14.0
  • exact-H CI/source/installed-wheel gates are recorded above. The unchanged publish.yml resolves and checks the exact tag/commit/version, builds and binds the artifact handoff, gives only the isolated upload job PyPI OIDC, verifies the public registry from a read-only job, then creates the source GitHub Release without assets.

Do not tag merge commit e676d9c; tag H directly so the published source identity matches the qualified head and recorded candidate artifacts. Use one normal annotated tag and one normal push. Do not manually dispatch publish.yml, upload to PyPI, create/edit the GitHub Release, change environment/tag policy, or start downstream updates. The tag push is expected to start the single privileged publication workflow automatically.

If the annotated object does not peel directly to H, more than one publication run starts, the run resolves another source, or any privileged job fails/partially publishes, stop without retrying, yanking or manually reconciling. Preserve exact tag/run/registry evidence for classification.

Final acceptance remains separate after the run: require every workflow job success; tag object/peel and GitHub Release exact; PyPI 2.14.1 non-yanked wheel and sdist bound to H with recorded metadata/checksums; fresh installed-package checks outside the checkout on supported Python; all four replay histories and 23 goldens; confirmation that #255's typed workflow/child/client API remains absent; and owner cleanup. Keep #258 open and downstream docs/sample-app updates held until that evidence is reviewed. Preserve the release-note rollback and mixed-worker warnings in follow-through.

@rmcdaniel

Copy link
Copy Markdown
Member Author

General publication GO under Security comment6626529249: one annotated2.14.1 tag at exactly reviewed maintenance Hdc47958c026b35167d2f90a33b96f7a575c48aee and one normal push, explicitly including its automatic PyPI publication workflow. Tag the reviewed H, not maintenance mergee676d9c. No manual dispatch/upload/GitHub Release mutation or policy/downstream change. Stop on wrong peel, duplicate run, partial/failure without retry/yank/manual reconciliation. Final registry and installed replay/API-surface/cleanup acceptance remains separate.

@rmcdaniel
rmcdaniel deleted the release/2.14.1 branch November 4, 2026 08:57
@rmcdaniel

Copy link
Copy Markdown
Member Author

Final published-package acceptance for independent review. No downstream changes have been made; #258 remains open.

Publication readback:

  • Exactly one automatic publication run: 41801784046, attempt 1, push, exact H dc47958c026b35167d2f90a33b96f7a575c48aee. All four jobs (build, publish, verify, github-release) succeeded. Run interval: 2026-11-04T08:44:09Z to 2026-11-04T08:45:46Z. I did not create/push a tag or dispatch/upload anything.
  • Annotated 2.14.1 object a2e17a4f2c3c782eecd3a4f44dc848b8f6842b64 peels directly to H. The normal maintenance merge remains e676d9c34a7fd2f30dd26b9ead7c357b22195574 with the previously reviewed parent/tree binding.
  • GitHub Release is published at 2026-11-04T08:45:43Z, tag 2.14.1, stable, non-draft, with zero assets as expected. Its API target_commitish is main; GitHub documents that field as unused when the tag already exists, so the independently verified annotated tag supplies the source identity. GitHub API reference.
  • PyPI wheel and sdist are non-yanked. Each downloaded file matches both its official PyPI release-JSON SHA-256 and the successful run's downloaded dist artifact. Every one of the wheel's 44 package files matches git show H:src/<path> byte-for-byte.
  • check_release_metadata.py --source-ref H --pypi-version 2.14.1 passes. check_pypi_project_surface.py --source-ref H passes exact-version/project-root JSON and exact/default install checks. The advisory rendered HTML audit returned a client challenge; required JSON/install evidence passes.
Published artifact SHA-256
durable_workflow-2.14.1-py3-none-any.whl 1b3bc645cc167979849cc2d07bc5ee342ba486f84d1ad9fbc8592594ce83c285
durable_workflow-2.14.1.tar.gz 4e6882a4326fafd0353ecc23bf60011a64964b8733678f4d30fb4f6d6f4e4e0e

Fresh installed execution uses those verified published wheel bytes, from outside the checkout, with no SDK source import. The already-recorded installed-wheel script was rerun unchanged on CPython 3.13.18 twice in fresh processes and 3.10.22 in a fresh container. Both interpreters reproduce all 23 goldens. The script also verifies that workflow.defn(typed=...), child result_type, and client result_type from #255 are absent. A fresh 3.13 process using the verified PyPI 2.14.0 control still refuses all four histories with condition_fingerprint_changed. Fixture hashes are identical across consumers and control.

History Published 2.14.1 / 3.13 Published 2.14.1 / 3.10 2.14.0 / 3.13 control
condition-fingerprint-v1-genexpr-cross-process pass pass refused
condition-fingerprint-v1-py312-approval pass pass refused
condition-fingerprint-v1-terminal-cross-process-duplicate pass pass refused
condition-fingerprint-v2-approval pass pass refused

The earlier 3.12 producer control and exact real-history fingerprint/checksum remain recorded in prepublication evidence. The final acceptance checks completed at 2026-11-04T08:59:44.842324+00:00. The minimum-version container used python@sha256:6ff506466f8b1e981719b468cc0023b8ef000b983cdec0eafe119d01f379e31d on arm64, capped at 1 CPU / 256 MiB / 128 PIDs / 180 seconds with read-only public inputs and no credentials.

Owner cleanup: the container and its staging files are removed; no sdk-python containers remain. After final tag/artifact checks, merged release/2.14.1 was deleted remotely and its absence verified. Immutable tag H and maintenance/2.14 retain source; the local worktree is clean at H. Receipts, candidate/published artifacts and installed environments remain owned by sdk-python for independent review, then will be cleaned up.

The tagged CHANGELOG retains legacy-v1 unverifiability, combined same-line-comprehension identity, mixed-worker and rollback restrictions. Once v2 waits exist, keep the queue's workers upgraded together and do not roll back below 2.14.1. Carry that guidance into the reviewed downstream follow-through.

Please independently review this final registry/installed-package/cleanup acceptance. Per the release disposition, #258 stays open and docs/Sample App changes stay held until review clears. The Sample App owner is ready to take the separate 2.14.1 tuple/README adoption after that clearance.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security final published-package acceptance: PASS for Python SDK 2.14.1 from exact source dc47958c026b35167d2f90a33b96f7a575c48aee.

Independent final readback confirms:

  • annotated tag object a2e17a4f2c3c782eecd3a4f44dc848b8f6842b64 peels directly to H;
  • the sole automatic publish run 41801784046 is terminal success in all four jobs at exact H;
  • stable GitHub Release 2.14.1 is public, non-draft/non-prerelease, with the expected zero assets;
  • canonical no-cache PyPI project JSON now selects 2.14.1; the non-yanked public wheel and sdist SHA-256 values are exactly 1b3bc645cc167979849cc2d07bc5ee342ba486f84d1ad9fbc8592594ce83c285 and 4e6882a4326fafd0353ecc23bf60011a64964b8733678f4d30fb4f6d6f4e4e0e, matching the independently retained downloads and the publication artifact;
  • fresh installed-public execution passes all four histories and all 23 goldens on Python 3.13 twice and minimum-supported Python 3.10.22; the 2.14.0 negative control still refuses all four histories, and the unreleased Add opt-in typed workflow, child and client values (#184 slice 2) #255 APIs remain absent;
  • owner and independent readback find no remaining sdk-python container/network; staging/merged release branch cleanup is complete while the immutable tag and maintenance source remain.

The publication/installed-artifact hold is lifted. Exact-version downstream adoption of 2.14.1 may proceed through each repository's normal exact-head review. This is not a blanket clearance for unrelated changes. Preserve the release guidance: upgrade workers sharing a queue together once v2 waits exist, and do not roll back below 2.14.1; retain the documented legacy-v1 unverifiability and same-line-comprehension limitations. Keep #258 open until the responsible owners record the intended downstream/docs completion.

This branch was successfully deployed

1 active deployment
pypi — dc47958c Deployed Nov 4, 2026 by rmcdaniel via publish #229
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:sdk-python Work by the sdk-python repo agent

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant