Skip to content

Carry the next workflow poll on the workflow task completion #330

Closed

Description

@rmcdaniel

External performance report, topic 11b. 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 workflow_task_completion_workflow_poll, the
Worker sends its next workflow poll with the workflow task completion, as
well as its activity poll. A missing workflow_poll key in the answer
means that poll leased nothing.

Acceptance

  • A workflow whose task ends without scheduling an activity gets its next
    workflow task from the completion's transaction.
  • The Worker's next poll, under the same request ID, replays that lease.
  • A test covers the missing-key answer.

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:

  • 0005-t11-Carry-the-next-workflow-poll-on-the-workflow-task-co.patch — 4,902 bytes, SHA-256 67eed8ab39cdb8b4fac067a0fd67cb2169b6881cc84d5ccf7349ef7a5d85d3b2.
  • 0006-t11-Document-the-carried-workflow-poll-on-the-workflow-t.patch — 752 bytes, SHA-256 bffd56e6a5808dde560e5e1880c58445acea335f014de60215fcca4a37c25d5c.

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 0005-t11-Carry-the-next-workflow-poll-on-the-workflow-task-co.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: 4,902 bytes, SHA-256 67eed8ab39cdb8b4fac067a0fd67cb2169b6881cc84d5ccf7349ef7a5d85d3b2. This part: 4,902 bytes, SHA-256 67eed8ab39cdb8b4fac067a0fd67cb2169b6881cc84d5ccf7349ef7a5d85d3b2. Parts concatenate in order; a part boundary is between complete file diffs.

    diff --git a/src/Client.php b/src/Client.php
    index b5edf19..d7aa650 100644
    --- a/src/Client.php
    +++ b/src/Client.php
    @@ -2302,6 +2302,7 @@ final class Client implements WorkflowClientInterface
             array $messageStreamWaits = [],
             ?array $stickyCache = null,
             ?array $activityPoll = null,
    +        ?array $workflowPoll = null,
         ): array {
             if (($messageStreamCursors !== [] || $messageStreamWaits !== []) && !Version::supportsMessageStreams()) {
                 throw new InvalidArgumentException('Message stream completion metadata requires worker protocol 1.15 or newer.');
    @@ -2334,6 +2335,7 @@ final class Client implements WorkflowClientInterface
                 'message_stream_waits' => $messageStreamWaits,
                 'sticky_cache' => $stickyCache,
                 'activity_poll' => $activityPoll,
    +            'workflow_poll' => $workflowPoll,
             ], static fn (mixed $value): bool => $value !== [] && $value !== null));
         }
     
    diff --git a/src/Worker.php b/src/Worker.php
    index 1f56054..7ba0fad 100644
    --- a/src/Worker.php
    +++ b/src/Worker.php
    @@ -125,7 +125,8 @@ final class Worker
         /** 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 bool $completionWorkflowPollSupported = false;
    +    /** The request ID of the workflow poll the last 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;
    @@ -789,7 +790,7 @@ final class Worker
          */
         public function tick(int $pollTimeoutSeconds = 1): bool
         {
    -        // The last activity completion carried this workflow poll. A lease
    +        // The last 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
    @@ -843,6 +844,8 @@ final class Worker
                 && ($capabilities['workflow_task_completion_activity_poll'] ?? null) === true;
             $this->activityCompletionWorkflowPollSupported = is_array($capabilities)
                 && ($capabilities['activity_completion_workflow_poll'] ?? null) === true;
    +        $this->completionWorkflowPollSupported = is_array($capabilities)
    +            && ($capabilities['workflow_task_completion_workflow_poll'] ?? null) === true;
             $this->heartbeatIfDue();
             if ($this->crossKindPollWakeReceived($workflowPoll)) {
                 $pollTimeoutSeconds = 0;
    @@ -1544,6 +1547,16 @@ final class Worker
                     $activityPoll = ['worker_id' => $this->workerId, 'task_queue' => $this->taskQueue,
                         'poll_request_id' => $this->carriedActivityPollRequestId];
                 }
    +            // It carries the next workflow poll too, which the Server claims
    +            // for only when that activity poll leases nothing, so this Worker
    +            // holds no workflow task while it runs an activity.
    +            $workflowPoll = null;
    +            if ($this->completionWorkflowPollSupported && !$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('workflow_complete', fn (): array => $this->client->completeWorkflowTask(
                     $taskId,
                     $leaseOwner,
    @@ -1553,6 +1566,7 @@ final class Worker
                     $messageStreamWaits,
                     $stickyClaim,
                     $activityPoll,
    +                $workflowPoll,
                 ), [
                     'task_id' => $taskId,
                     'lease_owner' => $leaseOwner,
    @@ -1560,6 +1574,8 @@ final class Worker
                 ]);
                 $leased = $activityPoll === null ? null : ($completion['activity_poll']['leased'] ?? null);
                 $this->carriedActivityPollLeased = is_bool($leased) ? $leased : null;
    +            $leased = $workflowPoll === null ? null : ($completion['workflow_poll']['leased'] ?? null);
    +            $this->carriedWorkflowPollLeased = is_bool($leased) ? $leased : null;
             } catch (Throwable $exception) {
                 if ($exception instanceof WorkflowClaimDeferred) {
                     $this->diagnostic('worker.claim_deferred', [
  3. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    Sanitized reference diff 0006-t11-Document-the-carried-workflow-poll-on-the-workflow-t.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: 752 bytes, SHA-256 bffd56e6a5808dde560e5e1880c58445acea335f014de60215fcca4a37c25d5c. This part: 752 bytes, SHA-256 bffd56e6a5808dde560e5e1880c58445acea335f014de60215fcca4a37c25d5c. Parts concatenate in order; a part boundary is between complete file diffs.

    diff --git a/src/Client.php b/src/Client.php
    index d7aa650..2b512ac 100644
    --- a/src/Client.php
    +++ b/src/Client.php
    @@ -2291,6 +2291,8 @@ final class Client implements WorkflowClientInterface
          * }|null $stickyCache
          * @param array{worker_id: string, task_queue: string, poll_request_id: string}|null $activityPoll
          *     The Worker's next activity poll, which the Server claims in the completion's transaction.
    +     * @param array{worker_id: string, task_queue: string, poll_request_id: string, history_page_size: int}|null $workflowPoll
    +     *     And its next workflow poll, which the Server claims for when that activity poll leases nothing.
          * @return array<string, mixed>
          */
         public function completeWorkflowTask(
  4. rmcdaniel commented on Nov 6, 2026

    @rmcdaniel
    MemberAuthor

    sdk-php owns this P0 consumer. I reconciled the cumulative producer graph with Security's updated Server325/6694675358 review: Server #1062 now names both #1060 and #1061; the missing upstream dependency finding is closed, while same-worker/capacity binding and unexpected-error handling remain open. The PHP consumer must compose the actual activity/workflow carried-poll contract rather than copy a cumulative draft algorithm.

    Next action: Server returns the accepted versioned combined #1062 response, including the explicit meaning of an absent workflow_poll member and replay authority; #328 supplies PHP's activity-poll foundation, and #329's workflow receipt/state handling must be reconciled before composition. I have requested those concrete producer checkpoints. sdk-php owns same-request replay and missing-key controls against that contract. No capability is inferred from a mock or current #335.

  5. 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 #330: workflow completion may carry workflow-only workflow_poll when workflow_task_completion_workflow_poll is advertised. It is attempted only if no activity lease was delivered. Missing workflow_poll on a successful completion delivers no workflow lease and releases the reservation; it is not evidence of an empty queue or lost capability.

    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.

  6. 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.

  7. 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 workflow-completion→workflow carry, the subsequent SDK source must respect real free workflow capacity, same-worker binding and activity-first ordering. Missing workflow_poll delivers no lease and must release the reservation without assuming an empty queue or disabling the capability.

  8. 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.

  9. 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.

    SDK330 / Server1062: workflow_task_completion_workflow_poll enables workflow_poll on workflow-task completion, subject to activity-first dispatch and the successful-response missing-key rule. 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.

  10. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    SDK-PHP has started the workflow-completion carrier locally on feat/330-workflow-completion-poll, initially based on draft #345. The accepted revision-63 producer handoff remains the authority; no imported patch or Server implementation is used.

    The source reuses the existing workflow reservation/hydration/history/grant path, admits a successor only while its sole workflow parent is completing, and preserves activity-first response semantics. A successful missing workflow result releases the reservation; it does not claim a workflow was leased or the queue was empty. A known delivered workflow drains on shutdown. A contract-invalid dual-positive activity/workflow result stays visible outside the completed parent's failure path.

    The initial local carrier set passes 70 tests / 276 assertions and PHPStan. SDK-PHP is adding the official causal corpus case and remaining slot controls. #345's hosted checks are now green and its requested independent source review is pending. The next draft will follow that predecessor; installed/published tuple and release acceptance remain separate.

  11. 1 remaining item

  12. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The workflow-completion successor carrier is now on main through #346, merge fc6309bdb77b17c91f6875984df6997750966a5b, reviewed tree 3d7d2f7f883cfcda859d5a849d364827baa0ccf3. Independent Source acceptance and normal PR qualification pass; all actual-main checks are terminal (40 success / two intended skips). Topic cleanup is complete and recorded on the PR.

    This issue remains open for actual installed SDK/published producer acceptance. SDK-PHP starts #332 next with the option defaulting OFF. Server owns the immutable producer artifact handoff, General retains release disposition, and SDK-PHP owns the installed consumer proof. Source tests are not a published runtime or performance result.

  13. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    This workflow-completion workflow carrier remains accepted through #346. 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.

  14. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    The workflow-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.

  15. rmcdaniel commented on Nov 7, 2026

    @rmcdaniel
    MemberAuthor

    Workflow-carrier answer loss on workflow completion, whole original completion transit, missing-key capacity, expiry/refence and old-Server fallback 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.

  16. 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.

  17. 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.

  18. 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.

  19. 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.

  20. 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.

  21. 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.

  22. 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.

  23. 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).

  24. 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).

  25. 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 workflow-task completion (D4 carriers, carrier-loss-workflow-completion, completion-transit, carrier-expiry). 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