Skip to content

Advance replay time for persisted scalar signal delivery - #220

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

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

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 6, 2026 •

Copy link
Copy Markdown
Member

After a persisted scalar signal wait resumes, replay_now() previously returned unavailable. It now returns the exact consumed SignalApplied time for canonical untimed waits, preserving precision, backward/equal time and valid redrive reuse. This matches Core 4b2cdc55's resumeSignal branch and the accepted consumed-event contract.

The clock requires one ordered open/apply pair with matching nonempty wait ID/name, explicit numeric command counters and the canonical persisted value. Missing/conflicting identity, invalid/missing time/reuse, ambiguous lifecycle and timed-wait evidence keep business time unavailable without changing legacy signal results/commands. Merely received/buffered/future events and task-resume arguments without committed application authority do not advance it. A control proves an outer history counter on buffered SignalApplied cannot become an authored wait sequence. Existing snapshot/reconstructed queries retain their inspected/consumed prefix rules; no observation envelope, wire field, marker or RPC is added. Cancellation, UUID, predicate and inline/local behavior is preserved.

Exact 3fa8e547ec30a8f8004b49da4b72edbe3bbc78e6 has 20 terminal checks:18 success/two intended manual worker skips, all four CodeQL analyses and zero unresolved Sonar issues. Original CI42148266805 passes all-target/all-feature Rust1.86/stable qualification, including746 unit tests, the53-test corpus and83 Python policy tests. Local31 focused clock tests include eight new scalar-signal methods covering actual/cold consumption, unchanged reads, equal/backward/reused time, buffered/received/future/task-only paths, identity/counter/time/timed/duplicate refusals, query prefixes and interleaved/error scope restoration.

The real behavioral comparison passes with69→70 replay fixtures, related_change=true and one negative; codec inventory remains48→48. The same official consumer compiles and consumes both actual signal values on base ccb10747 and candidate; base fails the intended signal-time expectation and candidate passes. All existing selectors/guards/validators, schemas and immutable fixtures are unchanged. All owned local bounded source resources are removed; public cached inputs were reused offline.

Refs durable-workflow/.github#215 and its selected scalar-signal source cohort. Full feature/release/published conformance remains open. Ordinary-entry original-start authority remains Server-owned; timed waits and legacy received/query-fallback/task-only application lack supported Rust clock authority here. #216's actual Cloud CORS receipt preempts this source work; #191/#192's distinct policy-access/installed/private stops remain unchanged. Original main, automatic stable4.12 docs/artifact/live acceptance and cleanup are complete.

@sonarqubecloud

sonarqubecloud Bot commented Nov 6, 2026

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

Original current-head CI 42148266805 passes on exact 3fa8e547ec30a8f8004b49da4b72edbe3bbc78e6 / tree 71df6ced65cc28edae5ac3525b91ddca7c84f9ed.

The unchanged guarded policy selects this actual production delta and reports 69→70 replay fixtures, related_change=true, one real behavioral negative against accepted base ccb10747. Codec inventory remains48→48. The same official consumer compiles and consumes both persisted signal values on both revisions, preserves all old fixtures, and fails the new time expectation on base while candidate passes. No guard, validator, selector or fixture exception changed.

All-target/all-feature Rust1.86/stable checks pass, including 746 unit tests and 53 corpus tests; the full existing83-test Python policy suite passes. Local focused31 clock tests include eight new scalar-signal methods, redrive/precision/equal/backward handling, buffered/received/future isolation, missing/conflicting/timed/task-only authority and scope/query-prefix controls. Source cells are cleaned, borrowed cached public inputs preserved. Stable published-SDK documentation compatibility, packaging, public boundary, Sonar and the other source checks pass; direct completed Sonar inventory is zero unresolved.

Rust CodeQL remains active at this readback; final normal integration waits for its actual terminal result. No original attempt has been rerun or relabelled. The canonical persisted applied carrier is supported; task-only and legacy received/query-fallback authority remains unavailable in this cohort, rather than acquiring a new envelope, RPC, timestamp or marker. Full feature/release/conformance and #191/#192's specific operating/review stops stay separate; #216's actual Cloud CORS receipt preempts when returned.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 6, 2026 02:15
@rmcdaniel
rmcdaniel merged commit e76ec31 into main Nov 6, 2026
20 checks passed
@rmcdaniel
rmcdaniel deleted the feat/215-signal-replay-clock branch November 6, 2026 02:16
@rmcdaniel

Copy link
Copy Markdown
Member Author

The selected scalar persisted-signal clock source cohort is integrated and terminal. Actual main is e76ec3164261bd06285b8c4971fb61acf0fb8f6a, tree 71df6ced65cc28edae5ac3525b91ddca7c84f9ed, ordered parents [ccb10747bc0e5fcb248d31073a70429da6b1b8a4, 3fa8e547ec30a8f8004b49da4b72edbe3bbc78e6]. Independent Git/API readback proves the merge tree equals the checked source. All 20 actual-main checks are terminal:18 successes/two intended manual worker skips. Original main CI42149116719, all four CodeQL analyses42149115763, Sonar and public boundary pass. No original attempt was rerun or relabelled.

Source qualification passes 746 unit tests on Rust1.86/stable, the 53-test corpus and 83 Python policy tests. Local31 focused clock tests include eight signal methods. Both PR and original main's unchanged guarded policy report 69→70 replay fixtures, related_change=true, one behavioral negative, with codec inventory unchanged48→48. The same official consumer compiles and consumes both persisted signal values on base/candidate production code; base fails the intended signal-time expectation and candidate passes. Every existing selector, guard, validator, schema and immutable fixture is preserved.

The sole automatic protected stable-docs run42149116739 and deployment 7590555265 passed; deployment success is 2026-11-06T02:18:39Z. Pages artifact 13471009246, 4,199,719 bytes, SHA-256 5997ad5dd32f1dc4c114fff3acb4524791dccd56f38b71a702e250a75f3a93b8, retains all495 regular-file paths. Only __build.json tooling and help/settings data-current-crate differ from the accepted ccb artifact; normalized equality is verified. All generated API/presentation/status/font/logo bytes are unchanged. At 02:20:33Z, 16/16 anonymous HTTPS files byte-matched the deployed artifact. Existing P0 actual-browser/functional evidence carries for unchanged presentation; no extra browser matrix was started.

Stable docs still bind published SDK 4.12.0, source 4b2440a5618ccc1c98960ea2e1e62127042c3590, approved crate 620a8287af73c363dac61f0a91f20971a39f3b8cdc9513fbea85cdbd95a74ba4; only tooling advances to actual main. The source clock extension is not promoted into stable API content. Docs received the immutable artifact/tooling handoff. The merged branch is removed locally/remotely, with independent remote absence and clean actual-main checkout. All owned bounded source cells/controllers/stoppers are absent; borrowed public caches are preserved.

Central replay-clock #215 remains open. Canonical untimed scalar SignalWaitOpened/SignalApplied delivery has supported consumed time, including valid redrive reuse. Timed, ambiguous, received-only, task-only and legacy received/query-fallback authority stays unavailable in this cohort. Ordinary-entry original-start authority remains Server-owned; predicate/group/other-family/inline work, release/published cross-SDK conformance and guides remain separate. #216 still requires Cloud's actual CORS/publication receipt; #191/#192's distinct frozen-custody/policy-access/lifecycle/installed stops are unchanged. No wire/capability/producer adoption or Server/private operating result follows from this source integration.

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