Skip to content

Commit 391a556

Browse files
docs: scope caller conformance
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 497420b commit 391a556

3 files changed

Lines changed: 52 additions & 10 deletions

File tree

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ The uniform wrapper is a strong starting point, but it predates the two latest b
5757
- `v8.0.0` moves stable publication to a default-branch `push`, adds `unlabeled` routing, and requires non-cancelling
5858
pull-request-or-ref concurrency.
5959

60+
The observed absence of additional jobs is inventory context, not a conformance requirement. The candidate standardizes
61+
the Process-PSModule reusable-workflow call and the shared top-level controls that govern that call, rather than the
62+
repository owner's entire workflow.
63+
6064
No current caller has the `v8.0.0` trigger and concurrency contract. The fleet spans nine older versions:
6165

6266
| Version | Repositories |
@@ -131,7 +135,7 @@ decisions before canonical guides, templates, or consumer workflows adopt it:
131135
132136
| Decision | Candidate | Alternatives still open |
133137
| --- | --- | --- |
134-
| Wrapper scope | Exactly one reusable-workflow job. | Permit repository-specific jobs in the same file, or define pre/post extension jobs. |
138+
| Wrapper scope | Exactly one conforming Process-PSModule reusable-workflow call job plus the shared top-level controls that govern it. Repository-owned jobs may coexist in the same file or separate workflows when they do not weaken or bypass that boundary. | Decide only the placement of repository-owned jobs. |
135139
| 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. |
136140
| Pull-request activities | Keep all six listed activity types. | Reduce the activity list if a v8 behavior is intentionally unsupported. |
137141
| Concurrency | Use the PR-number-or-ref key and cancel only superseded pull-request runs. | Use separate groups per event class or disable cancellation for all runs. |
@@ -174,7 +178,7 @@ fleet campaign. Branch names, `latest`, floating minor tags, and unqualified tar
174178
| Fork authorization | Leave the caller job unconditional. | Plan grants normal fork `pull_request` events only restricted read-only validation capabilities and rejects `pull_request_target` before credentials or repository-defined code run. |
175179
| 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. |
176180
| Credentials | Explicitly map `PSGALLERY_API_KEY`, `GitHubAppClientId`, and `GitHubAppPrivateKey`; do not use `secrets: inherit`. | Satisfies the `v7+` contract and prevents unrelated secret inheritance. |
177-
| Scope | Keep the caller as a single delegation job. | Repository-specific automation remains independently understandable and maintainable. |
181+
| Scope | Require exactly one conforming Process-PSModule delegation job and its governing triggers, concurrency, permissions, Plan authorization, and credential boundary. | Repository-owned jobs may be reported for visibility but are not nonconforming merely by existing. |
178182

179183
## Candidate optional elements
180184

@@ -202,8 +206,7 @@ approved organization policy until #514 records an approved structure:
202206
- missing `push` or `unlabeled` triggers;
203207
- a `cancel-in-progress` expression other than `github.event_name == 'pull_request'` or the old ref-only concurrency key;
204208
- trigger-level path filters that bypass Process-PSModule important-file evaluation;
205-
- unrelated additional jobs in the caller wrapper;
206-
- omitted documented permissions without a verified settings-based least-privilege profile.
209+
- omitted documented permissions without a verified settings-based least-privilege profile;
207210
- `with.Debug: true`, which is nonconforming because the reusable workflow default remains `false`.
208211

209212
When required, the optional test-data mapping extends the candidate baseline without broadening it:
@@ -234,9 +237,11 @@ untrusted validation and build inputs; they cannot enable credentials, broaden p
234237
envelope. This permits ordinary fork contributors to receive the standard workflow green/red validation without
235238
configuring secrets.
236239

237-
The candidate keeps repository-specific automation in a separate workflow file. That keeps the Process-PSModule wrapper
238-
identical enough for automated comparison while allowing modules to own unrelated schedules, generation, or integration
239-
tasks.
240+
The candidate requires exactly one conforming Process-PSModule reusable-workflow call job and the shared top-level triggers,
241+
concurrency, permissions, Plan authorization, and credential boundary that govern it. Repository-owned jobs may exist in
242+
the same file or in separate workflows and are reported only for visibility. Their existence is not nonconforming, but
243+
they MUST NOT weaken or bypass the Process-PSModule call's trigger, concurrency, permissions, Plan authorization, or
244+
credential boundary.
240245

241246
## Rollout boundary
242247

docs/content/reference/process-workflow-lifecycle-design.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ Plan resolves the caller event into one release classification before build and
3434

3535
Plan records its classification and release decision in enriched Settings. Downstream jobs consume that Settings object and do not infer policy from events, labels, or repository settings again.
3636

37+
## Candidate caller boundary
38+
39+
The candidate standardizes exactly one Process-PSModule reusable-workflow call job and the shared top-level triggers,
40+
concurrency, permissions, Plan authorization, and credential boundary that govern it. It does not standardize the
41+
repository owner's entire workflow. Repository-owned jobs may coexist in the same workflow file or in separate workflows
42+
and are reported only for visibility. They must not weaken or bypass the Process-PSModule call's trigger, concurrency,
43+
permissions, Plan authorization, or credential boundary.
44+
3745
## Candidate event authorization
3846

