Skip to content

Add SDK-owned blob purge service contract and shared task integration - #805

Open
wangbill (YunchuWang) wants to merge 21 commits into
mainfrom
yunchuwang-df-blob-purge-sdk-adapters
Open

wangbill (YunchuWang) wants to merge 21 commits into
mainfrom
yunchuwang-df-blob-purge-sdk-adapters

Conversation

@YunchuWang

@YunchuWang wangbill (YunchuWang) commented Sep 22, 2026 •

Copy link
Copy Markdown
Member

Summary

What changed?

  • Add Microsoft.DurableTask.LargePayloadPurge.Abstractions, using the SDK's standard package and assembly naming, MIT license metadata, signing and approval-gated publication conventions.
  • Define shared fetch/report operations once in Microsoft.DurableTask.LargePayloadPurge.Abstractions.ILargePayloadPurgeClient. Microsoft.DurableTask.LargePayloadPurge.Abstractions.IOrchestrationServiceLargePayloadPurgeClient inherits it and adds only the explicit setting operation.
  • Reference the canonical SDK Client models from source; no DTO copies, model moves or type forwarders.
  • Expose the existing Get/Report purge activities through their public interface constructors. Standalone worker factories adapt the same named/keyed gRPC client without adding a channel or taking over its lifetime.
  • Add contract identity/inheritance tests, shared-task coverage and package documentation. Keep package release notes and add a root Unreleased changelog entry.

Why is this change needed?

  • The optional .NET isolated Functions package can reuse the SDK purge implementation with a transport bound to a task hub, while leaving blob storage in the language worker.
  • The companion Functions extension and provider supply normal function wrappers, bound-client integration and the authenticated service bridge.
  • Keeping the contracts beside the SDK models avoids a package-version bootstrap dependency when building this repository.

Issues / work items


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: N/A
      • Migration guidance: N/A

No breaking change for released SDK packages: the new contracts and activity constructors are additive
relative to main. Canonical SDK models, serialization, protobuf definitions, explicit bootstrap, orchestration
and blob deletion behavior are unchanged.

Breaking Change (unreleased prototypes only)

  • Type: binary and source
  • Impact: The package and assembly are now Microsoft.DurableTask.LargePayloadPurge.Abstractions. The old prototype used Microsoft.Azure.DurableTask.LargePayloadPurge.Abstractions and assembly DurableTask.LargePayloadPurge.Abstractions. The provider contract now inherits the shared fetch/report interface rather than duplicating its operations. Both contract interfaces now share the package-owned Microsoft.DurableTask.LargePayloadPurge.Abstractions namespace, rather than the Core or Blob prototype namespaces.
  • Migration: Update the package reference and rebuild consumers. Update imports for both prototype interfaces to Microsoft.DurableTask.LargePayloadPurge.Abstractions and rebuild SDK Blob, Functions, and provider consumers; Blob implementation types keep their original namespace. Replace provider GetLargePayloadsToPurgeAsync implementations/calls with GetLargePayloadTombstonesAsync, returning Task<List<LargePayloadTombstone>>. Report uses the inherited shared signature. No compatibility forwarders are added for unreleased binaries.

The worker transport interface retains its exact fetch/report signatures and optional cancellation defaults.
The service contract declares only SetLargePayloadAutoPurgeAsync(bool, DateTime, CancellationToken), which
does not schedule or stop a purge runner. The existing setting-only client infrastructure interface is unchanged.


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
  • AI-assisted areas/files: Contract project/tests, activity construction and transport adapter, standalone registration, release integration and documentation.
  • What you changed after AI output: No human source changes recorded in this agent session.

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

These first-person attestations remain for the human author.


Testing

Automated tests

  • Current October 1 validation: 7 contract tests and 184 targeted extension tests passed, zero failures/skips. Contract assertions first failed against the prior identity/interface hierarchy and passed after the changes.
  • dotnet test test\LargePayloadPurge.Abstractions.Tests\LargePayloadPurge.Abstractions.Tests.csproj
  • dotnet test test\Extensions\AzureBlobPayloads.Tests\AzureBlobPayloads.Tests.csproj --filter "FullyQualifiedName~AutoPurge|FullyQualifiedName~DependencyInjection|FullyQualifiedName~BlobPayloadStoreDeleteResponseTests"
  • Coverage includes actual shared task execution/replay, failure details, event/continue-as-new behavior, backend status/deadline mapping, named/keyed DI, intercepted transport and channel rebinding.
  • Local Release pack/build succeeded for the netstandard2.0 contract and the Blob package's netstandard2.0/net6.0/net8.0/net10.0 targets. Existing unrelated analyzer warnings remain.
  • Actual packages were inspected for normalized IDs/dependencies, DLL simple names and SDK strong-name token, the inherited two-interface API, public-only activity constructors, README, MIT metadata and package release notes.
  • Both standard signing definitions and the normalized per-package publication selector were checked locally. Hosted signing or publication was not executed.

