Skip to content

Commit 343026d

Browse files
author
Copilot CI
committed
Merge main into agentic workflow fixes
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d00747b7-96f3-4e7a-8dfb-e3a48db04b2d
2 parents 92e9a48 + 073c90c commit 343026d

46 files changed

Lines changed: 1071 additions & 243 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"rollForward": false
2525
},
2626
"microsoft.dotnet.xharness.cli": {
27-
"version": "11.0.0-prerelease.26230.4",
27+
"version": "11.0.0-prerelease.26419.1",
2828
"commands": [
2929
"xharness"
3030
],

.github/agents/release-readiness-agent.agent.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ If the user wants the raw deterministic report with no judgment layer (e.g. for
8282

8383
- `release/<major>.0.1xx-sr<N>`**SR lane**`Get-ReleaseReadiness.ps1` (`-Candidate` if the branch doesn't exist yet; `-Shipped` if that SR cycle has a stable tag)
8484
- `release/<major>.0.1xx-preview<N>`**Preview lane**`Get-PreviewReadiness.ps1` (`-Mode candidate -SurveyRef net<major>.0` if the preview branch doesn't exist yet)
85+
- `release/<major>.0.1xx-rc<N>`**RC lane**`Get-PreviewReadiness.ps1` (`-Mode candidate -SurveyRef net<major>.0` if the RC branch doesn't exist yet)
8586

8687
**If the user asked a portfolio / cross-release question** (plural "releases", "status overview", "what needs attention across releases", "what's next" — no single branch named) → **Portfolio path (§0a)**. Do NOT ask "which release?" — the whole point is they may not know which releases exist.
8788

.github/skills/release-readiness/SKILL.md

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ This skill has **four** PowerShell entry points, one Preview helper, and one wor
3333

3434
| Script | Branch type | Purpose |
3535
|--------|-------------|---------|
36-
| [`Find-ReleaseReadinessTrackers.ps1`](scripts/Find-ReleaseReadinessTrackers.ps1) | both | Detects active in-flight & candidate trackers (SR and Preview) across all active majors using a four-lane algorithm and the **tag-existence rule** ("a release is in flight unless its tag already exists"). Emits a single tracker JSON consumed by the workflow. |
36+
| [`Find-ReleaseReadinessTrackers.ps1`](scripts/Find-ReleaseReadinessTrackers.ps1) | all | Detects active in-flight & candidate trackers (SR, Preview, and RC) across all active majors using a five-lane algorithm and the **tag-existence rule** ("a release is in flight unless its tag already exists"). Emits a single tracker JSON consumed by the workflow. |
3737
| [`Get-ReleaseReadiness.ps1`](scripts/Get-ReleaseReadiness.ps1) | SR | Full readiness report for a single SR branch (in-flight, `-Candidate`, or `-Shipped`). `-Shipped` surveys the same branch with post-ship verdict, carry-forward, and hotfix-vs-next-SR guidance semantics. |
38-
| [`Get-PreviewReadiness.ps1`](scripts/Get-PreviewReadiness.ps1) | Preview | Full readiness report for a single Preview branch (in-flight or candidate via `-Mode candidate -SurveyRef net<major>.0`), including consumer-installability evidence. |
38+
| [`Get-PreviewReadiness.ps1`](scripts/Get-PreviewReadiness.ps1) | Preview / RC | Full readiness report for a single prerelease branch (in-flight or candidate via `-Mode candidate -SurveyRef net<major>.0`). Preview reports include consumer-installability evidence; RC reports retain that check as `UNKNOWN` until RC workload-set package resolution is supported. |
3939
| [`PreviewInstallability.ps1`](scripts/PreviewInstallability.ps1) | Preview helper | Resolves the workload-set package, validates branch-pin coherence, probes manifest and representative pack availability, extracts platform prerequisites, and emits an isolated NuGet configuration for local validation. |
40-
| [`New-ReleaseHandoff.ps1`](scripts/New-ReleaseHandoff.ps1) | both | Projects existing readiness JSON plus separately verified public release evidence into copy-ready Markdown and normalized JSON. Missing facts remain `TBD`; it never selects builds or mutates release state. |
40+
| [`New-ReleaseHandoff.ps1`](scripts/New-ReleaseHandoff.ps1) | all | Projects existing readiness JSON plus separately verified public release evidence into copy-ready Markdown and normalized JSON. Missing facts remain `TBD`; it never selects builds or mutates release state. |
4141
| [`release-readiness.yml`](../../workflows/release-readiness.yml) | both | Three-hourly daytime UTC schedule + event-driven refreshes + manual dispatch + PR validation. Non-PR triggers run `Find-Trackers -AllActiveMajors`, fan out a matrix job per tracker, and write idempotent `[Release Readiness]` issues; PR triggers validate outputs only. |
4242

4343
Shared support code lives in [`PublicReportSanitizer.ps1`](scripts/PublicReportSanitizer.ps1) for public Markdown/JSON redaction and [`TrackerIssueLifecycle.sh`](scripts/TrackerIssueLifecycle.sh) for tested issue-selection and race-compensation primitives.
@@ -48,6 +48,7 @@ The trackers detector is grounded in **tag existence as the source of truth for
4848

4949
- SR shipped tag pattern: `<major>.0.<patch>` (e.g. `10.0.71` shipped → SR7 retired, no longer produces a tracker)
5050
- Preview shipped tag pattern: `<major>.0.0-preview.<N>.<date>[.<build>]` (e.g. `11.0.0-preview.5.26304.4` shipped → preview5 no longer produces a tracker)
51+
- RC shipped tag pattern: `<major>.0.0-rc.<N>.<date>[.<build>]` (e.g. `11.0.0-rc.1.26425.128` shipped → RC1 no longer produces a tracker)
5152

5253
**Post-ship lifecycle (`shipped` mode).** Most shipped SRs are retired the moment their tag exists. The **one exception** is the *most-recently-shipped* SR (highest shipped patch), which keeps emitting as `mode='shipped'` so its tracker issue stays useful through post-ship follow-up — adding the new build to the GitHub issue version dropdown, publishing release notes, closing out the milestone. Shipped reports never retroactively return `Not Ready`: unresolved work is split into urgent hotfix-vs-next-SR follow-ups and structured carry-forward items. Each immutable shipped tag is **create-once**: if it was never tracked (for example, the tag appeared before a scheduled updater ran), the workflow creates it; once a human closes that exact tagged generation, scheduled runs do not resurrect it. An untagged hotfix is explicitly marked `hotfixInProgress=true`, forces a yellow follow-up verdict, and is likewise create-once. Hotfix closure is scoped to the live version **and branch commit**: the same generation stays closed, while new commits or a new version can create fresh evidence. Workflow decisions use the generated report markers, not detector-time hotfix fields, so tag/commit changes between detection and reporting cannot apply stale lifecycle state. Older shipped SRs remain retired.
5354

@@ -67,14 +68,14 @@ pwsh .github/skills/release-readiness/scripts/Find-ReleaseReadinessTrackers.ps1
6768
-OutputJson trackers.json
6869

6970
# Emits a JSON envelope with one tracker per active branch, each carrying:
70-
# branchType: 'sr' | 'preview'
71+
# branchType: 'sr' | 'preview' | 'rc'
7172
# branchName: canonical proposed branch slug (always populated)
7273
# branchExists: true if the branch is on origin, false for candidates
7374
# mode: 'in-flight' | 'candidate' | 'shipped'
7475
# hotfixInProgress: true only when the latest shipped SR branch is ahead of its stable tag
7576
# hotfixVersion/hotfixCommit: mutable hotfix generation used for close/recreate idempotency
7677
# surveyRef: ref to actually survey (branch itself, or net<major>.0 for candidates)
77-
# canonicalKey: stable join key (e.g. net10-sr8, net11-preview6)
78+
# canonicalKey: stable join key (e.g. net10-sr8, net11-preview6, net11-rc1)
7879
# issueTitle: title for the maintained tracker issue
7980
# regressionLabels: list of regressed-in-* labels relevant to this branch
8081
```
@@ -119,6 +120,17 @@ pwsh .github/skills/release-readiness/scripts/Get-PreviewReadiness.ps1 \
119120
-OutputDir CustomAgentLogsTmp/release-readiness/preview6-candidate
120121
```
121122

123+
### Release Candidate
124+
125+
```bash
126+
pwsh .github/skills/release-readiness/scripts/Get-PreviewReadiness.ps1 \
127+
-Branch release/11.0.1xx-rc1 \
128+
-Mode in-flight \
129+
'-PublicSafe:$false' \
130+
-TrackerKey net11-rc1 \
131+
-OutputDir CustomAgentLogsTmp/release-readiness/rc1
132+
```
133+
122134
The unattended public survey does not know the release-owner-confirmed workload-set
123135
version or private shipping source. It therefore keeps **Consumer installability**
124136
`UNKNOWN` rather than guessing that the newest coherent package is the blessed one.
@@ -335,19 +347,19 @@ inferred ✅ but the sub points at the wrong channel, or inferred ⚠️/❌ con
335347
real gap with the missing source repos named. When the local check simply agrees with
336348
the inferred signal, report it conversationally and leave the tracker to the CI body.
337349

338-
### Preview action ordering (newly cut branch)
350+
### Prerelease action ordering (newly cut Preview or RC branch)
339351

340352
When the preview branch exists but its plumbing is incomplete, present the remediation
341353
as a dependency-ordered sequence. Do **not** sort unrelated `BLOCKED`/`WATCH` rows ahead
342354
of these prerequisites:
343355

344-
1. Add the Preview N default-channel mapping.
356+
1. Add the matching Preview/RC default-channel mapping for MAUI's outward build flow.
345357
2. Add the baseline Android and macOS/iOS subscriptions. Wait for the
346358
`maestro-configuration` PR to merge into `production`, then verify BAR ingestion
347359
with `darc get-subscriptions --target-repo https://github.com/dotnet/maui --target-branch <preview-branch>`.
348-
3. Reconcile MAUI's SDK/VMR pin **locally** with the official Preview N build and
360+
3. Reconcile MAUI's SDK/VMR pin **locally** with the official Preview/RC build and
349361
open the resulting focused component-bump PR. Do not add a VMR subscription.
350-
4. Build branch HEAD and promote the resulting MAUI build to the Preview N channel.
362+
4. Build branch HEAD and promote the resulting MAUI build to the matching Preview/RC channel.
351363
5. Clear current-preview CI/device/UI failures and finish release validation.
352364

353365
Keep the report scoped to Preview N. Do **not** mention the `netN.0` Preview N+1
@@ -393,15 +405,15 @@ work. Those belong only in the Preview N+1 candidate/in-flight readiness report.
393405
| `-IncludeInternal` | No | off | Release-captain only — augments the local survey with internal pipeline status when AzDO auth is available. |
394406
| `-PublicSafe` | No | `$true` | Sanitizes private/internal coordinates from SR Markdown and JSON. Set false only for local artifacts that will not be posted publicly. |
395407

396-
### `Get-PreviewReadiness.ps1` (Preview)
408+
### `Get-PreviewReadiness.ps1` (Preview / RC)
397409

398410
| Parameter | Required | Default | Description |
399411
|-----------|----------|---------|-------------|
400-
| `-Branch` | Yes || Preview branch name (e.g. `release/11.0.1xx-preview6`). Required even for candidate runs — used to derive milestone, tracker key, and regression labels. |
412+
| `-Branch` | Yes || Preview or RC branch name (e.g. `release/11.0.1xx-preview6` or `release/11.0.1xx-rc1`). Required even for candidate runs — used to derive milestone, tracker key, and regression labels. |
401413
| `-Mode` | No | `in-flight` | `in-flight` (survey the preview branch itself) or `candidate` (survey `-SurveyRef` instead — typically `net<major>.0`). |
402414
| `-SurveyRef` | No | computed | Ref to actually survey. Defaults to `$Branch` for in-flight; `net<major>.0` for candidate. |
403415
| `-Repository` | No | `dotnet/maui` | Repository in `owner/name` form. |
404-
| `-TrackerKey` | No | derived | Canonical key (default: `net<major>-preview<N>`) embedded for idempotent issue lookup. |
416+
| `-TrackerKey` | No | derived | Canonical key (default: `net<major>-preview<N>` or `net<major>-rc<N>`) embedded for idempotent issue lookup. |
405417
| `-OutputDir` | No || If set, writes `preview-readiness.{json,md}`. |
406418
| `-OutputFormat` | No | `markdown` | `markdown`, `json`, or `both`. |
407419
| `-IncludeInternal` | No | off | Compatibility override that requests sanitized internal classification even with `-PublicSafe`; enriched local skill/agent runs pass `'-PublicSafe:$false'`. GitHub Actions still skips. |
@@ -418,15 +430,15 @@ work. Those belong only in the Preview N+1 candidate/in-flight readiness report.
418430
| `release-readiness.{json,md}` | Get-ReleaseReadiness | Full SR readiness report |
419431
| `sr-source-prs.txt` | Get-ReleaseReadiness | Flat newline-delimited source PR list; use `grep -qxF NNNNN file` for instant cherry-pick verification |
420432
| `sr-commits.json` | Get-ReleaseReadiness | Raw SR-only commit metadata |
421-
| `preview-readiness.{json,md}` | Get-PreviewReadiness | Full Preview readiness report. Local non-public-safe net11 JSON includes `InternalOfficialBuilds`; public-safe JSON omits that property. |
433+
| `preview-readiness.{json,md}` | Get-PreviewReadiness | Full Preview/RC readiness report. Local non-public-safe net11 JSON includes `InternalOfficialBuilds`; public-safe JSON omits that property. |
422434

423435
## Tracker refresh workflow
424436

425437
`.github/workflows/release-readiness.yml` runs every three hours from **08:30–20:30 UTC daily**, plus targeted `issues`, `milestone`, and `push` refreshes, `workflow_dispatch`, and `pull_request` validation:
426438

427439
1. **`detect-trackers`** — runs `Find-Trackers -AllActiveMajors`, emits a matrix of tracker descriptors.
428440
2. **`per-tracker-report`** — matrix-expanded job per tracker:
429-
- Dispatches to `Get-ReleaseReadiness.ps1` (SR) or `Get-PreviewReadiness.ps1` (Preview) based on `branchType`.
441+
- Dispatches to `Get-ReleaseReadiness.ps1` (SR) or `Get-PreviewReadiness.ps1` (Preview/RC) based on `branchType`.
430442
- Looks for an open tracker issue by the canonical marker `<!-- release-readiness-tracker: <key> -->`.
431443
- **Refresh path**: in shipped mode, prefer an open issue carrying the exact current shipped/hotfix generation marker; otherwise refresh the oldest labeled tracker in place so Release Captain Notes and subscriptions survive commit-to-commit generation changes. If the exact generation was intentionally closed, retire any stale generic opens and do not recreate it. For non-shipped trackers, adopt the oldest labeled tracker issue and close remaining duplicates.
432444
- **Create path**: open a new issue with the mandatory `area-infrastructure` ownership label (creation fails rather than producing a tracker the lifecycle lookup cannot recognize); attach `report` / `s/triaged` best-effort.
@@ -565,7 +577,7 @@ Two consequences the report must get right:
565577
1. **Roll-forward milestone.** The cycle after `preview7` is `.NET <major>.0-rc1`, *not* `.NET <major>.0-preview8`. `Get-PreviewTrainMilestoneTitle` in [`Get-ReleaseReadiness.ps1`](scripts/Get-ReleaseReadiness.ps1) owns this mapping (ordinals `1..7` → previews, `8` → rc1, `9` → rc2, `10+``$null`); `$script:FinalPreviewNumber` is the single constant to change if the cadence ever moves. (.NET 5 shipped 8 previews; the 7-preview cadence has held for every major since .NET 6.)
566578
2. **`preview7` is the feature/API-lock gate.** Because no eighth preview exists, work that misses the `preview7` cut does **not** roll into "the next preview" — RC is normally API-locked and go-live-licensed, so in practice it slips to the **next major**. When reporting on a `preview7` branch or candidate, say so explicitly: public-API PRs still open at the `preview7` cut are a *decide-now* item, not a defer-later one.
567579

568-
> **Where the `rc` mapping actually fires (and where it doesn't).** `Get-MilestoneHygieneChecks` lives only in the **SR lane** (`Get-ReleaseReadiness.ps1`); the automated preview lane (`Get-PreviewReadiness.ps1``Test-PreviewMilestoneExists`) validates only the *current* preview's own milestone and never derives a next-cycle title. So an `rc`-shaped milestone title is produced **only** when the SR-lane hygiene check is driven with a preview-shaped branch — an ad-hoc `Get-ReleaseReadiness.ps1 -SrBranch release/<major>.0.1xx-preview7` run, or candidate mode off `preview7`. An **in-flight survey of an actual `release/*-rc1` branch produces no milestone checks at all**: rc-shaped branches match neither the SR nor the preview shape, so the parser skips them (scenario M15). Treat the `preview→rc` mapping as defensive normalization for preview-lane inputs, **not** a live milestone gate on cut `rc` branches.
580+
> **RC is a first-class tracker lane.** `Find-ReleaseReadinessTrackers.ps1` discovers strict `release/<major>.0.<band>xx-rc<N>` branches and RC tags independently of Preview. `Get-PreviewReadiness.ps1` validates the current `.NET <major>.0-rc<N>` milestone, expected `rc/N` version metadata, the outward MAUI default-channel mapping, Android/macOS-iOS inbound subscriptions, and the no-VMR-subscription reconciliation model.
569581
570582
### Maestro / BAR check gating
571583

0 commit comments

Comments
 (0)