You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Enable Go applications to run orchestrations, activities, and durable entities on Azure Durable Task Scheduler without hosting a task-hub engine. Includes resilient DTS client/worker connections, deterministic runtime improvements, and supporting tooling and samples. #156
Compatibility
Breaking: DTS becomes the only supported runtime. Embedded SQLite/PostgreSQL backends and the standalone gRPC host are removed; consumers must migrate to durabletaskscheduler.NewClient and durabletaskscheduler.NewWorker.
Testing
SDK, analyzer, and distributed-tracing module tests pass locally. Emulator-backed integration coverage remains required in CI.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🟡 Changes recommended
Durable selection can cross orchestration boundaries, and the new analyzer and external-event sample contain behavior-affecting defects.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced Findings: 1 · 2 · 1
New issues introduced by this change (4)
Severity
Finding
task/select.go — Select never verifies that a task/event case belongs to this orchestration. A case retained from…
cmd/orchestratorvet/analysis/orchestratorgo/reach.go — This walk descends into every function literal, including closures that are only defined and never…
samples/externalevents/externalevents.go — Errors in this goroutine are only logged, after which the main path keeps waiting for an event that…
task/eventchannel.go — For EventChannel[any], the zero value has no dynamic type, so reflect.TypeOf(value) is nil and…
What changed in this PR
Adds Durable Task Scheduler as the sole runtime, expands deterministic orchestration capabilities, and introduces supporting observability, payload, history-export, analyzer, test, and sample infrastructure.
Changes:
Adds DTS client/worker integration and removes embedded backends.
Expands orchestration runtime features, entities, retries, tracing, payloads, and history handling.
Adds analyzer tooling, tests, and DTS-based samples.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
Payload integrity validation, analyzer reachability, and external-event sample failure handling have unresolved correctness issues.
Review tier: Balanced Findings: 1 · 2 · 1
Pre-existing issues (4)
Severity
Finding
task/select.go — Select never verifies that a task/event case belongs to this orchestration. A case retained from… View comment
samples/externalevents/externalevents.go — Errors in this goroutine are only logged, after which the main path keeps waiting for an event that… View comment
cmd/orchestratorvet/analysis/orchestratorgo/reach.go — This walk descends into every function literal, including closures that are only defined and never… View comment
task/eventchannel.go — For EventChannel[any], the zero value has no dynamic type, so reflect.TypeOf(value) is nil and… View comment
This walk descends into every nested function literal, even when the literal is only assigned and never invoked. That makes the analyzer report replay hazards in unreachable closure bodies, contradicting its proof-only contract; skip nested literals during the enclosing walk and add them only when call resolution (including known ctx.Go callbacks) proves they execute.
Reject foreign Select cases before observing their state, preserve generic event type names, skip uninvoked closures during replay analysis, and propagate asynchronous sample failures without changing its timeouts.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🟡 Changes recommended
History export can multiply large buffered payloads in memory across concurrent activities and exhaust the worker process.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced Findings: 1
New issues introduced by this change (1)
Severity
Finding
exporthistory/activities.go — This path buffers each history as event objects, an uncompressed JSONL string, and a compressed…
Issues resolved since last review (4)
Severity
Finding
task/eventchannel.go — For EventChannel[any], the zero value has no dynamic type, so reflect.TypeOf(value) is nil and… View resolved comment
samples/externalevents/externalevents.go — Errors in this goroutine are only logged, after which the main path keeps waiting for an event that… View resolved comment
cmd/orchestratorvet/analysis/orchestratorgo/reach.go — This walk descends into every function literal, including closures that are only defined and never… View resolved comment
task/select.go — Select never verifies that a task/event case belongs to this orchestration. A case retained from… View resolved comment
The reason will be displayed to describe this comment to others. Learn more.
Six findings from the SDK rewrite review: four P1 issues affecting entity locking, replay correctness, and large-payload carryover, plus two P2 issues affecting versioned routing and history exports. Details and suggested fixes are attached inline.
Remove rewind, skip-graceful termination, and SDK task-hub create/delete operations and their options, dead tests, and documentation claims. Preserve restart, purge, entity maintenance, connection errors, and the vendored protocol contract.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve DTS-provided W3C trace parents on ActivityContext without emitting duplicate durable spans. The real OTLP sample exposed this missing context boundary; add regression coverage for remote IDs, tracestate, values, and deadlines.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Cover real blob storage, continuous history export, correlated OTLP traces, replay analysis, Azure identity, and isolated maintenance. Add a 22-family catalogue and a process-level runner with explicit service requirements and CI groups.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Check blob properties for the storage compression setting while accepting transport-decompressed downloads. Cover both compressed response forms and reject incorrect stored encoding.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove execution groups and special Azure/admin connection routing. Run examples with their normal environment and select E2E subtests with Go flags; keep per-sample prerequisite and safety checks. Simplify CI to one isolated service setup and update the sample index.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve history limits and execution identity while encoding incrementally, commit bounded Azure blocks only after clean source completion, encode identifier metadata reversibly, and update export consumers. Document Python-compatible processing counters rather than promising distinct-execution totals.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🟡 Changes recommended
Current-or-older workers advertise versions they subsequently reject, which can misroute newer work.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review tier: Balanced Findings: 4
New issues introduced by this change (1)
Severity
Finding
client/grpc_worker.go — Make CurrentOrOlder filters match executor acceptance
Pre-existing issues (3)
Severity
Finding
task/coroutine.go — Do not run a coroutine after its scope was canceled View comment
task/rewind.go — Validate the required orchestrator-started rewind event View comment
durabletaskscheduler/client.go — Do not retry non-idempotent management RPCs globally View comment
Issues resolved since last review (2)
Severity
Finding
exporthistory/orchestrations.go — For a continuous job, the terminal page has no NextCheckpoint, so the preserved cursor causes… View resolved comment
exporthistory/activities.go — This path buffers each history as event objects, an uncompressed JSONL string, and a compressed… View resolved comment
Restrict UNAVAILABLE retries to read-only RPCs and Hello, reject malformed rewind envelopes, and skip callbacks canceled before their first resume. Cover accepted-event acknowledgement loss with real gRPC and canceled coroutine replay through DTS.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Share runtime version comparison with route generation, exclude future versions without wildcard fallthrough, and preserve compatible current/default legacy fallback. Reject unrepresentable automatic wildcard routes and verify older workers never abandon newer work on DTS.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Follow-up review of the SDK changes and expanded sample catalogue. Five of the six earlier findings are fixed; cross-SDK lock ordering remains an explicitly documented limitation. All 21 emulator-compatible sample programs passed locally against isolated DTS, Azurite, and an OTLP collector. The six remaining P2 findings below concern rewind correctness and sample delay/failure/cleanup paths.
Reject additional durable events after an operation failure instead of removing handled failures required by retained work. Preserve the existing protocol for supported histories, surface worker rejection, and cover rewrite-to-replay plus unchanged rejected history on DTS.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Retain and confirm schedule creation before deletion, preserve worker lifetime for entity cleanup, drain before deleting payload storage, and bound Run cleanup while preserving errors. Validate logical timer deadlines rather than a fixed physical chunk count; add focused protocol failure and delay regressions.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This root option accepts an empty key and serializes it as __durabletask.context.field., while sub-orchestration context fields reject empty keys via task/orchestrator.go:203-219 and schedule fields use the same restriction. Reject the empty key here as well so the public context-field APIs have one wire contract.
The reachability model only adds ordinary callees and OrchestrationContext.Go callbacks. A function literal assigned to RetryPolicy.Handle inside a registered orchestrator is therefore skipped, even though the runtime invokes that handler from computeNextDelay during replay. Replay-unsafe code such as time.Now() in the handler receives no diagnostic and can change the retry decision across replays. Model this known callback path and add a regression fixture.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Enable Go applications to run orchestrations, activities, and durable entities on Azure Durable Task Scheduler without hosting a task-hub engine. Includes resilient DTS client/worker connections, deterministic runtime improvements, and supporting tooling and samples. #156
Compatibility
Breaking: DTS becomes the only supported runtime. Embedded SQLite/PostgreSQL backends and the standalone gRPC host are removed; consumers must migrate to
durabletaskscheduler.NewClientanddurabletaskscheduler.NewWorker.Testing
SDK, analyzer, and distributed-tracing module tests pass locally. Emulator-backed integration coverage remains required in CI.