@msn-control/liftoff 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/governance/single-maintainer-gitflow/policy.md +194 -32
- package/dist/repository-governance.d.ts +1 -1
- package/dist/repository-governance.js +59 -2
- package/dist/repository-governance.js.map +1 -1
- package/docs/existing-repositories.md +6 -0
- package/docs/prerequisites.md +3 -2
- package/docs/repository-governance.md +113 -7
- package/docs/safety-and-consent.md +4 -3
- package/docs/troubleshooting.md +8 -3
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
schemaVersion: 1
|
|
3
3
|
profile: single-maintainer-gitflow
|
|
4
|
-
policyVersion: "
|
|
4
|
+
policyVersion: "3"
|
|
5
5
|
state: handoff-generated
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -26,25 +26,68 @@ one-off.
|
|
|
26
26
|
best-practice default would introduce a human approver, override it and say so.
|
|
27
27
|
To be precise: me approving *your plan* in this conversation is expected and required. What is
|
|
28
28
|
forbidden is any *merge or deploy gate that waits on a person* once the automation is in place.
|
|
29
|
-
- **Repository-scoped only
|
|
30
|
-
|
|
29
|
+
- **Repository-scoped only, with one bounded provisioning exception.** Org-level rulesets remain out
|
|
30
|
+
of scope and will not be set up. Every governance control must be applied per-repository and work
|
|
31
31
|
standalone in a single repository. Do not propose, recommend, or design around org-level rulesets,
|
|
32
32
|
org-level required workflows, or org-wide GitHub App installations — not even as a "better
|
|
33
|
-
alternative" or
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
alternative" or future phase. If a control genuinely cannot be enforced at repository scope, say so
|
|
34
|
+
plainly and leave it out rather than proposing an org-level substitute.
|
|
35
|
+
**One provisioning exception only:** when private Staging DAST genuinely applies and no suitable
|
|
36
|
+
VNet-injected larger runner is assigned, an explicitly approved governance change may provision the
|
|
37
|
+
Azure network setting, organisation hosted-compute network configuration, selected-access runner
|
|
38
|
+
group, and bounded larger runner described below. Prove the required Azure and GitHub organisation
|
|
39
|
+
write authority first; never generalise this exception to any unrelated org-level control.
|
|
36
40
|
- **Automation identity is the built-in `GITHUB_TOKEN`.** Set the **GitHub Actions app** as the bypass
|
|
37
41
|
actor where automation must act on a protected ref — no custom GitHub App is available, since
|
|
38
42
|
installing one requires org ownership. Note that pushes made with `GITHUB_TOKEN` do not trigger
|
|
39
|
-
further workflows: never rely on a tag-push trigger
|
|
40
|
-
run
|
|
43
|
+
further workflows: never rely on a tag-push trigger. Create the tag, Release and durable evidence in
|
|
44
|
+
the successful production workflow. Where a checked back-merge needs another run, dispatch it
|
|
45
|
+
explicitly for the exact SHA and fail if that dispatch or its required checks do not succeed.
|
|
41
46
|
- **GitHub Advanced Security is licensed org-wide.** Use Secret Protection, CodeQL and Copilot Autofix.
|
|
42
47
|
Do not add third-party equivalents such as Gitleaks or Semgrep — they would duplicate licensed
|
|
43
48
|
capability.
|
|
44
|
-
- **Staging sits behind private networking
|
|
49
|
+
- **Staging sits behind private networking, and DAST runs on a GitHub-hosted larger runner with
|
|
50
|
+
Azure VNet injection.** Do not build a self-hosted runner VM. An ephemeral hosted runner has
|
|
51
|
+
nothing to patch and leaves no long-lived compute inside the Staging network for a compromised
|
|
52
|
+
workflow to pivot from.
|
|
53
|
+
**This is a deliberate, approved deviation** from guidance that assumes self-hosted runners for
|
|
54
|
+
private targets — implement it as written and do not re-argue it.
|
|
55
|
+
Note the dependency: VNet injection requires an Azure **network configuration** and a **runner
|
|
56
|
+
group**, both represented at organisation or enterprise level. Reuse a suitable existing
|
|
57
|
+
repository assignment when one is verified. If none exists, keep release qualification blocked
|
|
58
|
+
until the exact repository-dedicated stack is explicitly approved, provisioned, read back, and
|
|
59
|
+
proven to reach Staging. Never silently skip DAST, and never substitute a self-hosted runner to
|
|
60
|
+
work around it.
|
|
45
61
|
- **The GitHub Release plus attestations are the audit record.** There is no external GRC or
|
|
46
62
|
change-management system to integrate with.
|
|
47
63
|
|
|
64
|
+
### Pre-answered platform defaults — use these, do not ask again
|
|
65
|
+
|
|
66
|
+
These were decided once and apply to every repository. Ask only if the repository has a specific,
|
|
67
|
+
stated reason to differ, and say what that reason is. Apply a default only when the classified
|
|
68
|
+
workload actually uses that component; a database default does not justify provisioning a database.
|
|
69
|
+
|
|
70
|
+
| Decision | Default |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| Storage redundancy | **Dev LRS · Staging ZRS · Production ZRS** |
|
|
73
|
+
| IaC state storage | **ZRS in every environment**, including bootstrap |
|
|
74
|
+
| Database high availability | **Dev and Staging: no HA. Production: zone-redundant HA.** |
|
|
75
|
+
| Cloud identity for CI | **User-assigned managed identity with OIDC federation** per repository and environment. No app registrations, no client secrets, no long-lived credentials. |
|
|
76
|
+
| Workload scale | **Small — fewer than 1,000 users** |
|
|
77
|
+
| Budget profile | **Cost-optimised with production safeguards** |
|
|
78
|
+
| Slack webhook storage | **GitHub Actions secret at the environment level.** Not Key Vault — the alerting path must not depend on network access to a private vault, which is exactly how an alert path fails silently. |
|
|
79
|
+
| Dependency policy | **Active LTS only.** Pin runtime majors to Active LTS, add Dependabot ignore rules for non-LTS majors, and group updates per ecosystem. Do not re-litigate this every time a new major ships. |
|
|
80
|
+
|
|
81
|
+
**Provision nothing that no code uses.** Do not add a managed service to the infrastructure until the
|
|
82
|
+
application actually consumes it. Before adopting any managed service, state its cost and its
|
|
83
|
+
**known service limits** — per-subscription rate caps in particular, which have long lead times to
|
|
84
|
+
raise and are discovered far too late otherwise.
|
|
85
|
+
|
|
86
|
+
**When infrastructure as code does not match what already exists in the cloud**, report the
|
|
87
|
+
reconciliation plan before applying anything, refactor the IaC to match the live resources and import
|
|
88
|
+
them. Do not build a parallel stack and migrate, force replacement, or treat the estate as externally
|
|
89
|
+
managed.
|
|
90
|
+
|
|
48
91
|
## Basis
|
|
49
92
|
|
|
50
93
|
The branching model is Vincent Driessen's original GitFlow:
|
|
@@ -62,11 +105,18 @@ Report before you change anything.
|
|
|
62
105
|
2. Language(s), package managers, and the build and test commands that genuinely work today.
|
|
63
106
|
3. Anything already present: branches, workflows and their exact job names, rulesets, tags, releases,
|
|
64
107
|
environments, deployment pipelines, security scanning.
|
|
65
|
-
4. Whether
|
|
66
|
-
|
|
67
|
-
|
|
108
|
+
4. Whether private Staging DAST applies and whether a **GitHub-hosted larger runner group with Azure
|
|
109
|
+
VNet injection into Staging** already exists, is assigned to this repository, exposes the exact
|
|
110
|
+
required labels, and can inspect and reach the real private target.
|
|
111
|
+
5. If DAST applies and no suitable assignment exists: the repository's Staging subscription and
|
|
112
|
+
tenant; supported region; Azure and GitHub organisation write permissions; enterprise policy for
|
|
113
|
+
organisation network configurations; billing owner; remote state owner; deterministic resource
|
|
114
|
+
names; non-overlapping address space; Staging VNet, route, private DNS and security topology;
|
|
115
|
+
required outbound policy; current costs and service limits; and dependency-ordered teardown
|
|
116
|
+
owner. Any unresolved input is a blocker, not permission to begin a partial bootstrap.
|
|
117
|
+
6. What monitoring and alerting already exists — alert rules, action groups, where they route, and
|
|
68
118
|
which components have no coverage at all. Name the gaps explicitly.
|
|
69
|
-
|
|
119
|
+
7. Which components expose a health endpoint, and whether it is shallow (process is alive) or deep
|
|
70
120
|
(dependencies are reachable). A shallow check reported as health is a gap, not coverage.
|
|
71
121
|
|
|
72
122
|
Then state the gap and your proposed order of work, and **get my approval before making changes.**
|
|
@@ -75,6 +125,60 @@ Then state the gap and your proposed order of work, and **get my approval before
|
|
|
75
125
|
apply to a library the same way. Implement what is real for this repo and tell me explicitly what you
|
|
76
126
|
skipped and why. Never ship a workflow that cannot pass.
|
|
77
127
|
|
|
128
|
+
### Private Staging runner provisioning contract
|
|
129
|
+
|
|
130
|
+
Provision this stack only when private Staging DAST applies and no suitable assignment already
|
|
131
|
+
exists. If DAST is inapplicable, provision no runner networking or hosted-compute resources. If a
|
|
132
|
+
suitable assignment exists, consume it without creating a duplicate.
|
|
133
|
+
|
|
134
|
+
**Keep repository ownership independent.** Every Azure runner-network resource, remote state,
|
|
135
|
+
explicit egress resource, cost, and teardown responsibility belongs in the target repository's
|
|
136
|
+
Staging subscription. Do not share or depend on another repository's or subscription's firewall,
|
|
137
|
+
hub, route, state, billing boundary, or lifecycle. GitHub resources necessarily exist at organisation
|
|
138
|
+
level, but the runner group must use selected access for only this repository and, where supported,
|
|
139
|
+
only the required workflows.
|
|
140
|
+
|
|
141
|
+
**Use one explicit outbound mode.** Disable implicit default outbound access on the runner subnet,
|
|
142
|
+
then select exactly one of these modes from Phase 0 evidence:
|
|
143
|
+
|
|
144
|
+
1. **Azure Firewall Basic** only when an applicable organisation or repository policy requires
|
|
145
|
+
domain-restricted egress. Populate HTTPS application rules from the current GitHub meta endpoint
|
|
146
|
+
domain set, record the selected set and capture time, refresh it at least weekly, use no retired
|
|
147
|
+
static GitHub IP allowlist, and perform no TLS interception. Firewall Basic has no DNS proxy, so it
|
|
148
|
+
does not replace the private DNS path to Staging.
|
|
149
|
+
2. **Azure NAT Gateway** when strict domain-restricted egress is not required. Limit required
|
|
150
|
+
outbound protocols with an NSG, but state plainly that NAT Gateway and an NSG do not filter HTTPS
|
|
151
|
+
traffic by domain.
|
|
152
|
+
|
|
153
|
+
Never attach NAT Gateway to a runner subnet whose default route uses Azure Firewall. NAT Gateway
|
|
154
|
+
takes precedence for new outbound connections and would bypass the firewall path. Never treat
|
|
155
|
+
implicit Azure outbound access as a durable design.
|
|
156
|
+
|
|
157
|
+
**Prove isolation and the private path.** The delegated subnet must contain no existing NICs, use
|
|
158
|
+
non-overlapping address space, and deny all unsolicited inbound connections; GitHub requires no
|
|
159
|
+
inbound connection to the runner. Model the actual same-subscription route or peering to Staging,
|
|
160
|
+
private DNS zone or resolver path, forwarding settings, NSGs, and target policy. A standalone runner
|
|
161
|
+
VNet or a successfully created network setting is not proof that DAST can reach Staging.
|
|
162
|
+
|
|
163
|
+
**Apply and verify idempotently.** Use reviewable infrastructure as code for the Azure resources and
|
|
164
|
+
supported GitHub APIs for the hosted-compute network configuration, group, repository and workflow
|
|
165
|
+
access, and runner. Use deterministic names and read before write. Default to the smallest
|
|
166
|
+
organisation-supported Ubuntu x64 runner proven sufficient for ZAP — normally 4 cores and 16 GiB —
|
|
167
|
+
with maximum concurrency of one unless Phase 0 justifies another bound.
|
|
168
|
+
|
|
169
|
+
Do not mark the prerequisite satisfied until readback proves the Azure network setting and returned
|
|
170
|
+
GitHub ID, organisation network configuration, selected-access group, exact repository and workflow
|
|
171
|
+
assignment, runner image, size, labels, status, concurrency, billing owner, explicit egress path,
|
|
172
|
+
private DNS resolution, and live Staging reachability. A standard hosted preflight checks assignment
|
|
173
|
+
and labels before scheduling DAST; the larger-runner job proves the private target path. Missing,
|
|
174
|
+
stale, denied, skipped, or partial evidence fails closed.
|
|
175
|
+
|
|
176
|
+
**Remove in dependency order.** Stop new scheduling and repository access first; delete the larger
|
|
177
|
+
runner; remove repository and workflow access; detach and delete the runner group and hosted-compute
|
|
178
|
+
network configuration; delete the Azure network setting and wait for its service association to be
|
|
179
|
+
removed; only then delete the repository-owned subnet, egress, network, and state resources. Never
|
|
180
|
+
report rollback success while a billed or service-associated resource remains.
|
|
181
|
+
|
|
78
182
|
## Phase 1 — Branching model
|
|
79
183
|
|
|
80
184
|
- `develop` is the integration branch and the **default branch**. Feature branches (`feat/`, `fix/`,
|
|
@@ -88,17 +192,34 @@ skipped and why. Never ship a workflow that cannot pass.
|
|
|
88
192
|
`develop` — or into the open release branch if one exists.
|
|
89
193
|
- Nobody pushes directly to any protected branch, including me.
|
|
90
194
|
|
|
195
|
+
### Automated completion without protected-branch bypass
|
|
196
|
+
|
|
197
|
+
Release and hotfix back-merges use pull requests and the same required checks as every other protected
|
|
198
|
+
branch change. Protected branch rulesets keep `bypass_actors: []`; the GitHub Actions bypass applies
|
|
199
|
+
only to restricted release-tag creation.
|
|
200
|
+
|
|
201
|
+
When `GITHUB_TOKEN` creates the back-merge pull request, the coordinating workflow must explicitly
|
|
202
|
+
dispatch validation for the sync branch's exact head SHA, wait until every required context is
|
|
203
|
+
`success`, verify the head did not move, and merge through the pull-request API. A hotfix targets the
|
|
204
|
+
single open release branch when one exists, otherwise `develop`; multiple open release branches are
|
|
205
|
+
an ambiguity and must fail. If the token-generated merge suppresses the normal `develop` push
|
|
206
|
+
workflow, explicitly dispatch the required deployment or follow-on work for the resulting merge SHA.
|
|
207
|
+
Missing, skipped, cancelled or failed checks, a failed dispatch, or an unexpected SHA all fail closed.
|
|
208
|
+
|
|
91
209
|
## Phase 2 — Release versioning on `main`
|
|
92
210
|
|
|
93
211
|
Every production merge must produce a real, visible version.
|
|
94
212
|
|
|
95
213
|
- Semantic versioning. The `release/X.Y.Z` or `hotfix/X.Y.Z` branch name is the single source of truth
|
|
96
|
-
for the version
|
|
214
|
+
for the version. If an artifact format requires embedded version metadata, derive it from or verify
|
|
215
|
+
it against the branch version during candidate stabilisation; conflicting metadata blocks
|
|
216
|
+
qualification and never becomes a second source of truth.
|
|
97
217
|
- Merges into `main` are true merge commits, never squashed, so both parents stay traceable.
|
|
98
218
|
- After a successful production deploy — and only then — automation creates an annotated `vX.Y.Z` tag
|
|
99
219
|
on that exact `main` merge commit and a matching **GitHub Release** targeting `main`.
|
|
100
220
|
- The Release body must contain: the changelog between the previous tag and this one, the deployed
|
|
101
|
-
artifact digest, the
|
|
221
|
+
artifact digest, the qualified release or hotfix candidate SHA, the production `main` merge SHA,
|
|
222
|
+
the source `develop` SHA the release was cut from, a link to the staging
|
|
102
223
|
qualification run, the **evidence bundle digest** and links to the SBOM and scan reports, the
|
|
103
224
|
**expected signer identity and OIDC issuer** an auditor should pin when verifying, and an AI
|
|
104
225
|
Acceptable Use Policy attestation record. For a hotfix, include the incident reference. Attach the
|
|
@@ -117,17 +238,20 @@ Every production merge must produce a real, visible version.
|
|
|
117
238
|
|
|
118
239
|
## Phase 3 — Promotion: build once, promote the identical artifact
|
|
119
240
|
|
|
120
|
-
The artifact is built once per candidate and recorded in a release manifest with its
|
|
121
|
-
digest, provenance attestation and scan results. Dev,
|
|
122
|
-
digest. Never rebuild per environment; never resolve a
|
|
123
|
-
differs per environment; the artifact does not.
|
|
241
|
+
The artifact is built once per candidate and recorded in a release manifest with its release version,
|
|
242
|
+
release branch, candidate SHA, digest, SBOM digest, provenance attestation and scan results. Dev,
|
|
243
|
+
Staging and Production all deploy that same digest. Never rebuild per environment; never resolve a
|
|
244
|
+
floating tag like `latest`. Configuration differs per environment; the artifact does not.
|
|
124
245
|
|
|
125
246
|
- **Dev** — every push to `develop` deploys automatically. No gate.
|
|
126
247
|
- **Staging** — a push to `release/**` or `hotfix/**` builds the candidate, scans it, generates its
|
|
127
248
|
SBOM, deploys to Staging, then runs the qualification suite and DAST. It records a qualification
|
|
128
|
-
record bound to that exact digest and
|
|
249
|
+
record bound to that exact version, branch, candidate SHA, artifact digest and evidence-bundle
|
|
250
|
+
digest.
|
|
129
251
|
- **Production** — merging into `main` promotes. The workflow resolves the already-qualified digest,
|
|
130
|
-
verifies the
|
|
252
|
+
verifies the commit is a true merge that incorporates the exact qualified candidate SHA, and
|
|
253
|
+
verifies the attestation and qualification record bind that candidate to the version, artifact
|
|
254
|
+
digest and evidence digest being promoted. It records the distinct production merge SHA and refuses
|
|
131
255
|
to proceed on any mismatch. Deployment is recorded through a GitHub Environment for the deployment
|
|
132
256
|
history and audit trail only — configure it with **no required reviewers**, so promotion is never
|
|
133
257
|
blocked waiting on a person.
|
|
@@ -425,10 +549,11 @@ Stage mapping:
|
|
|
425
549
|
using `actions/attest-build-provenance`.
|
|
426
550
|
- **`release/**` and `hotfix/**`** — the full gate, all bound to the promoted digest: Trivy scan of
|
|
427
551
|
that exact digest, SBOM, **SLSA Build L3** provenance via `slsa-github-generator`, OSSF Scorecard,
|
|
428
|
-
deploy to Staging, then OWASP ZAP against the deployed instance on
|
|
429
|
-
running application and belongs here and nowhere else. Also run Grype
|
|
430
|
-
produce an exploitability-ranked risk report for the Release body —
|
|
431
|
-
qualification record must not be issuable if any of the gating
|
|
552
|
+
deploy to Staging, then OWASP ZAP against the deployed instance on the VNet-injected GitHub-hosted
|
|
553
|
+
larger runner. DAST needs a running application and belongs here and nowhere else. Also run Grype
|
|
554
|
+
against the candidate SBOM to produce an exploitability-ranked risk report for the Release body —
|
|
555
|
+
report only, never blocking. The qualification record must not be issuable if any of the gating
|
|
556
|
+
checks fail.
|
|
432
557
|
- **`main`** — verification only. Verify the L3 attestation, SBOM digest and qualification record all
|
|
433
558
|
bind to the digest being promoted. No new scans; re-scanning would describe a rebuilt artifact.
|
|
434
559
|
- **Scheduled** — re-scan released artifacts by running Grype against their **stored SBOMs**, which
|
|
@@ -448,6 +573,20 @@ Gating and evidence:
|
|
|
448
573
|
recorded in the Release, not an automated check.
|
|
449
574
|
- Every scan emits a stable, named status check suitable for requiring by ruleset.
|
|
450
575
|
|
|
576
|
+
**The SLSA L3 generator is the one approved exception to SHA-pinning.** The official
|
|
577
|
+
`slsa-github-generator` reusable workflow invokes mutable `@main` references internally, so pinning
|
|
578
|
+
the outer workflow by SHA cannot make the whole call graph immutable. Resolve the conflict narrowly:
|
|
579
|
+
|
|
580
|
+
- Keep **SLSA Build L3** for release candidates. Do not downgrade to L2 to satisfy the pinning rule.
|
|
581
|
+
- Pin the outer reusable workflow as tightly as the generator supports.
|
|
582
|
+
- Record an **explicit, narrow, expiring action-reference exception** naming that exact workflow,
|
|
583
|
+
reason, expiry and introducing commit. This is distinct from vulnerability acceptance; Trivy
|
|
584
|
+
remains the sole owner of vulnerability allowlisting and Grype remains non-gating.
|
|
585
|
+
- The SHA-pinning check must allow this single exception by exact name, fail when it expires, and keep
|
|
586
|
+
failing on every other unpinned reference. A wildcard, blanket exemption, differently named
|
|
587
|
+
workflow or disabled check is invalid.
|
|
588
|
+
- Re-evaluate at each expiry; remove the exception if the generator gains pinned internals.
|
|
589
|
+
|
|
451
590
|
### Audit evidence — every stage must produce a durable, reviewable report
|
|
452
591
|
|
|
453
592
|
An auditor must be able to answer, years after the fact: what was scanned, when, with which tool and
|
|
@@ -475,7 +614,8 @@ The evidence bundle contains, for each pipeline stage:
|
|
|
475
614
|
|
|
476
615
|
And at bundle level:
|
|
477
616
|
|
|
478
|
-
- The artifact digest,
|
|
617
|
+
- The artifact digest, qualified candidate SHA, production `main` merge SHA, source `develop` SHA,
|
|
618
|
+
release version and branch.
|
|
479
619
|
- A `manifest.json` listing every file with its SHA-256.
|
|
480
620
|
- The suppression allowlist exactly as it stood at that moment, with each entry's reason, expiry and
|
|
481
621
|
the commit that introduced it.
|
|
@@ -564,8 +704,11 @@ evidence.
|
|
|
564
704
|
|
|
565
705
|
A required check that is skipped stays pending forever and deadlocks the ruleset. Every required job
|
|
566
706
|
must reach a terminal conclusion on every triggering event, including a deliberate successful
|
|
567
|
-
"nothing to do" path.
|
|
568
|
-
|
|
707
|
+
"nothing to do" path. Before scheduling DAST, run a preflight on a standard hosted runner that verifies
|
|
708
|
+
the exact VNet-injected larger runner assignment and labels are visible to the repository. If the API
|
|
709
|
+
cannot be read, the assignment is absent or the labels differ, fail loudly without scheduling DAST.
|
|
710
|
+
The aggregate qualification check must then treat the skipped DAST dependency as not successful
|
|
711
|
+
rather than hang pending or report success.
|
|
569
712
|
|
|
570
713
|
**No required check may fail open.** A check that reports success when it could not actually do its
|
|
571
714
|
job is worse than no check at all, because it manufactures false assurance and nothing ever looks
|
|
@@ -665,15 +808,26 @@ Inspect and report all of the following with evidence before changing anything:
|
|
|
665
808
|
4. Secret Protection, Dependabot, Dependency Review, CodeQL, Copilot Autofix,
|
|
666
809
|
Checkov, Trivy, Grype, ZAP, attestations, SLSA, Scorecard, licenses, and every
|
|
667
810
|
required input or suppression policy.
|
|
668
|
-
5.
|
|
669
|
-
|
|
670
|
-
|
|
811
|
+
5. Whether private Staging DAST applies; the exact GitHub-hosted larger runner
|
|
812
|
+
group and labels when present; its repository and workflow assignment; whether
|
|
813
|
+
its Azure VNet injection can resolve and reach Staging; and whether a standard
|
|
814
|
+
hosted preflight can verify the assignment before DAST is scheduled.
|
|
815
|
+
6. When DAST applies but no suitable assignment exists: Staging subscription,
|
|
816
|
+
tenant, region, organisation and Azure write authority, enterprise network
|
|
817
|
+
policy, billing, state, deterministic names, address space, route or peering,
|
|
818
|
+
private DNS, inbound denial, strict-domain-egress requirement, explicit
|
|
819
|
+
Firewall Basic or NAT Gateway mode, costs, limits, and teardown ownership.
|
|
820
|
+
7. Live deployment mechanisms, parallel-version support, version-specific
|
|
671
821
|
origins, traffic volume, statistically valid canary capacity, and provider
|
|
672
822
|
status sources.
|
|
673
|
-
|
|
823
|
+
8. Monitoring signals, alert rules, severity routing, Slack delivery,
|
|
674
824
|
heartbeat coverage, alert-fire tests, dashboards, shallow/deep component
|
|
675
825
|
health, dependency graph, recovery order, deployed versions/digests, and DORA
|
|
676
826
|
event sources.
|
|
827
|
+
9. Which settled platform defaults apply to components the workload actually
|
|
828
|
+
uses, the cost and known service limits of every required managed service, and
|
|
829
|
+
any live-resource drift that requires a refactor-and-import reconciliation
|
|
830
|
+
plan.
|
|
677
831
|
|
|
678
832
|
Report every gap, blocker, inapplicable control, and GitFlow-versus-continuous-
|
|
679
833
|
delivery conflict. Propose the current `main` SHA as the activation baseline for
|
|
@@ -690,6 +844,14 @@ After approval, create a new governance change using the project's selected
|
|
|
690
844
|
OpenSpec or Spec Kit workflow. The generated Liftoff policy remains an input;
|
|
691
845
|
Liftoff does not own, name, restore, or recreate that active change.
|
|
692
846
|
|
|
847
|
+
When the approved plan includes the runner provisioning exception, treat it as
|
|
848
|
+
a fail-closed state machine: remote state and the Azure network; delegated
|
|
849
|
+
private subnet and exactly one explicit egress mode; Azure network setting and
|
|
850
|
+
GitHub ID; organisation network configuration; selected-access group; bounded
|
|
851
|
+
larger runner; complete API readback; private DNS and live Staging reachability;
|
|
852
|
+
then DAST eligibility. Stop at the first failed transition and reconcile or
|
|
853
|
+
remove partial resources in reverse dependency order.
|
|
854
|
+
|
|
693
855
|
Author workflows, exact ruleset payloads, runbooks, and documentation first.
|
|
694
856
|
Observe every proposed required context green on all applicable paths, then
|
|
695
857
|
prove that exact context deliberately red with a controlled violation. Treat
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { GeneratedArtifact, ProjectPlan } from './types.js';
|
|
2
2
|
export declare const governancePolicySchemaVersion: 1;
|
|
3
|
-
export declare const governancePolicyVersion: '
|
|
3
|
+
export declare const governancePolicyVersion: '3';
|
|
4
4
|
export declare const governanceContextSchemaVersion: 1;
|
|
5
5
|
export declare const governanceArtifactPaths: {
|
|
6
6
|
readonly policy: readonly ['.liftoff', 'governance', 'policy.md'];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { supportedStack } from './supported-stack.js';
|
|
3
3
|
export const governancePolicySchemaVersion = 1;
|
|
4
|
-
export const governancePolicyVersion = '
|
|
4
|
+
export const governancePolicyVersion = '3';
|
|
5
5
|
export const governanceContextSchemaVersion = 1;
|
|
6
6
|
export const governanceArtifactPaths = {
|
|
7
7
|
policy: ['.liftoff', 'governance', 'policy.md'],
|
|
@@ -28,7 +28,7 @@ export function renderCanonicalGovernancePolicy() {
|
|
|
28
28
|
const requiredPolicyFragments = [
|
|
29
29
|
'schemaVersion: 1',
|
|
30
30
|
'profile: single-maintainer-gitflow',
|
|
31
|
-
'policyVersion: "
|
|
31
|
+
'policyVersion: "3"',
|
|
32
32
|
'develop` is the integration branch and the **default branch**',
|
|
33
33
|
'main` is production truth',
|
|
34
34
|
'release/X.Y.Z',
|
|
@@ -40,6 +40,44 @@ const requiredPolicyFragments = [
|
|
|
40
40
|
'no required reviewers',
|
|
41
41
|
'GITHUB_TOKEN',
|
|
42
42
|
'Repository-scoped only',
|
|
43
|
+
'One provisioning exception only:',
|
|
44
|
+
'GitHub-hosted larger runner with',
|
|
45
|
+
'Azure VNet injection',
|
|
46
|
+
'private Staging DAST genuinely applies',
|
|
47
|
+
'If DAST is inapplicable, provision no runner networking',
|
|
48
|
+
'consume it without creating a duplicate',
|
|
49
|
+
'Any unresolved input is a blocker',
|
|
50
|
+
'Every Azure runner-network resource, remote state',
|
|
51
|
+
'Staging subscription.',
|
|
52
|
+
"Do not share or depend on another repository's or subscription's firewall",
|
|
53
|
+
'selected access for only this repository',
|
|
54
|
+
'Azure Firewall Basic',
|
|
55
|
+
'Azure NAT Gateway',
|
|
56
|
+
'takes precedence for new outbound connections',
|
|
57
|
+
'NAT Gateway and an NSG do not filter HTTPS',
|
|
58
|
+
'Disable implicit default outbound access',
|
|
59
|
+
'current GitHub meta endpoint',
|
|
60
|
+
'deny all unsolicited inbound connections',
|
|
61
|
+
'non-overlapping address space',
|
|
62
|
+
'private DNS',
|
|
63
|
+
'perform no TLS interception',
|
|
64
|
+
'A standard hosted preflight checks assignment',
|
|
65
|
+
'Do not mark the prerequisite satisfied until readback proves',
|
|
66
|
+
'maximum concurrency of one',
|
|
67
|
+
'Remove in dependency order',
|
|
68
|
+
'live Staging reachability',
|
|
69
|
+
'Pre-answered platform defaults',
|
|
70
|
+
'Dev LRS',
|
|
71
|
+
'ZRS in every environment',
|
|
72
|
+
'Production: zone-redundant HA',
|
|
73
|
+
'User-assigned managed identity with OIDC federation',
|
|
74
|
+
'Small — fewer than 1,000 users',
|
|
75
|
+
'Cost-optimised with production safeguards',
|
|
76
|
+
'GitHub Actions secret at the environment level',
|
|
77
|
+
'Active LTS only',
|
|
78
|
+
'Provision nothing that no code uses',
|
|
79
|
+
'known service limits',
|
|
80
|
+
'refactor the IaC to match the live resources and import',
|
|
43
81
|
'GitHub Secret Protection',
|
|
44
82
|
'Dependabot + Dependency Review',
|
|
45
83
|
'CodeQL + Copilot Autofix',
|
|
@@ -48,9 +86,15 @@ const requiredPolicyFragments = [
|
|
|
48
86
|
'Grype',
|
|
49
87
|
'OWASP ZAP',
|
|
50
88
|
'slsa-github-generator',
|
|
89
|
+
'The SLSA L3 generator is the one approved exception to SHA-pinning',
|
|
90
|
+
'expiring action-reference exception',
|
|
91
|
+
'wildcard, blanket exemption',
|
|
51
92
|
'OSSF Scorecard',
|
|
52
93
|
'Explicitly excluded as duplicates',
|
|
53
94
|
'build once',
|
|
95
|
+
'qualified release or hotfix candidate SHA',
|
|
96
|
+
'production `main` merge SHA',
|
|
97
|
+
'explicitly dispatch',
|
|
54
98
|
'zero traffic',
|
|
55
99
|
'fresh baseline revision',
|
|
56
100
|
'Rollback must never be gated',
|
|
@@ -68,11 +112,24 @@ const requiredPolicyFragments = [
|
|
|
68
112
|
'rulesets idempotently last',
|
|
69
113
|
'read the live rulesets'
|
|
70
114
|
];
|
|
115
|
+
const forbiddenPolicyFragments = [
|
|
116
|
+
'DAST must run on a self-hosted runner',
|
|
117
|
+
'self-hosted runner group with Staging access exists',
|
|
118
|
+
'Consume it; never attempt to create it',
|
|
119
|
+
'Treat it as an **external prerequisite**',
|
|
120
|
+
'share a firewall across repository subscriptions',
|
|
121
|
+
'NAT Gateway may coexist with Azure Firewall',
|
|
122
|
+
'resource creation is sufficient proof of Staging connectivity'
|
|
123
|
+
];
|
|
71
124
|
export function validateGovernancePolicy(policy) {
|
|
72
125
|
const missing = requiredPolicyFragments.filter((fragment) => !policy.includes(fragment));
|
|
73
126
|
if (missing.length > 0) {
|
|
74
127
|
throw new Error(`Governance policy is missing required contract fragment: ${missing[0]}`);
|
|
75
128
|
}
|
|
129
|
+
const forbidden = forbiddenPolicyFragments.find((fragment) => policy.includes(fragment));
|
|
130
|
+
if (forbidden) {
|
|
131
|
+
throw new Error(`Governance policy contains forbidden legacy contract fragment: ${forbidden}`);
|
|
132
|
+
}
|
|
76
133
|
if (!/No change in this repository\s+requires another person's approval/.test(policy) ||
|
|
77
134
|
!policy.includes('Never enable a ruleset whose required contexts have not been observed green')) {
|
|
78
135
|
throw new Error('Governance policy does not preserve fail-closed single-maintainer invariants.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-governance.js","sourceRoot":"","sources":["../src/repository-governance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repository-governance.js","sourceRoot":"","sources":["../src/repository-governance.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,6 +98,12 @@ Selecting `none` leaves previously managed handoff files as undeleted orphans
|
|
|
98
98
|
while unrecorded conflicts remain user-owned. No update mode runs an agent or
|
|
99
99
|
activates GitHub settings.
|
|
100
100
|
|
|
101
|
+
Projects carrying governance policy version 2 preview policy version 3 as
|
|
102
|
+
managed-core drift. Review the new conditional private-runner provisioning
|
|
103
|
+
contract before replacement. Updating the handoff never provisions Azure or
|
|
104
|
+
GitHub resources; reconcile any active downstream runner change with version 3
|
|
105
|
+
before applying its infrastructure.
|
|
106
|
+
|
|
101
107
|
The schema-v6 transition releases every legacy non-core artifact into project
|
|
102
108
|
provenance without writing, restoring, moving, or deleting its path.
|
|
103
109
|
Intentionally removed infrastructure stays absent and production source stays
|
package/docs/prerequisites.md
CHANGED
|
@@ -43,8 +43,9 @@ in to a cloud or agent on your behalf.
|
|
|
43
43
|
|
|
44
44
|
The default repository-governance handoff has no additional initialization
|
|
45
45
|
prerequisite. `gh`, a remote, licensed GitHub security features, private runners,
|
|
46
|
-
Slack, and deployment access are
|
|
47
|
-
may be reported as gaps; they do
|
|
46
|
+
Azure and GitHub provisioning authority, Slack, and deployment access are
|
|
47
|
+
discovered only during post-push Phase 0 and may be reported as gaps; they do
|
|
48
|
+
not block local generation or authorize cloud mutation.
|
|
48
49
|
|
|
49
50
|
## Preview requirements without writes
|
|
50
51
|
|
|
@@ -12,8 +12,8 @@ liftoff init --governance none
|
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
Accepting the default or passing `--yes` authorizes only local project files. It
|
|
15
|
-
does not run an agent, mutate Git, contact GitHub, configure security,
|
|
16
|
-
ruleset, deploy, or create monitoring.
|
|
15
|
+
does not run an agent, mutate Git, contact GitHub or Azure, configure security,
|
|
16
|
+
install a ruleset, deploy, provision a runner, or create monitoring.
|
|
17
17
|
|
|
18
18
|
## Generated files
|
|
19
19
|
|
|
@@ -34,6 +34,96 @@ tools, fail-closed checks, immutable release evidence, build-once promotion,
|
|
|
34
34
|
deployment and rollback, monitoring and health, DORA metrics, ruleset
|
|
35
35
|
sequencing, negative tests, documentation, and workload adaptation.
|
|
36
36
|
|
|
37
|
+
Policy version 3 also fixes platform decisions that generated projects should
|
|
38
|
+
not repeatedly ask users to make:
|
|
39
|
+
|
|
40
|
+
- Dev storage uses LRS; Staging and Production use ZRS. IaC state uses ZRS in
|
|
41
|
+
every environment.
|
|
42
|
+
- Database HA is off in Dev and Staging and zone-redundant in Production.
|
|
43
|
+
- CI uses one user-assigned managed identity with OIDC federation per repository
|
|
44
|
+
and environment, without app registrations or long-lived credentials.
|
|
45
|
+
- The default workload is small and cost-optimised with production safeguards.
|
|
46
|
+
Runtimes remain on Active LTS majors, with grouped dependency updates and
|
|
47
|
+
non-LTS major updates ignored.
|
|
48
|
+
- Slack webhooks are required environment-level GitHub Actions secrets so the
|
|
49
|
+
alert path does not depend on private-vault connectivity.
|
|
50
|
+
|
|
51
|
+
These are applicable defaults, not reasons to create unused resources. A
|
|
52
|
+
managed service is included only when application code consumes it, after its
|
|
53
|
+
cost and known service limits are stated. When live infrastructure differs from
|
|
54
|
+
IaC, activation planning adapts the IaC and imports the live resource rather
|
|
55
|
+
than creating a parallel stack or forcing replacement.
|
|
56
|
+
|
|
57
|
+
## Private Staging qualification
|
|
58
|
+
|
|
59
|
+
DAST for a privately networked Staging environment uses an ephemeral
|
|
60
|
+
GitHub-hosted larger runner with Azure VNet injection. Activation reuses a
|
|
61
|
+
suitable existing repository assignment. If none exists, policy version 3
|
|
62
|
+
permits one narrow post-approval exception to provision the Azure network
|
|
63
|
+
setting, organisation hosted-compute network configuration, selected-access
|
|
64
|
+
runner group, and bounded larger runner required by that repository.
|
|
65
|
+
|
|
66
|
+
Phase 0 first proves that private Staging DAST applies. It then discovers the
|
|
67
|
+
repository's Staging subscription and tenant, existing runner resources, Azure
|
|
68
|
+
and GitHub write authority, enterprise network policy, billing, state, names,
|
|
69
|
+
address space, DNS, routing, costs, limits, and teardown ownership. Missing
|
|
70
|
+
authority or an unresolved input blocks provisioning without partial mutation.
|
|
71
|
+
No self-hosted runner is substituted.
|
|
72
|
+
|
|
73
|
+
Every Azure runner-network resource, its state, egress cost, and teardown owner
|
|
74
|
+
remain inside the repository's Staging subscription. The design cannot share a
|
|
75
|
+
firewall, hub, route, state, or lifecycle with another repository or
|
|
76
|
+
subscription. GitHub resources exist at organisation level but grant selected
|
|
77
|
+
access only to the target repository and required workflows.
|
|
78
|
+
|
|
79
|
+
The delegated runner subnet disables implicit default outbound access, denies
|
|
80
|
+
unsolicited inbound connectivity, and uses exactly one egress mode:
|
|
81
|
+
|
|
82
|
+
- Azure Firewall Basic only when an applicable policy requires domain-restricted
|
|
83
|
+
egress. Its HTTPS rules use a current GitHub meta domain set without the
|
|
84
|
+
retired static-IP template or TLS interception.
|
|
85
|
+
- Azure NAT Gateway otherwise, with required protocols constrained by an NSG.
|
|
86
|
+
NAT and NSG controls do not filter HTTPS by domain.
|
|
87
|
+
|
|
88
|
+
NAT Gateway cannot be attached to a firewall-routed runner subnet because it
|
|
89
|
+
takes precedence and would bypass the firewall. The approved topology must also
|
|
90
|
+
prove non-overlapping address space, same-subscription routing or peering,
|
|
91
|
+
private DNS, security rules, and live private Staging reachability.
|
|
92
|
+
|
|
93
|
+
A standard hosted preflight verifies the assignment and labels before scheduling
|
|
94
|
+
DAST. Azure and GitHub resources, associations, egress, DNS, and reachability
|
|
95
|
+
must all be read back successfully. Missing or partial evidence blocks
|
|
96
|
+
qualification rather than leaving a required job queued or reporting success.
|
|
97
|
+
Teardown reverses those dependencies and removes the Azure network only after
|
|
98
|
+
GitHub scheduling, assignment, and service associations are gone.
|
|
99
|
+
|
|
100
|
+
## Release identity and automated completion
|
|
101
|
+
|
|
102
|
+
Staging qualifies the release or hotfix candidate commit and binds it to the
|
|
103
|
+
version, artifact digest, and evidence-bundle digest. A later true merge into
|
|
104
|
+
`main` necessarily has a different SHA. Production verifies that the merge
|
|
105
|
+
incorporates the exact qualified candidate, promotes the identical artifact,
|
|
106
|
+
and records both identities:
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
candidate SHA -> qualification -> artifact digest
|
|
110
|
+
| |
|
|
111
|
+
+---------- main merge SHA ----+
|
|
112
|
+
|
|
|
113
|
+
+-> deployment -> tag and GitHub Release
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Package formats may require embedded version metadata, but that value must
|
|
117
|
+
match the authoritative `release/X.Y.Z` or `hotfix/X.Y.Z` branch name.
|
|
118
|
+
|
|
119
|
+
Release and hotfix back-merges remain pull-request-only and require successful
|
|
120
|
+
checks. Because `GITHUB_TOKEN`-created events do not normally start more
|
|
121
|
+
workflows, the coordinating workflow explicitly dispatches validation for the
|
|
122
|
+
back-merge head and any required post-merge work for the resulting SHA. It does
|
|
123
|
+
not push directly to a protected branch or rely on a tag push. Tag creation,
|
|
124
|
+
Release publication, and durable evidence stay in the successful production
|
|
125
|
+
workflow.
|
|
126
|
+
|
|
37
127
|
`context.json` contains generated project facts only. GitHub repository state,
|
|
38
128
|
runner access, licensed features, deployments, monitoring, alert routes,
|
|
39
129
|
traffic, and rollout capabilities remain `undiscovered`. Power Apps context
|
|
@@ -48,7 +138,10 @@ and API DAST as inapplicable.
|
|
|
48
138
|
4. The agent performs read-only Phase 0 and reports repository identity,
|
|
49
139
|
artifacts, working commands, refs, workflows and exact checks, rulesets,
|
|
50
140
|
releases, environments, security, runners, deployments, monitoring, alerts,
|
|
51
|
-
health depth, platform capabilities, gaps, and inapplicable controls.
|
|
141
|
+
health depth, platform capabilities, gaps, and inapplicable controls. When
|
|
142
|
+
private Staging DAST applies without a suitable runner, it also reports the
|
|
143
|
+
complete subscription-local topology, one explicit egress mode, authority,
|
|
144
|
+
costs, limits, verification, and teardown plan.
|
|
52
145
|
5. The agent proposes the current `main` SHA as the activation baseline,
|
|
53
146
|
presents an ordered plan, and stops.
|
|
54
147
|
6. Explicitly approve or revise the conversational plan. This is not a human
|
|
@@ -79,13 +172,26 @@ conflict remains outside Liftoff ownership and produces `handoff-partial`.
|
|
|
79
172
|
After every conflict is removed or matches the current artifact, the next
|
|
80
173
|
update records the full artifact set as `handoff-generated`.
|
|
81
174
|
|
|
175
|
+
Projects generated with policy version 2 review the version-3 managed-core drift
|
|
176
|
+
before replacement. `liftoff update` changes only the local handoff; it never
|
|
177
|
+
provisions Azure or GitHub resources. Any active downstream runner change based
|
|
178
|
+
on the external-only version-2 contract must reconcile its plan and
|
|
179
|
+
implementation with version 3 before applying cloud or organisation resources.
|
|
180
|
+
|
|
82
181
|
Setting `"governanceProfile": "none"` stops future rendering. Previously managed
|
|
83
182
|
handoff files are reported once as orphans and left on disk; Liftoff never
|
|
84
183
|
deletes them automatically or changes live repository settings.
|
|
85
184
|
|
|
86
185
|
## Capability gaps
|
|
87
186
|
|
|
88
|
-
Phase 0 must report missing GitHub licenses,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
187
|
+
Phase 0 must report missing GitHub licenses, runner-provisioning authority,
|
|
188
|
+
VNet-injected assignment or reachability, Staging access, monitoring routes,
|
|
189
|
+
parallel-version mechanisms, or statistically meaningful canary traffic. It
|
|
190
|
+
must mark controls inapplicable or blocked rather than creating a skipped,
|
|
191
|
+
hanging, partial, duplicate, or success-shaped placeholder.
|
|
192
|
+
|
|
193
|
+
The official SLSA L3 generator is the policy's only action SHA-pinning
|
|
194
|
+
exception because its reusable workflow contains mutable internal references.
|
|
195
|
+
The outer call is pinned as tightly as supported and the exact exception is
|
|
196
|
+
narrow and expiring. It does not weaken pinning for any other action, create a
|
|
197
|
+
second vulnerability allowlist, or make Grype a blocking gate.
|
|
@@ -19,9 +19,10 @@ Interactive sessions ask separately at the point each permission is needed.
|
|
|
19
19
|
|
|
20
20
|
Selecting repository governance or passing `--yes` authorizes only deterministic
|
|
21
21
|
local handoff files. It never authorizes agent execution, Git mutation, GitHub
|
|
22
|
-
APIs, rulesets, security configuration,
|
|
23
|
-
replacement, machine tools, or project
|
|
24
|
-
only after commit, push, read-only Phase 0,
|
|
22
|
+
APIs, Azure or other cloud resources, rulesets, security configuration,
|
|
23
|
+
deployment, monitoring, file replacement, machine tools, or project
|
|
24
|
+
dependencies. Live activation begins only after commit, push, read-only Phase 0,
|
|
25
|
+
and explicit plan approval.
|
|
25
26
|
|
|
26
27
|
## CLI self-upgrade boundary
|
|
27
28
|
|
package/docs/troubleshooting.md
CHANGED
|
@@ -188,9 +188,14 @@ not active enforcement. Commit and push the repository, run the selected-agent
|
|
|
188
188
|
launcher, review its read-only Phase 0 report, and explicitly approve the plan
|
|
189
189
|
before the agent creates a governance change.
|
|
190
190
|
|
|
191
|
-
Missing licenses, a private Staging
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
Missing licenses, runner-provisioning authority, a private Staging assignment or
|
|
192
|
+
reachable network path, alert routes, parallel deployment, or sufficient canary
|
|
193
|
+
traffic must be reported as blockers or inapplicable controls. When private
|
|
194
|
+
Staging DAST applies and no suitable runner exists, Phase 0 may propose the
|
|
195
|
+
policy's repository-dedicated provisioning exception, but it must stop for
|
|
196
|
+
explicit approval before creating any Azure or GitHub resource. Do not replace
|
|
197
|
+
missing capability with duplicate scanners, partial provisioning, or
|
|
198
|
+
placeholder success.
|
|
194
199
|
|
|
195
200
|
Do not run an older Liftoff release to reverse a completed baseline migration.
|
|
196
201
|
Restore the affected generated files and `liftoff.manifest.json` through version
|