Repository navigation
Legacy version fallback fails offline replay when a step already occupies the marker position #641
Copy link
Copy link
Closed
Labels
authority:githubGitHub is the authoritative lifecycle record for this workGitHub is the authoritative lifecycle record for this workbugSomething isn't workingSomething isn't workingcompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publicClose only after all explicit acceptance and operational evidence is publicintake:approvedCurrent issue title and body revision is approved for authority intakeCurrent issue title and body revision is approved for authority intakekind:defectA public product behavior is incorrectA public product behavior is incorrectpriority:P1High-priority product or release riskHigh-priority product or release riskstatus:in-progressApproved work is actively being implemented or validatedApproved work is actively being implemented or validated
Description
Activity
- addedauthority:githubGitHub is the authoritative lifecycle record for this workGitHub is the authoritative lifecycle record for this workcompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publicClose only after all explicit acceptance and operational evidence is publicpriority:untriagedMaintainers have not assigned a priorityMaintainers have not assigned a prioritystatus:triageAwaiting maintainer classificationAwaiting maintainer classificationintake:approvedCurrent issue title and body revision is approved for authority intakeCurrent issue title and body revision is approved for authority intakepriority:P1High-priority product or release riskHigh-priority product or release riskbugSomething isn't workingSomething isn't workingkind:defectA public product behavior is incorrectA public product behavior is incorrectstatus:in-progressApproved work is actively being implemented or validatedApproved work is actively being implemented or validatedand removedpriority:untriagedMaintainers have not assigned a priorityMaintainers have not assigned a prioritystatus:triageAwaiting maintainer classificationAwaiting maintainer classification
on Oct 7, 2026 Fixed and verified in Workflow 2.5.1 and Server 2.5.7.
Legacy fallback preserves the existing activity or timer position during queries and offline replay. Malformed markers and genuine step drift remain rejected.
The registry-installed package passes all 20 frozen-history cases with 216 assertions and published Laravel 9–13 upgrade checks. The published Server image passes 31 PHP/Python/Rust replay scenarios and all 15 schedule cells without findings. Sample App, Waterline qualification and the live website installation defaults are updated and verified.
Implementation and regression coverage: #643. Published image and consumer qualification: Server #309.
Metadata
Metadata
Assignees
Labels
authority:githubGitHub is the authoritative lifecycle record for this workGitHub is the authoritative lifecycle record for this workbugSomething isn't workingSomething isn't workingcompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publicClose only after all explicit acceptance and operational evidence is publicintake:approvedCurrent issue title and body revision is approved for authority intakeCurrent issue title and body revision is approved for authority intakekind:defectA public product behavior is incorrectA public product behavior is incorrectpriority:P1High-priority product or release riskHigh-priority product or release riskstatus:in-progressApproved work is actively being implemented or validatedApproved work is actively being implemented or validated
Version: workflow 2.4.5, SDK 2.1.6.
A workflow history recorded before a new
patched()call continues correctly throughWorkflowExecutor, butReplayDiff::diffExport()reportsshape_mismatchfor the same history.QueryStateReplayerasserts a version-marker shape beforeVersionResolvercan return the legacy default. The legacy default records no marker and does not advance the workflow sequence, so the existing activity or timer at that position is valid.Reproduction:
patched('change-id')before an already-recorded activity or timer, retaining the old branch when it returns false. Ensure the workflow definition fingerprint changes.ReplayDiff::diffExport()against the unchanged bundle. It returnsdrifted,reason=shape_mismatch,expected_shape=version marker, with the original activity/timer event types at that position.Expected: offline replay applies the same conservative fallback as the runtime and matches the existing step.
Source: QueryStateReplayer, lines 325-334 asserts first. WorkflowExecutor, lines 704-734 resolves first and asserts only when
advancesSequenceis true.Suggested fix: resolve the version before asserting its shape in
QueryStateReplayer; assert only when the resolution occupies a history slot. Add a frozen pre-marker offline replay regression while retaining malformed-marker and genuine step-drift refusals.