Skip to content

Encode Nexus arguments as Avro before sending them to workflow services #112

Description

@rmcdaniel

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

  1. added
    kind:defectA public product behavior is incorrect
    priority:P1High-priority product or release risk
    completion:evidence-requiredClose only after all explicit acceptance and operational evidence is public
    on Oct 11, 2026
  2. rmcdaniel commented on Oct 11, 2026

    @rmcdaniel
    MemberAuthor

    Python SDK PR #113 merged at aeded98bc64a3537f973a475cd524c4302b564e0, with the exact source tree qualified at 4fd246840f6d34dab76333b0697b041f3e5d1f18. 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.

  3. rmcdaniel commented on Oct 11, 2026

    @rmcdaniel
    MemberAuthor

    Published Python SDK 2.6.0rc1 has now executed actual caller workflows against PHP SDK workers in both shared and tenant-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 Started without 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.

  4. rmcdaniel commented on Oct 11, 2026

    @rmcdaniel
    MemberAuthor

    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.

  5. rmcdaniel commented on Oct 11, 2026

    @rmcdaniel
    MemberAuthor

    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-workflow selecting 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, shared and tenant-b callers targeting shared, 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-256 c0119c8aa6852335223ffc0f90dfdb86e22ba367012ef7a507bb4470c0cb6080, 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 HTTP403 caller_namespace_not_allowed and 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    completion:evidence-requiredClose only after all explicit acceptance and operational evidence is publickind:defectA public product behavior is incorrectpriority:P1High-priority product or release risk

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions