Repository navigation
Encode Nexus arguments as Avro before sending them to workflow services #112
Description
Activity
- addedkind:defectA public product behavior is incorrectA public product behavior is incorrectpriority:P1High-priority product or release riskHigh-priority product or release riskcompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publicClose only after all explicit acceptance and operational evidence is public
on 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.
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.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.
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.
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'snexus_request_payload()currently copieslist(arguments)without invoking the SDK serializer.In actual published run 38126329842, authored Python workflow
nexus-python-caller-shared-71, run01m4n2p2jpmnyv17pefg60c9np, sendsarguments: ["world"]to the registered PHP workflow service. HTTP admission succeeds, but the linked PHP SDK worker receives no positional input and fails withToo few arguments. Linked service run01m4n2p2s13v2dt3g0evcdr6s7has an actualWorkflowFailedhistory 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 digestsha256:1b8621cb43340f979f4dc144aa51c32d0747aaad73f2b600130e0ee973aea352. The official artifact independently verifies at 3338626 bytes and SHA-256b12925d8976b9ce10626a99a7373a08df34c87e7eb40932c9fe5f23af0cfc7b6.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