@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.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  schemaVersion: 1
3
3
  profile: single-maintainer-gitflow
4
- policyVersion: "1"
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. Org-level rulesets are out of scope and will not be set up.** I am a
30
- repository admin, not an org owner. Every control must be applied per-repository and must work
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 a future phase. Do not treat the per-repository approach as a limitation to be
34
- worked around; it is the deliberate design. If a control genuinely cannot be enforced at repository
35
- scope, say so plainly and leave it out rather than proposing an org-level substitute.
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, and do the follow-on work in the same workflow
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.** DAST must run on a self-hosted runner with access to it.
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 a self-hosted runner group with Staging access exists. If it does not, say so plainly —
66
- DAST cannot run without it, and the release lane will be unable to qualify a candidate.
67
- 5. What monitoring and alerting already exists alert rules, action groups, where they route, and
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
- 6. Which components expose a health endpoint, and whether it is shallow (process is alive) or deep
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; nothing else declares it.
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 source `develop` SHA the release was cut from, a link to the staging
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 digest, SBOM
121
- digest, provenance attestation and scan results. Dev, Staging and Production all deploy that same
122
- digest. Never rebuild per environment; never resolve a floating tag like `latest`. Configuration
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 commit.
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 attestation and qualification record bind to that exact commit and digest, and refuses
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 a self-hosted runner. DAST needs a
429
- running application and belongs here and nowhere else. Also run Grype against the candidate SBOM to
430
- produce an exploitability-ranked risk report for the Release body — report only, never blocking. The
431
- qualification record must not be issuable if any of the gating checks fail.
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, source commit SHA, release version and branch.
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. **If the self-hosted runner group is unavailable, DAST must fail loudly with a
568
- clear message rather than hang pending.**
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. GitHub Actions runner labels and whether a private-network runner can reach
669
- Staging.
670
- 6. Live deployment mechanisms, parallel-version support, version-specific
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
- 7. Monitoring signals, alert rules, severity routing, Slack delivery,
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: '1';
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 = '1';
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: "1"',
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
@@ -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 discovered only during post-push Phase 0 and
47
- may be reported as gaps; they do not block local generation.
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, install a
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, private runners, staging access,
89
- monitoring routes, parallel-version mechanisms, or statistically meaningful
90
- canary traffic. It must mark controls inapplicable or blocked rather than
91
- creating a skipped, hanging, duplicate, or success-shaped placeholder.
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, deployment, monitoring, file
23
- replacement, machine tools, or project dependencies. Live activation begins
24
- only after commit, push, read-only Phase 0, and explicit plan approval.
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
 
@@ -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 runner, alert routes, parallel deployment,
192
- or sufficient canary traffic must be reported as blockers or inapplicable
193
- controls. Do not replace them with duplicate scanners or placeholder success.
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msn-control/liftoff",
3
- "version": "0.9.4",
3
+ "version": "0.9.6",
4
4
  "description": "Interactive CLI for governed GenAI, API, and Power Apps code app projects.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",