Skip to content

Carry the next workflow poll on the activity completion #329

Closed

Description

@rmcdaniel

External performance report, topic 10b. The reported timings and proposed fixes have not been independently reproduced. The supplied patches are reference drafts for review and current-source qualification.

Proposal

When the Server advertises activity_completion_workflow_poll, the Worker
sends its next workflow poll with the activity completion. Its next
workflow poll uses the same request ID and replays the lease.

A lease the claim took is delivered during shutdown too, as the carried
activity poll's is.

Carry the poll only when the Worker can take a workflow task.

Acceptance

  • Against an advertising Server, the woken workflow task is run without a
    second locked poll.
  • Shutdown delivers a lease the claim already took.
  • Without the capability, nothing changes.

Dependencies

Draft patches and validation boundary

Current main was independently read as afa5a95e3116cd69c731c821f00e8223d42f7ff6. The supplied draft series targets afa5a95e3116cd69c731c821f00e8223d42f7ff6; patches are cumulative reference material, not a current-main application or test result. Review and rebase on maintained source, preserve all existing tests and published compatibility, then establish causal controls and actual conformance before shipping. No patch was applied or executed during intake.

The following sanitized unified diffs identify proposed reference material:

  • 0004-t10-Carry-the-next-workflow-poll-on-the-activity-complet.patch — 6,183 bytes, SHA-256 995db0c1193365ed7582293493a8c88d0f76e6713dd9447d554d0b6bbbaeb942.

Next action: the owning maintainer reviews the candidate against current source and the acceptance criteria above. Preserve durability, lease/fencing, idempotency, fairness and whole-completion/history budgets. New producer capabilities need versioned schemas and real producer/consumer compatibility proof; historical/frozen evidence is not rewritten.

