Skip to content

Commit 73cd63d

Browse files
Keep caller layout as a candidate
Co-authored-by: Copilot App <[email protected]>
1 parent 925b021 commit 73cd63d

5 files changed

Lines changed: 55 additions & 66 deletions

File tree

docs/content/get-started/repository-setup.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ permissions:
6565

6666
jobs:
6767
Process-PSModule:
68-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
69-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
68+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
7069
secrets:
7170
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
7271
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}

docs/content/guides/calling-the-workflow.md

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ permissions:
4848

4949
jobs:
5050
Process-PSModule:
51-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
52-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
51+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
5352
secrets:
5453
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
5554
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}
@@ -68,15 +67,6 @@ the PowerShell Gallery, GitHub Releases, and tags, so later runs must queue rath
6867
The reusable workflow uses its own prefixed concurrency group, so it cannot queue behind the caller while the caller
6968
waits for it to finish.
7069

71-
`Process-PSModule` is PSModule-owned automation, so callers use the controlled floating major tag (`@v8`). Compatible
72-
patch and minor releases move that tag through the release workflow. A breaking release publishes a new major tag and
73-
uses a deliberate fleet campaign rather than moving `v8` across the breaking boundary. External actions remain pinned
74-
to full commit SHAs.
75-
76-
The job condition skips fork-originated pull requests because GitHub does not expose the required repository secrets to
77-
forks. Use a separate secret-free, read-only workflow if the repository accepts contributions from forks and requires
78-
fork CI.
79-
8070
## Passing test data
8171

8272
The reusable workflow at `.github/workflows/workflow.yml` declares four workflow-call secrets,
@@ -104,8 +94,7 @@ changes:
10494
```yaml
10595
jobs:
10696
Process-PSModule:
107-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
108-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
97+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
10998
secrets:
11099
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
111100
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}
@@ -134,8 +123,7 @@ content lines stay at the same indentation level:
134123
```yaml
135124
jobs:
136125
Process-PSModule:
137-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
138-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
126+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
139127
secrets:
140128
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
141129
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}
@@ -247,8 +235,7 @@ You can also pass patterns via the workflow input:
247235
```yaml
248236
jobs:
249237
Process:
250-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
251-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
238+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
252239
with:
253240
ImportantFilePatterns: |
254241
^src/
@@ -261,8 +248,7 @@ To disable triggering via the workflow input, pass an explicit empty string:
261248
```yaml
262249
jobs:
263250
process:
264-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
265-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
251+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
266252
with:
267253
ImportantFilePatterns: ''
268254
```

docs/content/guides/github-app-authentication.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ names. Map the caller's secrets explicitly:
2323
```yaml
2424
jobs:
2525
Process-PSModule:
26-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
27-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
26+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v5
2827
secrets:
2928
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
3029
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}

docs/content/reference/process-workflow-fleet-standard.md

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
---
2-
title: Process-PSModule caller workflow fleet standard
3-
description: Fleet research and proposed required and optional caller workflow elements for Process-PSModule consumers.
2+
title: Process-PSModule caller workflow candidate
3+
description: Fleet research and candidate required and optional caller workflow elements for Process-PSModule consumers.
44
---
55

6-
# Process-PSModule caller workflow fleet standard
6+
# Process-PSModule caller workflow candidate
77

88
This page records the 2026-08-15 fleet research used to propose a common caller workflow for PowerShell module
99
repositories. It is a proposal for review before the consumer repositories are changed.
@@ -81,9 +81,9 @@ Secret forwarding is the only widespread caller variation:
8181

8282
The case difference in the old API key name is historical drift, not a supported option in the current contract.
8383

84-
## Proposed standard
84+
## Candidate for discussion
8585

86-
The standard caller should be:
86+
The current candidate is:
8787

8888
```yaml
8989
name: Process-PSModule
@@ -127,6 +127,21 @@ jobs:
127127
GitHubAppPrivateKey: ${{ secrets.SHELLY_PRIVATE_KEY }}
128128
```
129129
130+
This YAML is a recommendation derived from the v8 interface and fleet evidence. It is not an approved standard.
131+
Issue [#514](https://github.com/PSModule/Process-PSModule/issues/514) must record agreement on the following structural
132+
decisions before canonical guides, templates, or consumer workflows adopt it:
133+
134+
| Decision | Candidate | Alternatives still open |
135+
| --- | --- | --- |
136+
| Wrapper scope | Exactly one reusable-workflow job. | Permit repository-specific jobs in the same file, or define pre/post extension jobs. |
137+
| Trigger ownership | The caller owns manual, schedule, default-branch push, and pull-request triggers. | Move some trigger policy into separate workflows or omit selected event classes. |
138+
| Pull-request activities | Keep all six listed activity types. | Reduce the activity list if a v8 behavior is intentionally unsupported. |
139+
| Concurrency | Use the PR-number-or-ref key and never cancel a release-capable run. | Use separate groups per event class or permit cancellation for non-mutating paths. |
140+
| Permissions | Declare the five current scopes at workflow level. | Introduce settings-based least-privilege profiles or split read-only validation from release work. |
141+
| Fork behavior | Skip fork-originated pull requests in this credentialed wrapper. | Add a separate secret-free workflow or define another supported fork-validation design. |
142+
| Credentials | Explicitly map the three v8 credentials. | Define a narrower credential profile for repositories that cannot publish. |
143+
| Optional surface | Permit only documented `TestData`, workflow inputs, schedule timing, and presentation metadata. | Allow additional extension points after naming and compatibility rules are agreed. |
144+
130145
The `v8` reference is the controlled moving major tag for this PSModule-owned workflow. On 2026-08-15, `v8`, `v8.0`,
131146
and the immutable `v8.0.0` release tag all resolve to commit `5a11e8e8b018faf97017e0416f136a751c026713`.
132147
`Release-GHRepository` creates and advances major and minor tags by default, while the organization tag ruleset prevents
@@ -147,25 +162,25 @@ to `@v8`; until then, consumers must retain immutable SHA references.
147162
A major tag never crosses a breaking boundary. `v8` remains on the latest compatible `8.x` release; `v9` begins a new
148163
fleet campaign. Branch names, `latest`, floating minor tags, and unqualified targets are not accepted pins.
149164

150-
## Required elements
165+
## Candidate common elements
151166

152-
| Element | Requirement | Reason |
167+
| Element | Candidate requirement | Reason |
153168
| --- | --- | --- |
154-
| Identity | Keep the standard file, workflow, and job names shown above. | Stable discovery, status checks, and fleet maintenance. |
169+
| Identity | Keep the candidate file, workflow, and job names shown above. | Stable discovery, status checks, and fleet maintenance. |
155170
| Pull requests | Target `main` and keep all six listed activity types. | CI, prerelease publication, label changes, and closed-PR cleanup depend on them. |
156171
| Default-branch push | Keep `push.branches: [main]`. | `v8` authorizes stable releases from the tested default-branch push. |
157172
| Manual dispatch | Keep `workflow_dispatch`. | Provides the documented default-branch manual release and recovery path. |
158173
| Schedule | Keep a scheduled health run. | Exercises current dependencies even when repository code is unchanged. |
159174
| Concurrency | Use the PR-number-or-ref key with `cancel-in-progress: false`. | Cleanup and stable release runs stay distinct; release mutations queue instead of being interrupted. |
160175
| Permissions | Declare the five documented permissions explicitly. | The called workflow cannot elevate caller permissions. |
161176
| Fork guard | Skip pull requests whose head repository differs from `github.repository`. | GitHub withholds the required repository secrets from fork pull requests. |
162-
| Reference | Use the approved internal floating major tag (`v8`). | Compatible owned releases roll out centrally; breaking releases require a new major and campaign. |
177+
| Reference | Use the intended internal floating major tag (`v8`) after tag governance is enforced. | Compatible owned releases roll out centrally; breaking releases require a new major and campaign. |
163178
| Credentials | Explicitly map the three required secrets. | Satisfies the `v7+` contract and prevents unrelated secret inheritance. |
164179
| Scope | Keep the caller as a single delegation job. | Repository-specific automation remains independently understandable and maintainable. |
165180

166-
## Supported optional elements
181+
## Candidate optional elements
167182

168-
Optional elements are supported contract variations, not permission to retain historical drift.
183+
These are evidence-based candidate variations, not approved policy.
169184

170185
| Option | When it is appropriate | Constraint |
171186
| --- | --- | --- |
@@ -177,31 +192,33 @@ Optional elements are supported contract variations, not permission to retain hi
177192
| Schedule time | Health runs need staggering or a repository-specific maintenance window. | Keep at least one documented schedule unless the repository records why health runs are unnecessary. |
178193
| `run-name` | A repository needs clearer run presentation. | Presentation must not change job names or routing behavior. |
179194

180-
## Out-of-standard variations
195+
## Variations requiring a decision
181196

182-
The following are migration defects or require a documented exception:
197+
The following differ from the candidate. They are inventory classifications, not policy violations, until #514 records
198+
an approved structure:
183199

184200
- `secrets: inherit`;
185201
- `APIKey` or `APIKEY` mappings from the pre-`v7` contract;
186-
- any Process-PSModule reference other than the approved major tag (`v8`), including a branch, `latest`, minor tag,
202+
- any Process-PSModule reference other than the intended major tag (`v8`), including a branch, `latest`, minor tag,
187203
exact patch tag, or full commit SHA;
188204
- missing `push` or `unlabeled` triggers;
189205
- `cancel-in-progress: true` or the old ref-only concurrency key;
190206
- trigger-level path filters that bypass Process-PSModule important-file evaluation;
191207
- unrelated additional jobs in the caller wrapper;
192208
- omitted documented permissions without a verified settings-based least-privilege profile.
193209

194-
Fork-originated pull requests are skipped by the standard caller because reusable-workflow caller jobs cannot select a
210+
Fork-originated pull requests are skipped by the candidate caller because reusable-workflow caller jobs cannot select a
195211
GitHub Environment and repository secrets are unavailable to forks. Supporting fork CI requires a separate, secret-free,
196-
read-only validation workflow; removing the guard is not a supported shortcut.
212+
read-only validation workflow under this candidate; #514 must approve that boundary.
197213

198-
Repository-specific automation should normally use a separate workflow file. That keeps the Process-PSModule wrapper
214+
The candidate keeps repository-specific automation in a separate workflow file. That keeps the Process-PSModule wrapper
199215
identical enough for automated comparison while allowing modules to own unrelated schedules, generation, or integration
200216
tasks.
201217

202218
## Rollout boundary
203219

204-
This research does not change consumer repositories. The campaign should use the stable slug
220+
This research does not approve or change consumer repositories. If #514 approves the candidate, the campaign would use
221+
the stable slug
205222
`process-v8-major-tag`, one delivery issue, branch, and early draft pull request per repository, and these waves:
206223

207224
| Wave | Repositories | Change profile |
@@ -214,17 +231,18 @@ This research does not change consumer repositories. The campaign should use the
214231

215232
Before opening leaves:
216233

217-
1. Confirm `v8` and `v8.0.0` resolve to the same tested release commit.
218-
2. Restrict moving major-tag updates to the controlled release identity. Do not start the consumer rollout while another
234+
1. Record approval of every structural decision above in #514 and update the canonical guides and template.
235+
2. Confirm `v8` and `v8.0.0` resolve to the same tested release commit.
236+
3. Restrict moving major-tag updates to the controlled release identity. Do not start the consumer rollout while another
219237
identity can move `v8`; retain immutable SHA references until this gate is enforced.
220-
3. Have an organization administrator confirm `PSGALLERY_API_KEY`, `SHELLY_CLIENT_ID`, and `SHELLY_PRIVATE_KEY` coverage
238+
4. Have an organization administrator confirm `PSGALLERY_API_KEY`, `SHELLY_CLIENT_ID`, and `SHELLY_PRIVATE_KEY` coverage
221239
in Actions and Dependabot scope. The inventory token can list repository-local secrets but receives `403` for
222240
organization secret visibility, so inherited coverage is currently unresolved.
223-
4. Refresh the inventory with `-TargetReference v8`; the starting target count should be `0/60`.
224-
5. Confirm workflow-only changes are not important release changes. The fleet defaults match only `src/` and
241+
5. Refresh the inventory with `-TargetReference v8`; the starting target count should be `0/60`.
242+
6. Confirm workflow-only changes are not important release changes. The fleet defaults match only `src/` and
225243
`README.md`; `Yaml` explicitly matches `src/`, `tests/`, and `README.md`, so this campaign should not publish modules.
226244

227-
Each leaf applies the common caller, retains only the supported optional mappings, and proves the PR path before merge.
228-
Advance one wave only after the previous wave's push run completes without an unintended release. Completion requires a
229-
fresh inventory showing `60/60` on `v8`, the complete trigger/concurrency contract, explicit credentials, no inherited
230-
secrets or old API-key mappings, and no unresolved review or CI failures.
245+
After approval, each leaf would apply the agreed caller, retain the agreed optional mappings, and prove the PR path
246+
before merge. Advance one wave only after the previous wave's push run completes without an unintended release.
247+
Completion would require a fresh inventory showing `60/60` on `v8`, the agreed trigger and concurrency contract,
248+
the agreed credential mapping, and no unresolved review or CI failures.

docs/content/reference/repository-standard.md

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,14 @@ The caller workflow declares the triggers, concurrency, and permissions for the
122122
```yaml
123123
jobs:
124124
Process-PSModule:
125-
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
126-
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v8
125+
uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@<commit-sha> # <version tag>
127126
secrets:
128127
PSGALLERY_API_KEY: ${{ secrets.PSGALLERY_API_KEY }}
129128
GitHubAppClientId: ${{ secrets.SHELLY_CLIENT_ID }}
130129
GitHubAppPrivateKey: ${{ secrets.SHELLY_PRIVATE_KEY }}
131130
```
132131
133-
Name the caller file `Process-PSModule.yml`, matching [`PSModule/Template-PSModule`](https://github.com/PSModule/Template-PSModule) and every existing module repository. `workflow.yml` is the reusable workflow's own filename inside `PSModule/Process-PSModule` and belongs only in the `uses:` reference.
134-
135-
`Process-PSModule` is PSModule-owned automation. Pin it to the approved floating major tag (`v8`) so compatible patch
136-
and minor releases move across the fleet without one pull request per release. The release workflow owns movement of
137-
the major tag; an incompatible release creates a new major tag and requires a deliberate fleet campaign. Do not use a
138-
branch, `latest`, a floating minor tag, or an exact release/commit for the standard caller.
139-
140-
This internal-major-tag policy does not apply to third-party actions. External actions remain pinned to their full
141-
immutable commit SHA with the release version in a trailing comment.
132+
Name the caller file `Process-PSModule.yml`, matching [`PSModule/Template-PSModule`](https://github.com/PSModule/Template-PSModule) and every existing module repository. `workflow.yml` is the reusable workflow's own filename inside `PSModule/Process-PSModule` and belongs only in the `uses:` reference. Pin the reference to a commit SHA with the version tag in a trailing comment so Dependabot can update it.
142133

143134
## Required common files
144135

@@ -202,11 +193,7 @@ For PSModule module repositories, the requirements are:
202193

203194
Every module repository must include `.github/dependabot.yml`. Dependabot is part of the repository supply-chain control, not an optional convenience.
204195

205-
Configure the `github-actions` ecosystem. It keeps external SHA-pinned actions current and proposes intentional major
206-
updates when supported. Compatible Process-PSModule patch and minor releases arrive through its controlled major tag
207-
instead of a Dependabot pull request. This is what
208-
[`PSModule/Template-PSModule`](https://github.com/PSModule/Template-PSModule) ships, and it is the default for new
209-
repositories:
196+
Configure the `github-actions` ecosystem. It keeps the pinned actions current, including the pinned `PSModule/Process-PSModule` reference in the [caller workflow](#caller-workflow-and-reusable-workflow). This is what [`PSModule/Template-PSModule`](https://github.com/PSModule/Template-PSModule) ships, and it is the default for new repositories:
210197

211198
```yaml
212199
version: 2

0 commit comments

Comments
 (0)