Skip to content

Commit 4a96210

Browse files
Prepare v1.3.0 release and security fixes (#127)
Signed-off-by: Sherif Mansour <13433538+kerberosmansour@users.noreply.github.com>
1 parent 50df0b3 commit 4a96210

46 files changed

Lines changed: 1206 additions & 194 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ body:
2424
- "@hulumi/policies"
2525
- "@hulumi/drift"
2626
- "@hulumi/k8s-baseline"
27+
- "@hulumi/cloudflare-baseline"
28+
- "@hulumi/platform-patterns"
2729
- "/hulumi-threat-model skill"
2830
- "release / CI workflow"
2931
- "docs"
@@ -59,8 +61,8 @@ body:
5961
id: version
6062
attributes:
6163
label: Package version(s)
62-
description: Output of `pnpm list @hulumi/baseline @hulumi/policies @hulumi/drift @hulumi/k8s-baseline @pulumi/aws @pulumi/pulumi @pulumi/kubernetes`.
63-
placeholder: e.g. `@hulumi/baseline 1.2.0`, `@pulumi/aws 7.27.0`, `@pulumi/pulumi 3.232.0`
64+
description: Output of `pnpm list @hulumi/baseline @hulumi/policies @hulumi/drift @hulumi/k8s-baseline @hulumi/cloudflare-baseline @hulumi/platform-patterns @pulumi/aws @pulumi/pulumi @pulumi/kubernetes @pulumi/cloudflare`.
65+
placeholder: e.g. `@hulumi/baseline 1.3.0`, `@pulumi/aws 7.27.0`, `@pulumi/pulumi 3.232.0`
6466
validations:
6567
required: true
6668
- type: input

.github/ISSUE_TEMPLATE/feature_request.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ body:
2323
- New component in @hulumi/baseline (AWS)
2424
- New component in @hulumi/baseline (GitHub)
2525
- New component in @hulumi/k8s-baseline
26+
- New component in @hulumi/cloudflare-baseline
27+
- New component in @hulumi/platform-patterns
2628
- New rule in @hulumi/policies
2729
- New adapter in @hulumi/drift
2830
- New /hulumi-threat-model scenario

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
- [ ] No secrets, credentials, or `.env` files included
2828
- [ ] No verbatim control text from CSA / CIS / NIST / MITRE frameworks (IDs-only — see [SECURITY.md](../SECURITY.md) and [docs/mappings/licensing.md](../docs/mappings/licensing.md))
2929
- [ ] Docs updated if behavior or surface changed (README, ARCHITECTURE.md, component docs, CHANGELOG)
30-
- [ ] If a new dependency was added to `@hulumi/baseline`, `@hulumi/policies`, `@hulumi/drift`, or `@hulumi/k8s-baseline`, the supply-chain rationale is in the PR body (see CONTRIBUTING.md)
30+
- [ ] If a new dependency was added to a publishable `@hulumi/*` package, the supply-chain rationale is in the PR body (see CONTRIBUTING.md)
3131

3232
## Notes for the reviewer
3333

.github/attestations/README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ covers verification via `gh attestation verify` and `cosign`.
88

99
```sh
1010
# Download the tarball
11-
pnpm pack @hulumi/baseline@1.0.0 --pack-destination .
11+
pnpm pack @hulumi/baseline@1.3.0 --pack-destination .
1212

1313
# Verify the attestation
14-
gh attestation verify ./hulumi-baseline-1.0.0.tgz \
14+
gh attestation verify ./hulumi-baseline-1.3.0.tgz \
1515
--repo kerberosmansour/hulumi
1616
```
1717

1818
Expected output:
1919

2020
```
21-
Loaded digest sha256:<sha> for file://./hulumi-baseline-1.0.0.tgz
21+
Loaded digest sha256:<sha> for file://./hulumi-baseline-1.3.0.tgz
2222
Loaded 1 attestation from GitHub API
2323
✓ Verification succeeded!
2424
@@ -29,7 +29,9 @@ The following policy criteria were satisfied:
2929
- Commit: <sha>
3030
```
3131

32-
Repeat for `@hulumi/policies@1.0.0` and `@hulumi/drift@1.0.0`.
32+
Repeat for the other published packages in the same version train:
33+
`@hulumi/policies`, `@hulumi/drift`, `@hulumi/k8s-baseline`,
34+
`@hulumi/cloudflare-baseline`, and `@hulumi/platform-patterns`.
3335

3436
A non-zero exit code from `gh attestation verify` means the
3537
attestation chain doesn't tie back to this repo's release
@@ -42,26 +44,26 @@ If you can't reach the GitHub API:
4244

4345
```sh
4446
# Download the tarball + the attestation
45-
pnpm pack @hulumi/baseline@1.0.0 --pack-destination .
46-
gh release download v1.0.0 \
47+
pnpm pack @hulumi/baseline@1.3.0 --pack-destination .
48+
gh release download v1.3.0 \
4749
--repo kerberosmansour/hulumi \
48-
--pattern "hulumi-baseline-1.0.0.tgz.intoto.jsonl" \
50+
--pattern "hulumi-baseline-1.3.0.tgz.intoto.jsonl" \
4951
--dir .
5052

5153
# Verify with cosign (assumes a recent cosign + Sigstore root)
5254
cosign verify-blob \
53-
--bundle ./hulumi-baseline-1.0.0.tgz.intoto.jsonl \
55+
--bundle ./hulumi-baseline-1.3.0.tgz.intoto.jsonl \
5456
--certificate-identity-regexp '^https://github.com/kerberosmansour/hulumi/' \
5557
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
56-
./hulumi-baseline-1.0.0.tgz
58+
./hulumi-baseline-1.3.0.tgz
5759
```
5860

5961
## What attestation guarantees
6062

6163
- The tarball was built by GitHub Actions running
6264
`.github/workflows/release.yml` from the
6365
`kerberosmansour/hulumi` repo.
64-
- The exact commit SHA at build time matches the `v1.0.0` tag.
66+
- The exact commit SHA at build time matches the release tag.
6567
- The build was hermetic (no maintainer-side `npm publish`).
6668
- The publish used npm trusted publishing (OIDC); no
6769
long-lived `NPM_TOKEN` was involved.

.github/dependabot.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# .github/workflows/pulumi-cooling-off.yml on every PR — Dependabot
44
# proposes the bump, the cooling-off CI gate decides whether the PR
55
# can merge. @pulumi/* deps are grouped so a coherent bump stays
6-
# atomic across the three Hulumi packages.
6+
# atomic across the six Hulumi packages.
77
#
88
# Major-version bumps on the toolchain below are conscious migrations with
99
# code-level fallout (e.g. TypeScript 6's moduleResolution=node10
@@ -22,7 +22,7 @@ updates:
2222
labels:
2323
- "dependencies"
2424
# Group @pulumi/* together so cooling-off stays atomic across the
25-
# three Hulumi packages; group remaining dev deps for noise control.
25+
# six Hulumi packages; group remaining dev deps for noise control.
2626
groups:
2727
pulumi-runtime:
2828
patterns:

.github/workflows/ci.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ jobs:
8383
- run: pnpm --filter @hulumi/drift build
8484
- run: pnpm --filter @hulumi-examples/drift-classify-smoke typecheck
8585
- run: pnpm --filter @hulumi-examples/drift-classify-smoke test
86+
- run: pnpm --filter @hulumi/cloudflare-baseline build
87+
- run: pnpm --filter @hulumi/platform-patterns build
88+
- run: pnpm --filter @hulumi/policies build
89+
- run: pnpm --filter @hulumi/example-edge-platform-smoke typecheck
90+
- run: pnpm --filter @hulumi/example-edge-platform-smoke test
8691

8792
k8s-baseline-test:
8893
name: "@hulumi/k8s-baseline unit + release-readiness BDD"
@@ -192,7 +197,7 @@ jobs:
192197
run: |
193198
mkdir -p .release-artifacts
194199
ABS_DEST="$(pwd)/.release-artifacts"
195-
for pkg in baseline policies drift k8s-baseline; do
200+
for pkg in baseline policies drift k8s-baseline cloudflare-baseline platform-patterns; do
196201
(cd "packages/$pkg" && pnpm pack --pack-destination "$ABS_DEST")
197202
done
198203
ls -la .release-artifacts/

.github/workflows/release.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
# Release — atomic four-package npm publish with SLSA Build L3
1+
# Release — atomic six-package npm publish with SLSA Build L3
22
# attestation + SBOM generation + signed GitHub release.
33
#
44
# Trigger: tag v*.*.* on main. The release is atomic — any step
55
# failure aborts before any `npm publish`. There is NO long-lived
66
# NPM_TOKEN; npm trusted publishing via OIDC is the only auth path.
77
#
8-
# The four-package set is asserted by
8+
# The six-package set is asserted by
99
# packages/k8s-baseline/tests/release-readiness.test.ts:
1010
# - @hulumi/baseline
1111
# - @hulumi/policies
1212
# - @hulumi/drift
1313
# - @hulumi/k8s-baseline (added in runbook hulumi-operations-k8s-security M1)
14+
# - @hulumi/cloudflare-baseline
15+
# - @hulumi/platform-patterns
1416

1517
name: release
1618
on:
@@ -19,9 +21,7 @@ on:
1921
- "v*.*.*"
2022

2123
permissions:
22-
contents: write
23-
id-token: write
24-
attestations: write
24+
contents: read
2525

2626
jobs:
2727
preflight:
@@ -73,7 +73,7 @@ jobs:
7373
run: |
7474
mkdir -p .release-artifacts
7575
ABS_DEST="$(pwd)/.release-artifacts"
76-
for pkg in baseline policies drift k8s-baseline; do
76+
for pkg in baseline policies drift k8s-baseline cloudflare-baseline platform-patterns; do
7777
(cd "packages/$pkg" && pnpm pack --pack-destination "$ABS_DEST")
7878
done
7979
ls -la .release-artifacts/
@@ -96,7 +96,7 @@ jobs:
9696
FETCH_LICENSE: "true"
9797
run: |
9898
set -euo pipefail
99-
for pkg in baseline policies drift k8s-baseline; do
99+
for pkg in baseline policies drift k8s-baseline cloudflare-baseline platform-patterns; do
100100
npx --yes @cyclonedx/cdxgen@11.10.0 \
101101
--type js \
102102
--no-recurse \
@@ -117,6 +117,8 @@ jobs:
117117
pnpm --filter @hulumi/policies publish --no-git-checks --provenance --access public
118118
pnpm --filter @hulumi/drift publish --no-git-checks --provenance --access public
119119
pnpm --filter @hulumi/k8s-baseline publish --no-git-checks --provenance --access public
120+
pnpm --filter @hulumi/cloudflare-baseline publish --no-git-checks --provenance --access public
121+
pnpm --filter @hulumi/platform-patterns publish --no-git-checks --provenance --access public
120122
121123
- name: Create GitHub release with SBOMs + tarballs
122124
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3

CHANGELOG.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,86 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.3.0] — 2026-05-15
9+
10+
The Hulumi Edge Platform release. Atomic six-package publish:
11+
`@hulumi/baseline@1.3.0`, `@hulumi/policies@1.3.0`,
12+
`@hulumi/drift@1.3.0`, `@hulumi/k8s-baseline@1.3.0`, and first public
13+
publishes for `@hulumi/cloudflare-baseline@1.3.0` and
14+
`@hulumi/platform-patterns@1.3.0`. All six packages use the same SLSA
15+
Build L3 + npm provenance release path.
16+
17+
### Added
18+
19+
- **`@hulumi/cloudflare-baseline@1.3.0`** — first release of Cloudflare
20+
edge primitives: `ZoneFoundation`, `PublicHostname`, `EdgeWafBaseline`,
21+
`BotProtectionBaseline`, and `ProtectedAdminHostname`.
22+
- **`@hulumi/platform-patterns@1.3.0`** — first release of
23+
cross-provider patterns: `CloudflareOriginIngress`,
24+
`GitHubAwsOidcDeploymentRole`, `DeploymentRepositoryFoundation`, and
25+
`BuildProvenanceFoundation`.
26+
- **Edge policy coverage** in `@hulumi/policies`: Cloudflare hardening,
27+
origin-bypass, deployment-governance, and workflow-governance checks.
28+
- **Edge smoke and integration lanes**: `examples/edge-platform-smoke/`,
29+
Cloudflare/platform integration tests that skip without real credentials,
30+
and CI coverage for the new package pair.
31+
- **Release advisory preparation**: `docs/release/v1.3.0-security-advisories.md`
32+
tracks the GHSA registrations to publish after the npm packages are live.
33+
34+
### Security
35+
36+
- **PR #80**`@hulumi/baseline`: CloudTrail selector-tampering detection
37+
now catches selector-changing APIs such as `PutEventSelectors` and
38+
`PutInsightSelectors`.
39+
- **PR #119**`/hulumi-threat-model`: helper scripts are anchored to the
40+
installed skill root so an attacker-controlled workspace cannot shadow the
41+
generator helpers.
42+
- **PR #120**`@hulumi/policies`: HULUMI-H1 no longer trusts substring
43+
parent matches for `SecureBucket`-managed resources, closing a parent-spoof
44+
bypass for raw `BucketV2`.
45+
- **PR #121**`@hulumi/policies`: CIS 1.16 admin-policy detection now
46+
covers inline role/user/group policies and `AdministratorAccess`
47+
attachments, not only standalone IAM policies.
48+
- **PR #122** — deployment SCP guidance: the `hulumi:iac-role` tag guard now
49+
denies tag-on-create paths for `iam:CreateRole` and `iam:CreateUser`.
50+
- **PR #123**`@hulumi/drift`: `OrphanReconciler.execute()` now requires
51+
the in-memory token/action set and refuses externally supplied stale plans.
52+
- **PR #124** — weekly integration IAM guidance: removed unnecessary role
53+
mutation permissions from the documented policy and added regression coverage
54+
to keep inline role-policy writes and trust-policy mutation out.
55+
- **PR #126**`@hulumi/cloudflare-baseline`: `ProtectedAdminHostname`
56+
hostname validation uses bounded parser-style checks before first public
57+
publish.
58+
- **`@hulumi/policies`**`G_OIDC_1` now inspects AWS set-qualified and
59+
`IfExists` condition operators on the GitHub OIDC `sub` claim, closing a
60+
bypass where wildcard trusts under `ForAnyValue:StringLike`,
61+
`ForAllValues:StringLike`, or set-qualified `StringEquals` variants were
62+
missed.
63+
- **`@hulumi/policies`** — Cloudflare, origin-bypass, and deployment-governance
64+
stack validators now require per-resource evidence matching. Unrelated
65+
`ZoneDnssec`, `CloudflareOriginIngress`, `DeploymentRepositoryFoundation`,
66+
or unscoped OIDC-role resources no longer suppress findings for other zones,
67+
hostnames, or deployment repositories.
68+
69+
### Changed
70+
71+
- Release and CI workflows expand from four to six packages for pack,
72+
SBOM, attestation, dry-run, and npm publish steps.
73+
- `release-readiness.test.ts` now enforces the six-package atomic version
74+
invariant, per-package README/LICENSE requirements, and the v1.3 changelog
75+
entry.
76+
- `docs/slo/` is ignored as development-only SLO runbook material, not a
77+
user-facing publish artifact.
78+
- Dependency and workflow governance docs now describe the v1.3 package set
79+
and the 13 exact-pinned supply-chain dependencies.
80+
81+
### Migration
82+
83+
For consumers on v1.2.x: existing AWS, GitHub, drift, and K8s surfaces are
84+
additive. The two new packages are opt-in. Edge-platform real-provider proof
85+
remains credential-gated; use the smoke example and integration docs before
86+
promoting Cloudflare/AWS/GitHub edge patterns into production.
87+
888
## [1.2.0] — 2026-05-01
989