Manual validation (only if runtime/behavior changed)

  • Environment: Windows, .NET SDK 10.0.401, isolated local build outputs and validation-package cache.
  • Current review remediation was validated locally only. No Azure resource calls, deployments or physical end-to-end runs were performed for this revision.
  • Historical companion evidence, recorded before the package/assembly and provider-signature normalization, included:
    1. Ordinary isolated Functions executed Get/Delete/Report and the selected owned blob targets were physically absent afterward.
    2. Task-hub isolation and strict business-version behavior were observed while the empty-version purge runner remained Running.
    3. A base-extension-only consumer had no purge functions; explicit disable followed by restart did not re-enable cleanup.
  • Those separately owned earlier observations are not a fresh end-to-end result for the current package identity or interface hierarchy, nor a cloud-release or whole-container-cleanup guarantee.

Notes for reviewers

  • The contracts package inherits the shared SDK release version from eng/targets/Release.props, like Client and the Blob implementation; the normal Prepare Release workflow updates it automatically. Its assembly version follows the canonical SDK Client version and the signing key is unchanged. The standard signing pattern covers it without an exceptional job.
  • The dependency direction is Blob implementation -> contracts -> SDK Client -> SDK Abstractions -> Core. Contracts do not depend on Blob/storage/worker/gRPC implementations; Core has no reverse dependency.
  • Fetch/report methods, token mapping and their deadline/cancellation behavior are shared unchanged. Only the service contract adds the explicit setting operation.
  • The service interface and contract tests were newly authored for this feature effort; the Core-template Apache notices carried through the earlier extraction were corrected to the SDK MIT convention after their provenance was verified. This does not change the license of any unrelated source or canonical model.
  • RELEASENOTES.md is consumed into NuGet metadata by Release.targets; the root changelog is the persistent repository history. This package now uses the normal shared SDK release tag/link, not a separate 0.1.x release train.
  • Publish actual compatible SDK dependencies containing the canonical purge models before the new package. No local validation version is claimed as released, and no machine-local reference is committed.
  • The contract publication job additionally requires successful Client and Abstractions publication, not approval alone. Failed/skipped/canceled prerequisites, including duplicate-version upload failures, block it; other package jobs remain independent. The YAML dependency graph, package selector and documented status semantics were checked locally, without executing a release.

October 5 namespace alignment

  • Both contracts now use the user-selected Microsoft.DurableTask.LargePayloadPurge.Abstractions; both unreleased interface type names moved out of the Blob implementation namespace. Its package/assembly identity, SDK signing key, method signatures/defaults, Client model identities, and protobuf protocol are unchanged. Old prototype consumers must update imports and rebuild.
  • Fresh local namespace checks: 7 contract tests and 184 targeted Blob integration tests passed. The actual immutable SDK packages were inspected for the two new-namespace exports and absence of all prior prototype interface locations; companion consumer validation is recorded in their PRs. This is not a hosted CI or production-publication claim.
  • Merge/release sequence is Core #1408, then SDK Add SDK-owned blob purge service contract and shared task integration #805, then Functions #3556, then the private provider. Each upstream artifact must actually be published and the next layer must commit compatible real package pins and pass clean-cache validation before its merge. Existing pipeline gates cover Client/Abstractions -> contracts -> Blob; a release operator must also verify the entire SDK package dependency closure, including Grpc/Worker. No release numbers are invented and no production packages are published by this follow-up.

Final namespace decision: the contracts own Microsoft.DurableTask.LargePayloadPurge.Abstractions; Blob classes, stores, and activities own Microsoft.DurableTask.AzureBlobPayloads and explicitly import the contracts. No prior interface alias or type forwarder is supplied. The coordinated namespace follow-up is not a production release or a fix for the private provider's separate dependency-pin/deadline review blockers.

