Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
6aa3045
Add release notes agentic workflow and skill references
richlander Mar 26, 2026
3d196a2
Add release notes system design document
richlander Mar 27, 2026
b94d89f
Update release notes skill docs to match actual dotnet-release CLI
richlander Mar 31, 2026
c8ba518
Scope to dotnet org repos; skip microsoft/vstest for now
richlander Mar 31, 2026
3439740
Fix schema docs: product field exists, add labels analysis
richlander Mar 31, 2026
9af3d86
Make milestone detection deterministic
richlander Mar 31, 2026
1c255c5
Add head-ref selection logic: check for target tag before using main
richlander Mar 31, 2026
73d556c
Move general docs link to README only; add component-specific links
richlander Mar 31, 2026
83f06d6
Add dotnet_commit field to schema (dotnet-release v1.2.0)
richlander Apr 1, 2026
9e0ed30
Update schema docs for dotnet-release v2.0.0
richlander Apr 1, 2026
1a10de4
Evolve to multi-milestone live system with human interaction
richlander Apr 1, 2026
887240c
Compile agentic workflow; fix toolset names
richlander Apr 1, 2026
4d7add2
Remove stale gist link from changes schema docs
richlander Apr 1, 2026
5105869
Add curated examples reference doc
richlander Apr 1, 2026
accd29f
Add JIT/runtime examples to release notes reference
richlander Apr 1, 2026
f340d3e
Add ask-for-help guidance: benchmarks, samples, domain context
richlander Apr 1, 2026
68d022c
Split examples by component for token efficiency
richlander Apr 1, 2026
d0251eb
Reformat examples: content first, metadata in footer blocks
richlander Apr 1, 2026
c23dd4e
Update for dotnet-release v2.1.0; fix example formatting
richlander Apr 1, 2026
9c0d47a
Run every 6 hours instead of daily
richlander Apr 1, 2026
ef90d9b
Fix commentary: callback example would benefit from code sample
richlander Apr 1, 2026
5016b21
Replace short ASP.NET example: StatusCodeSelector with code snippet
richlander Apr 1, 2026
19c1636
Add active voice principle to examples guide
richlander Apr 1, 2026
1d92154
Add style note: simplify awkward phrasing in PipeReader example
richlander Apr 1, 2026
05ae36a
Mark PAR example as anti-pattern; add Title/Content/Credit principle
richlander Apr 1, 2026
60b1c8a
Add style note: simplify transition to rule bullets in C# example
richlander Apr 1, 2026
50518fe
Add style note: active voice for MLDsa ease-of-use intro
richlander Apr 1, 2026
f1c1a7e
Add principle: link PRs/issues in org/repo #number format
richlander Apr 1, 2026
48940cc
Add principle: avoid jargon and ambiguous words
richlander Apr 1, 2026
63e49d2
Add style note: don't bury the lede with backward-looking passive
richlander Apr 1, 2026
83034f7
Fix markdownlint: setext headings, list numbering, table spacing
richlander Apr 1, 2026
36e528d
Fix broken relative links; exclude lock files from super-linter
richlander Apr 1, 2026
0323096
Fix remaining CI: blank line before list, README link paths
richlander Apr 1, 2026
0991b56
Remove stale monolithic examples.md (replaced by examples/ directory)
richlander Apr 1, 2026
3b44f7e
Add API verification guidance using dotnet-inspect
richlander Apr 1, 2026
6f30d9d
Add nightly SDK download workflow for API verification
richlander Apr 1, 2026
6d81c05
Simplify API verification: query NuGet feed directly, no SDK install
richlander Apr 1, 2026
dfe874a
Update api-verification: use dotnet-release build-metadata pipeline
richlander Apr 2, 2026
a401333
Editorial rules: prefer short sentences, avoid interrupting clauses
richlander Apr 2, 2026
214ef9a
Editorial rules: three-tier feature ordering
richlander Apr 2, 2026
da285a8
Editorial rules: 20/80 rule, two-sentence test, value headlines
richlander Apr 2, 2026
7e200b8
SKILL.md: add examples/ to reference documents
richlander Apr 2, 2026
2053759
Editorial rules: don't overstate maturity in previews
richlander Apr 2, 2026
6eeb131
Editorial rules: filtered features comment block
richlander Apr 2, 2026
3abddf2
Editorial rules: TODO for borderline entries, vet community lists
richlander Apr 2, 2026
e4c380d
Format template: add release info and VMR refs to README
richlander Apr 2, 2026
016b30d
Editorial rules: dedup nuance — state changes are new news
richlander Apr 2, 2026
d611362
Initialize Agentic Workflows agent
jeffhandley Apr 3, 2026
3c9c99d
Set up the select-copilot-pat integration into agentic workflows
jeffhandley Apr 3, 2026
c1b6ce7
Integrate select-copilot-pat into release-notes workflow
jeffhandley Apr 3, 2026
5cd26dd
Move labeler workflow readme to avoid it being recognized as a workflow
jeffhandley Apr 3, 2026
d8410e8
Apply review feedback. Set schedule to be daily around 9am PDT.
jeffhandley Apr 3, 2026
6506a9e
Merge branch 'main' into release-notes-agentic-workflow
jeffhandley Apr 3, 2026
2c99e4b
Do not run the release-notes workflow on forks unless manually dispat…
jeffhandley Apr 3, 2026
5fa1a59
Set release-notes workflow timeout to 2 hours
jeffhandley Apr 3, 2026
cc9b522
Add .NET 11 Preview 3 release notes
github-actions[bot] Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,6 @@
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
#*.RTF diff=astextplain

