Repository navigation
Propagate tags from entity-started orchestrations - #812
Merged
Merged
Conversation
Snapshot and validate entity scheduling tags, carry them through both gRPC action conversions, and import the pinned canonical field8 schema. Cover both overloads, mutation, rollback, cached execution, and wire round trips with the explicit unpublished Core PR dependency. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d59e0dc-efdb-4b0a-b588-6dbd83416193
8 of 25 tasks
This was referenced Oct 7, 2026
Restore Directory.Packages.props to the exact PR baseline. Validate tag propagation only with an explicit session-local build override; update the SDK dependency to a real published Core version after the prerequisite release. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d59e0dc-efdb-4b0a-b588-6dbd83416193
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
The committed Core 3.9.0 dependency lacks the new Tags API, causing default builds and CI to fail.
1 open finding
What changed in this PR
Propagates tags from entity-scheduled orchestrations through the Core and protobuf layers.
Changes:
- Snapshots and validates tags during entity scheduling.
- Adds protobuf field 8 and bidirectional conversion.
- Adds comprehensive regression coverage.
| File | Description |
|---|---|
src/Abstractions/Entities/TaskEntityContext.cs |
Documents tag snapshot and validation behavior. |
src/Grpc/orchestrator_service.proto |
Adds the optional tags map. |
src/Grpc/versions.txt |
Records updated protobuf provenance. |
src/Shared/Grpc/ProtoUtils.cs |
Converts tags between Core and protobuf. |
src/Worker/Core/Shims/TaskEntityShim.cs |
Snapshots and validates scheduled tags. |
test/Worker/Core.Tests/Shims/TaskEntityShimTests.cs |
Tests shim behavior and rollback. |
test/Worker/Grpc.Tests/GrpcEntityRunnerTagTests.cs |
Tests serialized entity execution. |
test/Worker/Grpc.Tests/ProtoUtilsEntityActionTests.cs |
Tests protocol conversions and schema. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
2 tasks
Align PR812 with origin/main91739687 using a normal merge. Run the canonical refresh workflow against durabletask-protobuf merge20d2aada and regenerate C# projections with Grpc.Tools; schema bytes and entity-tag behavior remain unchanged. Keep the released Core dependency until a real Tags-capable Core package is published. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d59e0dc-efdb-4b0a-b588-6dbd83416193
Use the officially published DurableTask Core 3.11.0 package and cover null tag keys alongside null values in entity operation rollback tests. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 921196dd-eb1c-47fa-af1e-43c0222194a9 Copilot-Session: 3d59e0dc-efdb-4b0a-b588-6dbd83416193
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 66135f0b-c3e7-4b97-8bdc-41880d4f0005
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 66135f0b-c3e7-4b97-8bdc-41880d4f0005
Varshitha Bachu (bachuv)
approved these changes
Oct 20, 2026
Merged
1 of 15 tasks
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.