October 5 shared-version and adapter regression follow-up

  • Removed the package-local VersionPrefix/VersionSuffix overrides; contracts now inherit the SDK shared prefix/suffix and version. An isolated real-import regression changed only copied shared Release.props: before the fix Client became 9.8.7.0 while contracts stayed 0.1.0.0; after the fix both became 9.8.7.0, without a command-line VersionPrefix override masking the old behavior. No production release version was bumped or published.
  • Added two real GrpcLargePayloadPurgeClient mapping tests. A non-empty two-row fetch asserts exact opaque token/payload pairs and order; Report verifies outgoing tokens and dispositions. Isolated swapped-field and dropped-row mutations each fail the fetch regression, and restored source passes both tests. Fresh targeted results: 7 contract tests and 186 Blob tests passed; these are local scoped checks, not hosted-CI or a full auth-suite rerun.
  • The actual validation packages use one uniform SDK version including contracts, and the companion assertions compare the contract assembly version with Client rather than hardcoding 0.1.0. The committed 1.26.0 source baseline is not a claim that a feature-ready contract release exists; actual new shared SDK releases and consumer dependency upgrades still gate downstream merges.

Reuse the existing purge tasks and bootstrap sequence with a task-hub-bound transport interface. Preserve standalone behavior and prove DTFx shim execution, failure handling, replay, and per-hub setup.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Reuse the existing native gRPC client for setup instead of adding an alternate bootstrap overload. Remove the unused setting facade and client shim tests while retaining actual DTFx purge task execution coverage.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Document normal function indexing, language-worker task execution, and the bound local-host transport. Preserve the existing SDK implementation and explicit bootstrap without claiming Functions end-to-end validation.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Clarify normal compiled-library Function indexing and opt-in package registration without a metadata transformer or generator. Preserve the base extension behavior and unchanged shared SDK tasks.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Describe explicit registration, normal function metadata and bindings without naming an unreleased package or prescribing its metadata implementation. Leave shared task APIs and bootstrap unchanged.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Describe the optional feature package's normal build-time Function discovery and generated invocation. Preserve shared SDK task APIs, explicit bootstrap behavior, and standalone operation.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@YunchuWang wangbill (YunchuWang) changed the title Expose blob auto-purge integration APIs for alternate .NET hosts Expose shared blob auto-purge tasks for .NET isolated Functions Sep 23, 2026
Restore the constants file to its upstream scope after verifying final consumers use only the public activities and transport facade. Trim integration documentation to the current isolated Functions path.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve the interface package identity and canonical SDK Client model references with an independent version. Add focused API and signing tests, Apache license attribution, solution discovery, and existing release signing coverage.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add the preserved package ID to the existing independent NuGet publication jobs, retaining the manual approval gate and symbol exclusion.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@YunchuWang wangbill (YunchuWang) changed the title Expose shared blob auto-purge tasks for .NET isolated Functions Add SDK-owned blob purge service contract and shared task integration Sep 24, 2026
Explain the interface-only netstandard2.0 target alongside the matching Client model library. Use a typed xUnit assertion before validating activity deadlines.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve both interface APIs and SDK model identities while removing the Blob implementation dependency from transport consumers. Add ownership and dependency regression coverage and package the existing Apache and MIT notices together.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use an extension-bearing package path so NuGet places the linked MIT license at the documented package root rather than treating it as a directory.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep the repository license linked without duplicating it and document the actual NuGet directory layout.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@YunchuWang
wangbill (YunchuWang) marked this pull request as ready for review September 29, 2026 17:07
@YunchuWang
wangbill (YunchuWang) requested review from halspang and a balanced review from Copilot and removed request for Copilot September 29, 2026 17:07

@halspang halspang left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few questions and some concerns about the license. It seems like we did a lot of custom release stuff for this package. Is there a reason we didn't follow the same path as something like the ExportHistory which also releases under its own version but doesn't pull in its own licensing.

Comment thread doc/release_process.md Outdated
Comment thread eng/publish/publish.yml Outdated
Comment thread src/Extensions/AzureBlobPayloads/AutoPurge/Client/GrpcLargePayloadPurgeClient.cs Outdated
Comment thread src/LargePayloadPurge.Abstractions/ILargePayloadPurgeClient.cs Outdated
Comment thread src/LargePayloadPurge.Abstractions/LargePayloadPurge.Abstractions.csproj Outdated
Comment thread src/LargePayloadPurge.Abstractions/LargePayloadPurge.Abstractions.csproj Outdated
Comment thread src/LargePayloadPurge.Abstractions/LICENSE Outdated
Comment thread src/LargePayloadPurge.Abstractions/README.md Outdated
Comment thread src/LargePayloadPurge.Abstractions/RELEASENOTES.md
Normalize the package and assembly identity, inherit shared fetch/report operations, construct gRPC adapters in named worker factories, and retain normal SDK signing and release conventions. Align verified task-original interface and tests with the SDK MIT convention after scoped authorization.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 1, 2026 16:30

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.

