Repository navigation
Encode Nexus arguments as Avro before sending them to workflow services #112
Description
Reproduced failure
Published Python 2.5.4 Nexus requests send workflow arguments as a plain JSON list. The PHP SDK encodes its service-operation arguments as Avro bytes with payload_codec: avro. Python's nexus_request_payload() currently copies list(arguments) without invoking the SDK serializer.
In actual published run 38126329842, authored Python workflow nexus-python-caller-shared-71, run 01m4n2p2jpmnyv17pefg60c9np, sends arguments: ["world"] to the registered PHP workflow service. HTTP admission succeeds, but the linked PHP SDK worker receives no positional input and fails with Too few arguments. Linked service run 01m4n2p2s13v2dt3g0evcdr6s7 has an actual WorkflowFailed history event. Both workers and SDKs are published artifacts.
Runner a51c2a0b69153bb93404a4e086969e62363337f0, frozen Server 2.5.19 / Workflow 2.5.9 / PHP SDK 2.2.7 / Python SDK 2.5.4 / CLI 2.2.3 / Waterline 2.9.1. Server digest sha256:1b8621cb43340f979f4dc144aa51c32d0747aaad73f2b600130e0ee973aea352. The official artifact independently verifies at 3338626 bytes and SHA-256 b12925d8976b9ce10626a99a7373a08df34c87e7eb40932c9fe5f23af0cfc7b6.
This violates the portable SDK Avro payload contract and blocks the actual caller-workflow qualification in .github #122 / Server #394. Target-namespace addressing is a separate root cause in #111. Admission is insufficient to prove payload delivery or terminal results.
Acceptance
- Serialize Nexus arguments with the published fixed-schema Avro codec and carry the matching codec field. Preserve empty arguments and nested portable values. Refuse unsupported codecs explicitly.
- Exercise both ordinary client calls and authored workflow calls, including stable replay of the original call identity and recorded arguments. Preserve deterministic idempotency input while correcting HTTP payload encoding.
- Cover the SDK's external payload transport for oversized Nexus arguments, retaining the intended caller and target scopes.
- Add a focused wire regression and prove the actual PHP service worker receives the original values from the published Python SDK. Keep terminal service completion, failure and cancellation claims separate until those checks execute.
- Publish the qualified fix and complete affected consumer follow-through. Do not add JSON compatibility to service-mode SDK payloads.
Activity
rmcdaniel commentedon Oct 11, 2026
Python SDK PR #113 merged at
aeded98bc64a3537f973a475cd524c4302b564e0, with the exact source tree qualified at4fd246840f6d34dab76333b0697b041f3e5d1f18. All PR and main CI, package, corpus, docs, boundary and integration checks pass. Nexus arguments now use Avro. Oversized arguments use runtime payload upload while the recorded request and existing idempotency input stay unchanged. The merged branch is deleted.Publication and actual installed PHP service verification remain outstanding, so #112 stays open. Target routing is separate PR #114, whose focused request/worker/payload/replay tests pass and full source integration is running. Server #396 passes its source gates and six HTTP transport regressions but is currently closed without merging. Its disposition must be resolved before the dependent Server fix is published.
Next complete routing qualification and the published payload delivery checks. Linked terminal service/caller convergence remains Workflow #753, with the real workflow fixture Server #394 still draft and failing its new completion gate. HTTP admissions do not close that work.
rmcdaniel commentedon Oct 11, 2026
Published Python SDK 2.6.0rc1 has now executed actual caller workflows against PHP SDK workers in both
sharedandtenant-b. Both send Avro input to the shared catalog, preserve original caller/run identity, and receive the expected greeting from the linked PHP service.Exact tuple, requests and linked histories. The full workflow still returns
Startedwithout the service result because the durable call never reaches its linked terminal outcome. That backend work remains in durable-workflow/workflow#753. This issue stays open for the remaining acceptance cases, including recovery and oversized transport where applicable. Stable remains 2.5.4.rmcdaniel commentedon Oct 11, 2026
The addressing and Avro corrections are now prepared for ordinary stable 2.5.5 in #120, alongside #111. Its runtime/tests are byte-identical to the previously merged #113/#114 source, with pending 2.6 leased authoring excluded. Local lint/types and 541 affected tests pass, with two skipped. Hosted qualification passes all three supported Python versions, corpus/policy and built-package metadata/smoke. Real HTTP integration is still running.
The fix remains unpublished in stable 2.5.4. After the remaining gates, publication and actual installed stable namespace/inline/external PHP-worker checks will complete the stable delivery. This issue stays open through its published acceptance criteria, with full Nexus lifecycle work retained separately.
rmcdaniel commentedon Oct 11, 2026
Delivered in Python SDK 2.5.5, exact source
095a00d0c0e08592767c11b3c4da132aafabf1cf, through #120.Source qualification passes supported Python versions, lint, types, the official codec/replay corpus, built-package checks and 33 real HTTP integration cases on the ordinary worker protocol. Publication verifies distribution metadata, the exact install and the default
pip install durable-workflowselecting 2.5.5. The final protected run passes without changing the checker or tag.An additional registry-only execution on October 11 uses installed Python 2.5.5 and PHP 2.2.8 against published Server 2.5.22, immutable image
sha256:5e0d2dc34f6199f4b01b77874e046c173d9697499f647cc0e9ca543ea89bee7c, bundled Workflow 2.5.11. It runs the image's normal Apache entrypoint with isolated SQLite and namespace-owned local payload storage. No SDK, runtime source or transport is substituted.All 12 cases pass: client and authored workflow calls,
sharedandtenant-bcallers targetingshared, each with empty arguments, nested Unicode/null/boolean/numeric values, and external arguments. Every PHP service run actually completes with the original arguments. All six authored callers complete. The call records preserve the caller namespace and original run while polling and completion continue in that namespace. Each oversized request carries the original Avro reference, size 19,140 bytes and SHA-256c0119c8aa6852335223ffc0f90dfdb86e22ba367012ef7a507bb4470c0cb6080, uploaded through the target namespace. The caller client retains its original namespace.Actual installed-client diagnostics also pass: a missing endpoint returns HTTP404
endpoint_not_found; a disallowed caller namespace returns HTTP403caller_namespace_not_allowedand starts no linked work.Wheel SHA-256:
a167d021b25b90580539d7d99b6cf6d2e7f66be1014bbe5f42f116609ccd22f5. Source distribution SHA-256:436d44f7f7e3b93801a75f84209b1c975b853b39d03a964010ed6a7355bd443d.The focused source replay cases also retain the original call identity and reject a changed recorded target. This stable backport excludes the pending leased-authoring change. Complete Nexus cancellation, deadline and recovery qualification stays tracked in #116 and the owning runtime work.