.github/workflows/*.lock.yml linguist-generated=true merge=ours
116 changes: 116 additions & 0 deletions .github/actions/select-copilot-pat/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Select Copilot PAT
Selects a random Copilot PAT from a numbered pool of secrets. This addresses limitations that arise from having a single PAT shared across all agentic workflows, such as rate-limiting.

**This is a stop-gap workaround.** As soon as organization/enterprise billing is offered for agentic workflows, this approach will be removed from our workflows.

## Repository Onboarding
To use Agentic Workflows in a dotnet org repository:

1. Follow the instructions for [Configuring Your Repository | Agentic Authoring | GitHub Agentic Workflows][configure-repo].
2. Copy this `select-copilot-pat` folder into the repository under `.github/actions/select-copilot-pat`, including both the `README.md` and `action.yml`.
3. Merge those additions into the repository and then follow the instructions for the PAT Creation and Usage below.

> **Optional:** If you plan to manage secrets or workflows from the command line (e.g., `gh aw secrets set`), [install the `gh aw` CLI extension][cli-setup]:
> ```sh
> gh extension install github/gh-aw
> ```

## PAT Management
Team members provide PATs into the pools for the repository by adding them as repository secrets with secret names matching the pattern of `<pool_name>_<0-9>`, such as `COPILOT_PAT_0`.

[Use this link to prefill the PAT creation form with the required settings][create-pat]:

1. **Resource owner** is your **user account**, not an organization.
2. **Copilot Requests (Read)** must be the only permission granted.
3. **8-day expiration** must be used, which enforces a weekly renewal.
4. **Repository access** set to **Public repositories** only.

The **Token Name** _does not_ need to match the secret name and is only visible to the owner of the PAT. It's recommended to use a token name indicating the PAT is used for dotnet org agentic workflows. The **Description** is also only used for your own reference.

Team members providing PATs for workflows should set weekly recurring reminders to regenerate and update their PATs in the repository secrets. With an 8-day expiration, renewal can be done on the same day each week.

PATs are added to repositories through the **Settings > Secrets and variables > Actions** UI, saved as **Repository secrets** and matching the `<pool_name>_<0-9>` naming convention. This can also be done using the GitHub CLI.

```sh
gh aw secrets set "<pool_name>_<0-9>" --value "<your-github-pat>" --repo dotnet/<repo>
```

## Workflow Output Attribution
Team members' PATs are _only_ used for the Copilot requests from within the agentic portion of the workflow. All outputs from the workflow use the `github-actions[bot]` account token. Issues, PRs, comments, and all other content generated by the workflow will be attributed to `github-actions[bot]`--not the team member's account or token.

## Usage
Add the following frontmatter at the top-level of an agentic workflow. These elements are not supported through [imports][imports], so they must be copied into all workflows.

Up to 10 `SECRET_#` environment variables can be passed to the action, numbered 0-9. Different workflows can use different pools of PATs if desired. Change the `secrets.COPILOT_PAT_0` through `secrets.COPILOT_PAT_9` secret names in both the `select-copilot-pat` step `env` values and in the `case` expression under the `engine: env` configuration.

```yml
on:
# Add the pre-activation step of selecting a random PAT from the supplied secrets
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
name: Checkout the select-copilot-pat action folder
with:
persist-credentials: false
sparse-checkout: .github/actions/select-copilot-pat
sparse-checkout-cone-mode: true
fetch-depth: 1

- id: select-copilot-pat
name: Select Copilot token from pool
uses: ./.github/actions/select-copilot-pat
env:
# If the secret names are changed here, they must also be changed
# in the `engine: env` case expression
SECRET_0: ${{ secrets.COPILOT_PAT_0 }}
SECRET_1: ${{ secrets.COPILOT_PAT_1 }}
SECRET_2: ${{ secrets.COPILOT_PAT_2 }}
SECRET_3: ${{ secrets.COPILOT_PAT_3 }}
SECRET_4: ${{ secrets.COPILOT_PAT_4 }}
SECRET_5: ${{ secrets.COPILOT_PAT_5 }}
SECRET_6: ${{ secrets.COPILOT_PAT_6 }}
SECRET_7: ${{ secrets.COPILOT_PAT_7 }}
SECRET_8: ${{ secrets.COPILOT_PAT_8 }}
SECRET_9: ${{ secrets.COPILOT_PAT_9 }}

# Add the pre-activation output of the randomly selected PAT
jobs:
pre-activation:
outputs:
copilot_pat_number: ${{ steps.select-copilot-pat.outputs.copilot_pat_number }}

# Override the COPILOT_GITHUB_TOKEN expression used in the activation job
# Consume the PAT number from the pre-activation step and select the corresponding secret
engine:
id: copilot
env:
# We cannot use line breaks in this expression as it leads to a syntax error in the compiled workflow
# If none of the `COPILOT_PAT_#` secrets were selected, then the default COPILOT_GITHUB_TOKEN is used
COPILOT_GITHUB_TOKEN: ${{ case(needs.pre_activation.outputs.copilot_pat_number == '0', secrets.COPILOT_PAT_0, needs.pre_activation.outputs.copilot_pat_number == '1', secrets.COPILOT_PAT_1, needs.pre_activation.outputs.copilot_pat_number == '2', secrets.COPILOT_PAT_2, needs.pre_activation.outputs.copilot_pat_number == '3', secrets.COPILOT_PAT_3, needs.pre_activation.outputs.copilot_pat_number == '4', secrets.COPILOT_PAT_4, needs.pre_activation.outputs.copilot_pat_number == '5', secrets.COPILOT_PAT_5, needs.pre_activation.outputs.copilot_pat_number == '6', secrets.COPILOT_PAT_6, needs.pre_activation.outputs.copilot_pat_number == '7', secrets.COPILOT_PAT_7, needs.pre_activation.outputs.copilot_pat_number == '8', secrets.COPILOT_PAT_8, needs.pre_activation.outputs.copilot_pat_number == '9', secrets.COPILOT_PAT_9, secrets.COPILOT_GITHUB_TOKEN) }}
```

## References

- [Agentic Workflows CLI Extension][cli-setup]
- [Agentic Authoring][configure-repo]
- [Authentication][authentication]
- [Agentic Workflow Imports][imports]
- [Custom Steps][steps]
- [Custom Jobs][jobs]
- [Job Outputs][job-outputs]
- [Engine Configuration][engine]
- [Engine Environment Variables][engine-vars]
- [Case Function in Workflow Expressions][case-expression]
- [Update agentic engine token handling to use user-provided secrets (github/gh-aw#18017)][secret-override]

[cli-setup]: https://github.github.com/gh-aw/setup/cli/
[configure-repo]: https://github.github.com/gh-aw/guides/agentic-authoring/#configuring-your-repository
[authentication]: https://github.github.com/gh-aw/reference/auth/
[create-pat]: https://github.com/settings/personal-access-tokens/new?name=dotnet%20org%20agentic%20workflows&description=GitHub+Agentic+Workflows+-+Copilot+engine+authentication.++Used+for+dotnet+org+workflows.+MUST+be+configured+with+only+Copilot+Requests+permissions+and+user+account+as+resource+owner.+Weekly+expiration+and+required+renewal.&user_copilot_requests=read&expires_in=8
[imports]: https://github.github.com/gh-aw/reference/imports/
[steps]: https://github.github.com/gh-aw/reference/frontmatter/#custom-steps-steps
[jobs]: https://github.github.com/gh-aw/reference/frontmatter/#custom-jobs-jobs
[job-outputs]: https://github.github.com/gh-aw/reference/frontmatter/#job-outputs
[engine]: https://github.github.com/gh-aw/reference/frontmatter/#ai-engine-engine
[engine-vars]: https://github.github.com/gh-aw/reference/engines/#engine-environment-variables
[case-expression]: https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#case
[secret-override]: https://github.com/github/gh-aw/pull/18017
53 changes: 53 additions & 0 deletions .github/actions/select-copilot-pat/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: 'Select Copilot PAT from Pool'
description: >
Selects a random Copilot PAT from a numbered pool of secrets. Secrets
are passed as environment variables SECRET_0 through SECRET_9
by the calling workflow step.

inputs:
random-seed:
description: 'A seed number to use for the random PAT selection, for deterministic selection if needed.'
required: false
default: ''

outputs:
copilot_pat_number:
description: 'The 0-9 secret number selected from the pool of specified secrets'
value: ${{ steps.select-pat-number.outputs.copilot_pat_number }}

runs:
using: composite
steps:
- id: select-pat-number
shell: bash
env:
RANDOM_SEED: ${{ inputs.random-seed }}
run: |
# Collect all secret numbers with non-empty values from SECRET_0..SECRET_9
PAT_NUMBERS=()
for i in $(seq 0 9); do
var="SECRET_${i}"
val="${!var}"
if [ -n "$val" ]; then
PAT_NUMBERS+=(${i})
fi
done

# If none of the secrets in the pool have values, then emit a warning and do not
# set an output value. The consumer can then fall back to using COPILOT_GITHUB_TOKEN.
if [ ${#PAT_NUMBERS[@]} -eq 0 ]; then
echo "::warning::None of the specified secrets had values (checked SECRET_0 through SECRET_9)"
exit 0
fi

# Select a random index using the seed if specified
if [ -n "$RANDOM_SEED" ]; then
RANDOM=$RANDOM_SEED
fi

PAT_INDEX=$(( RANDOM % ${#PAT_NUMBERS[@]} ))
PAT_NUMBER="${PAT_NUMBERS[$PAT_INDEX]}"
echo "Selected token ${PAT_NUMBER} (index: ${PAT_INDEX}; pool size: ${#PAT_NUMBERS[@]})"

# Set the PAT number as the output
echo "copilot_pat_number=${PAT_NUMBER}" >> "$GITHUB_OUTPUT"
Loading