Skip to content

fix: correlate fired condition timeout replay time - #224

Merged
rmcdaniel merged 1 commit into
mainfrom
feat/215-condition-timeout-replay-clock
Nov 6, 2026
Merged

rmcdaniel merged 1 commit into
mainfrom
feat/215-condition-timeout-replay-clock

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 6, 2026 •

Copy link
Copy Markdown
Member

After Rust consumed a persisted scalar condition timeout represented by TimerFired alone, replay_now() stayed unavailable. It now returns that exact fired event's recorded_at, following Core's resumeTimedOutCondition branch. Existing explicit condition-resolution behavior keeps its own time authority.

The clock requires one ordered canonical wait/schedule/fire with matching physical/logical wait, key/fingerprint, typed command counters, timer ID/kind and timeout delay. Indexes bind identities once; duplicate, cancelled, aliased, reordered or orphaned physical waits remain unavailable. Cold and repeated reads preserve exact precision and backward/equal time. Payload fired/deadline/reuse values, insertion aliases and missing timer-row authority cannot replace the consumed event time. Legacy outcomes, reopen validation, cancellation, UUID/history and APIs are unchanged.

This authority is executor-specific. Core query replay stops without an explicit condition resolution, so both snapshot and actual reconstructed-query clocks remain unavailable on fired-only histories, including inside the reconstructed workflow. Existing explicit-resolution query behavior is preserved. Grouped conditions and the separate PHP occurrence-carrier gap remain open.

Offline official Rust 1.86 passes 64 clock tests and 53 corpus tests, including eight new consumed/cold/correlation/reopen/orphan/group/query controls. Formatting and the normal warning-free all-target/all-feature build pass. The new module receives one exact replay guard with 24 passing omission/addition classification controls; previous guards, selectors, validators and fixtures are preserved. The native-shaped synthetic fixture runs through the real worker consumer. Original CI 42176963526/a1 passes on exact 2e17ef99: 779 unit tests, 53 corpus tests and 86 Python policy tests. The unchanged official consumer proves 73→74 fixtures, related_change=true and one real behavioral negative against immutable base 3c4f10c6; codec remains 48→48. Both required checks (Target branch qualification and SonarCloud) are green, with direct Sonar inventory zero. All 20 current-head checks are terminal: 18 success/two intended manual worker skips, including all four CodeQL analyses.

Refs durable-workflow/.github#215 and the recorded source gap. Actual references: Core ce24207e resumeTimedOutCondition and QueryStateReplayer; native fadf8729 existing wait-field/schedule/fire writers. This introduces no producer field or wire change and claims no native/installed qualification. Normal actual-main 115922dd and all 20 checks are terminal (18 success/two intended skips). The sole automatic Pages run 42177802650/a1, deployment 7594389330 and artifact 13483768157 are accepted, with all 495 files reconciled and 16/16 live raw HTTPS matches. Published API/source remains stable 4.12.0. Terminal delivery and cleanup receipt. Release and #191/#192 operating boundaries remain separate.

@sonarqubecloud

sonarqubecloud Bot commented Nov 6, 2026

Copy link
Copy Markdown

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 6, 2026 06:55
@rmcdaniel
rmcdaniel merged commit 115922d into main Nov 6, 2026
20 checks passed
@rmcdaniel
rmcdaniel deleted the feat/215-condition-timeout-replay-clock branch November 6, 2026 07:07
@rmcdaniel

Copy link
Copy Markdown
Member Author

The persisted fired-only scalar condition-timeout SOURCE checkpoint is complete on actual main. Normal merge 115922ddc863486953b31b6e37691defbe69c4a6 has tree 0c67b85e0d72e34b169ec9d936ee5429dcec9f10 and ordered parents [3c4f10c68609da57ca7162c109fd59c5496d0cbf, 2e17ef99b850a1c09afdeca2e79e58b73530ab48], independently read back.

All 20 actual-main checks are terminal: 18 success/two intended manual worker skips. Original CI 42177802708/a1 and all four CodeQL analyses 42177802368/a1 succeed. Rust 1.86/stable checks include 779 unit tests, 53 corpus tests and 86 Python policy tests. The unchanged official consumer proves 73→74 replay fixtures, related_change=true and one genuine behavioral negative against accepted 3c4f10c6; codec remains 48→48. Local controls pass 64 clock methods and 24 exact-module guard classification controls. The normal all-target/all-feature warning-free build passes, and direct current-source Sonar inventory is zero unresolved.

The source mapping uses one fully correlated condition open/schedule/fire and the consumed TimerFired.recorded_at. It preserves precision, repeated/cold reads and backward/equal time, with explicit orphan/alias/counter/definition/lifecycle refusals. Existing explicit condition resolutions keep their own branch. Source indexes prevent repeated full-history scans. Core query replay lacks this fired-only resolution branch, so both actual query paths remain unavailable; no executor time is transferred into query reconstruction. Legacy outcomes, reopen validation, predicates, grouped behavior, cancellation, UUID and history are unchanged. The fixture is synthetic source evidence shaped from immutable native writer fields, not an installed/native qualification or producer change.

The sole automatic stable-docs follower is complete:

Subject Original accepted identity
Protected Pages run 42177802650/a1, success
Deployment 7594389330, github-pages, success at 2026-11-06T06:59:38Z
Artifact 13483768157, 4,199,738 bytes, SHA-256 a8e1157ef4f34724479528e73ec75a5bca415668b5af1239601445788dbb5b3b
Published SDK 4.12.0, approved crate SHA-256 620a8287af73c363dac61f0a91f20971a39f3b8cdc9513fbea85cdbd95a74ba4
Source / tooling Published source 4b2440a5618ccc1c98960ea2e1e62127042c3590; tooling/current main 115922ddc863486953b31b6e37691defbe69c4a6

All 495 regular-file paths match #223. Only __build.json tooling and Help/Settings' data-current-crate differ (local_activities→worker_latency); comparison normalizing only those attributes proves all remaining bytes unchanged. 16/16 anonymous raw HTTPS files match at 07:05:19.765775Z. Public API/examples, P0 presentation, canonical logo/fonts/status consumer and analytics retain their exact prior identities. The unreleased accessor remains absent from both published context API pages. No new browser, SDK runtime, package publication or manual dispatch was needed. #216's actual-origin/CORS acceptance retains its separate point-in-time scope.

The merged branch is deleted locally/remotely and remote absence verified. Checkout is clean at actual main; owned source containers/controllers/stoppers are absent, with public borrowed inputs preserved. Sanitized diagnostics have seven-day retention. Broader #215 source-family/query/producer/guide/published acceptance remains open; the next supported parallel family follows the accepted group-order table. No release, wire, private review or #191/#192 operating authority follows from this source delivery.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:sdk-rust Owned by the sdk-rust repository agent

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant