Skip to content

Propagate tags from entity-started orchestrations - #812

Merged
wangbill (YunchuWang) merged 8 commits into
mainfrom
yunchuwang-entity-tags-sdk-e2e
Oct 20, 2026
Merged

wangbill (YunchuWang) merged 8 commits into
mainfrom
yunchuwang-entity-tags-sdk-e2e

Conversation

@YunchuWang

@YunchuWang wangbill (YunchuWang) commented Oct 6, 2026 •

Copy link
Copy Markdown
Member

Summary

What changed?

  • Snapshot StartOrchestrationOptions.Tags in the actual entity shim and carry tags through both Core/protobuf operation-action conversions.
  • Import the merged canonical optional StartNewOrchestrationAction.tags = 8 schema using the repository workflow and record its merged upstream commit in versions.txt.
  • Reject runtime null tag keys/values during scheduling, so normal entity-operation failure and rollback happen before batch serialization or extended-session cache publication. Valid Unicode and empty strings remain supported.
  • Add 31 focused regression cases covering both scheduling overloads, null/empty tags, existing name/ID/version/input/timing/trace fields, dictionary reuse/mutation, null-key/null-value transactional rollback, cached execution, and serialized public GrpcEntityRunner request/response and protocol round trips. Public signatures remain unchanged.
  • Update Directory.Packages.props to 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.
  • Historical branch preparation at 4c583a70dd8820069451dbeb7e400e9886ab1092 incorporated SDK main commit 91739687ff647699079cdadd627daa00562982b7 and recorded canonical protocol merge 20d2aadae358d8aa526190cbf78fb6c313b0b3db. The earlier 8eb4417 review 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 normal Grpc.Tools build outputs.

Why is this change needed?

  • Entity-scheduled orchestration tags are currently dropped before reaching the scheduler, preventing metadata display and tag searches. Published Core 3.11.1 is now consumed here. Full native DTS feature availability still depends on a supporting deployed receiver; this PR does not deploy that receiver.

Issues / work items

  • Resolves #807 -- SDK portion; native backend consumption/persistence and dependency releases remain separate gates.
  • Related #399, #559.

Companion PRs and release order

Companion Responsibility
microsoft/durabletask-protobuf#80 Canonical optional entity-start tags field8, merged as 20d2aadae358d8aa526190cbf78fb6c313b0b3db. The SDK refresh now records that merge; schema blob remains 2429fff4696ea9e8615e7f39f8960fcaf7b73a93.
Azure/durabletask#1412 Core action property and wrapped-Core tag merging, merged as d1e659fc5c4285665d09aebae027ab9c6a0921cb; historical validation source remains 76a6f9e0c4fddc04e4f1c9178ef3d9739184349e. Merge alone does not publish its API.
Azure/durabletask#1416 Initial tag-aware Core 3.11.0 release prerequisite. This SDK PR now consumes the published Core 3.11.1 patch; earlier local candidates below remain historical evidence, not release artifacts.
#812 (this PR) SDK snapshotting and both protocol conversions.
Azure/azure-functions-durable-extension#3566 Functions consumer, host bridge, and separate wrapped-Core provider path.
DTS native backend companion (private/internal PR; link omitted from public GitHub) Native entity-start receiver consumption/persistence; approved rollout is required. No private URL, ID, repository, code, or logs are disclosed here.
  1. Merge the canonical protocol contract first; completed by the merge above. This is a contract change, not a NuGet release.
  2. The Core prerequisite is published, and this PR now references Core 3.11.1. Native DTS receiver rollout is a separate service-side feature gate, not a Core NuGet release requirement; this PR makes no deployment claim.
  3. Complete normal SDK CI and review using the committed Core 3.11.1 dependency before merge/release. The Core publication gate is satisfied; no future version, unsigned candidate, or validation-only override is being substituted.
  4. After a tag-aware SDK release actually exists, align the Functions SDK dependencies to that real published version, validate the host bridge, and release the extension. Functions is receiving the same published Core 3.11.1 update separately; its SDK dependency versions are not changed by this Core-only follow-up.

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 are not required for the next release
    • Otherwise: Notes added to release_notes.md
  • Backport is not required
    • Otherwise: Backport tracked by issue/PR #issue_or_pr
  • All required tests have been added/updated (unit tests, E2E tests)
  • Breaking change?
    • If yes:
      • Impact:
      • Migration guidance:

AI-assisted code disclosure (required)

Was an AI tool used? (select one)

  • No
  • Yes, AI helped write parts of this PR (e.g., GitHub Copilot)
  • Yes, an AI agent generated most of this PR

If AI was used:

  • Tool(s): GitHub Copilot App.
  • AI-assisted areas/files: Entity shim, shared protocol conversions, focused tests, XML documentation, canonical schema refresh, isolated Azure validation harness, and reviewed manifest restoration.
  • What you changed after AI output: Agent refined snapshot-time null validation/rollback coverage, preserved existing mixed line endings and legacy comment bytes, adjusted the historical harness for numeric versions/ID-length constraints, and restored the released Core manifest following review. No human post-generation edits are claimed.

AI verification (required if AI was used):

  • I understand the code and can explain it
  • I verified referenced APIs/types exist and are correct
  • I reviewed edge cases/failure paths (timeouts, retries, cancellation, exceptions)
  • I reviewed concurrency/async behavior
  • I checked for unintended breaking or behavior changes

Testing

Automated tests

Current provenance-only follow-up -- October 20 (UTC), source 721c2e73dec59459a2c6a96c8df560eb4c64f47e

  • Addressed the versions.txt review 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 commit 20d2aadae358d8aa526190cbf78fb6c313b0b3db.
  • Only src/Grpc/versions.txt metadata changed. All three downloaded schema blobs are byte-identical to the previous SDK source: orchestrator 2429fff4696ea9e8615e7f39f8960fcaf7b73a93, sandbox 1d52ed7d7342f3f0a82fdf92f1a54e84bc3c3ebe, purge 9d9e222aec64087dbde98d1528bbd8798e0feb79. 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.
  • This metadata-only follow-up did not rerun runtime tests or relabel previous results. The normal public-Core-3.11.1 default build (40 outputs, 0 errors) and owning tests (31 passed) below were actually executed at parent 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 19a52403aa6b50dd5ddacc5a2425c11da6044ffd

  • The committed central dependency is Microsoft.Azure.DurableTask.Core 3.11.1, restored with normal repository nuget.config sources 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 source 774e93b103d6eefe4c6b09c4ca7cf4e1b4a21721 were verified. Both actual test-runtime Core DLLs match this public version/source.
  • Default source Release build passed: 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.
  • Owning tests passed 31/31 on net10.0, 0 failed, 0 skipped: TaskEntityShimTests 13, GrpcEntityRunnerTagTests 13, ProtoUtilsEntityActionTests 5. Both null-key and retained null-value rollback cases remain unchanged. The test commands use the existing class filters, Release configuration and --no-restore; no test/assertion/skip changes or custom dependency manifest were used.
  • This follow-up changes only the Core dependency from 3.11.0 to 3.11.1. Normal push-triggered hosted CI and required review remain current-head gates; no full hosted/cloud-suite pass, release, or service rollout is inferred from these local results.

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 8eb44179540f8cacc8d83c6c0aca59e82eb96ded

  • Committed dependency: Microsoft.Azure.DurableTask.Core 3.11.0, actually published. Normal nuget.config sources and fresh session-scoped NuGet/HTTP caches were used, with no DirectoryPackagesPropsPath, 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 source 99296e0f6a013b217092430d97914e7578dfe4f5. Both test-runtime Core DLLs match the official 3.11.0 assembly.
  • Default source build passed: src\dirs.proj produced 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.
  • Owning tests passed: 31/31 on net10.0, 0 failed, 0 skipped. Core 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.
  • The null-key input is a local strict IReadOnlyDictionary mock 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 source 20d2aadae358d8aa526190cbf78fb6c313b0b3db, orchestrator blob 2429fff4696ea9e8615e7f39f8960fcaf7b73a93.
  • Final push-triggered hosted-check snapshot, October 19 at 02:14 UTC: all 10 reported checks succeeded, including build and dts-emulator-tests, smoke-tests, all three C# analyses, Python analysis, CodeQL, submit-nuget, and license/cla. The analyses that were pending in the earlier 02:04 snapshot have completed. This reports actual checks on source 8eb4417, 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:

dotnet restore src\dirs.proj --configfile nuget.config --no-http-cache --verbosity minimal
dotnet restore test\Worker\Core.Tests\Worker.Tests.csproj --configfile nuget.config --no-http-cache --verbosity minimal
dotnet restore test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configfile nuget.config --no-http-cache --verbosity minimal
dotnet build src\dirs.proj --configuration Release --no-restore --verbosity minimal
dotnet test test\Worker\Core.Tests\Worker.Tests.csproj --configuration Release --no-restore --filter 'FullyQualifiedName~Microsoft.DurableTask.Worker.Shims.TaskEntityShimTests' --verbosity minimal
dotnet test test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configuration Release --no-restore --filter 'FullyQualifiedName~Microsoft.DurableTask.Worker.Grpc.Tests.GrpcEntityRunnerTagTests|FullyQualifiedName~Microsoft.DurableTask.Worker.Grpc.Tests.ProtoUtilsEntityActionTests' --verbosity minimal

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 4c583a70dd8820069451dbeb7e400e9886ab1092

The existing SDK branch was aligned with real main commit 91739687ff647699079cdadd627daa00562982b7 using a normal merge, without rebasing, amending, or force-pushing. Apart from those upstream changes, the new source delta is only tool-generated src/Grpc/versions.txt provenance. Entity-tag implementation, all 29 focused cases, and the released Core manifest are unchanged.

After microsoft/durabletask-protobuf#80 merged, canonical main was confirmed to be merge commit 20d2aadae358d8aa526190cbf78fb6c313b0b3db, and the actual repository workflow was run:

.\src\Grpc\refresh-protos.ps1 -branch 20d2aadae358d8aa526190cbf78fb6c313b0b3db
dotnet restore src\Grpc\Grpc.csproj --configfile nuget.config --verbosity quiet -p:SubOutRoot=ci812-canonical-generation
dotnet build src\Grpc\Grpc.csproj --configuration Release --no-restore --verbosity normal -p:SubOutRoot=ci812-canonical-generation

Passed. The script recorded the merged source in versions.txt and downloaded exactly its existing three-schema scope. All three schema bytes were unchanged: orchestrator blob 2429fff4696ea9e8615e7f39f8960fcaf7b73a93, sandbox blob 1d52ed7d7342f3f0a82fdf92f1a54e84bc3c3ebe, payload-purge blob 9d9e222aec64087dbde98d1528bbd8798e0feb79. The ordinary Grpc.Tools 2.81.0 build logged 12 actual protoc/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 generated StartNewOrchestrationAction projections have the Tags map at field8, with identical generated-message SHA256 4A12254CDD6CA43E654C491FCF009657864ECD5C107B694A7DBE9176A9342C16. 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, $OVERRIDE now points to an uncommitted session-only ci812.Directory.Packages.props that imports the released repository manifest and selects a locally built unsigned/unpublished Core 3.11.0 candidate; $LOCAL_CONFIG points to its explicit validation-only local feed plus upstream-public, with a separate isolated NUGET_PACKAGES cache. Local Core source/assembly identity is e3170420ff4e8afda2336b53450d0ae226a000b5; package SHA256 06462071274F68A34EA17C39FD3AF89E95F7FACFDFFBEEFE66F160D945A0F12E, DLL SHA256 0BAD29CCB83DFC8F715F33E1F472B75D1BCE1DFCAE33E77D3A15C97CDC745872. This candidate is not a published or signed release, was not uploaded, and is not referenced by committed source or production/CI feeds.

With $RESULTS pointing to the isolated session's ci812-results:

dotnet restore test\Worker\Core.Tests\Worker.Tests.csproj --configfile "$LOCAL_CONFIG" --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=ci812-local-validation
dotnet restore test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configfile "$LOCAL_CONFIG" --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=ci812-local-validation
dotnet test test\Worker\Core.Tests\Worker.Tests.csproj --configuration Release --no-restore --verbosity quiet --filter "FullyQualifiedName~TaskEntityShimTests" --logger "trx;LogFileName=shim.trx" --results-directory "$RESULTS" -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=ci812-local-validation
dotnet test test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configuration Release --no-restore --verbosity quiet --filter "FullyQualifiedName~GrpcEntityRunnerTagTests|FullyQualifiedName~ProtoUtilsEntityActionTests" --logger "trx;LogFileName=grpc.trx" --results-directory "$RESULTS" -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=ci812-local-validation
dotnet build src\Worker\Grpc\Worker.Grpc.csproj --configuration Release --no-restore --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=ci812-local-validation

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 CS8002 unsigned-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:

dotnet restore src\Worker\Core\Worker.csproj --configfile nuget.config --verbosity quiet -p:SubOutRoot=ci812-public-baseline
dotnet build src\Worker\Core\Worker.csproj --configuration Release --no-restore --verbosity quiet -p:SubOutRoot=ci812-public-baseline

Normal restore passed with committed released Core 3.9.0; the normal worker build failed with CS0117 because StartNewOrchestrationOperationAction.Tags is absent. The captured hosted Validate Build run at preceding head 5c304330... likewise fails with CS0117/CS1061 in the shim and both protocol conversions. As of October 13, the separately checked official NuGet Gallery still has Core 3.10.0 as 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 5c304330dde4a2044f1ef35da288966aa31e9a89