Copilot review overview

🟡 Changes recommended

Package licensing is inconsistent and publication does not enforce prerequisite package availability.

Review effort: Balanced
Findings: 3 Medium severity · 1 Low severity

Open (4)
What changed in this PR

Adds an independently versioned large-payload purge contract package for alternate host integrations.

Changes:

  • Introduces service and transport interfaces using canonical SDK models.
  • Exposes purge activities and adds a gRPC transport adapter.
  • Adds integration tests, documentation, packaging, signing, and publication wiring.
File Description
test/​LargePayloadPurge.Abstractions.Tests/​LargePayloadPurgeContractTests.cs Verifies contract API, identity, dependencies, and signing.
test/​LargePayloadPurge.Abstractions.Tests/​LargePayloadPurge.Abstractions.Tests.csproj Defines the contract test project.
test/​Extensions/​AzureBlobPayloads.Tests/​PayloadStore/​BlobPayloadStoreDeleteResponseTests.cs Uses the new gRPC adapter.
test/​Extensions/​AzureBlobPayloads.Tests/​AutoPurge/​PurgeActivityDeadlineTests.cs Updates deadline tests for the adapter.
test/​Extensions/​AzureBlobPayloads.Tests/​AutoPurge/​PurgeActivityBackendStatusTests.cs Updates status-handling tests.
test/​Extensions/​AzureBlobPayloads.Tests/​AutoPurge/​AlternateHostPurgeTaskTests.cs Tests alternate-host execution and replay.
src/​LargePayloadPurge.Abstractions/​RELEASENOTES.md Adds initial package release notes.
src/​LargePayloadPurge.Abstractions/​README.md Documents contracts and dependencies.
src/​LargePayloadPurge.Abstractions/​LargePayloadPurge.Abstractions.csproj Defines the contract package.
src/​LargePayloadPurge.Abstractions/​IOrchestrationServiceLargePayloadPurgeClient.cs Adds the service capability interface.
src/​LargePayloadPurge.Abstractions/​ILargePayloadPurgeClient.cs Adds the activity transport interface.
src/​Extensions/​AzureBlobPayloads/​DependencyInjection/​DurableTaskWorkerBuilderExtensions.AzureBlobPayloads.cs Registers adapter-backed activities.
src/​Extensions/​AzureBlobPayloads/​AzureBlobPayloads.csproj References the contract project.
src/​Extensions/​AzureBlobPayloads/​AutoPurge/​Client/​GrpcLargePayloadPurgeClient.cs Implements the transport adapter.
src/​Extensions/​AzureBlobPayloads/​AutoPurge/​Activities/​ReportLargePayloadPurgeResultsActivity.cs Makes reporting publicly constructible.
src/​Extensions/​AzureBlobPayloads/​AutoPurge/​Activities/​GetLargePayloadTombstonesActivity.cs Makes fetching publicly constructible.
README.md Documents isolated Functions integration.
Microsoft.DurableTask.sln Adds contract and test projects.
list-nuget-packages-links.ps1 Adds the package to generated links.
eng/​publish/​publish.yml Adds a publication job.
doc/​release_process.md Documents independent release handling.
CHANGELOG.md Records the new package and integration.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread eng/publish/publish.yml Outdated
Comment thread doc/release_process.md Outdated
Require successful approval, Abstractions publication and Client publication before publishing the contract. Document conservative skipping on prerequisite failure without changing independent package jobs.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 1, 2026 17:02

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.

Copilot review overview

🟡 Changes recommended

The Blob package can publish before or despite failure of its newly required contract package.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Resolved since last review (4)

Comment thread eng/publish/publish.yml
Preserve both blob purge integration and upstream scheduler authentication documentation and release notes.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 1, 2026 19:13

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.

Copilot review overview

🟢 Approval recommended

The additive API, transport adaptation, packaging, release dependencies, documentation, and focused tests are consistent and complete.

Review effort: Balanced
Findings: 1 High severity

Open (1)

