Record 2.0.352 in the Reusable-Workflow Rollout and Add Its Catalog Snippets - #775
Conversation
…nippets Release 2.0.352 (main 0b07a59) is the first tag carrying every hub-hosted reusable workflow task, so stages 2 through 5 of the rollout are now adoptable. Tick the promoted-and-released item in each stage with the tag, the commit, and promotion PR #774, note the first release attempt's startup_failure and its #772 fix in stage 4, and tick the two stage-0 merge-bot proof items with the Dependabot run evidence. Add catalog caller-stub snippets, each pinned to the release, for the three tasks whose doc stub shape is complete enough to copy verbatim: test-pull-request.yml (no-build gate), publish-release.yml (release chain), and run-periodic-codegen-pull-request.yml (codegen). The release-with-smoke gate variant, deploy-site.yml, and check-upstream-version.yml stay open, since the doc itself says they carry no manifest-wide snippet or still call a local build-release-task.yml rather than the hub's. Regenerate reports/workflow-reuse.md against the current fleet state.
There was a problem hiding this comment.
Pull request overview
Records hub release 2.0.352 as the first tag carrying the full set of hub-hosted reusable workflow tasks, and advances the reusable-workflows rollout by adding the first set of catalog-ready caller snippets pinned to that release.
Changes:
- Update the rollout tracker and supporting docs to mark promotion/release proofs for stages 0–5 and note which catalog snippets are now available vs. intentionally still pending.
- Add three new workflow caller snippets to
catalog/snippets/workflows/, each pinned to0b07a59d… # 2.0.352, and update the snippets catalog README accordingly. - Regenerate the fleet workflow reuse report and record the release milestone in
TODO.md.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| TODO.md | Adds a settled milestone entry for release 2.0.352, including links to the proving run and the remaining follow-up issue. |
| reports/workflow-reuse.md | Regenerates the workflow-reuse report against the current live fleet state at the referenced hub commit. |
| docs/reusable-workflows.md | Updates the rollout checklist and adoption docs to record proof items and annotate which catalog snippets are now present vs. still pending. |
| catalog/snippets/workflows/test-pull-request.yml | Adds the “no-build gate” caller snippet pinned to the 2.0.352 release commit. |
| catalog/snippets/workflows/publish-release.yml | Adds the release-repo caller stub snippet pinned to the 2.0.352 release commit. |
| catalog/snippets/workflows/run-periodic-codegen-pull-request.yml | Adds the periodic codegen caller snippet pinned to the 2.0.352 release commit. |
| catalog/snippets/workflows/README.md | Adds rows for the new snippets and updates the intro text to reflect the partial-but-advancing rollout. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.
Suppressed comments (4)
catalog/snippets/workflows/publish-release.yml:33
- The
validatejob callsvalidate-task.yml, whose jobs requestcontents: read. Without an explicit callerpermissions:grant, this relies on the repository default token permissions and can be broader than necessary (or could fail if a repo later tightens defaults). Grant onlycontents: readon this job explicitly.
validate:
name: Validate job
needs: [plan]
if: ${{ needs.plan.outputs.publish == 'true' }}
uses: ptr727/ProjectTemplate/.github/workflows/validate-task.yml@0b07a59d7c65d07d8df275a96deaf2e06cbefd51 # 2.0.352
docs/reusable-workflows.md:460
- The example
validatejob doesn’t declarepermissions:even thoughvalidate-task.ymlrequestscontents: read. Add an explicitpermissions: { contents: read }grant here so the example remains least-privilege and doesn’t depend on repository default token permissions.
validate:
name: Validate job
needs: [plan]
if: ${{ needs.plan.outputs.publish == 'true' }}
uses: ptr727/ProjectTemplate/.github/workflows/validate-task.yml@0b07a59d7c65d07d8df275a96deaf2e06cbefd51 # 2.0.352
catalog/snippets/workflows/publish-release.yml:17
- This catalog snippet leaves workflow token permissions implicit, which can grant broader-than-needed scopes depending on the repository default. To make the snippet least-privilege by construction (matching the other caller stubs here), add
permissions: {}at workflow scope and rely on per-jobpermissions:blocks.
This issue also appears on line 29 of the same file.
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
jobs:
docs/reusable-workflows.md:444
- In the release-chain stub example, workflow token permissions are implicit. That can grant broader scopes than intended depending on the repo default, which conflicts with the surrounding guidance about granting only what’s needed. Add
permissions: {}to make the example least-privilege by default and rely on per-jobpermissions:blocks.
This issue also appears on line 456 of the same file.
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
jobs:
… Pilot (#778) ## What - `.github/actions/build-executable-default/action.yml`: the release archive is named for the project file's stem (`./PhotoCleaner/PhotoCleaner.csproj` gives `PhotoCleaner.7z`) unless the new `asset-name` input names it, and `build-release-task.yml` exposes that as `executable_asset_name`. PhotoCleaner's first publish through the task (run 31977092102, release 1.1.11) attached `Console.7z` where its own leaf had attached `PhotoCleaner.7z`, the one regression the pilot found. PlexCleaner names its archive the same way, so the derived default is right for both known callers. - `catalog/snippets/workflows/publish-release.yml` and the doc's byte-identical stub: `permissions: {}` at workflow level, `contents: read` on the `validate` job, the publish job's grants unchanged. These are the four suppressed findings raised on #775 after its clean round. - `docs/reusable-workflows.md` Rollout: PhotoCleaner ticked as the stage 2 pilot (ptr727/PhotoCleaner#55, #56, the validate default-hook path observed) and the stage 4 pilot (smoke run 31974932749 and publish run 31977092102, release 1.1.11), a proof item for the asset-name fix on the next PhotoCleaner release. - `reports/workflow-reuse.md` regenerated: PhotoCleaner 8 workflow files to 3, all three callers, fleet callers 1 to 3. ## Verification actionlint, prose gate, repo gate, audit self-test, unit tests, markdownlint. The asset-name change is proven by the next PhotoCleaner release, recorded as a proof item. Refs ptr727/PhotoCleaner#55, ptr727/PhotoCleaner#56.
… Fix (#786) Promote `develop` to `main`, carrying: - #783 Drop IGNORE_GITHUB_REF From the Hosted Get-Version Task (the hosted task follows WORKFLOW.md D3.1 like the inline get-version job already does) - #778 Name the Executable Asset for Its Project and Record the PhotoCleaner Pilot (the executable default names its archive for the project file, the publish-release snippet and doc stub carry explicit permissions, PhotoCleaner ticked as the stage 2 and 4 pilot) - #775 Record 2.0.352 in the Reusable-Workflow Rollout and Add Its Catalog Snippets - #773 Expand references/ in large skill files for progressive disclosure - #776 Make the linux host-setup scripts refuse more than one action - #782 Add PowerShell as an Optional Tool From the Microsoft Feed The release that follows is the pin PhotoCleaner's Dependabot bumps to, and PhotoCleaner's next release through it is the proof that the executable asset is named `PhotoCleaner.7z` again. Closes #769.
Release
2.0.352(main0b07a59d7c65d07d8df275a96deaf2e06cbefd51) is thefirst tag carrying every hub-hosted reusable workflow task, produced by
the publish-release run
after promotion #774. In that run
build-release-task.ymlran with everytarget disabled and its
github-releasejob succeeded while all five buildjobs skipped, proving the
github-releaseskip fix (#762) and thecaller-granted scopes (#772). The earlier release attempt on
82fecef(run)
ended in
startup_failurebecausebuild-nuget/github-releasedeclaredjob-level permissions; #772 fixed it.
docs/reusable-workflows.md "Rollout"
developwith--squashthroughmerge-bot-task.yml(run),
and Dependabot PR Bump astral-sh/setup-uv from 8.1.0 to 10.0.0 in the actions-deps group #770 merged to
mainwith--merge(run).
2.0.352on0b07a59dand Promote develop to main With the Release Task Scope Fix #774, and stage 4 also notes the first attempt'sstartup_failureand its Move the Release Task's Job Scopes to the Caller #772 fix.release" item, since neither stage's full set of snippets is complete this
time: stage 2's release-with-smoke shape still calls its own repo's
build-release-task.ymlby./path rather than the hub's, and stage 5'sdeploy-site.yml,publish-docker-readme-task.yml, andcheck-upstream-version-task.ymleach stay open for reasons the docitself already states (no manifest-wide snippet by design, or a job
embedded in a larger stub rather than a standalone caller). Both items
gain an inline note identifying which of their snippets this PR adds.
New catalog snippets
Three of the five/six candidate files, each pinned
0b07a59d7c65d07d8df275a96deaf2e06cbefd51 # 2.0.352and byte-identical toits doc stub block apart from the pin (and, where the doc's own comment
wrapping does not survive an actual YAML file's comment-wrap rule, a
reworded comment kept in sync on both sides):
catalog/snippets/workflows/test-pull-request.yml(the no-build gateshape from "Adopting the Gates")
catalog/snippets/workflows/publish-release.yml(the release-repo shapefrom "Adopting the Release Chain")
catalog/snippets/workflows/run-periodic-codegen-pull-request.yml(thecodegen stub, which the doc already says keeps today's per-repo shape)
Skipped, with the doc updated to say why:
test-pull-request-smoke.yml- the doc's smoke stub still calls thecaller's own
./.github/workflows/build-release-task.ymlby local path,never the hub's
build-release-task.ymldirectly, so it does not meetthe "calls the hub task" condition.
deploy-site.yml- the doc's own "Deploy-site" paragraph states it"has no manifest-wide catalog snippet either," the same reason
get-version-task.yml/publish-plan-task.ymlhave none: each site's ownshape varies too much around the shared
deployjob.check-upstream-version.yml- the doc gives only thecheck-upstream-version:job body, not a complete top-level trigger/concurrency shape, and unlike
the codegen stub there is no doc statement that a uniform shape exists to
copy.
catalog/snippets/workflows/README.mdgained rows for the three newsnippets and an updated intro paragraph explaining the partial rollout.
TODO.md
Added one Settled line under "Host the type-specific tasks" naming
2.0.352as the release that makes stages 2-5 adoptable and the run thatproved the release chain, and noting #769 as the one open follow-up from
the promotion review.
reports/workflow-reuse.md
Regenerated with
python3 spec/workflow_reuse.py --reportagainst the livefleet at hub
63d244b(this branch's base). The numbers move against thelast committed report only because the live fleet moved since then, not
because of anything in this PR.
Gates run locally
spec/validate.py,python3 -m unittest discover -s scripts/tests(686tests),
spec/audit.py --selftest,spec/workflow_reuse.py --selftest,scripts/repo_gate.py(sha-pin resolved against GitHub),scripts/build_dist.py --check,scripts/prose_lint.py(all nine checks),ruff check/ruff format --check,mypy, and the Dockeractionlint,markdownlint-cli2, andeditorconfig-checkerlinters (only.ruff_cachenoise there).