Passed 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 action Tags API. 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.props imports the repository's unchanged Directory.Packages.props and updates only the local build's Core reference to 3.10.1-entitytags807.local from Core source 76a6f9e0c4fddc04e4f1c9178ef3d9739184349e. Its package SHA256 is A3812665B2AF7DB313AD8122884E62156270667038EC62DC8F8868FF0F861DAF. Restore uses the explicit session-local feed and isolated NUGET_PACKAGES cache, never an official package shadow or version-warning suppression. SubOutRoot=review-812 keeps these outputs separate from the original Azure-bound build.

With $OVERRIDE pointing to that session-only props file, $LOCAL_CONFIG to the existing explicit local-feed NuGet config, and $RESULTS to the session's review-812-results:

dotnet restore test\Worker\Core.Tests\Worker.Tests.csproj --configfile "$LOCAL_CONFIG" --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=review-812
dotnet restore test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configfile "$LOCAL_CONFIG" --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=review-812

Both restores passed.

dotnet test test\Worker\Core.Tests\Worker.Tests.csproj --configuration Release --no-restore --verbosity quiet --filter "FullyQualifiedName~TaskEntityShimTests" --logger "trx;LogFileName=shim.trx" --results-directory "$RESULTS" -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=review-812
dotnet test test\Worker\Grpc.Tests\Worker.Grpc.Tests.csproj --configuration Release --no-restore --verbosity quiet --filter "FullyQualifiedName~GrpcEntityRunnerTagTests|FullyQualifiedName~ProtoUtilsEntityActionTests" --logger "trx;LogFileName=grpc.trx" --results-directory "$RESULTS" -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=review-812
dotnet build src\Worker\Grpc\Worker.Grpc.csproj --configuration Release --no-restore --verbosity quiet -p:DirectoryPackagesPropsPath="$OVERRIDE" -p:SubOutRoot=review-812
  • Actual shim tests: passed, 12/12.
  • Encoded public GrpcEntityRunner and protocol conversion tests: passed, 17/17.
  • Worker gRPC type build: passed for netstandard2.0/net6.0/net8.0/net10.0, 0 errors. Existing unrelated analyzer warnings remain.
  • git diff --cached --check -- passed. Manifest Git blob 7b634b8fc999cb4b54e3fc8327cbc956360832c2 exactly matches the PR baseline; git diff fb044a3c84ec093a30c3a4f5c7bb295357eec1c0..HEAD -- Directory.Packages.props is empty.

Historical October 6 validation -- source c6ef936bc02ea52a720f6014cab90ec70c2c8cf4 only

The 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.
  • Test-first evidence at the original source: shim tag tests initially failed 8/11; protocol/public-runner tests initially failed 8/16; null-value tests reproduced batch-serialization poisoning before the guard.
  • src\Grpc\refresh-protos.ps1 -branch 8188ba772b1c9e2b47e2ce51ae528149867f0f09 -- historical pass; exact schema blob verified and unchanged.
  • For the original eight Abstractions/Grpc/Client/Client.Grpc/Client.AzureManaged/Worker/Worker.Grpc/Worker.AzureManaged projects, dotnet pack $project --configuration Release --no-restore --verbosity quiet -p:VersionSuffix=entitytags807.local --output $LOCAL_FEED -- historical pass. All original 1.26.0-entitytags807.local package nuspec commits, 21 SourceLink documents, DLL hashes, and runtime identities remain bound to c6ef936bc02ea52a720f6014cab90ec70c2c8cf4. Their bytes were checked unchanged; nothing was repacked or relabeled as 5c304330....

Manual validation (only if runtime/behavior changed)

  • Environment (OS, .NET version, components): Historical October 6 run at SDK source c6ef936bc02ea52a720f6014cab90ec70c2c8cf4, Windows/.NET SDK 10.0.401, real Azure DTS Consumption scheduler in centraluseuap, newly-created isolated authorized hub, Azure CLI identity, standard https://durabletask.io audience. 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.
  • Steps + observed results:
    1. Historical authenticated baseline GetInstanceAsync probe -- 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.
    2. Historical 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 version 807.0.0, input, future StartAt, emitted dictionary snapshots, no-tags/null/empty starts, transactional rollback, null-value rejection, and repeated no-orphan checks passed. Correct outgoing /TaskHubSidecarService/CompleteEntityTask field8 maps for the tagged start and both snapshots yielded persisted tags: {}. Client-start control tags persisted. Native inheritance was not surfaced; no native inheritance/override success is claimed.
    3. Historical authenticated dashboard searches by key, unique value, and exact key/value at 2026-10-06T22:25:18Z each returned totalCount 1, the completed client control only, not the entity child. Strict assertions requiring both IDs failed. Final unfiltered query at 22:27:04Z returned 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.
  • Evidence (optional): Original JSONL and dashboard JSONs preserve redacted outgoing payloads versus persisted metadata, loaded identities, assertions, and cleanup. All original Azure/provenance evidence remains explicitly historical at c6ef936...; it is not a new-review-head or deployed-backend success claim. Endpoint/hub/tenant/subscription/instance suffixes are redacted here.
  • Historical cleanup: Worker stopped; five nonretained children, parent, and exact uniquely-created entity purged/absence verified. Control/entity fixtures remained only for coordinator queries, followed by coordinator-owned isolated-hub deletion. No shared scheduler or other hub was changed.

