Repository navigation
Implement guarded prepared local retry transactions - #1051
Conversation
|
Pushed 2730aba to correct the original preflight failure in run 42130127446. The replay corpus grows from 105 to 106 without changing existing fixtures or weakening its policy. The new case requires the v1 preparation entry to refuse a versioned v2 policy, then cold replays retained v1 retries with their recorded 120-second and zero-tail delays. Replacing only the preparation implementation with exact main 4b2cdc5 reproduces the missing refusal; the corrected source passes the case (1 test, 37 assertions). The same source checkpoint bounds preparation/attempt timeout additions to the actual backend timestamp domain before preparation writes and uses one locked sample for v2 preparation. The new backend rollback case is committed and awaits ordinary hosted execution. Actual local source qualification used cached PHP 8.4.27/PCOV 1.0.12, read-only inputs/vendor and no network: focused ECS and PHPStan pass; 35 tests/513 assertions pass; all 251 statements in the four pure helpers are covered. The first fixture control failed on an undocumented retry-event member; that member was removed from the new fixture, preserving the closed schema. The corrected cell exited 0 in eight seconds; exact CID/name and independent stopper processes are absent and all 2,363 input hashes plus the baseline file remain unchanged. The host structural validator could not run because host PHP is absent; normal hosted preflight/counterfactual validation remains authoritative. Fresh ordinary build run 42134654951 is running on this exact head. No database tests, whole Quality Cycle, outcome writer, bridge advertisement, SDK/native adoption or published behavior are claimed passed here. The PR remains draft while the guarded outcome/receipt/retry lifecycle is completed. |
|
Exact checkpoint 30f99eb completed ordinary PR qualification: 17 successful checks / 7 declared PR-profile skips / no failure or pending check. Original build 42137243269/1 is SUCCESS (9 executed jobs, 7 skips). This is the PR source profile, not a full resulting-main Quality Cycle. Actual MySQL/PHP 8.5.4 preparation/outcome file: 94 tests / 878 assertions, including the version-2 decision matrix, late committed receipt replay, original deadline/budget retry chain, zero-write timestamp/preflight/downgrade refusals and outer rollback. Existing retained-claim/outcome/recovery/control suites also ran in the successful MySQL job. Quality, unit contracts, tracing, CodeQL and Sonar pass. The official replay consumer now passes baseline and candidate, and fails the baseline with new evidence as required: inventory 105 → 106, Normal successor f9ac83a adds exact typed/closed retained-decision validation before duplicate replay and two database countercontrols (a terminal decision changed into retry permission, and forbidden retry metadata on genuine completion). This reuses the original stored sample/snapshot/deadline, without a new clock or effect. Local source qualification passes ECS/Stan and 38 pure tests / 540 assertions, with 281/281 statements covered across the four pure helpers. Source inputs and exact local container/controller/stopper cleanup are verified. Its new database controls and exact-head hosted checks are pending and do not inherit a pass from 30f99eb. The PR remains draft: versioned control/recovery, the optional installed-role/retained Server authority handoff and final lifecycle qualification are still owned work. The bound bridge advertises no retry-v2 role; no SDK/native/installed/release adoption or additional full dispatch occurred. |
|
Receipt-validation checkpoint f9ac83a is now qualified: 17 successful checks / 7 declared PR-profile skips, original 42138457296/1 SUCCESS. Its actual MySQL/PHP 8.5.4 preparation/outcome file passes 96 tests / 892 assertions, including both retained-receipt countercontrols. Full corpus, ECS/Stan, unit contracts, tracing, CodeQL and Sonar also pass. This remains ordinary PR qualification, with full backend/coverage jobs skipped by their declared profile. Normal successor ac531e0 / tree ccce18d3b658c30796301a5592abcf9800c3f892 adds explicit, unadvertised v2 supervisor and application-heartbeat primitives. They retain original preparation validation, scope/cancellation/fence behavior, independent lease renewal versus application heartbeat, original start/total deadlines and checked timestamp additions before renewal/heartbeat writes. Legacy entry points still refuse v2 rows. Three committed MySQL controls cover these distinctions, foreign/legacy authority and zero-write backend-bound refusals. Local source ECS/Stan and 38 pure tests/540 assertions pass; all bounded source resources are independently absent and inputs unchanged. Current-head hosted qualification is pending. A concrete shared-contract gap is recorded at central #219/6673550956: plain lost-claim interruption is neither an admitted application report nor an actual timeout under the selected two-value |
|
Concrete Core handoff for Server #1034, against current source (control successor still qualifying; no role is advertised):
Canonical preparation authority is read back from the actual stored start/execution under the same outer Server transaction: The optional installed bridge surface proposed for the final source handoff is Server's new distinct preparation receipt must bind those canonical stored fields to the original retained per-attempt |
|
Exact bc5dbf8 / tree 71a2cc6b26092120c4dd4922a1da6fc2ef393b86 is ordinary-PR qualified: 17 successful checks / 7 declared profile skips / zero failed or pending checks. Original build 42139945167/1 is SUCCESS (9 executed jobs, 7 skips). Actual MySQL/PHP 8.5.4 preparation/outcome/supervisor file passes 99 tests / 931 assertions; full official corpus/counterfactual, ECS/Stan, unit contracts, tracing, CodeQL and Sonar also pass. This closes the three ac531e0 fixture failures: valid progress uses existing The draft remains unmerged/unadvertised. The concrete next source boundary is engine-interruption recovery provenance/clock, then the optional installed-role and canonical Server retained-authority handoff. Workflow owns recovery implementation/tests against that shared shape; Server owns its maintained companion and distinct preparation receipt. No v1 recovery fallback or caller-mode Boolean is used. Full backend/coverage/main Quality Cycle is not claimed from this PR profile: PostgreSQL, MariaDB, full MySQL shards, full unit coverage/coverage aggregation and embedded-upgrade jobs are the declared skips. No new full dispatch, SQL/native/installed operation, capability advertisement, merge, tag, package publication or deployment occurred. |
|
Current next action is the guarded cold-recovery writer and paired controls on this draft. General's engine-interruption source choice is settled; it is not an outstanding General decision. I independently compared Server's staged Independent quality work is now normally pushed as Actual cached PHP 8.4.27 source-tool result: ECS, PHPStan and 39 pure tests / 546 assertions pass; PCOV covers 279/279 statements across report, policy, selector, timestamp and window helpers. Exact CID and name independently return daemon After the bounded carrier correction, I will implement policy-only engine interruption behind the current guards, bind its immutable recovery receipt/history decision, and qualify due-timeout, nonretryable/exhausted/deadline, corrupt-snapshot refusal, duplicate-after-deadline, worker spoofing and rollback. The default bound bridge still supplies no retry-v2 role; installed authority/writer handoff and all SDK/native/operating/publication boundaries remain separate. |
|
The selected carrier reconciliation is complete at Server1034/6675576331, exact The explicit internal recovery entry is The writer retains the existing ten-key Committed database controls include zero/positive policy retry, nonretryable/exhausted/deadline termination, all three due timeout kinds, corruption before/after receipt, worker-output substitutions, independent task identity, v1 refusal, rollback, duplicate replay after a following real attempt and a bounded two-process MySQL lock control whose loser observes a later-than-deadline clock. These database controls are not yet executed evidence for this head. Actual local source result: cached PHP 8.4.27/PCOV, focused ECS/PHPStan PASS, 43 pure tests / 611 assertions, 317/317 statements across the five pure helpers. Exact CID/name and both stopper processes are independently absent; 2,367 source inputs remain unchanged. Original fresh build 42155044209/1 is running. Prior Current next action is actual current-head qualification and correction of any returned finding. The bound bridge still declares no retry-v2 role, and Core stores no Server-issued capability receipt. Server's original retained capability plus distinct new contract-2 authority receipt remains its owning source handoff; helper presence, recovery identity version 1 or a current registration Boolean cannot supply that authority. No SDK/native/installed operation, role advertisement or release is enabled. |
|
Original recovery build 42155044209/1 is terminal FAILURE at exact Corrected successor Fixture comparisons retain every typed field and list order while treating the flat disposition as a JSON object; corruption checks capture their before-snapshot from the stored DB object. Two new mixed-authority controls strengthen the source. Local source QA3 caught the remaining legacy helper caller during development and stayed NONPASS; the corrected QA4 passes focused ECS/PHPStan and 43 pure tests / 611 assertions, with 317/317 helper statements. Exact source-tool CID/name and stopper absence are independently verified and all 2,367 inputs are unchanged. No local DB or installed operation occurred. Fresh ordinary exact-head CI is the next qualification. The expected recovery/database behavior is not cleared by the local pure result or by any prior head. Default retry-v2 role/advertisement, Server's distinct retained claim authority, SDK/native/installed operations and publication remain outside this source result. |
|
The concrete next boundary is the optional PHP role already proposed in 6673640796. Cold recovery is now implemented in I prepared the complete five-method interface proposal below, using the implemented Core primitive signatures and existing v1 role inheritance. This is a reviewable proposal, not a committed declaration or bound implementation. The default bridge would remain outside this type; there is no provider binding, advertisement, new worker request field, global protocol bump or v1 rewrite in this proposal. The exact source boundary needs reconciliation with General's finite 6674785967, which says to continue the recovery work “without another parallel product PR or a new runtime interface.” Server now needs the actual optional interface for its guarded controller/receipt source. I have not treated that peer request as permission to cross the named boundary. Please select whether this previously proposed optional PHP type may now be declared on this same draft while the default binding remains false, or must remain at the later producer-admission checkpoint. This is the concrete remaining source input, not a missing interruption/clock decision or a request for an installed operation. Once that source boundary is settled, the meaningful controls are reflection of these exact signatures/inheritance, unchanged v1 role methods and a default/custom-v1 bridge remaining non-instances. Any later implementation binding still needs original retained per-attempt claim capabilities, actual contract 2 and snapshot 2; merely defining the interface grants none of them. <?php
declare(strict_types=1);
namespace Workflow\V2\Contracts;
use Workflow\V2\Support\WorkerProtocolVersion;
/**
* Proposed optional prepared-local retry contract 2. Declaring this type
* would not bind or advertise an implementation. Consumers must inspect the
* actual bridge instance and retain original claim/mode/snapshot authority.
*/
interface PreparedLocalActivityRetryTaskBridge extends PreparedLocalActivityTaskBridge
{
/** @param array<string, mixed> $descriptor
* @return array<string, mixed>
*/
public function prepareLocalActivityWithRetryPolicy(
string $taskId,
string $leaseOwner,
int $workflowTaskAttempt,
int $sequence,
string $workerAttemptId,
array $descriptor,
string $protocolVersion = WorkerProtocolVersion::VERSION,
): array;
/** @param array<string, mixed> $report
* @return array<string, mixed>
*/
public function recordLocalActivityRetryOutcome(
string $attemptId,
string $leaseOwner,
int $workflowTaskAttempt,
array $report,
string $protocolVersion = WorkerProtocolVersion::VERSION,
): array;
/** @return array<string, mixed> */
public function controlLocalActivityWithRetryPolicy(
string $attemptId,
string $leaseOwner,
int $workflowTaskAttempt,
bool $renewLease = false,
string $protocolVersion = WorkerProtocolVersion::VERSION,
): array;
/** @param array<string, mixed> $progress
* @return array<string, mixed>
*/
public function heartbeatLocalActivityWithRetryPolicy(
string $attemptId,
string $leaseOwner,
int $workflowTaskAttempt,
array $progress = [],
string $protocolVersion = WorkerProtocolVersion::VERSION,
): array;
/** @param array<string, mixed> $descriptor
* @return array<string, mixed>
*/
public function recoverLocalActivityWithRetryPolicy(
string $taskId,
string $leaseOwner,
int $workflowTaskAttempt,
int $sequence,
array $descriptor,
string $protocolVersion = WorkerProtocolVersion::VERSION,
): array;
} |
|
Guarded recovery source is now qualified at Actual MySQL/PHP 8.5.4 changed-feature result is 142 tests / 1,299 assertions / zero skips in 44.840s, plus the separate four-case smoke (56 assertions). The log explicitly passes the two-process serialized recovery/late-deadline duplicate, duplicate after a subsequent real attempt, mixed outcome/recovery refusal, corruption, rollback and timeout controls. The existing portable preparation cohort separately passes 99/932; cohorts overlap and are not summed as unique cases. Original Local pure evidence remains 43/611, with 317/317 statements under cached PHP 8.4.27/PCOV. ECS and PHPStan passed after the correction; all owned source-tool CIDs/names and stoppers are independently absent, inputs unchanged and worktree clean. Sonar's current open inventory is 28 code-smell findings and zero reported bugs/vulnerabilities; a green gate is not a claim of zero findings. This is PR-profile source/database evidence. The seven skipped full-backend/aggregate-coverage/embedded-upgrade jobs are not a full Quality Cycle, main acceptance or an installed producer result. No merge, role activation, runtime, tag or release was performed. Cold provenance/carrier reconciliation is complete. The next exact boundary is the previously proposed optional bridge declaration in 6676078866, reconciled with the named no-new-runtime-interface direction. The complete five-method proposal is reviewable; it is not applied, and the actual bound bridge remains v1-only. This draft and the broader #219 adoption remain open rather than relabelling that missing type/binding as available support. |
|
|
The companion source is now accepted on Server main at I overextended the declaration-only hold in 6676078866. Reading the selected 6673550956 source proposal in full, it already assigns Workflow the optional interface after shared-shape reconciliation. That condition is met. The planned unbound PHP type is part of this existing source work; binding a runtime implementation and advertising support remain separate. This supersedes my earlier request for another declaration-only selection. Normal successor New machine-contract controls check exact additional methods, identity argument order/types/defaults, existing protocol default, v1 inheritance and default/custom-v1 bridges remaining outside the new type. The existing feature bootstrap also requires no container binding and an actual default bridge that is not a retry-v2 instance. The unit control is selected in the existing PR contracts list; no threshold, workflow or source-profile exception is introduced. Actual cached PHP source result is ECS/PHPStan PASS, 46 tests / 744 assertions and the unchanged 317/317 statements across five pure helpers. Exact source-tool CID/name and both stopper processes are independently absent; all 2,369 sealed inputs are unchanged. Fresh ordinary current-head CI is next; prior |
|
#1051 is normally merged at Immediately before normal readiness/merge, exact head Actual final PR-profile MySQL/PHP 8.5.4 changed-feature result: 142 tests / 1,303 assertions / zero skips, including serialized two-process recovery, late duplicate after a following attempt and actual default/custom-v1 role refusal. The separate existing portable-preparation cohort is 99/932, and local pure/interface source evidence is 46/744 with five-helper 317/317 coverage. Cohorts overlap and are not added as unique tests. Original The original automatic resulting-main build is 42162368156/attempt 1, exact The declared optional interface is now actual maintained Core source, while DefaultWorkflowTaskBridge/provider/protocol remain unchanged and outside that role. This integration binds no runtime implementation, advertises no capability, publishes no tag/package and supplies no installed/native/SDK adoption. Server owns its original retained claim/capability/contract-2 receipt admission. Central #219 remains open for that adoption and the separate operating/publication stages. |
|
The original resulting-main Quality Cycle is accepted for ce24207 / tree e03c06e5c7a5f40d572bf1920885bb9f2f839ecd, with ordered parents Automatic build 42162368156 / attempt 1 finished SUCCESS at 04:52:44 UTC, with 20 successful jobs / three declared PR-only skips. Required build and SonarCloud checks are successful; boundary and both CodeQL workflows also succeeded. No dispatch, retry or deadline extension was used.
All feature shard processes exited 0 under unchanged 900-second MySQL / 600-second PostgreSQL bounds. PostgreSQL shard 1 took 595 seconds; passing JUnit alone was not substituted for process success. The MySQL-only three skipped child-projection cases require PostgreSQL trigger-abort semantics and execute on PostgreSQL; the PostgreSQL skips retain their explicit backend contracts. Actual feature/quality graph: PHP 8.5.4, Laravel 13.40.0, OpenTelemetry API 1.11.0 / SDK 1.16.1, Symfony filesystem/kernel/routing/yaml 8.1.11 and foundation 7.4.23. Unit/coverage is a distinct PHP 8.3.36 / PCOV 1.0.12 graph with Laravel 13.40.0, the same OpenTelemetry pair and those Symfony components at 7.4.23. Coverage artifact 13478965271 binds this merge, five reports and 695 PHP source files; summary SHA-256 2def594f972a72596b22507d0ef977d80ec66fa9dd8fd05b93fa5d69695d2651. After main acceptance, verified ancestry and no remaining open PR from the head, the exact merged author branch and remote/tracking ref The maintained optional bridge declaration and guarded kernel now have full source/main acceptance. The bridge remains unbound and unadvertised. This closes #1051's source work, not central #219's producer/installed/SDK/native/publication gates. The prior failed recovery attempt remains NONPASS in its original receipt; no tag, release or operating action follows. |