3947
The caller invokes the reusable workflow without a caller-level fork or event condition. Plan is the event-authorization
@@ -201,6 +209,7 @@ The lifecycle contract is exercised with event payload fixtures and publication
201209
| Stable aggregation | Bursts of main-push, manual-dispatch, and scheduled fixtures that replace an intermediate pending run and prove the later stable target aggregates all unreleased merged pull requests. |
202210
| Scoped caller permissions | Empty caller top-level permissions, the three job grants, built-in-token checkout/read, and standard Pages/OIDC verification. |
203211
| Caller credential contract | Explicit baseline mappings for `PSGALLERY_API_KEY`, `GitHubAppClientId`, and `GitHubAppPrivateKey`; rejected `secrets: inherit`; optional `TestData` JSON with separate `secrets` and `variables` maps; and no `with.Debug: true`. |
212+
| Caller boundary | Exactly one conforming Process-PSModule call job with governing shared top-level controls, plus repository-owned jobs in the same file and separate workflows that prove their presence is visible but does not weaken or bypass the call boundary. |
204213
| App authorization failure | Missing-App-token fixtures that prove user-facing operations fail closed without built-in token fallback. |
205214
| Token boundary | Fixtures that prove App tokens are step-scoped and built-in-token operations remain within the caller job's boundary. |
206215
| Event authorization | Normal-fork `pull_request` fixtures that prove the controlled upstream Plan derives restricted capabilities from immutable fork/base/head metadata before it consumes settings or checked-out code, then permits only checkout/build/lint/test with a green/red outcome and no configured secrets; `pull_request_target` fixtures prove Plan rejects before credentialed or repository-defined code, including for downstream `always()` jobs. |

docs/content/reference/process-workflow-lifecycle-specification.md

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ This candidate defines the behavior required from a Process-PSModule workflow li
1515

1616
## Scope
1717

18-
The candidate covers dispatch recovery, scheduled validation, pull-request validation and prerelease evaluation, closed-pull-request cleanup, and stable publication after a default-branch push.
18+
The candidate covers dispatch recovery, scheduled validation, pull-request validation and prerelease evaluation, closed-pull-request cleanup, stable publication after a default-branch push, and the Process-PSModule reusable-workflow caller boundary.
1919

20-
It does not approve a caller layout, change module build or publication implementation, define label names, or prescribe release-note presentation. Those choices remain in the caller candidate, the existing versioning guidance, and the companion [candidate design](process-workflow-lifecycle-design.md).
20+
It standardizes exactly one conforming Process-PSModule reusable-workflow call job and the shared top-level controls that govern
21+
it; it does not standardize the repository owner's whole workflow. Repository-owned jobs may exist in the same workflow
22+
file or separate workflows, provided they do not weaken or bypass the call's trigger, concurrency, permissions, Plan
23+
authorization, or credential boundary. It does not change module build or publication implementation, define label
24+
names, or prescribe release-note presentation. Those choices remain in the caller candidate, the existing versioning
25+
guidance, and the companion [candidate design](process-workflow-lifecycle-design.md).
2126

2227
## Confirmed implementation baseline
2328

@@ -309,6 +314,29 @@ Scenario: Gate a privileged job for a restricted fork run
309314
And it does not create an App token or parse an absent publication configuration
310315
```
311316

317+
### FR13 — Caller conformance MUST be limited to the reusable-workflow boundary {#fr13}
318+
319+
A conforming caller MUST contain exactly one Process-PSModule reusable-workflow call job and the shared top-level triggers,
320+
concurrency, permissions, Plan authorization, and credential boundary that govern it. Repository-owned jobs MAY coexist
321+
in the same workflow file or in separate workflows. They are not nonconforming merely by existing, but they MUST NOT
322+
weaken or bypass any of those controls for the Process-PSModule call.
323+
324+
#### Behavioral scenarios {#fr13-scenarios}
325+
326+
```gherkin
327+
Scenario: Retain a repository-owned job beside the reusable-workflow call
328+
Given a workflow contains one conforming Process-PSModule reusable-workflow call job
329+
And a repository-owned documentation job exists in the same workflow file
330+
When the workflow is evaluated for caller conformance
331+
Then the documentation job is reported for visibility
332+
And its existence does not make the Process-PSModule call nonconforming
333+
334+
Scenario: Prevent a repository-owned job from bypassing the caller boundary
335+
Given a repository-owned job exists beside or outside the caller workflow
336+
When it could weaken or bypass the Process-PSModule call's trigger, concurrency, permissions, Plan authorization, or credential boundary
337+
Then the caller arrangement is nonconforming
338+
```
339+
312340
## Non-functional requirements
313341

314342
### NFR1 — Lifecycle mutations MUST be idempotent {#nfr1}
@@ -445,7 +473,7 @@ Scenario: Recover release notes after a missed main-push publication
445473
And a retry creates no duplicate publication
446474
```
447475

448-
### AC2 — Verifies: [FR2](#fr2), [FR4](#fr4), [FR5](#fr5), [FR6](#fr6), [FR8](#fr8), [FR9](#fr9), [FR10](#fr10), [FR11](#fr11), [FR12](#fr12), [NFR2](#nfr2), [NFR3](#nfr3), [NFR4](#nfr4), [NFR5](#nfr5), [NFR6](#nfr6), [NFR7](#nfr7)
476+
### AC2 — Verifies: [FR2](#fr2), [FR4](#fr4), [FR5](#fr5), [FR6](#fr6), [FR8](#fr8), [FR9](#fr9), [FR10](#fr10), [FR11](#fr11), [FR12](#fr12), [FR13](#fr13), [NFR2](#nfr2), [NFR3](#nfr3), [NFR4](#nfr4), [NFR5](#nfr5), [NFR6](#nfr6), [NFR7](#nfr7)
449477

450478
```gherkin
451479
Scenario: Lifecycle runs preserve release ownership after cancellation

0 commit comments

Comments
 (0)