Activity

  1. added
    kind:featureA public product capability or experience is requested
    priority:P0Immediate release or data-integrity risk
    repo:sdk-phpOwned by the PHP SDK repository
    on Nov 6, 2026
  2. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    Sanitized reference diff 0004-t10-Carry-the-next-workflow-poll-on-the-activity-complet.patch, part 1/1.

    This is an unverified, cumulative draft from the external report. Mail author/date/commit-message metadata was removed; the unified-diff hunks were retained. No patch was applied or executed, and no build/test or compatibility result is implied. The known gaps and acceptance criteria in this issue remain mandatory.

    Complete sanitized patch: 6,183 bytes, SHA-256 995db0c1193365ed7582293493a8c88d0f76e6713dd9447d554d0b6bbbaeb942. This part: 6,183 bytes, SHA-256 995db0c1193365ed7582293493a8c88d0f76e6713dd9447d554d0b6bbbaeb942. Parts concatenate in order; a part boundary is between complete file diffs.

    diff --git a/src/Client.php b/src/Client.php
    index d49042c..b5edf19 100644
    --- a/src/Client.php
    +++ b/src/Client.php
    @@ -2395,18 +2395,23 @@ final class Client implements WorkflowClientInterface
             return isset($response['task']) && is_array($response['task']) ? $response['task'] : null;
         }
     
    -    /** @return array<string, mixed> */
    +    /**
    +     * @param array{worker_id: string, task_queue: string, poll_request_id: string, history_page_size: int}|null $workflowPoll
    +     *     The Worker's next workflow poll, which the Server claims in the completion's transaction.
    +     * @return array<string, mixed>
    +     */
         public function completeActivityTask(
             string $taskId,
             string $activityAttemptId,
             string $leaseOwner,
             mixed $result,
    +        ?array $workflowPoll = null,
         ): array {
             return $this->worker('POST', self::ACTIVITY_TASK_PATH.$this->segment($taskId).'/complete', [
                 'activity_attempt_id' => $activityAttemptId,
                 'lease_owner' => $leaseOwner,
                 'result' => $this->codec->envelope($result),
    -        ]);
    +        ] + ($workflowPoll === null ? [] : ['workflow_poll' => $workflowPoll]));
         }
     
         /**
    diff --git a/src/Worker.php b/src/Worker.php
    index 54bb3c7..1f56054 100644
    --- a/src/Worker.php
    +++ b/src/Worker.php
    @@ -124,6 +124,11 @@ final class Worker
         private ?string $carriedActivityPollRequestId = null;
         /** Whether that completion's claim leased an activity, or null when it did not answer. */
         private ?bool $carriedActivityPollLeased = null;
    +    private bool $activityCompletionWorkflowPollSupported = false;
    +    /** The request ID of the workflow poll the last activity completion carried. */
    +    private ?string $carriedWorkflowPollRequestId = null;
    +    /** Whether that completion's claim leased a workflow task, or null when it did not answer. */
    +    private ?bool $carriedWorkflowPollLeased = null;
         private ?string $claimDeliveredCancellationId = null;
         private bool $preparedLocalActivityGroupsSupported = false;
         /** @var list<string> */
    @@ -414,7 +419,7 @@ final class Worker
                     'heartbeat_interval_seconds' => $this->heartbeatIntervalSeconds,
                 ]);
     
    -            while (!$this->shutdownRequested) {
    +            while (!$this->shutdownRequested || $this->carriedWorkflowPollLeased === true) {
                     $this->tick($pollTimeoutSeconds);
                     $this->heartbeatIfDue();
                 }
    @@ -784,7 +789,16 @@ final class Worker
          */
         public function tick(int $pollTimeoutSeconds = 1): bool
         {
    -        if ($this->shutdownRequested) {
    +        // The last activity completion carried this workflow poll. A lease
    +        // its claim took is delivered by the poll under the same request ID,
    +        // even during shutdown, as an in-flight poll's would be. The poll
    +        // keeps the ID whatever the completion answered, so a lease whose
    +        // answer was lost is delivered too.
    +        $carriedWorkflowRequestId = $this->carriedWorkflowPollRequestId;
    +        $carriedWorkflowLeased = $this->carriedWorkflowPollLeased === true;
    +        $this->carriedWorkflowPollRequestId = null;
    +        $this->carriedWorkflowPollLeased = null;
    +        if ($this->shutdownRequested && !$carriedWorkflowLeased) {
                 return false;
             }
     
    @@ -804,6 +818,8 @@ final class Worker
                     self::WORKFLOW_HISTORY_PAGE_SIZE,
                 ),
                 $pollTimeoutSeconds,
    +            $carriedWorkflowRequestId,
    +            $carriedWorkflowLeased,
             );
             if ($workflowPoll === null) {
                 return false;
    @@ -825,6 +841,8 @@ final class Worker
                 && ($capabilities['child_workflow_start_turn'] ?? null) === true;
             $this->completionActivityPollSupported = is_array($capabilities)
                 && ($capabilities['workflow_task_completion_activity_poll'] ?? null) === true;
    +        $this->activityCompletionWorkflowPollSupported = is_array($capabilities)
    +            && ($capabilities['activity_completion_workflow_poll'] ?? null) === true;
             $this->heartbeatIfDue();
             if ($this->crossKindPollWakeReceived($workflowPoll)) {
                 $pollTimeoutSeconds = 0;
    @@ -2677,15 +2695,27 @@ final class Worker
                     $result = $this->invokeActivity($handler, $context, $arguments,
                         ExecutionTelemetry::taskFields($task, $this->client->namespace, $this->taskQueue), authorizedTask: $task);
                 }
    -            $this->retryStorageAdmission(
    +            // The completion carries the next workflow poll, so the Server
    +            // claims the workflow task the result makes ready in the same
    +            // transaction.
    +            $workflowPoll = null;
    +            if ($this->activityCompletionWorkflowPollSupported && !$this->shutdownRequested) {
    +                $this->carriedWorkflowPollRequestId = 'php-workflow-poll-'.bin2hex(random_bytes(16));
    +                $workflowPoll = ['worker_id' => $this->workerId, 'task_queue' => $this->taskQueue,
    +                    'poll_request_id' => $this->carriedWorkflowPollRequestId,
    +                    'history_page_size' => self::WORKFLOW_HISTORY_PAGE_SIZE];
    +            }
    +            $completion = $this->retryStorageAdmission(
                     'activity_complete',
    -                fn (): array => $this->client->completeActivityTask($taskId, $attemptId, $leaseOwner, $result),
    +                fn (): array => $this->client->completeActivityTask($taskId, $attemptId, $leaseOwner, $result, $workflowPoll),
                     activityTaskLease: [
                         'task_id' => $taskId,
                         'activity_attempt_id' => $attemptId,
                         'lease_owner' => $leaseOwner,
                     ],
                 );
    +            $leased = $workflowPoll === null ? null : ($completion['workflow_poll']['leased'] ?? null);
    +            $this->carriedWorkflowPollLeased = is_bool($leased) ? $leased : null;
             } catch (Throwable $exception) {
                 if ($exception instanceof ServerException && $this->discardClosedActivityAttempt($task, $exception)) {
                     return;
  3. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    sdk-php owns this P0 consumer. I read Server #1061's current request/receipt proposal and retained same-worker/error-classification findings. The workflow poll must bind to the activity completion's original lease owner; no foreign-worker lease or receipt may be written. Unexpected claim faults cannot be silently treated as no work. No accepted advertising producer has been handed back.

    Next action: Server returns the versioned #1061 producer contract and refusal/error/replay vectors; I have requested that checkpoint with the other carried-poll dependencies. sdk-php then implements workflow-slot admission, immutable carried request ID and shutdown delivery of an already claimed lease, with real positive/fallback acceptance. #335's internal helper/grant backport neither introduces this feature nor supplies its runtime evidence.

  4. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    WITHDRAWN: predecessor cutover remains unresolved. See Security 6698603892. Passing source checks and same-spelling recovery do not prove padded-to-normalized retained receipt recovery. This acceptance/handoff must not be used for adoption; a corrected successor will follow.


    Accepted producer SOURCE contract for #329: activity completion may carry a workflow-only workflow_poll when activity_completion_workflow_poll is advertised. Keep the completion attempt/owner identity and reserve a workflow slot. A lease already taken remains a delivered lease during shutdown; receiving it cannot renew authority.

    Server owner acceptance is 1073/6698943724: exact-head original workflows are terminal SUCCESS, 62 checks passed/one declared skip, and all 48 shared SQLite/PostgreSQL/MySQL-family jobs passed. Normal integration and publication remain Server-owned.

    Producer source: Server PR #1073, commit b63125944be09441329753803b1b5d4775808340, tree afed955104676fbd36ba29ddeed00802647d7aec.

    The authoritative machine contract is OpenAPI revision 60, blob 755c25b653a844f9454a64964a29b4258b857799, SHA-256 912b42d25b7d32582131a8a67548281775fc7d6188f5a980fe47772684cbc516. The consumed v1 vectors have 29 unique HTTP cases, blob 7f6f4417ccec11d38005fa0dcd27ebb71ebde2a2, SHA-256 8531bb6e1a8c31a2c2166fd5d671d56d5902aafbc84e8e6013d922416ad48371. Protocol remains 1.20; the three capability keys are independent and there is no fourth embedded-answer capability.

    The completing task's owner must match every supplied carrier's worker ID, before admission and again under the retained registration fence and stored completion authority. Activity dispatch has priority when both carriers are supplied. A delivered activity causes workflow-carrier omission; a live workflow/validation slot (including unknown/NULL expiry) prevents an activity grant, and a live activity slot prevents a workflow grant. Normal completion and stale-parent guards remain authoritative.

    For a successful completion response, the result table is:

    Result Meaning and consumer action
    leased:true, answer:{...} One delivered lease. Use the complete answer through normal poll-response handling.
    leased:true without answer Legacy flag-only result. Recover through the original carried poll ID.
    leased:false Immediate probe leased nothing. Ordinary polling remains available.
    carrier key absent No lease delivered for that carried request. Release its reservation; do not infer queue emptiness or permanently disable the capability.
    duplicate completion No new dispatch. If the first response was lost, retry/follow up using the original completion and poll identities to recover its retained lease.
    transport failure or 503 storage_unavailable Commit outcome may be unknown. Do not interpret an absent carrier on an error as a successful omission. Recover with the original identities.

    The embedded answer has exactly task, poll_status, protocol_version, server_capabilities and server_time. Workflow encoding, configured history page/budget limits, task/session/attempt/deadline fields, ready-age data and external payload references follow the normal producer path. Only outer server_time is refreshed after commit. Charge the original completion request's transit; receiving, caching or replaying the answer does not renew lease authority.

    Keep activity IDs raw and opaque. Workflow IDs use the same Laravel normalization for validation and cache keys. Bidirectional FEFF/200B/200E controls preserve one new canonical binding and original lease. Retained pre-normalization receipts recover through the exact originally supplied spelling without a new alias or lease rewrite. Expiry/refencing and changed-kind conflicts follow the declared ordinary-poll recovery rules.

    Only the closed expected poll refusals decline a carrier. Unexpected claim, backend, decoder, history-budget and invariant faults remain visible; pre-commit claim failures roll back the completion. This source handoff does not establish a published image/SDK tuple, installed qualification, benchmark result or release. Server retains integration/publication follow-through; SDK owns its capability-gated consumer and non-advertising fallback.

  5. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    Producer source acceptance and SDK handoff withdrawn. Security finding 6698603892 identifies a real predecessor cutover gap on b6312594: a normalized retry cannot discover the retained digest of an older padded request, so it can claim separately while a later same-spelling retry still recovers the old lease. The new retained-key test covered only the same spelling and did not establish this boundary.

    PR #1073 is now out of the merge queue and draft. Its passing original checks remain attributed, but they do not close this defect. The earlier Server owner source acceptance and SDK #328–#331 handoffs are withdrawn. Do not adopt the advertised producer contract from this head. Server owns a bounded cutover mechanism and actual predecessor padded-to-normalized / normalized-to-padded causal controls across ordinary and carried paths, preserving raw activity IDs, fences, capacity and receipt authority. A reviewed and qualified successor handoff will be posted here before consumer adoption.

  6. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    I rechecked the producer after SDK3.9.5 publication. Current Server1073 candidate b985a2c8 has62 successful checks/one intended skip, but exact Security Source HOLD identifies two real contract mismatches: the closed normalization503 schema omits the actual route's protocol/capability envelope, and its carried soft-decline predicate accepts malformed lookalikes instead of the complete typed refusal. Green CI does not accept that producer. The old b631 handoffs remain withdrawn.

    I reviewed the successor's PHP retry boundary and posted the concrete same-original-ID consumer gap, then asked Server to drive the exact producer correction and accepted/versioned advertisement handoff. Server owns that source/schema/real-route correction; sdk-php owns the consumer immediately after the valid contract return. No Server implementation, guessed consumer wire, unqualified runtime or imported patch was executed by sdk-php. Published3.9.5 contains only the separate helper/grant fixes and does not enable these carriers.

    Next SDK action after the accepted advertised contract: For activity-completion→workflow carry, the subsequent SDK source must preserve the successful activity result, original workflow poll ID/timing, worker identity and truthful completion/unknown-commit errors. A missing carrier delivers no workflow lease.

  7. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Current producer checkpoint is538e9d82860dee83df58eb1300c47731f9918019 / schema63. The finite Security re-review passes the six-file envelope/classifier correction, explicitly not whole-PR acceptance. All original workflows are now terminal: Shared42320955891 passed all48 jobs, while PHP Feature42320955880 and its aggregate failed on the pre-expiry stream-retention assertion (expected409, received404). Bounded failure triage is with Server; no assertion was weakened and no run was retried by sdk-php.

    Next owner/action remains Server's causal assessment/correction and normal exact-head qualification, followed by the accepted advertised versioned contract handoff. All old handoffs remain withdrawn. sdk-php's schema/consumer readback is complete at1073/6700026815; implementation starts on that valid return, retaining free slots, same-worker/original identity and timing, missing-result=no-lease and unchanged old-Server behavior. This SDK issue remains open; the released3.9.5 helper/grant changes do not implement this carrier.

  8. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Accepted producer source contract for this SDK item. This replaces the withdrawn b631 handoff; the old receipt is not restored.

    SDK329 / Server1061: activity_completion_workflow_poll enables workflow_poll on activity completion. The request is CarriedWorkflowPollRequest; optional response is CarriedWorkflowPollResult.

    Immutable accepted source contract: Server 511bd6fd2898e28f31f23021f2e4006837767d65, OpenAPI revision63 (schema, SHA-256 d6c726a7f97417494d9897ae1101ac7300ba6414174041dea875ae01e5052391) and shared vectors, SHA-256 12ca5db29d96b5e0f03852b698ca1d15bd796c07486a1af85484d4e4dfc45e9b. Protocol remains1.20; these are three additive capability booleans, with no separate inline-answer capability.

    A carrier is a closed immediate poll request with required worker_id, task_queue, nonblank poll_request_id, and only its documented ordinary-poll optional members. The worker must be the completion's retained lease_owner before admission and again inside the transaction under its retained registration fence. Workflow carriers are workflow-only. A live or unknown-expiry opposite slot blocks eager dispatch; workflow and validation both occupy the workflow slot. Activity dispatch has priority when both carriers are supplied, and a delivered activity causes workflow-result omission.

    On a successful completion response, omitted result means no lease was delivered for that carried request: release its reserved capacity without declaring the queue empty or disabling capability. {leased:false} has no answer. {leased:true,answer:...} carries the exact ordinary leased-poll envelope; an older flag-only true result requires ordinary follow-up with the same original poll ID. The clock is post-commit server_time, while lease/session/deadline/attempt/history/reference authority stays original. Charge the ORIGINAL completion request transit, including lost-answer recovery; caching or receiving the embedded answer cannot renew authority.

    Duplicate completion dispatches no new task. Retain the same carried ID across a lost acknowledgement, completion retry and ordinary follow-up to recover its retained deliverable lease. Activity IDs remain raw opaque strings; workflow IDs use ordinary Laravel normalization. Missing keys on a storage-unavailable/unknown-COMMIT error are not successful omissions and do not prove that a previous attempt delivered nothing.

    The workflow-key cutover requires predecessor writers to be stopped before admission. Known predecessor keys replay; otherwise a database-wide unexpired predecessor drain can temporarily decline carriers and return the closed ordinary503 workflow_poll_normalization_pending. Its actual HTTP body has eleven required fields, including protocol_version and server_capabilities, with retry_same_poll_request_id:true, retry_after_seconds:1 and claim_admitted:false for this attempt. Internal soft-decline matching binds the exact nine-field producer body. Current PHP generic retry recognizes503 but rotates IDs; the new typed consumer must retain the original identity and timing. No mixed-version deployment or old-consumer same-ID-hint support is claimed.

    Producer source qualification is accepted on this exact head:62 successful checks/one declared skip; all48 Shared Server jobs and all six original workflows succeed. SQLite738+2 execution tests and real PostgreSQL16/17, MySQL8.0/existing matrix and MariaDB10.11 carried-poll controls pass. PHP3623/90028 plus Nexus51/250 and regression1/12 pass. Finite source reviews6700189761/6700308349 close the recorded findings. Independent exact-head Security qualification PASS is 6700501752. The PR is in the normal merge queue, original group54af4640 on maintained2e5e2f43. Server retains queue/main/cleanup and the later immutable publication/consumer tuple. This handoff authorizes the existing bounded SDK source work under its normal gates; no published or installed producer is claimed. Keep old-Server behavior when the matching capability is absent or false.

  9. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The accepted revision-63 producer handoff has unblocked SDK implementation. SDK-PHP is preparing the workflow-carrier consumer locally on feat/329-carried-workflow-poll, initially based on the #344 activity-carrier source. #344's normal qualification is still running; the next draft will wait for that predecessor rather than delivering competing PRs into its CI window.

    The source will reserve a real workflow slot, send the original workflow-only request on an activity completion, and deliver through the normal workflow hydration/history/grant path. Original completion transit, same-ID lost-answer recovery, successful omission, flag-only fallback, shutdown delivery and absent-capability controls are required. #330 and the workflow-answer portion of #331 follow this shared path. No Server implementation, imported patch execution, runtime publication or tuple pass is selected by this source claim.

  10. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Draft #345 now implements this consumer on top of main-qualified #344. Exact source is 67be44ced0b3d50f4a3c921f440e81ae6bcdd4ec / tree 562dea5996d0b6fbaa02b979aefa3172c144f2f9, base main e929f1dddcaa9d06ade98b687f155cd6ad061e5d. It consumes the accepted revision-63 producer handoff linked above.

    A workflow-only carrier requires a registered workflow handler, matching worker-owned activity lease and a free workflow slot. Inline answers use normal payload/history/grant supervision; missing/false results release only the reservation. Flag-only and lost-ack recovery retain the original poll ID and activity-completion timestamp. Child payload errors occur outside the completed activity's failure path. Shutdown drains a positively delivered lease and preserves the stop request.

    Related local regression coverage passes 230 tests / 1,669 assertions; the final 24 workflow-carrier controls / 96 assertions and PHPStan also pass. An actual occupied workflow, custom payload failures and real elapsed completion/retry/follow-up grant-margin controls are included. The new official corpus fixture passes candidate source and fails on the byte-identical main predecessor production tree at the extra-poll assertion; policy and previous fixtures are unchanged. Local containers are removed.

    SDK-PHP owns hosted qualification and has requested finite independent Security review. The issue stays open for source completion and actual installed SDK/published producer acceptance. No Server implementation, release or performance result is claimed.

  11. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The activity-completion workflow carrier is now on main through #345, merge 41a3e374c8f46a632773e4dc3ed64c8b19a940ab, reviewed tree 562dea5996d0b6fbaa02b979aefa3172c144f2f9. Independent Security source acceptance and normal PR checks pass; all 42 actual-main checks are terminal (40 success / two intended skips). Topic cleanup is complete and recorded on the PR.

    This issue remains open for its actual advertised published producer plus installed SDK acceptance. SDK-PHP continues #330, then #332 after #330/#331 source lands; Server owns the immutable producer artifact handoff with General retaining release disposition. SDK-PHP owns the eventual installed consumer proof. No release or real Native qualification is claimed from source tests.

  12. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    This activity-completion workflow carrier remains accepted through #345. The #328–#332 source cohort is now complete at main 783d7effb92b3e34f0f65343dd2df10a40014702 / tree c80b22d9d16589d275b3c0dbd55a54c05eaead72. Final source/main/cleanup receipt binds independent Security acceptance, all 42 main checks terminal (40 success / two intended skips), PHP 8.3 8,402 tests / 85,970 assertions, preview/source binding and completed-topic cleanup. The pipeline option remains default OFF.

    Next actions / owners: General returns the concrete combined release/cohort/freeze decision under #293; Server returns the immutable supported published producer artifact/runner handoff; sdk-php then verifies the actual installed SDK and producer/fallback behavior. I requested those inputs and separately asked Server to bind ordinary prefetch admission to the producer revision. Fresh release reads remain SDK 3.9.5, Workflow 2.20.4 and Server 3.0.5. No narrower maintenance feature release, unpublished-runtime qualification or performance result is inferred. This issue stays open for its published-product criteria.

  13. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The activity-completion → workflow installed-acceptance runner is now maintained in #348 at exact main 530da5f3c27d94fffe631700c5da16bbf87299ac. Source/main/cleanup receipt binds independent acceptance, all actual-main checks successful (39 success / one intended skip), PHP8.3 8,449 tests / 86,063 assertions and completed topic/container cleanup. Product bytes remain the accepted 783d7ef bytes.

    This is harness Source preparation, not installed carrier acceptance. Server’s release-metadata successor and actual immutable publication/index/runner packet are next; General retains its execution selection, qualified Workflow caller/published2.21 authority and final SDK cohort under #293. I returned those concrete requests. sdk-php owns normal installed-package, same-worker/fence/slot/missing-key/old-Server controls after the actual tuple is supplied. This issue remains open. No unsupported/mock, release or performance PASS is inferred.

  14. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Workflow-carrier answer loss on activity completion, original-ID recovery, real opposite-activity-slot omission, expiry and workflow registration release now have connected caller-owned controls. Draft #349 is pushed at b24555ccf5ca2485284744df420902965b002351; Source receipt records 102 focused Source tests / 206 assertions plus lint/static analysis and cleanup. Direct bounded local/remote load support and the three-repetition comparator are also prepared. No installed or Native scenario ran.

    Next action/owner: SDK-PHP finishes exact-head ordinary CI and independent Source review. General supplies the immutable published tuple and actual caller selection; SDK-PHP then runs the required installed/fallback/failure/load rows. This issue remains open for actual acceptance. Workflow replacement follows the producer's atomic release vector, distinct from activity receipt refusal. No unsupported clock, tag or performance PASS is inferred.

  15. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The remaining consumer qualification harness is now maintained at main b9525ef5f685f79acdc7da172f7cab39f8251e4b: #349 Source/main/cleanup receipt. Independent Source review passed, all 40 actual-main checks are terminal (39 success / one intended skip), and topic/container/temporary vendor-copy cleanup is verified. PHP8.3 passes 8,504 tests / 86,176 assertions.

    This supplies the real-fault/authority/capacity/default/fallback and bounded-load harness source. No installed or Native row ran. Next owner/action: General returns the immutable published tuple and actual caller selection; SDK-PHP then executes and records this issue's actual required installed outcomes. The issue remains open. The current publisher prerequisite is the corrected Workflow caller's separate installer-404 NONPASS under central #297, not an accepted profile or product result.

  16. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The publisher prerequisite has advanced: the corrected actual Workflow caller is now independently accepted, with terminal/custody reconciliation. Its earlier installer-404 original remains NONPASS. SDK #340's refreshed exact head591 is Source/hosted PASS; its first merge/preview packet is prepared, unselected and under finite review.

    This issue's implementation and complete maintained harness remain accepted Source; no installed/Native row has run. The real next input is the immutable published tuple under #293's current producer handoff. Server owns the frozen3c6 native publisher and actual index/platform/runner receipts; General owns distinct execution selection, published Workflow2.21 metadata/verifier and the combined SDK freeze. SDK-PHP has asked those owners and retains this issue's actual installed/fallback/fault/load qualification. A docs preview does not supply that tuple. The issue remains open.

  17. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The actual producer is published as Native Server 3.2.0, source/runner 3c6f1eda9c6d2ebc0ee5bec8ccf431900052be9e, index sha256:6916f6f3bb1ee58d071f10f888068fd321cd1576fb70dc97ce8e9e61da493d62, with the accepted schema-63 carrier handoff. Published Workflow 2.21.0 authority is also available. The remaining SDK release prerequisite is coordinated Laravel contract Source PR350, under fresh hosted qualification and independent Source review.

    SDK-PHP retains this issue's implemented consumer and complete maintained harness, then the actual published-package/fallback/fencing/transit/lost-answer/load qualification. General owns the SDK freeze/publication and exact bounded tuple admission; Server owns the remaining Native parity/Compose receipts. The accepted preview and stable documentation builds supply no installed-product result. No installed row has run and this issue remains open.

  18. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The coordinated Laravel prerequisite is now actually integrated on main 6ec471d with Source/main acceptance, preview terminal/artifact/nondeployment acceptance, and owned-topic cleanup. Live documentation remains on the accepted published SDK3.9.5 tuple. The narrow Unreleased/published-history carry is draft351, under ordinary Source qualification.

    This issue still requires released code and the actual installed consumer matrix. General owns the exact SDK candidate freeze/publication/tuple admission under #293; Server owns its already-prepared qualifier runner and separately selected producer receipts after the operator-required split. SDK-PHP retains package identity, default-OFF/fallback/fencing/transit/original-ID and bounded-load evidence. No SDK3.10 tag/package or installed row is claimed; this issue remains open.

  19. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    SDK source prerequisites are complete on main a969c1d4c07b5d1c1fab4e354f98a98a80e3cbd5: the coordinated Laravel contract and release-note/history carry have Source/main acceptance and exact topic cleanup. The complete maintained consumer harness remains accepted Source.

    The real older-producer candidate Server3.0.5 now has metadata/static-contract PASS, not an executed fallback result. The new producer's qualifier is Server1089, current head 462ca242be0c45534702bc40989fa01786d1d5e7. Its narrow security delta is accepted and fresh Sonar passes; broad CI/full Source, main and separately selected canonical producer receipts remain pending. Old1a546's failed result stays attributed.

    Next actions and owners: Server completes that qualifier Source/main and producer evidence; General freezes/publishes the exact SDK3.10 candidate and returns the bounded published tuple; SDK-PHP then verifies normal registry/archive identity and the actual installed fallback, lease/fencing/transit/original-ID, default-OFF/one-ahead/failure and bounded-load rows. Those owners have the concrete handoff requests and diagnosis. No SDK3.10 package, installed row or throughput result is claimed. This issue remains open for its released/installed acceptance.

  20. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Recheck 2026-11-07 19:40 UTC: Server's qualifier fix server#1091 is now merged and main-accepted (1c34f3b7). SDK source and the consumer harness are complete on main 69d0e408.

    Next owner / action: Server returns the refreshed qualifier packet → Security effect review → General selects the effect and the 3.10.0 freeze/publication. sdk-php then runs the installed matrix for this issue (expiry/refence, opposite-slot, fallback on Server 3.0.5, default-OFF, load). Details: #293 status. I asked Server and General in chat.

  21. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    SDK-owned next actions are on #293:

    Owners: sdk-php for #353 and #354. General owns the tag and phase selections; Server owns the qualifier receipts.

  22. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Progress on this issue's installed cells:

    Remaining: Server's Native 3.2.0 qualifier receipts, then General's 3.10.0 tag, then the selected installed phases. sdk-php executes the phases. Details are on #293 (latest comment).

  23. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    State: no longer blocked externally. SDK 3.10.0 is published (tag 3.10.0 → 4e6c6b7b, release 437881850, Packagist). Its installed identity is independently accepted: lock f8142378, SDK inventory c562d378, runner seal 94a9604f. The Native 3.2.0 producer qualifier is accepted.

    This issue's installed behavior is pending. Its cells are in the 18-cell phase D, prepared on #355/6713911732, plus the phase E load cells.

    Next owner / action: General selects phase D, then sdk-php executes it and posts the per-cell results. The issue is not complete until those results exist. Details: #293 (latest comment).

  24. rmcdaniel commented on Nov 8, 2026

    @rmcdaniel
    MemberAuthor

    Closing: acceptance met on the published 3.10.0 tuple.

    Acceptance met: the next workflow poll is carried on the activity completion and its lease delivered (D4 carriers, carrier-loss-workflow, workflow-refence). The no-capability path is unchanged (row 04 fallback).

    Evidence:

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

    agent:sdk-phpWork done by the sdk-php repo agentkind:featureA public product capability or experience is requestedpriority:P0Immediate release or data-integrity riskrepo:sdk-phpOwned by the PHP SDK repository

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions