@@ -21,19 +21,25 @@ Its package and assembly name is `Microsoft.DurableTask.LargePayloadPurge.Abstra
2121standard ` Microsoft.DurableTask.*.dll ` signing pattern. The existing source traversal, SBOM inclusion,
2222NuGet signing and per-package approval-gated publication steps apply.
2323
24- Contract publication also waits for successful Client and Abstractions publication. If either prerequisite
25- fails, including a duplicate-version upload failure, or is skipped or canceled, contract publication is
26- skipped rather than treating that result as success.
24+ Contract publication also waits for successful Client and Abstractions jobs. Each prerequisite must
25+ either publish successfully or complete an explicit successful no-op because the operator confirmed its
26+ selected artifact version is already on NuGet.org using ` alreadyPublishedPackages ` . If either job fails,
27+ including a duplicate-version upload failure, or is intentionally held back, skipped or canceled, contract
28+ publication is skipped rather than treating that result as success.
2729
2830` Microsoft.DurableTask.Extensions.AzureBlobPayloads ` depends on the contract package at every target
2931framework, so its publication job also waits for successful contract publication (in addition to approval).
30- If contract publication fails for any reason above, including a duplicate-version upload failure, or is
31- skipped or canceled, Blob publication is skipped rather than treating that result as success. This extends
32- the same fail-closed chain: approval, then Client and Abstractions, then the contract, then Blob. A
33- prerequisite that deliberately skips — for example because its exact version is already published — still
34- skips the dependent job; this is not a general-purpose publication-idempotency mechanism, just the minimum
35- ordering these two packages require. Other packages retain their own independent publication jobs gated
36- only on approval.
32+ If the contract job fails for any reason above, including a duplicate-version upload failure, or is
33+ intentionally held back, skipped or canceled, Blob publication is skipped rather than treating that result
34+ as success. This extends the same fail-closed chain: approval, then Client and Abstractions, then the
35+ contract, then Blob. An already-published confirmation succeeds without staging or submitting that
36+ package, allowing recovery of a partial release: confirm Client/Abstractions to retry the contract and
37+ Blob. For a Blob-only retry, confirm all selected versions already published, including Client,
38+ Abstractions and the contract; their jobs still follow the dependency chain but complete as no-ops.
39+ Intentional holds belong in ` skipPackages ` and still block dependents. If a package appears in both
40+ lists, the hold takes precedence; it is not permission to publish dependents. Both lists default to
41+ empty and apply only to the selected run. Other packages retain their own independent publication
42+ jobs gated only on approval.
3743
3844Keep its ` RELEASENOTES.md ` : ` eng/targets/Release.targets ` reads it into NuGet package metadata, whereas the
3945root ` CHANGELOG.md ` retains repository release history. The shared target also appends a link using the
@@ -131,16 +137,21 @@ After the PR is merged, follow the **Publishing** steps below.
131137 official artifact run is selected.
1321384 . Supply ` nuGetOrganization ` , the NuGet.org organization confirmed during ESRP NuGet onboarding.
133139 There is no organization default; an unset or unresolved value fails before any ESRP submission.
134- Set ` skipPackages ` to an array of exact public package IDs whose selected versions are already
135- published or are intentionally held back. This is a per-run exclusion, not a permanent package removal.
140+ Set ` alreadyPublishedPackages ` to exact public package IDs only after verifying their ** selected
141+ artifact versions** already exist on NuGet.org. Those jobs log a successful no-op, without package
142+ staging or an ESRP task, so dependent jobs can proceed.
143+ Use ` skipPackages ` only for intentional holds: those jobs are skipped and still block dependents.
144+ A hold takes precedence if a package is in both lists. These are per-run inputs, not permanent removals.
1361455 . The publisher first stages the signed packages to the existing internal ADO feed. Only after that
137146 succeeds does ` nugetApproval ` wait for manual approval. The gate displays the selected organization
138- and requires confirmation of NuGet onboarding, publisher allowlisting and Trusted Publishing.
139- Do not approve until those prerequisites, the selected artifacts, exclusion list and dependency
147+ and both package lists, and requires confirmation of NuGet onboarding, publisher allowlisting,
148+ Trusted Publishing and each exact already-published version.
149+ Do not approve until those prerequisites, the selected artifacts, both lists and dependency
140150 availability have been checked. Stop at the gate for a validation-only trial.
141151 Rejecting or timing out the gate prevents all public publication.
142- 6 . After approval, each selected public package is copied unchanged into its own ESRP folder using
143- the exact nuspec ID, then submitted with ` EsrpRelease@14 ` and ` WaitForReleaseCompletion: true ` .
152+ 6 . After approval, each public package not held or already confirmed published is copied unchanged into
153+ its own ESRP folder using the exact nuspec ID, then submitted with ` EsrpRelease@14 ` and
154+ ` WaitForReleaseCompletion: true ` .
144155 Internal-only/test packages and symbol packages are not submitted. Missing or multiple matching
145156 packages fail explicitly. Each package retains its independent job and the dependency gates above;
146157 ESRP does not guarantee ordering within a multi-package submission.
@@ -175,9 +186,10 @@ The signed official drop has 18 `.nupkg` files: 14 public stable packages at `1.
175186` ExportHistory ` and ` ScheduledTasks ` at ` 1.27.1-preview.2 ` , the unchanged public
176187` Microsoft.DurableTask.Generators ` at ` 2.1.0-preview.2 ` , and internal-only
177188` Microsoft.DurableTask.InProcessTestHost ` at ` 0.2.3-preview.1 ` .
178- For this trial, set ` skipPackages: [Microsoft.DurableTask.Generators] ` because that exact generator
179- version is already public. This leaves 16 public targets; the test host has no public job.
180- The default exclusion list is empty so future generator releases remain enabled.
189+ For this trial, set ` alreadyPublishedPackages: [Microsoft.DurableTask.Generators] ` and
190+ ` skipPackages: [] ` because that exact generator version is already public. Its job succeeds through a
191+ logged no-op, not an ESRP submission. This leaves 16 public submission targets; the test host has no
192+ public job. Both default lists are empty so future generator releases remain enabled.
181193Keep ` officialPipeline ` pinned to the approved signed run ` 311120 ` (build number ` 20261021.2 ` ,
182194source ` 2a409da4ac7dcf03c4f25985337eb4623ea6394e ` ), while the publisher uses the new reviewed and mirrored
183195source containing this migration (normally the reviewed ` main ` commit). A run ID and build number
@@ -187,8 +199,9 @@ search indexing alone is not proof that a version has never been published.
187199
188200#### Pinned trial request and queue permissions
189201
190- The pipeline's ` skipPackages ` parameter is a YAML/UI list, for example
191- ` [Microsoft.DurableTask.Generators] ` . For the verified REST request through the installed Azure DevOps
202+ The pipeline's ` skipPackages ` and ` alreadyPublishedPackages ` parameters are YAML/UI lists. For the
203+ trial, use an empty hold list and ` [Microsoft.DurableTask.Generators] ` as the already-published list.
204+ For the verified REST request through the installed Azure DevOps
192205CLI SDK, however, ` RunPipelineParameters.template_parameters ` is typed as ` {str} ` : send
193206` templateParameters ` as a map of strings, with the list serialized as JSON ** inside a string** .
194207This request fragment illustrates the wire value; ` <confirmed-org> ` is a placeholder, not a default:
@@ -197,12 +210,13 @@ This request fragment illustrates the wire value; `<confirmed-org>` is a placeho
197210{
198211 "templateParameters" : {
199212 "nuGetOrganization" : " <confirmed-org>" ,
200- "skipPackages" : " [\" Microsoft.DurableTask.Generators\" ]"
213+ "skipPackages" : " []" ,
214+ "alreadyPublishedPackages" : " [\" Microsoft.DurableTask.Generators\" ]"
201215 }
202216}
203217```
204218
205- Do not send ` skipPackages ` as a native JSON array through that client. In the trial, that request
219+ Do not send either list as a native JSON array through that client. In the earlier trial, that request
206220invalidated or ignored overrides and resolved default source/artifact selections instead.
207221Verify the resolved publisher source, official artifact run, organization bindings and exclusion
208222conditions in the actual expanded preview before attempting a run; an HTTP 200 alone is insufficient.
@@ -217,7 +231,7 @@ credentials/APIs, or loosen policies to bypass the denial. This queue-configurat
217231separate from authorization to use ` dtfx-internal-esrp-prod ` , ESRP ` ESRPRELPACMAN ` allowlisting,
218232NuGet channel onboarding and Trusted Publishing.
219233
220- #### Observed trial status (2026-10-22)
234+ #### Observed trial status before partial-release recovery fix (2026-10-22)
221235
222236The tested runtime source is ` 261b233a828211dae2439afba6a9cf3601d79c5c ` . Mirror run ` 311345 `
223237succeeded and its locked internal ref matched that commit. The actual-source publisher preview
@@ -236,7 +250,11 @@ This is a hard ADO authorization blocker, not a source compilation failure or an
236250ESRP/backend/NuGet failure. No permission grant, policy change, approval or public distribution was
237251performed. Post-denial run inventory confirmed that the corrected request created no run and that
238252` 311347 ` was completed/canceled; no accidental publisher remained active.
239- Later documentation-only commits do not replace ` 261b233a ` as the exact runtime tested.
253+ Later documentation-only commits did not replace ` 261b233a ` as the exact runtime tested in that preview.
254+ The subsequent source change adds ` alreadyPublishedPackages ` to distinguish successful no-ops from
255+ intentional holds. It is not covered by that earlier server preview; the final recovery/holdback variants
256+ need their own actual-source compilation before use. The queue-configuration and downstream onboarding
257+ prerequisites remain separate and unresolved; no trial parameter change bypasses them.
240258
241259For source-only validation, PowerShell 7 with the ` Pester ` (5.x) and ` powershell-yaml ` modules can run:
242260
0 commit comments