Repository navigation
Propagate tags from entity-started orchestrations - #812
Open
wangbill (YunchuWang) wants to merge 2 commits into
Open
wangbill (YunchuWang) wants to merge 2 commits into
wangbill (YunchuWang) wants to merge 2 commits into
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.
| Version = options?.Version ?? string.Empty, | ||
| InstanceId = instanceId, | ||
| Input = this.dataConverter.Serialize(input), | ||
| Tags = options?.Tags?.ToDictionary(tag => tag.Key, tag => Check.NotNull(tag.Value)), |
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 and record its upstream commit inversions.txt.GrpcEntityRunnerrequest/response and protocol round trips. Document snapshot behavior without changing public signatures.5c304330dde4a2044f1ef35da288966aa31e9a89: restoreDirectory.Packages.propsbyte-for-byte to PR baselinefb044a3c84ec093a30c3a4f5c7bb295357eec1c0, retaining released Core3.9.0. This manifest now has no aggregate PR diff; no preview/speculative package reference or validation override is committed.Why is this change needed?
Issues / work items
Companion PRs and release order
3455f719b18ed156bbbc008d757821e72f58d63b; schema blob remains2429fff4696ea9e8615e7f39f8960fcaf7b73a93, identical to the SDK's recorded import from8188ba772b1c9e2b47e2ce51ae528149867f0f09.76a6f9e0c4fddc04e4f1c9178ef3d9739184349e.The native receiver must be deployed before SDK senders are enabled, otherwise correct field8 tags can still be dropped. Package version changes happen only after the prerequisite is actually released. Local validation overrides stay outside source control and do not bypass public CI or release gates.
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
Fresh 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 this manifest-only review change.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
3.9.0cannot compile the new actionTagsAPI; no default/public-CI success is claimed. Only after Core is actually published should this SDK manifest be updated to the real released version, CI made green, and the SDK released. Local overrides are not committed and are not a CI bypass.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; the optional map only adds field8 and preserves existing field numbers/empty-map bytes. No orchestrator replay logic or JSON converter defaults changed. Null tag values fail consistently with existing client constraints inside the transactional operation.