Microsoft.DurableTask.Extensions.AzureBlobPayloads depends on Microsoft.DurableTask.LargePayloadPurge.Abstractions at every target framework, but its publish job was only gated on approval. Depend on the contract publish job too, with succeeded() so a failed, skipped, or canceled contract prerequisite skips Blob instead of running against an unpublished dependency.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 5, 2026 19:54
IOrchestrationServiceLargePayloadPurgeClient was left in the DurableTask.LargePayloadPurge namespace, a Core-prototype leftover, while the shared transport contract it inherits (ILargePayloadPurgeClient) lives in Microsoft.DurableTask.AzureBlobPayloads. Move the service interface into that same namespace so both contracts share one namespace; this is a source-breaking move for the unreleased prototype, not a compatibility-preserving one, so no type forwarder is added.

Remove the matching Core-prototype RootNamespace overrides in the contract and its test project so both fall back to the repo's standard Microsoft.DurableTask.* naming convention. Update the contract tests, README, and root README for the new namespace and full type name, and document the required cross-repository release order (Core, then this repo's SDK/contract/Blob, then Durable Functions, then the private provider) without inventing or bumping any committed package version.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Both ILargePayloadPurgeClient and IOrchestrationServiceLargePayloadPurgeClient moved to Microsoft.DurableTask.LargePayloadPurge.Abstractions, matching the contracts package's own name, instead of reusing Microsoft.DurableTask.AzureBlobPayloads -- the Azure Blob extension's own implementation namespace (BlobPurgeJobOrchestrator, the generated-client adapter, the purge activities) in a separate assembly. The contracts package is explicitly backend-neutral and does not depend on blob storage, gRPC, or worker implementations, so it should not appear to be owned by one specific backend's namespace.

This moves the transport interface's namespace for the first time since it was split out of the Blob implementation; there is no type forwarder for either prior location since these are unreleased prototype types. The Blob project's activities and generated-client adapter now reference the contracts namespace explicitly via using, the same as any other consumer. Updated contract tests to assert the new namespace/full names and to negatively assert all three now-prior full names (the Core-prototype one and both AzureBlobPayloads ones) are absent. Updated root and package README accordingly.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 5, 2026 20:59

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.

Copilot review overview

🟡 Changes recommended

Independent-version release preparation is incomplete, and the new fetch mapping lacks direct coverage.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)

Comment thread doc/release_process.md Outdated
@YunchuWang

Copy link
Copy Markdown
Member Author

Blob auto-purge: staged merge and release order

This PR is stage 2 of the cross-repository integration. Review can proceed in parallel, but merge/release must follow the dependency order:

  1. Core #1408: merge and publish a compatible Core release containing the required version-exemption API.
  2. SDK #805: use the published Core prerequisite, merge, and publish the compatible Client/Abstractions/Grpc/Worker dependency closure, then the contracts package, then the Blob implementation package.
  3. Functions #3556: commit actual compatible published Core/SDK/contracts references and pass clean-cache restore/build/tests and required CI before merging; then publish the host, base worker and optional purge worker packages.
  4. AzureManaged provider companion (internal): update its committed dependencies to those actual releases, satisfy remaining review/policy requirements, validate without local substitutions, then merge and publish last.

The SDK pipeline gates Client/Abstractions -> contracts -> Blob. Release operators must additionally verify the entire actual package dependency closure, including Grpc/Worker; those existing jobs are not all ordered by the new gate.

Gate: completing four consecutive merges is not sufficient. Each upstream package must actually be published and its dependency closure restorable before the next consumer is merged. Local validation artifacts or matching version numbers alone are not release-readiness evidence. Keep auto-purge explicitly disabled until the compatible worker/provider/backend/storage rollout is verified.

Remove LargePayloadPurge.Abstractions' independent VersionPrefix/VersionSuffix override so it inherits eng/targets/Release.props exactly like Client, Blob, and every other Microsoft.DurableTask.* package, rather than carrying its own 0.1.0 version. Rename the contract's signing test to assert equality with Client's assembly version instead of a hardcoded 0.1.0.0, and update the root/package README and release-process docs to describe the shared version and the existing Prepare Release workflow instead of an independent 0.1 tag.

Add a regression test proving the real field-by-field mapping in GrpcLargePayloadPurgeClient: a non-empty, order-sensitive, opaque-token-like fetch response and a captured report request, asserted against the real adapter rather than a mock of ILargePayloadPurgeClient, so a swapped or dropped field/row or a constant-mapped disposition would fail.

Copilot-Session: 883b4cbd-e93c-4d4e-8cb8-ffcf69525cfa

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 6, 2026 00:29

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.

Copilot review overview

🟡 Changes recommended

The produced shared-version package conflicts with the documented and companion-consumer 0.1.0 identity.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Resolved since last review (1)

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.

3 participants