1090
The Hulumi-K8s-Security + Hulumi-Operations + pre-public-launch release.

CONTRIBUTING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ Before opening a PR, confirm `pnpm -r test && pnpm -r typecheck && pnpm -r lint`
4040

4141
## No runtime dependency additions without discussion
4242

43-
Adding a runtime dependency to any of `@hulumi/baseline`, `@hulumi/policies`, `@hulumi/drift` is a significant supply-chain decision. Open a GitHub Discussion first describing:
43+
Adding a runtime dependency to any publishable `@hulumi/*` package is a significant supply-chain decision. Open a GitHub Discussion first describing:
4444

4545
- why the dependency is needed,
4646
- what the exact version + integrity hash will be,
4747
- whether the dependency itself carries SLSA provenance,
4848
- how the 72h/24h cooling-off policy applies to future bumps.
4949

50-
The policy is codified in `SECURITY.md` once M5 lands.
50+
The policy is codified in `SECURITY.md`.
5151

5252
## Pre-submit checks
5353

@@ -82,7 +82,7 @@ The runbook templates live at [docs/slo/templates/](./docs/slo/templates/). Runb
8282
## What is out of scope
8383

8484
- Switching the licence from Apache-2.0 to anything else. The Apache-2.0 + IDs-only-citations stance is load-bearing — see [SECURITY.md](./SECURITY.md) and [docs/mappings/licensing.md](./docs/mappings/licensing.md).
85-
- Adding new runtime dependencies to `@hulumi/baseline` / `@hulumi/policies` / `@hulumi/drift` / `@hulumi/k8s-baseline` without supply-chain rationale (see "No runtime dependency additions without discussion" above).
85+
- Adding new runtime dependencies to a publishable `@hulumi/*` package without supply-chain rationale (see "No runtime dependency additions without discussion" above).
8686
- Extending `/hulumi-threat-model` to non-Apache-2.0-compatible framework prose. Citations only.
8787

8888
## Code of Conduct

0 commit comments

Comments
 (0)