Conversation
…nippets (#775) Release `2.0.352` (`main` `0b07a59d7c65d07d8df275a96deaf2e06cbefd51`) is the first tag carrying every hub-hosted reusable workflow task, produced by [the publish-release run](https://github.com/ptr727/ProjectTemplate/actions/runs/31974067182) after promotion #774. In that run `build-release-task.yml` ran with every target disabled and its `github-release` job succeeded while all five build jobs skipped, proving the `github-release` skip fix (#762) and the caller-granted scopes (#772). The earlier release attempt on `82fecef` ([run](https://github.com/ptr727/ProjectTemplate/actions/runs/31972504539)) ended in `startup_failure` because `build-nuget`/`github-release` declared job-level permissions; #772 fixed it. ## docs/reusable-workflows.md "Rollout" - Ticks the two stage-0 merge-bot proof items: Dependabot PR #771 merged to `develop` with `--squash` through `merge-bot-task.yml` ([run](https://github.com/ptr727/ProjectTemplate/actions/runs/31972622149)), and Dependabot PR #770 merged to `main` with `--merge` ([run](https://github.com/ptr727/ProjectTemplate/actions/runs/31972611554)). - Ticks "Promoted and released" in stages 2, 3, 4, and 5 with `2.0.352` on `0b07a59d` and #774, and stage 4 also notes the first attempt's `startup_failure` and its #772 fix. - Leaves every adoption and pilot checkbox untouched. - Does **not** tick either stage's "Catalog snippets ... pinned to that 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.yml` by `./` path rather than the hub's, and stage 5's `deploy-site.yml`, `publish-docker-readme-task.yml`, and `check-upstream-version-task.yml` each stay open for reasons the doc itself 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.352` and byte-identical to its 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 gate shape from "Adopting the Gates") - `catalog/snippets/workflows/publish-release.yml` (the release-repo shape from "Adopting the Release Chain") - `catalog/snippets/workflows/run-periodic-codegen-pull-request.yml` (the codegen 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 the caller's own `./.github/workflows/build-release-task.yml` by local path, never the hub's `build-release-task.yml` directly, so it does not meet the "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.yml` have none: each site's own shape varies too much around the shared `deploy` job. - `check-upstream-version.yml` - the doc gives only the `check-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.md` gained rows for the three new snippets and an updated intro paragraph explaining the partial rollout. ## TODO.md Added one **Settled** line under "Host the type-specific tasks" naming `2.0.352` as the release that makes stages 2-5 adoptable and the run that proved 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 --report` against the live fleet at hub `63d244b` (this branch's base). The numbers move against the last 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` (686 tests), `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 Docker `actionlint`, `markdownlint-cli2`, and `editorconfig-checker` linters (only `.ruff_cache` noise there).
Fixes #767. Supersedes the last-command-wins behavior with the strict single-action contract the Windows tooling already enforces. ## What changed The Linux host-setup scripts (`bootstrap.sh`, `install-tools.sh`, `setup-github.sh`, `upgrade-host.sh`) overwrote `MODE` in the argument loop, so the last action given won. That silently discards an intent in the dangerous direction: `--report --install` drops the safe action and keeps the one that changes the host. Each script now collects the actions it is given and refuses when more than one is named, mirroring the Windows `Resolve-Mode` refusal: ```sh ERROR: More than one action given (report install), name one ``` The `parse_args` functions also `return 0` on the no-action/default path, which keeps the default action reachable under `set -e`. ## Files - `host-setup/bootstrap.sh` - actions collected and refused when more than one; help now says "Actions, name one" - `host-setup/linux/install-tools.sh` - same, and the `--sudo-timestamp` tool-name refusal reworded against the resolved action - `host-setup/linux/setup-github.sh` - same - `host-setup/linux/upgrade-host.sh` - same - `host-setup/windows/README.md` - the "Actions, the last one given wins | Actions, name one" differences-table row is deleted rather than kept - `TODO.md` - the #673 entry is broadened to carry the loader (#767), with a refreshed check anchor ## Verification - `bash -n` and `shellcheck` clean on all four scripts - Prose gate, markdownlint, and editorconfig-checker clean - `python3 -m unittest discover -s scripts/tests` - 686 tests pass - Manual refusal tests for every multi-action combination, plus single-action and no-action paths
## What Adds `powershell` to the host tools `install-tools.sh` manages, as the one optional member. It installs from Microsoft's apt repository, the same feed `dotnet` already falls back to, so no separate download step is needed (the path HomeAutomation-Config's PR #56 took with a tar.gz build). - `install-tools.sh --optional` (or a stand-up's `--optional` tools step) now also installs `pwsh`. - Naming it explicitly (`install-tools.sh --install powershell`) selects it regardless of `--optional`. - The feed registration is extracted into a shared `microsoft_feed()`, used by both `dotnet` and `powershell`; `dotnet`'s behavior is unchanged. - `--list` marks it `(optional)`, and the report notes when Microsoft's repository is not configured. - Non-amd64 hosts get a named skip, matching `dotnet`. Verified: shellcheck, prose_lint, markdownlint, and editorconfig are clean, and all 686 tests in `scripts/tests` pass. On a Debian 13 host the report shows `powershell 7.6.5-1.deb` available from `packages.microsoft.com`, and a default report (without `--optional`) omits it. ## Docs - `host-setup/linux/README.md` source taxonomy and the docker/node/dotnet section. - `docs/host-setup.md` source paragraph and the "not in the table" sentence.
… 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.
Phase 2) (#773) Reduces conditional-load token cost of the three largest un-converted skills by extracting detail content into `references/` subdirectories, keeping common-path rules in `SKILL.md`. ## Changes ### `python-codestyle` — 17.3 KB → 8.7 KB (−50%) - **`references/profiles.md`** — full `build`/`lint-only` profile spec, per-repo adaptation axes (type checker, dep declaration, versioning, VS Code config) - **`references/code-style.md`** — comments, docstrings, type hints, naming, imports, patterns to avoid - **`references/testing.md`** — pytest conventions - SKILL.md retains: profile decision table (condensed), toolchain table, dev loop, layout, key lint rules, linter checklist ### `dotnet-codestyle` — 16.0 KB → 11.5 KB (−28%) - **`references/conventions.md`** — C# language features, naming, code structure, XML doc examples - **`references/testing.md`** — xUnit v3 + AwesomeAssertions template - **`references/project-config.md`** — target framework, AOT, SourceLink, `InternalsVisibleTo` - SKILL.md retains: zero-warnings policy, build tasks, central config rules, suppression hierarchy, logging/library split, code patterns ### `git-commit-conventions` — 12.8 KB → 11.9 KB (−7%) - **`references/history-rewrite.md`** — two-gate re-identification rule for `git filter-repo` rewrites - SKILL.md retains: all core rules — staging, signing probe (both shells), identity check, no force-push, destructive-command ban ### `.claude-plugin` dist Regenerated via `build_dist.py`; reference files included in the generated tree. ## Metrics | Skill | Before | After | Reduction | |---|---:|---:|---:| | `python-codestyle` | 17,312 B | 8,696 B | −50% | | `dotnet-codestyle` | 15,959 B | 11,523 B | −28% | | `git-commit-conventions` | 12,784 B | 11,869 B | −7% | | All skills total | 156,243 B | 142,276 B | −9% | No rules removed. All behavioral constraints, safety gates, and verification requirements are preserved — content is moved, not deleted. ## Out of scope - AGENTS.md reduction (Phase 4) — deferred pending a hub-vs-local scope decision - Skill description compression (Phase 5) — deferred until body compression is complete - `comment-and-doc-style` — already has three references; no additional split warranted --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ptr727 <2061579+ptr727@users.noreply.github.com> Co-authored-by: Pieter Viljoen <ptr727@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
`get-version-task.yml` follows WORKFLOW.md D3.1 like the inline `get-version` job in `build-release-task.yml` already does: one branch per run, `GITHUB_REF` names it, NBGV classifies it directly, no `IGNORE_GITHUB_REF`. The override was carried over from the retired branch-matrix snippet, and its comments described that model. Every current caller passes the default ref, where the two spellings agree, so no behavior changes for them. Refs #769, which the promotion to `main` closes.
Contributor
There was a problem hiding this comment.
Pull request overview
Promotes develop to main while folding in the follow-ups that finalize the reusable-workflow rollout (pins/snippets, permissions), align the hosted get-version task with WORKFLOW.md D3.1, and incorporate the PhotoCleaner pilot learnings (executable asset naming), plus host-setup improvements (single-action contract + optional PowerShell).
Changes:
- Align
.github/workflows/get-version-task.ymlwith WORKFLOW.md D3.1 by removing theIGNORE_GITHUB_REFoverride and updating its contract comments. - Fix executable release asset naming by deriving the
.7zarchive name from the project file (with an override input), and expose it viabuild-release-task.yml. - Add pinned catalog workflow snippets for newly adoptable stubs, regenerate the workflow-reuse report, and update host-setup docs/scripts (single-action refusal + optional PowerShell from Microsoft feed); split large Skill files into
references/for progressive disclosure.
Reviewed changes
Copilot reviewed 38 out of 38 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| TODO.md | Records 2.0.352 rollout proof and updates tracking entries/links for the promotion follow-ups. |
| reports/workflow-reuse.md | Regenerated fleet reuse metrics after workflow adoption/pilot changes. |
| host-setup/windows/README.md | Removes the Linux-vs-Windows “last action wins” divergence row now that Linux matches “name one action”. |
| host-setup/linux/upgrade-host.sh | Enforces “exactly one action” CLI contract (refuse multiple). |
| host-setup/linux/setup-github.sh | Enforces “exactly one action” CLI contract (refuse multiple). |
| host-setup/linux/README.md | Documents PowerShell as an upstream apt-repo tool and updates Linux host-tool taxonomy. |
| host-setup/linux/install-tools.sh | Adds optional powershell tool, factors Microsoft feed registration, and enforces single-action parsing. |
| host-setup/bootstrap.sh | Enforces single-action parsing while preserving the menu/default behavior. |
| docs/reusable-workflows.md | Updates rollout stages with 2.0.352 release/pilot proofs and adds pinned stub/snippet guidance. |
| docs/host-setup.md | Documents pwsh/PowerShell sourcing as optional tooling from Microsoft’s feed. |
| catalog/snippets/workflows/test-pull-request.yml | New pinned no-build gate stub that calls hub validate-task.yml plus required-check aggregator. |
| catalog/snippets/workflows/run-periodic-codegen-pull-request.yml | New pinned scheduled codegen caller stub for run-codegen-pull-request-task.yml. |
| catalog/snippets/workflows/README.md | Documents which caller stubs now have snippets post-2.0.352 and why others remain reference-only. |
| catalog/snippets/workflows/publish-release.yml | New pinned publish-release caller stub with explicit permissions model and hub task pins. |
| .github/workflows/get-version-task.yml | Drops IGNORE_GITHUB_REF and updates task semantics to match D3.1 branch-per-run versioning. |
| .github/workflows/build-release-task.yml | Adds executable_asset_name input and forwards it to the hub executable default action. |
| .github/actions/build-executable-default/action.yml | Derives release archive name from project stem (or explicit input), validates it, and uploads the derived artifact path. |
| .claude-plugin/fleet-skills/skills/python-codestyle/SKILL.md | Moves detailed Python guidance into references/ to reduce default load size. |
| .claude-plugin/fleet-skills/skills/python-codestyle/references/testing.md | New: Python testing conventions reference. |
| .claude-plugin/fleet-skills/skills/python-codestyle/references/profiles.md | New: Full Python profile spec + adaptation axes reference. |
| .claude-plugin/fleet-skills/skills/python-codestyle/references/code-style.md | New: Full Python code style reference. |
| .claude-plugin/fleet-skills/skills/git-commit-conventions/SKILL.md | Condenses history-rewrite rule and points to extracted reference. |
| .claude-plugin/fleet-skills/skills/git-commit-conventions/references/history-rewrite.md | New: Full history rewrite re-identification rule reference. |
| .claude-plugin/fleet-skills/skills/dotnet-codestyle/SKILL.md | Condenses .NET guidance and points to extracted references. |
| .claude-plugin/fleet-skills/skills/dotnet-codestyle/references/testing.md | New: .NET testing conventions reference. |
| .claude-plugin/fleet-skills/skills/dotnet-codestyle/references/project-config.md | New: .NET project configuration reference. |
| .claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md | New: Full .NET coding conventions reference. |
| .claude-plugin/fleet-skills/.source-digest | Updates plugin digest to reflect the regenerated skill tree content. |
| .agents/skills/python-codestyle/SKILL.md | Mirrors the Python Skill progressive-disclosure refactor in the agent skills tree. |
| .agents/skills/python-codestyle/references/testing.md | New: Python testing conventions reference (agent skills tree). |
| .agents/skills/python-codestyle/references/profiles.md | New: Python profiles reference (agent skills tree). |
| .agents/skills/python-codestyle/references/code-style.md | New: Python code style reference (agent skills tree). |
| .agents/skills/git-commit-conventions/SKILL.md | Mirrors the condensed history-rewrite guidance in the agent skills tree. |
| .agents/skills/git-commit-conventions/references/history-rewrite.md | New: History rewrite reference (agent skills tree). |
| .agents/skills/dotnet-codestyle/SKILL.md | Mirrors the .NET Skill progressive-disclosure refactor in the agent skills tree. |
| .agents/skills/dotnet-codestyle/references/testing.md | New: .NET testing conventions reference (agent skills tree). |
| .agents/skills/dotnet-codestyle/references/project-config.md | New: .NET project configuration reference (agent skills tree). |
| .agents/skills/dotnet-codestyle/references/conventions.md | New: .NET conventions reference (agent skills tree). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promote
developtomain, carrying: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.7zagain.Closes #769.