Repository navigation
fix: reopen recorded service conditions within groups - #602
Conversation
Confirmed before/after for physical reopensThe unchanged published consumer in Corrected tuple: Native
Local checks: focused feature 30 tests / 226 assertions, declared replay consumer 1 test / 616 assertions, style and static analysis pass. The official corpus validator passes with Next: establish final satisfaction, timeout and cold replay semantics after reopens, then qualify and publish the actual customer artifacts. #601 remains open and #602 remains draft. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #602 +/- ##
==========================================
+ Coverage 88.74% 88.78% +0.03%
==========================================
Files 472 472
Lines 64963 65126 +163
==========================================
+ Hits 57654 57821 +167
+ Misses 7309 7305 -4
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Source qualification checkpoint and remaining delayed deadline defectThe isolated actual Worker consumer used ordinary protocol 1.19 with cooperative cancellation disabled. Every workflow claim ran in a fresh process. Exact source tuple:
The delayed selection deadline failure is now reproduced directly by three canonical feature cases: initial condition, reopened condition and signal deadlines. All three reject Native unit and coverage runs at the checkpoint each pass 2,145 tests / 16,371 assertions, with 15 existing notices and 5 skips. V2 line coverage is 65.94%, above the 60% accepted baseline. The preceding full database/Laravel/coverage matrix passed in run 36896774188. Final checkpoint PR checks passed in run 36898365688. Rust checks passed in run 36898809083. The locked fresh-process consumer is retained for review and rerunning. The SDK marker counterfactual on the same Server checkpoint does not complete the keyed condition winner, while the corrected Rust source does. Next action: finish the delayed timer closure correction, repeat the focused gates and the five actual Worker cases, then qualify the exact published PHP/Python/Rust tuple through the stable Server artifact. Both fix PRs remain drafts. No stable artifact or cooperative capability has been published. The completed candidate stack has been removed with its volumes and network. |
Final actual Worker source qualification: all five cases passThe corrected Native and Rust source now complete every bounded case with a fresh Worker process for each claim. The consumer asserts the handler's typed satisfied or timed-out value and the durable
Exact source tuple:
The locked actual Worker consumer and commands are retained in SDK PR 56. Run This is source qualification. Next: merge and publish Rust 2.1.3 and Native 2.3.2, build the stable Server from main with the published Native package, then qualify the exact published Server digest and PHP/Python/Rust consumers before closing #601. Cooperative feature delivery remains separately gated. Raw result records{"claim_process":"fresh-process-per-claim","mode":"condition","next_signal":{"completed":true,"opens_before_final_signal":2,"outcome":"pass","satisfied":2},"opens":2,"phases":[{"event_type":"StartAccepted","sequence":null},{"event_type":"WorkflowStarted","sequence":null},{"event_type":"ConditionWaitOpened","sequence":1},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":1},{"event_type":"ConditionWaitOpened","sequence":2},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":2},{"event_type":"WorkflowCompleted","sequence":null}],"result":{"outcome":"pass"}}
{"claim_process":"fresh-process-per-claim","mode":"parallel","next_signal":{"completed":true,"opens_before_final_signal":3,"outcome":"pass","satisfied":3},"opens":3,"phases":[{"event_type":"StartAccepted","sequence":null},{"event_type":"WorkflowStarted","sequence":null},{"event_type":"TimerScheduled","sequence":1},{"event_type":"SignalWaitOpened","sequence":2},{"event_type":"ConditionWaitOpened","sequence":3},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":3},{"event_type":"ConditionWaitOpened","sequence":4},{"event_type":"SignalReceived","sequence":null},{"event_type":"TimerFired","sequence":1},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"SignalApplied","sequence":2},{"event_type":"ConditionWaitSatisfied","sequence":4},{"event_type":"ConditionWaitOpened","sequence":5},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":5},{"event_type":"WorkflowCompleted","sequence":null}],"result":{"outcome":"pass"}}
{"claim_process":"fresh-process-per-claim","mode":"selection","next_signal":{"completed":true,"opens_before_final_signal":2,"outcome":"pass","satisfied":2},"opens":2,"phases":[{"event_type":"StartAccepted","sequence":null},{"event_type":"WorkflowStarted","sequence":null},{"event_type":"TimerScheduled","sequence":1},{"event_type":"ConditionWaitOpened","sequence":2},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":2},{"event_type":"ConditionWaitOpened","sequence":3},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":3},{"event_type":"SelectionResolved","sequence":null},{"event_type":"WorkflowCompleted","sequence":null}],"result":{"outcome":"pass"}}
{"claim_process":"fresh-process-per-claim","mode":"selection-timeout","next_signal":{"completed":true,"opens_before_final_signal":2,"outcome":"pass","satisfied":1},"opens":2,"phases":[{"event_type":"StartAccepted","sequence":null},{"event_type":"WorkflowStarted","sequence":null},{"event_type":"TimerScheduled","sequence":1},{"event_type":"ConditionWaitOpened","sequence":2},{"event_type":"TimerScheduled","sequence":2},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":2},{"event_type":"TimerCancelled","sequence":2},{"event_type":"ConditionWaitOpened","sequence":3},{"event_type":"TimerScheduled","sequence":3},{"event_type":"TimerFired","sequence":3},{"event_type":"SelectionResolved","sequence":null},{"event_type":"WorkflowCompleted","sequence":null}],"result":{"outcome":"pass"}}
{"claim_process":"fresh-process-per-claim","mode":"parallel-timeout","next_signal":{"completed":true,"opens_before_final_signal":3,"outcome":"pass","satisfied":2},"opens":3,"phases":[{"event_type":"StartAccepted","sequence":null},{"event_type":"WorkflowStarted","sequence":null},{"event_type":"TimerScheduled","sequence":1},{"event_type":"SignalWaitOpened","sequence":2},{"event_type":"ConditionWaitOpened","sequence":3},{"event_type":"TimerScheduled","sequence":3},{"event_type":"SignalReceived","sequence":null},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"ConditionWaitSatisfied","sequence":3},{"event_type":"TimerCancelled","sequence":3},{"event_type":"ConditionWaitOpened","sequence":4},{"event_type":"TimerScheduled","sequence":4},{"event_type":"SignalReceived","sequence":null},{"event_type":"TimerFired","sequence":1},{"event_type":"MessageCursorAdvanced","sequence":null},{"event_type":"SignalApplied","sequence":2},{"event_type":"ConditionWaitSatisfied","sequence":4},{"event_type":"TimerCancelled","sequence":4},{"event_type":"ConditionWaitOpened","sequence":5},{"event_type":"TimerScheduled","sequence":5},{"event_type":"TimerFired","sequence":5},{"event_type":"WorkflowCompleted","sequence":null}],"result":{"outcome":"pass"}}
|
|
Reviewed the final runtime diff and regression evidence at
Ready to merge the patch source. Issue #601 remains open for exact published Rust 2.1.3, Native 2.3.2 and stable Server follow-through. No cooperative feature activation is included. |
Problem
The published Rust Worker can reopen a scalar condition after an insufficient signal. The same condition in a nested parallel group or keyed selection is rejected with
409 invalid_commands. Subsequent replay and delayed deadline checks also expose incorrect logical completion and a stalled selection.The untouched published counterfactual uses Workflow 2.3.1, Rust SDK 2.1.2 and the exact Server 2.4.36 image recorded in #601.
Change
Evidence and delivery
71f31baabea53cb4f4d334c6291896987f88db3ain run 36900284907. Normal PR checks also pass on this head.WorkflowCompletedwith typed satisfied or timed-out results and a fresh process for every claim. This includes nested parallel members finishing while the condition remains false, final keyed selection, and both delayed deadline paths. Exact published PHP/Python/Rust qualification remains before delivery.Refs #601. Keep the issue open until the stable Server artifact and consumers are verified. Shared cooperative cancellation work remains separately gated in durable-workflow/.github#136.