Notes for reviewers

  • Current dependency: published Core 3.11.1. Current-head validation is recorded in the new section above; the older 3.11.0 build/test/check results retain their exact historical source identities and are not claimed as results for this new pin. Human review and normal merge/release gates remain separate.
  • Native DTS rollout remains separately unverified here. Older native receivers can ignore optional field 8, so successful scheduling alone does not prove tags persisted. Correctly versioned client packages do not inherently break merely because DTS is older, but uniform new-feature behavior and provider-specific batch-safety require a supporting receiver. This PR neither deploys nor claims a verified service rollout.
  • The Functions provider's wrapped-Core-generated ExecutionStarted path is separate from native EntityBatchResult. 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.
  • Size risk remains: tag dictionaries add bytes to actions and batches. Existing transport/message limits still apply; large tags/batches and load behavior are not proven by these small synthetic cases. No new global tag limits or silently dropped values were added.
  • Compatibility scope: public TaskEntityContext and StartOrchestrationOptions signatures 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.
  • No reflective/conditional compatibility workaround was added. Tags were not moved into input. No packages were published, no source release version was invented, no private backend identifiers/code/logs were disclosed, and no PR was merged.

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
Comment thread Directory.Packages.props Outdated
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
@YunchuWang
wangbill (YunchuWang) marked this pull request as ready for review October 7, 2026 19:42
Copilot AI balanced review requested due to automatic review settings October 7, 2026 19:42

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Comment thread src/Worker/Core/Shims/TaskEntityShim.cs
Comment thread src/Grpc/orchestrator_service.proto
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
Copilot AI balanced review requested due to automatic review settings October 13, 2026 21:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The committed Core dependency lacks the new Tags API, preventing default builds, and null-key rollback coverage is missing.

2 open findings

🧠 Review effort: Balanced

Comment thread src/Worker/Core/Shims/TaskEntityShim.cs
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
Copilot AI balanced review requested due to automatic review settings October 19, 2026 01:54

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Public-package validation for the updated dependency and receiver-first rollout readiness require maintainer confirmation.

3 open issues

Review effort: Balanced

Comment thread Directory.Packages.props Outdated
Copilot AI balanced review requested due to automatic review settings October 19, 2026 14:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No unresolved blocking findings remain, and hosted build validation succeeded for the reviewed commit.

No open issues 🎉

3 resolved since last review

Review effort: Balanced

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 66135f0b-c3e7-4b97-8bdc-41880d4f0005
Copilot AI balanced review requested due to automatic review settings October 19, 2026 18:14

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Human confirmation is needed because the recorded dependency validation covers Core 3.11.0 rather than the committed 3.11.1 pin.

1 open issue

Review effort: Balanced

Comment thread Directory.Packages.props
Comment thread src/Grpc/versions.txt Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 66135f0b-c3e7-4b97-8bdc-41880d4f0005
Copilot AI balanced review requested due to automatic review settings October 20, 2026 19:47

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No unresolved blocking issues remain in SDK tag propagation, rollback handling, or backward-compatible protocol changes.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings October 20, 2026 20:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Cross-package integration warrants human sign-off, and current-head CI completion remains unverified.

No open issues 🎉

Review effort: Balanced

@YunchuWang
wangbill (YunchuWang) merged commit 5eb6bc9 into main Oct 20, 2026
11 checks passed
@YunchuWang
wangbill (YunchuWang) deleted the yunchuwang-entity-tags-sdk-e2e branch October 20, 2026 22:16
@YunchuWang wangbill (YunchuWang) mentioned this pull request Oct 21, 2026
1 of 15 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support for Tags in TaskEntityContext.ScheduleNewOrchestration

4 participants