Summary
What changed?
StartOrchestrationOptions.Tagsin the actual entity shim and carry tags through both Core/protobuf operation-action conversions.StartNewOrchestrationAction.tags = 8schema using the repository workflow and record its merged upstream commit inversions.txt.GrpcEntityRunnerrequest/response and protocol round trips. Public signatures remain unchanged.Directory.Packages.propsto the actually published Core 3.11.1, as requested. This follow-up changes only the Core dependency; all other package pins, production code, public APIs, tests, and canonical protocol files remain unchanged. The earlier Core 3.11.0 review fix and Core 3.9.0 manifest-restoration records below are historical.4c583a70dd8820069451dbeb7e400e9886ab1092incorporated SDKmaincommit91739687ff647699079cdadd627daa00562982b7and recorded canonical protocol merge20d2aadae358d8aa526190cbf78fb6c313b0b3db. The earlier8eb4417review fix changed the Core dependency and two rollback tests. This 3.11.1 follow-up does not alter those tests, production tag propagation, or any vendored schema; C# projections remain normalGrpc.Toolsbuild outputs.Why is this change needed?
Issues / work items
Companion PRs and release order
20d2aadae358d8aa526190cbf78fb6c313b0b3db. The SDK refresh now records that merge; schema blob remains2429fff4696ea9e8615e7f39f8960fcaf7b73a93.d1e659fc5c4285665d09aebae027ab9c6a0921cb; historical validation source remains76a6f9e0c4fddc04e4f1c9178ef3d9739184349e. Merge alone does not publish its API.For native DTS feature readiness, use a receiver-first rollout before clients rely on persisted/searchable tags. Optional field 8 is wire-compatible with older receivers, but they can ignore it and drop tags; DTS rollout is not a universal binary/package dependency for Core-backed or other providers. Mixed-version feature behavior and provider tag limits still require validation. Package references use actually released versions; historical local overrides below are not current validation or a release bypass.
Project checklist
release_notes.mdAI-assisted code disclosure (required)
Was an AI tool used? (select one)
If AI was used:
AI verification (required if AI was used):
Testing
Automated tests
Current provenance-only follow-up -- October 20 (UTC), source
721c2e73dec59459a2c6a96c8df560eb4c64f47eversions.txtreview by actually running the unchanged repository workflow:.\src\Grpc\refresh-protos.ps1 -branch main. The generated header now says from branch main and records the new real refresh timestamp; immutable download URLs still identify canonical commit20d2aadae358d8aa526190cbf78fb6c313b0b3db.src/Grpc/versions.txtmetadata changed. All three downloaded schema blobs are byte-identical to the previous SDK source: orchestrator2429fff4696ea9e8615e7f39f8960fcaf7b73a93, sandbox1d52ed7d7342f3f0a82fdf92f1a54e84bc3c3ebe, purge9d9e222aec64087dbde98d1528bbd8798e0feb79. Production code, tests, build inputs, and Core 3.11.1 plus every other dependency pin are unchanged. No SDK-main synchronization, package publication, or service deployment was performed.19a52403aa6b50dd5ddacc5a2425c11da6044ffd; their exact source/package identities are retained. Current push-triggered checks must be judged on the new head rather than assumed green from the parent.Current published Core 3.11.1 update -- October 19 (UTC), source
19a52403aa6b50dd5ddacc5a2425c11da6044ffdnuget.configsources and fresh package/HTTP caches, without preview/local-feed/dependency overrides. The restored nupkg SHA512 matches the independent public NuGet.org metadata and the official v2 download; Microsoft author/NuGet repository signatures and nuspec source774e93b103d6eefe4c6b09c4ca7cf4e1b4a21721were verified. Both actual test-runtime Core DLLs match this public version/source.dotnet build src\dirs.proj --configuration Release, 40 project/TFM DLL outputs across netstandard2.0/net6.0/net8.0/net10.0, 321 unsuppressed warnings, 0 errors. This is the current default traversal, not the historical 39-output build on the older source below.--no-restore; no test/assertion/skip changes or custom dependency manifest were used.The 3.11.0 and older sections below remain historical evidence for their stated commits/packages; they are not relabelled as current 3.11.1 validation. This update does not merge or release the SDK, change other package pins, or deploy DTS.
Historical SDK Core 3.11.0 review fixes and validation -- October 19 (UTC), source
8eb44179540f8cacc8d83c6c0aca59e82eb96dednuget.configsources and fresh session-scoped NuGet/HTTP caches were used, with noDirectoryPackagesPropsPath, preview package, local feed, API shim, or warning suppression. The restored Core package's Microsoft author and NuGet.org repository signatures were verified; its nuspec and assembly product version identify public source99296e0f6a013b217092430d97914e7578dfe4f5. Both test-runtime Core DLLs match the official 3.11.0 assembly.src\dirs.projproduced all 39 declared project/TFM outputs across netstandard2.0, net6.0, net8.0, and net10.0, with 0 errors and 265 unsuppressed warnings. No unrelated repairs were made.TaskEntityShimTests: 13;GrpcEntityRunnerTagTests: 13;ProtoUtilsEntityActionTests: 5. This includes both NEW null-key cases and both retained null-value cases, not an extrapolation from old results. The gRPC test executes the serialized public runner and checks operation failure, state/action rollback, successful surrounding operations, and final extended-session cached state.IReadOnlyDictionarymock enumerating a valid entry and a null-key entry; production validation and public APIs were not changed. Canonical proto/versions files remain unchanged at merged source20d2aadae358d8aa526190cbf78fb6c313b0b3db, orchestrator blob2429fff4696ea9e8615e7f39f8960fcaf7b73a93.buildanddts-emulator-tests,smoke-tests, all three C# analyses, Python analysis, CodeQL,submit-nuget, andlicense/cla. The analyses that were pending in the earlier 02:04 snapshot have completed. This reports actual checks on source8eb4417, not human approval, merge, package publication, or deployment.Commands used below omit only console/TRX logger and results-directory arguments; package-cache environment variables pointed to fresh session directories, not a different dependency manifest:
The sections below are explicitly historical. Their local candidate packages, overrides, source identities, and release-blocked states are not being relabelled as the current public-package validation. No SDK package publication, service deployment, or new Azure E2E run was performed for these review fixes.
Historical source preparation and validation -- October 13, source
4c583a70dd8820069451dbeb7e400e9886ab1092The existing SDK branch was aligned with real
maincommit91739687ff647699079cdadd627daa00562982b7using a normal merge, without rebasing, amending, or force-pushing. Apart from those upstream changes, the new source delta is only tool-generatedsrc/Grpc/versions.txtprovenance. Entity-tag implementation, all 29 focused cases, and the released Core manifest are unchanged.After microsoft/durabletask-protobuf#80 merged, canonical
mainwas confirmed to be merge commit20d2aadae358d8aa526190cbf78fb6c313b0b3db, and the actual repository workflow was run:Passed. The script recorded the merged source in
versions.txtand downloaded exactly its existing three-schema scope. All three schema bytes were unchanged: orchestrator blob2429fff4696ea9e8615e7f39f8960fcaf7b73a93, sandbox blob1d52ed7d7342f3f0a82fdf92f1a54e84bc3c3ebe, payload-purge blob9d9e222aec64087dbde98d1528bbd8798e0feb79. The ordinaryGrpc.Tools2.81.0 build logged 12 actualprotoc/C# plugin invocations, three schemas across netstandard2.0/net6.0/net8.0/net10.0, and finished with 0 warnings / 0 errors. Generated message/service files stay in ignored build outputs, not source control. All four generatedStartNewOrchestrationActionprojections have theTagsmap at field8, with identical generated-message SHA2564A12254CDD6CA43E654C491FCF009657864ECD5C107B694A7DBE9176A9342C16. This independent protocol-project build uses normal public dependencies and requires no Core override; it is not a full-SDK CI pass.For source behavior only,
$OVERRIDEnow points to an uncommitted session-onlyci812.Directory.Packages.propsthat imports the released repository manifest and selects a locally built unsigned/unpublished Core3.11.0candidate;$LOCAL_CONFIGpoints to its explicit validation-only local feed plus upstream-public, with a separate isolatedNUGET_PACKAGEScache. Local Core source/assembly identity ise3170420ff4e8afda2336b53450d0ae226a000b5; package SHA25606462071274F68A34EA17C39FD3AF89E95F7FACFDFFBEEFE66F160D945A0F12E, DLL SHA2560BAD29CCB83DFC8F715F33E1F472B75D1BCE1DFCAE33E77D3A15C97CDC745872. This candidate is not a published or signed release, was not uploaded, and is not referenced by committed source or production/CI feeds.With
$RESULTSpointing to the isolated session'sci812-results:Both restores passed; actual shim tests 12/12 passed; public encoded runner/protocol tests 17/17 passed; worker gRPC build passed for all four target frameworks with 0 errors. Existing analyzer warnings and expected
CS8002unsigned-local-Core reference warnings were not suppressed. These local-only checks were rerun at the exact pushed source head, not substituted for normal CI.The normal/public dependency gate remains reproduced at this head:
Normal restore passed with committed released Core
3.9.0; the normal worker build failed withCS0117becauseStartNewOrchestrationOperationAction.Tagsis absent. The captured hosted Validate Build run at preceding head5c304330...likewise fails withCS0117/CS1061in the shim and both protocol conversions. As of October 13, the separately checked official NuGet Gallery still has Core3.10.0as its latest public release, without this new API; the tag-aware Core release is not yet published. No released-version pin available today can legitimately make this sender compile. Once the real tag-aware Core package is published, update the SDK dependency to that real published version and run the normal CI. Do not commit a guessed package, local override/feed, reflection fallback, tag dropping, test removal, or compiler suppression to obtain a green result.Original October 6 packages/Azure evidence remain unchanged at source
c6ef936...; no package was repacked/relabelled and no new Azure run or backend deployment was performed for this sync/provenance follow-up.Historical review validation -- October 7, source
5c304330dde4a2044f1ef35da288966aa31e9a89Passed with an explicit build-only local Core override; not a default/public-CI pass. The committed/default manifest retains Core
3.9.0, which lacks the new actionTagsAPI. This draft stays blocked until the Core prerequisite is actually published and the SDK dependency is then updated to its real released version.The uncommitted session artifact
review-812.Directory.Packages.propsimports the repository's unchangedDirectory.Packages.propsand updates only the local build's Core reference to3.10.1-entitytags807.localfrom Core source76a6f9e0c4fddc04e4f1c9178ef3d9739184349e. Its package SHA256 isA3812665B2AF7DB313AD8122884E62156270667038EC62DC8F8868FF0F861DAF. Restore uses the explicit session-local feed and isolatedNUGET_PACKAGEScache, never an official package shadow or version-warning suppression.SubOutRoot=review-812keeps these outputs separate from the original Azure-bound build.With
$OVERRIDEpointing to that session-only props file,$LOCAL_CONFIGto the existing explicit local-feed NuGet config, and$RESULTSto the session'sreview-812-results:Both restores passed.
GrpcEntityRunnerand protocol conversion tests: passed, 17/17.git diff --cached --check-- passed. Manifest Git blob7b634b8fc999cb4b54e3fc8327cbc956360832c2exactly matches the PR baseline;git diff fb044a3c84ec093a30c3a4f5c7bb295357eec1c0..HEAD -- Directory.Packages.propsis empty.Historical October 6 validation -- source
c6ef936bc02ea52a720f6014cab90ec70c2c8cf4onlyThe original 416-test run and original packages are not validation/artifacts of the new review head:
dotnet test test\Worker\Core.Tests\Worker.Tests.csproj --configuration Release --no-restore --verbosity quiet -p:VersionSuffix=entitytags807.local-- historical pass, 149 tests.dotnet test test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configuration Release --no-restore --verbosity quiet -p:VersionSuffix=entitytags807.local-- historical pass, 203 tests.dotnet test test\Client\Grpc.Tests\Client.Grpc.Tests.csproj --configuration Release --no-restore --verbosity quiet -p:VersionSuffix=entitytags807.local-- historical pass, 64 tests.src\Grpc\refresh-protos.ps1 -branch 8188ba772b1c9e2b47e2ce51ae528149867f0f09-- historical pass; exact schema blob verified and unchanged.dotnet pack $project --configuration Release --no-restore --verbosity quiet -p:VersionSuffix=entitytags807.local --output $LOCAL_FEED-- historical pass. All original1.26.0-entitytags807.localpackage nuspec commits, 21 SourceLink documents, DLL hashes, and runtime identities remain bound toc6ef936bc02ea52a720f6014cab90ec70c2c8cf4. Their bytes were checked unchanged; nothing was repacked or relabeled as5c304330....Manual validation (only if runtime/behavior changed)
c6ef936bc02ea52a720f6014cab90ec70c2c8cf4, Windows/.NET SDK 10.0.401, real Azure DTS Consumption scheduler in centraluseuap, newly-created isolated authorized hub, Azure CLI identity, standardhttps://durabletask.ioaudience. No emulator, copied secrets, private service deployment, or primary-checkout builds. No new Azure run/deployment was performed for the manifest/main-sync/provenance follow-ups.GetInstanceAsyncprobe -- passed, zero instances created. The original combined Core/protocol/SDK artifacts were verified by loaded DLL hashes, informational commits/MVIDs, and field8 before the Azure run.pwsh -NoProfile -File $HARNESS\run-e2e.ps1-- FAIL: 84 checks passed, exactly 3 tag-persistence assertions failed. Six real native entity-triggered child orchestrations completed. Name, numeric version807.0.0, input, futureStartAt, emitted dictionary snapshots, no-tags/null/empty starts, transactional rollback, null-value rejection, and repeated no-orphan checks passed. Correct outgoing/TaskHubSidecarService/CompleteEntityTaskfield8 maps for the tagged start and both snapshots yielded persistedtags: {}. Client-start control tags persisted. Native inheritance was not surfaced; no native inheritance/override success is claimed.2026-10-06T22:25:18Zeach returned totalCount 1, the completed client control only, not the entity child. Strict assertions requiring both IDs failed. Final unfiltered query at22:27:04Zreturned both completed instances with control tags present/entity tags empty; a synthetic negative filter returned 0. This proves missing persisted tags, not query/authentication failure or missing orchestration execution.c6ef936...; it is not a new-review-head or deployed-backend success claim. Endpoint/hub/tenant/subscription/instance suffixes are redacted here.Notes for reviewers
ExecutionStartedpath is separate from nativeEntityBatchResult. Core action/merging tests and local provider/bridge tests cover that wrapped path within their stated scope, not deployment or persistence of the Azure native receiver. The native failure does not by itself prove the wrapped Functions path fails or passes.TaskEntityContextandStartOrchestrationOptionssignatures remain unchanged; optional field 8 preserves existing field numbers and absent/empty-map bytes. No orchestrator replay logic or JSON converter defaults changed. Invalid null keys/values fail within operation rollback; server/provider limits and feature availability remain version-dependent. This is not a claim that every tag-bearing application observes identical behavior on old and new receivers.