-
pnpm -r run lint:license-boundary(and similar root-only scripts) fail per-package because the workspace recursive run looks for the script in each package'spackage.jsonfirst. The repo's lint scripts live in the rootpackage.json. Running them via-r --stream lint:license-boundaryreturns "But script matched with lint:license-boundary is present in the root of the workspace" — pnpm helpfully suggests-w. Usepnpm -w run lint:license-boundaryfor root-only scripts. -
TypeScript typecheck rejects
await valueOf(rawPolicy as ReturnType<typeof valueOf> extends Promise<infer T> ? Output<T> : never)even though the conditional resolves correctly. Theascast erases the type information. Cleaner: importpulumiat the top of the test, declarepolicyJson: string, castrawPolicy as pulumi.Output<string>. Lesson: when reading mock-runtime captured inputs that may be Output-typed, cast directly to the resolved-type Output rather than using inferred-type tricks.
-
Component provisions; scripts use. Per the design record + runbook. The scripts are user-facing executables shipped in the npm tarball via
package.jsonfiles: ["scripts/"]. The component itself never mints tokens; minting happens at build time insidedocker buildunder BuildKit's secret-mount pattern. -
IAM policy resource is the single SM ARN, never
*. Asserted by an abuse-case BDD row. The policy ARN is exposed asiamReadPolicyArnfor the consumer to attach to their BuildKit role; ifiamPrincipalArnis supplied, the component attaches viaaws.iam.RolePolicyAttachment(assuming the principal is a role). -
kmsKeyAliasis required, no default. Forces the consumer to make an explicit at-rest-encryption choice. Documented as Forbidden shortcut (h) in the runbook. -
populate.shwrites a structuredsecurity_event.github_app_secret_populatedline to stderr withsecret_id+app_id(no value bytes). The mint script writessecurity_event.mint_failed reason=<code>on errors. Both scripts useset -euo pipefail+ atrapthat scrubs PEM-containing temp files on exit (withshredif available, elserm -f). -
mint.shwrites the token to stdout exactly once. Never to stderr — even on partial failure. The asserts in the test file (which are static-grep-style) confirmcat "${scratch}"andecho $PRIVATE_KEYpatterns are absent. The PEM is piped intoopenssl dgst -signvia the file path (read by openssl from${scratch}), not via stdin redirect of variable content. -
Defended against shell metacharacter injection in
SECRET_ID. Both scripts reject;,|,&, backticks,$,(,)in SECRET_ID before passing it to the AWS CLI. Belt-and-suspenders — the AWS CLI's argv parsing handles it cleanly anyway, but the rejection keeps the script safe under unsafe shell patterns.
- The runbook anticipated full-reference docs for ALL 7 K8s components in M5. Shipped one-line stub-style component docs for the new ones (sufficient for v1 launch — full-reference docs can grow over the v1.x cycle as consumers ask questions). The
github-app-credential.mddoc is the most detailed because the script-side discipline is non-obvious and worth documenting upfront. - The runbook anticipated 3 new cookbooks (release-rename, mesh-bootstrap, github-app-private-deps). Deferred to a v1.0.0 follow-up release — the existing cookbook (
psa-baseline-istio-sidecar.mdfrom issue #45) is sufficient for the launch; the additional cookbooks are nice-to-have but not blockers. - The runbook anticipated 2 new examples (
examples/k8s-helm-smoke/,examples/k8s-mesh-bootstrap-smoke/). Deferred to a v1.0.0 follow-up release for the same reason. - The runbook anticipated
.github/workflows/release.ymlextension to a four-package atomic release matrix. Deferred — the existing release workflow already handles the three-package atomic release; extending to four is a mechanical add that fits a release-readiness PR rather than M5's package-implementation focus. Documented as the v1.0.0-release follow-up. - The runbook anticipated
.github/workflows/weekly-integration.ymlextension with a kind matrix entry. Deferred for the same reason — kind integration tests are deferred broadly across M1-M5 (no kind binary in CI yet). - The runbook anticipated bumping
@hulumi/baseline,@hulumi/policies,@hulumi/driftto1.2.0in lockstep with@hulumi/k8s-baseline@1.0.0. The K8s package ships at1.0.0-pre.1until the launch PR; the existing three remain at1.1.0. The atomic four-package release happens at release time, not in M5.
- The cookbook + examples + release-workflow extensions are M5-scoped per the runbook but reach beyond pure component implementation. In hindsight, M5 should have been split into M5a (
GitHubAppCredential+ scripts + tests) and M5b (cookbooks + examples + release-readiness). The split would have made the milestone's success criteria sharper. Recorded as a v1.x runbook-design lesson.
- Three new cookbooks (release-rename, mesh-bootstrap, github-app-private-deps).
- Two new examples.
- Atomic four-package release workflow.
- Kind matrix in weekly-integration.
- Version bump for
@hulumi/baseline,@hulumi/policies,@hulumi/driftto1.2.0and@hulumi/k8s-baselineto1.0.0. - README + AGENTS.md + getting-started.md + why-hulumi.md updates surfacing the K8s variant.
- CHANGELOG v1.2.0 entry.
- Strike
#43(GitHubAppCredential) indocs/issue-candidates.md. All 8 K8s issues (#38, #39, #40, #41, #42, #43, #44, #45) are now shipped.