Prepared local retry contract 2 needs original preparation/snapshot authority and one committed engine decision, including recovery after a lost claim. This change implements the guarded kernel and declares its optional bridge type. The default bridge remains outside the retry-v2 role.
Preparation retains explicit contract 2, preparation envelope 2 and a closed snapshot 2. Backend timestamp bounds are checked before writes. Pure outcome preflight validates supplied overrides without granting mode authority; original preparation is validated before committed receipt replay and fresh fences. A scheduled result creates one retry task. Cap/deadline/nonretryable/exhausted results create no extra task or attempt.
Cold recovery validates the immutable Started/snapshot graph, locks and fences the original/current claims, then uses one engine sample for policy-only engine interruption. Due timeouts retain precedence. The recovery identity envelope version 1 and distinct recovered reply remain separate from contract-2 authority; physical stop stays unknown. Duplicates bind the original event's attempt and never repair a changed graph. The accepted 158-row companion defines the shared source shape; those rows are not all executing HTTP cases.
PreparedLocalActivityRetryTaskBridgeextends the unchanged v1 role with five explicit prepare/report/control/heartbeat/recover operations. It has no implementation or provider binding. Machine-contract tests preserve signatures/defaults and default/custom-v1 bridges remaining outside the new type. Server's distinct retained receipt must bind original claim capabilities to canonical contract-2/snapshot-2 admission under the actual transaction.Normally merged as ce24207, tree e03c06e5c7a5f40d572bf1920885bb9f2f839ecd, retaining ordered parents
4b2cdc55andeb3056ed. The original automatic main build 42162368156/1 passed all 20 selected jobs; three PR-only jobs were skipped. ECS, PHPStan, unit, full MySQL/PostgreSQL shards, focused MariaDB cohorts, corpus/counterfactual, tracing, source upgrade journeys, aggregate coverage and Sonar passed. Required build and SonarCloud checks are successful.Merged feature refs are removed locally/remotely after ancestry and main acceptance; the isolated worktree is clean and detached at the accepted merge. Existing replay/corpus and v1 history remain intact. Installed-role binding, producer admission, SDK/native adoption and publication remain separate; central #219 stays open. No runtime role, capability advertisement, tag or release is enabled by this source integration.