Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8535f33-08ac-44ef-84d1-aab96770ae3a
5.4 KiB
5.4 KiB
Release Wrap-Up Summary
Present this summary when the release is complete: the GitHub release is published, both the release and docs workflows have succeeded, the packages are listed on NuGet.org, and the docs site reflects the release.
The tone is short and celebratory. It is a chat message to the user -- do not commit it, do not post it to GitHub, and do not write it to a file unless the user explicitly asks.
Build the timing sections from the release_stages, release_interactions, release_waits, and
release_workflow_runs tables described in session-tracking.md.
Template
🎉 **v{version} is released.**
{One or two sentences on the release theme, echoing the preamble that shipped in the release notes.}
**Shipped**
| | |
|---|---|
| Version | `v{version}` |
| Base branch | `{base branch}` |
| Release PR | #{pr} |
| Release | {release URL} |
| Release workflow | {run URL} — {conclusion} |
| Docs workflow | {run URL} — {conclusion} |
| NuGet | {listed package versions, or the package listing URL} |
| Docs | https://csharp.sdk.modelcontextprotocol.io/{version-slug}/ — live |
**Packages**
* {package name} {version}
* {package name} {version}
**Stage timing (this session)**
| Stage | Status | Elapsed | Interactions |
|---|---|---|---|
| 1. Prepare | ✓ | {h m} | ~{h m} |
| 2. Review and merge | ✓ | {h m} | ~{h m} |
| 2. Review and merge (attempt 2) | ✓ | {h m} | ~{h m} |
| 3. Publish | ✓ | {h m} | ~{h m} |
| 4. Release | ✓ | {h m} | ~{h m} |
| 5. Verify | ✓ | {h m} | ~{h m} |
| **Total session** | | **{h m}** | **~{h m}** |
{Include an attempt row only when a stage was reworked, and say what forced it -- "CI red, corrective
push". Aggregating rework into one row hides where the time actually went.}
**Where the time went**
* Active interaction — ~{h m} across {n} measured gates{, plus {n} unmeasured}
* Waiting on builds, CI, and the release and docs workflows — ~{h m}
* Unaccounted — {h m}
* Longest single wait — {h m} ({what you were waiting on})
{Optional: one line on anything notable — a blocked stage and how long it cost, an excluded
step-away gap, or a stage that ran unusually long or short.}
**Follow-ups**
* {Anything deferred during the release, or "None."}
* {Worktrees still on disk for this release, offered for cleanup, or omit this line.}
Rules
- Only report what you observed. Stages recorded as
carried_overshow↩ carried over from a previous sessionin the Status column and—for Elapsed. They are excluded from the total, and a footnote says the total covers this session only. - Total session is wall-clock from
session_started_atto now, not the sum of stage elapsed times -- gaps between stages belong to the session but to no stage. - The Interactions column is per-stage active user time. Sum that stage's
release_interactionsprompt-to-answer intervals and prefix with~:~5m,~1h 3m. Show~0mwhen the stage had no interactions at all, or when its measured intervals round to zero. Show—when the stage did have interactions but none of them carry a usable reply timestamp -- that is missing data, not zero time, and must never be rendered as~0mor fabricated. Carried-over stages show—in both time columns. ~is the only qualifier the table needs. Never append "minimum", "at least", or a similar hedge to a cell -- the tilde already says the figure is estimated, and the table stays scannable. When stages show—or interactions went unmeasured, explain that in the narrative prose below rather than in the table.- Active interaction time is always an estimate. Label it with
~and say it is estimated from prompt-to-answer intervals. In the narrative, report it as a floor with the unmeasured count beside it -- interactions whose reply timestamp was unavailable are counted, not silently dropped. Name any interval you excluded as a step-away gap. - Reconcile the narrative with the table. The
Active interactionbullet must equal the table's total interaction cell. Where the two could differ -- excluded step-away gaps,—stages, zero-duration rows discarded as unmeasured -- name the discrepancy explicitly rather than letting the reader find it. - Waiting time is measured, not inferred. Sum the
release_waitsintervals. Never derive it by subtracting interaction time from the session total; that counts diagnosis and rework as waiting. Show whatever the two do not account for asUnaccountedrather than folding it into either. IfUnaccountedcomputes negative, wait and interaction rows overlapped — the split is unsound, so omit theUnaccountedline, report the two measured totals, and state plainly that they overlap. Never publish a negative figure and never clamp it to zero, which would present a broken split as a clean one. - Longest single wait comes from
release_waitsandrelease_workflow_runs, not from the longest interaction. If waits were not recorded, say the data is unavailable instead of substituting the longest gate. - Round to readable units.
2h 14m,47m,3m. Never show seconds. - Omit rows and sections that do not apply. No blocked stage means no note about one; no
follow-ups means the section says
None.rather than disappearing. - Never speculate about time. If the session lacks the data for a section, say so plainly instead of estimating.