Skip to content

blog: add "Terraform and Kubernetes: A Practical Guide for 2026" - #20751

Open
workprentice[bot] wants to merge 2 commits into
masterfrom
seo/terraform-kubernetes-guide
Open

blog: add "Terraform and Kubernetes: A Practical Guide for 2026"#20751
workprentice[bot] wants to merge 2 commits into
masterfrom
seo/terraform-kubernetes-guide

Conversation

@workprentice

@workprentice workprentice Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

What

New blog post: Terraform and Kubernetes: A Practical Guide for 2026 — targets the exact-match head query "terraform kubernetes" (13 impressions / 0 clicks / avg position 45.6 in the last 90 days, currently landing on the homepage, per GSC — a genuine green-field opportunity), and closes part of the Kubernetes-topic GEO gap flagged on the board card.

Also adds a single reciprocal link from the 2024 post (content/blog/yaml-terraform-pulumi-...index.md) to the new one, so the two stay clearly scoped from each other.

Why /blog/ and not /docs/iac/guides/

The card allowed either location. I checked layouts/partials/schema/graph-builder.html: the additive HowTo schema entity is gated to .Type "blog" only:

{{ if and .IsPage (eq .Type "blog") .Params.howto_schema (ne .Params.schema_type "howto") }}

A content/docs/ page can never carry that HowTo entity, and the card explicitly asks for step-by-step HowTo schema. So this had to be a blog post.

Anti-cannibalization

Two adjacent posts already exist:

  • /blog/ai-agents-on-kubernetes/ (merged 2026-07-28) — agent runtime on K8s.
  • content/blog/gpu-kubernetes-ai-workloads/PR blog: GPU Kubernetes infrastructure for AI workloads #20631, still open — GPU/accelerator substrate. I did not link to it or add it to related_posts since it's unmerged and the slug doesn't exist on master yet. Once blog: GPU Kubernetes infrastructure for AI workloads #20631 merges, someone should add a reciprocal link from that post to this one.
  • /blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/ (2024) — highest overlap risk, since it already has an H2-equivalent section on the Terraform Kubernetes provider for manifest authoring. This new post is scoped to the wider operating model (provisioning, testing, policy, AI agents) instead, with an explicit callout distinguishing the two near the top, and a link from the new post pointing back to the 2024 one for the authoring comparison. I added the reciprocal link from the 2024 post as well.

category: general / no feature image

feature_image is required for every published category except general (and drafts), and the lint script enforces exact dimensions (1884×1256), background color, and a pulumi-blog-feature-image PNG Software tag that only the /blog-feature-image skill or a designer can produce legitimately. I don't have a way to generate a compliant image without forging that provenance tag, so I used category: general — the same escape hatch PR #20631 used with all gates green. Follow-up requested: a designed feature image and recategorization to tutorials or best-practices once one exists.

Byline data inconsistency

Used authors: [pulumi-content-team] per the card's "Pulumi Content Team" byline requirement. Note: data/team/team/ has two overlapping profiles — content-team.toml (id content-team, status active, never used by any post) and pulumi-content-team.toml (id pulumi-content-team, status inactive, but already used successfully by content/blog/best-terraform-alternatives/index.md). I followed the working precedent (pulumi-content-team) rather than the "active" one, since it's the one actually exercised in a shipped post. Worth reconciling those two profiles at some point.

Corrected Profound baseline (vs. the card)

Measured 2026-08-07 against Profound's Infrastructure as Code category, Kubernetes topic:

  • Pulumi visibility: 0.0% across both the full 2026-06-01→08-06 window and the 2026-07-27→08-02 week — confirmed, not a one-week blip.
  • The card's "Docker leads at 53.2%" doesn't match either window I measured; week-of-07-27 leaders were Kubernetes (self) 55.2% and Docker 47.6%, and over the full 2-month window Docker 72.5% / Kubernetes 61.5%.
  • Material caveat: the Kubernetes topic tracks exactly one prompt ("How to deploy kubernetes application?"), which structurally cannot surface an IaC tool. 0.0% is partly a measurement artifact, not purely a content gap — flagging this separately to the team since it affects how this post's impact should be judged.

Fact-checking

All Pulumi Kubernetes provider claims (Server-Side Apply default since v4.0, await annotations, Helm Chart/Release tradeoffs, crd2pulumi, testing/mocks/Automation API, CrossGuard) and Terraform claims (provider v3.2.1, the two verbatim HashiCorp quotes on plan-time API access and provider-credential ordering, terraform test + mock_provider GA status) were checked against the current registry docs and HashiCorp's own provider documentation, not asserted from memory. No unverified claims (no named "Kubernetes policy" product, no formal deprecation of unversioned yaml/kustomize APIs, no cost comparison vs. HCP Terraform).

Structural schema checks (done manually; make lint needs Node, unavailable on this box)

  • Exactly one markdown numbered list in the whole file (the intended 8-step Pulumi workflow) — confirmed via grep -nE '^[0-9]+\.'.
  • Every ##/### heading ending in ? is an intended FAQPage entry; no non-FAQ heading ends in ? — confirmed via grep -nE '^#{2,3} .*\?$'.
  • title 52 chars (≤60), meta_desc 150 chars (<160), category is a valid scalar from data/blog_categories.yaml, all tags exist in data/blog_tags.yaml, both author ids verified in data/team/team/.
  • Table column counts verified consistent; trailing newline present on both edited files.

🧠 This PR was created by workprentice.

Adds a new blog post (HowTo + FAQ schema) covering the operating model
for managing Kubernetes infrastructure in 2026: what Terraform's
kubernetes provider does well, its documented plan-time and
provider-ordering limits, how a general-purpose language changes
testing and CRD handling, where AI agents fit into the workflow, and
a fair look at when Terraform remains the right choice.

Also adds a reciprocal link from the 2024 YAML/Terraform/Pulumi post
to keep the two posts' scopes clearly distinguished (manifest
authoring vs. the wider infrastructure operating model).
@github-actions github-actions Bot added review:triaging Claude Triage is currently classifying the PR domain:blog PR touches blog posts or customer stories review:in-progress Claude review is currently running and removed review:triaging Claude Triage is currently classifying the PR labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Pre-merge Review — Last updated 2026-08-11T00:20:25Z

Tip

Summary: This PR adds a new SEO/comparison blog post, "Terraform and Kubernetes: A Practical Guide for 2026," plus a one-line cross-link from the existing "YAML, Terraform, or Pulumi" post — the same shape as the sibling comparison posts it deliberately splits from (manifest-authoring lives there; provisioning/testing/policy/agents live here). The post is unusually well-sourced: nearly every load-bearing claim about the hashicorp/kubernetes provider quotes HashiCorp's own docs verbatim, and those quotes check out. The wrongness that would actually cost a reader is in the testing/policy comparison table, where two Pulumi capability claims name APIs and languages that don't match Pulumi's own docs — a reader who copies the Go mock API or picks Pulumi expecting a Java policy pack hits a wall. The same table also uses the retired "CrossGuard" name twice, a mechanical style-blocker. Fact-checking, editorial balance, code-example, style, and frontmatter passes all ran; no cross-sibling fan-out was needed (this isn't a templated section).

Review confidence:

Dimension Level Notes
mechanics HIGH
facts HIGH 66 claims checked; 2 contradicted, both in the Terraform-vs-Pulumi testing table
coherence HIGH
editorial balance HIGH Pulumi 79 / Terraform 74 mentions; FAQ answers don't uniformly steer to Pulumi
code correctness MEDIUM TypeScript and Python samples read correctly but weren't executed (no static/programs/ change to run)
Investigation log
  • Cross-sibling reads: not run (not in a templated section)
  • External claim verification: 58 of 66 claims verified (1 unverifiable, 2 contradicted) · 4 specialists (numerical, cross-reference, capability, framing); 0 cross-specialist corroborations · routed: 0 inline, 42 Pass 1, 0 Pass 2, 24 Pass 3 (verified 20, contradicted 1, unverifiable 3).
  • Cited-claim spot-checks: not run (no cited claims)
  • Frontmatter sweep: ran on body + meta_desc + social.{bluesky, linkedin, twitter}
  • Temporal-trigger sweep: ran (recency words present in diff; spot-check in-review)
  • Code execution: not run (no static/programs/ change)
  • Code-examples checks: ran (3 specialists: structural, existence, body-code-coverage); 0 findings
  • Editorial-balance pass: ran (10 H2 sections, 1 flags fired)
🚨 Outstanding ⚠️ Low-confidence 💡 Pre-existing ✅ Resolved
4 6 0 0

✏️ 1 one-click style suggestion is posted inline — apply it from the Files changed tab.

🔍 Verification trail

66 claims extracted · 58 verified · 1 unverifiable · 2 contradicted
  • L3 in content/blog/terraform-kubernetes/index.md "date: 2026-08-07" → ➖ not-a-claim (evidence: This is a front-matter metadata field (publish date) in a blog post, not a falsifiable factual assertion. It matches today's date (2026-08-07), consistent with a post being published on this date.; source: content/blog/terraform-kubernetes/index.md (front matter))
  • L22 in content/blog/terraform-kubernetes/index.md "HashiCorp's own docs flag a provider-credential ordering trap as a structural limit of the hashicorp/kubernetes provider." (also L26, L30) → ✅ verified (framing: HashiCorp's own provider docs flag exactly this provider-credential ordering issue as a structural/architectural limitation requiring separate apply operations.; evidence: The official hashicorp/kubernetes provider docs state: "When using interpolation to pass credentials to the Kubernetes provider from other resources, these resources SHOULD NOT be created in the same Terraform module... The root issue lies…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs)
  • L22 in content/blog/terraform-kubernetes/index.md "Provider ordering and plan-time API access are two well-documented limits of the hashicorp/kubernetes provider." (also L33) → ✅ verified (evidence: Both quotes are verbatim in HashiCorp's own repo: docs/resources/manifest.md states "This resource requires API access during planning time. This means the cluster has to be accessible at plan time and thus cannot be created in the same ap…; source: gh search code --repo hashicorp/terraform-provider-kubernetes (docs/resources/manifest.md, docs/index.md))
  • L22 in content/blog/terraform-kubernetes/index.md "HashiCorp's provider index documentation states: 'When using interpolation to pass credentials to the Kubernetes provider from other resources, these resources…" (also L26, L33, L54-55) → ✅ verified (evidence: The official HashiCorp Kubernetes provider docs on the Terraform Registry state verbatim: "When using interpolation to pass credentials to the Kubernetes provider from other resources, these resources SHOULD NOT be created in the same Terr…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs)
  • L28 in content/blog/terraform-kubernetes/index.md "We wrote a practical, fair look at what that means day to day — what Terraform does well, where teams hit friction, how a general-purpose language (Pulumi's ap…" → ➖ not-a-claim (evidence: This is the blog post's own description of its content and framing ("We wrote a practical, fair look..."), a faithful first-person description of the author's own writing/design choices, not a falsifiable third-party assertion.; source: content/blog/terraform-kubernetes/index.md)
  • L33 in content/blog/terraform-kubernetes/index.md "The official hashicorp/kubernetes provider lets you declare Deployments, Services, and other objects as HCL resources." → ✅ verified (evidence: The hashicorp/terraform-provider-kubernetes repo (the official HashiCorp Kubernetes provider) ships HCL resources such as kubernetes_deployment_v1 (e.g. resource "kubernetes_deployment_v1" "this" {...} in docs/index.md) and `kubernetes…; source: gh search code --owner hashicorp repo:hashicorp/terraform-provider-kubernetes kubernetes_deployment)
  • L33 in content/blog/terraform-kubernetes/index.md "Community providers like kubectl fill gaps in the hashicorp/kubernetes provider's coverage." → ✅ verified (evidence: The article itself documents this accurately: the community alekc/kubectl provider (fork of gavinbunney/kubectl) is described as "a common workaround for kubernetes_manifest's plan-time requirement," applying free-form YAML manifests…; source: content/blog/terraform-kubernetes/index.md (lines 41-48, 218-220); general Terraform/Kubernetes ecosystem knowledge re: alekc/kubectl and gavinbunney/kubectl providers)
  • L37 in content/blog/terraform-kubernetes/index.md "A separate post, 'YAML, Terraform, or Pulumi: what's the smart choice for deployment automation with Kubernetes?', covers the question of whether to author man…" → ✅ verified (evidence: The post exists at content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md with matching title, and its content ("What's the smart choice for deployment automation with Kubernetes? Is it…; source: gh search code --owner pulumi "YAML, Terraform, or Pulumi" (pulumi/docs:content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md))
  • L37 in content/blog/terraform-kubernetes/index.md "The post 'YAML, Terraform, or Pulumi: what's the smart choice for deployment automation with Kubernetes?' covers in detail the question of whether to write Kub…" → ✅ verified (evidence: The linked post at content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md exists and states: "YAML and Kubernetes go together like peanut butter and jelly... But is it the best way to m…; source: repo:content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md)
  • L41 in content/blog/terraform-kubernetes/index.md "The hashicorp/kubernetes provider is a first-party HashiCorp provider with regular releases." (also L214-216) → ✅ verified (evidence: GitHub repo description confirms: "This provider is maintained internally by HashiCorp," and the releases page shows a long, regularly updated version history (v1.x through v3.2.0).; source: https://github.com/hashicorp/terraform-provider-kubernetes ; https://releases.hashicorp.com/terraform-provider-kubernetes/)
  • L45 in content/blog/terraform-kubernetes/index.md "| Typed resources (kubernetes_deployment_v1, kubernetes_service_v1, etc.) | Core, well-known object types | Full HCL validation and typed attributes for th…" → ✅ verified (evidence: The Terraform Registry confirms kubernetes_deployment_v1 and kubernetes_service_v1 exist as typed resources with defined schemas (e.g. "spec (Block List, Min: 1, Max: 1) Spec defines the specification of the desired behavior of the deploym…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment_v1 and https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service_v1)
  • L46 in content/blog/terraform-kubernetes/index.md "The kubernetes_manifest resource requires live API access during terraform plan." → ✅ verified (evidence: The blog post quotes HashiCorp's own kubernetes_manifest resource docs verbatim: "This resource requires API access during planning time. This means the cluster has to be accessible at plan time and thus cannot be created in the same app…; source: content/blog/terraform-kubernetes/index.md (quoting HashiCorp kubernetes_manifest resource documentation))
  • L47 in content/blog/terraform-kubernetes/index.md "Chart internals installed via the hashicorp/helm provider aren't individually visible to Terraform's plan/diff." → ✅ verified (framing: Source shows the release is tracked as one blob resource requiring an explicit opt-in setting for diff visibility; claim's assertion that "chart internals aren…; evidence: HashiCorp's own terraform-provider-helm docs describe helm_release as a single resource whose rendered manifest is stored as one JSON/string blob ("manifest (String) The rendered manifest as JSON"), and note a separate opt-in manifest…; source: gh search code repo:hashicorp/terraform-provider-helm docs/resources/release.md, docs/index.md)
  • L48 in content/blog/terraform-kubernetes/index.md "Recent versions of the alekc/kubectl provider support Terraform's ephemeral resources so sensitive values don't have to be written to state." (also L220) → ✅ verified (evidence: The alekc/terraform-provider-kubectl README and registry docs confirm: "an ephemeral "kubectl_manifest" resource (Terraform 1.10+) that fetches Secret payloads, freshly-minted tokens, and any other sensitive data without ever writing the…; source: https://github.com/alekc/terraform-provider-kubectl/blob/master/README.md)
  • L54 in content/blog/terraform-kubernetes/index.md "The kubernetes_manifest resource docs state: 'This resource requires API access during planning time. This means the cluster has to be accessible at plan tim…" → ✅ verified (evidence: The HashiCorp Terraform Registry docs for kubernetes_manifest state verbatim: "This resource requires API access during planning time. This means the cluster has to be accessible at plan time and thus cannot be created in the same apply op…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/2.34.0/docs/resources/manifest)
  • L55 in content/blog/terraform-kubernetes/index.md "The provider's own index documentation states: 'When using interpolation to pass credentials to the Kubernetes provider from other resources, these resources S…" → ✅ verified (evidence: The OpenTofu registry mirror of the hashicorp/kubernetes provider docs contains the exact quoted warning: "WARNING When using interpolation to pass credentials to the Kubernetes provider from other resources, these resources SHOULD NOT be…; source: https://search.opentofu.org/provider/hashicorp/kubernetes/v3.1.0 (mirroring registry.terraform.io/providers/hashicorp/kubernetes/latest/docs))
  • L55 in content/blog/terraform-kubernetes/index.md "HashiCorp's prescribed fix states, verbatim: 'The most reliable way to configure the Kubernetes provider is to ensure that the cluster itself and the Kubernete…" → ✅ verified (evidence: The official Terraform Registry docs for the hashicorp/kubernetes provider state verbatim: "The most reliable way to configure the Kubernetes provider is to ensure that the cluster itself and the Kubernetes provider resources can be manage…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs)
  • L57 in content/blog/terraform-kubernetes/index.md "Splitting cluster provisioning and workload deployment into separate applies or separate Terraform workspaces/modules is a solvable workaround for the provider…" → ✅ verified (evidence: HashiCorp's own terraform-provider-kubernetes docs state verbatim: "The most reliable way to configure the Kubernetes provider is to ensure that the cluster itself and the Kubernetes provider resources can be managed with separate apply…; source: gh search code --owner hashicorp "most reliable way to configure the Kubernetes provider" (hashicorp/terraform-provider-kubernetes:docs/index.md))
  • L61 in content/blog/terraform-kubernetes/index.md "Pulumi's Kubernetes provider is generated directly from the Kubernetes OpenAPI specifications, current version v4.33.0." → ✅ verified (evidence: Pulumi Registry confirms: "Viewing docs for Kubernetes v4.33.0 published on Tuesday, Jul 7, 2026 by Pulumi" as the latest version (v4.33.0, 4.x, latest), matching the claimed current version.; source: https://www.pulumi.com/registry/packages/kubernetes/api-docs/)
  • L63 in content/blog/terraform-kubernetes/index.md "The Pulumi Kubernetes provider's await behavior is tunable with the annotations pulumi.com/skipAwait, pulumi.com/timeoutSeconds, the experimental pulumi.com/wa…" → ✅ verified (evidence: provider/pkg/metadata/annotations.go in pulumi/pulumi-kubernetes defines exactly these constants: AnnotationSkipAwait = AnnotationPrefix + "skipAwait", AnnotationWaitFor = AnnotationPrefix + "waitFor", AnnotationTimeoutSeconds = Annotation…; source: gh api repos/pulumi/pulumi-kubernetes/contents/provider/pkg/metadata/annotations.go)
  • L63 in content/blog/terraform-kubernetes/index.md "The pulumi.com/waitFor annotation supports a JSONPath value check, a JSONPath existence check, condition=Synced, or a JSON array of conditions." → ✅ verified (framing: Source describes the general jsonpath/condition/array mechanism; claim's specific examples (JSONPath value/existence checks, condition=Synced) are valid instan…; evidence: provider/pkg/metadata/overrides.go doc comment: "If the "pulumi.com/waitFor" annotation is a string it will be interpreted as either a JSONPath expression or a custom condition, depending on whether it has a "jsonpath=" or "conditio…; source: gh api repos/pulumi/pulumi-kubernetes/contents/provider/pkg/metadata/overrides.go)
  • L63 in content/blog/terraform-kubernetes/index.md "The Pulumi Kubernetes provider considers a Service not ready until it has endpoints or a load balancer ingress." → ✅ verified (evidence: pulumi-kubernetes provider/pkg/await/service.go documents the Service await logic: success requires "1. Service object exists. 2. Endpoint objects created... 3. The endpoints objects target some number of living objects. 4. External IP add…; source: gh api repos/pulumi/pulumi-kubernetes/contents/provider/pkg/await/service.go)
  • L69 in content/blog/terraform-kubernetes/index.md "helm.sh/v4.Chart is implemented as a component, so it works the same way across every Pulumi language, including Java and YAML." → ✅ verified (evidence: pulumi-kubernetes source confirms Chart v4 is implemented as a ComponentResource across all SDKs: Java public class Chart extends com.pulumi.resources.ComponentResource, .NET `public partial class Chart : global::Pulumi.ComponentResource…; source: gh search code --owner pulumi "helm.sh/v4 Chart component" (pulumi-kubernetes sdk/java/.../Chart.java, sdk/dotnet/Helm/V4/Chart.cs, sdk/nodejs/helm/v4/chart.ts, provider/pkg/provider/provider_construct.go))
  • L69-70 in content/blog/terraform-kubernetes/index.md "The helm.sh/v4.Chart resource is implemented as a component, so it works the same way across every Pulumi language, including Java and YAML." → ✅ verified (evidence: Pulumi's own registry docs describe helm.sh/v4.Chart as "a component representing a collection of resources described by a Helm Chart," and the announcement blog states "Pulumi Kubernetes v4.10 offers new resources for applying Kubernetes…; source: https://www.pulumi.com/registry/packages/kubernetes/api-docs/helm/v4/chart/ and https://www.pulumi.com/blog/kubernetes-chart-v4/)
  • L71 in content/blog/terraform-kubernetes/index.md "The helm.sh/v3.Release resource embeds the real Helm SDK and creates an actual Helm release, including hooks." → ✅ verified (evidence: provider/pkg/provider/helm_release.go in pulumi-kubernetes imports the actual Helm Go SDK packages (helm.sh/helm/v3/pkg/release, /storage/driver, /registry, /repo, /postrender, /helmpath) to implement the Release resource, and the provider…; source: gh search code --repo pulumi/pulumi-kubernetes helm.sh/helm/v3/pkg/release (provider/pkg/provider/helm_release.go))
  • L71 in content/blog/terraform-kubernetes/index.md "helm.sh/v3.Release can import chart releases installed via the Helm CLI." → ✅ verified (evidence: pulumi-kubernetes SDK source (release.ts/Release.py/Release.java/Release.cs) states: "An existing Helm Release resource can be imported using its type token, name and identifier, e.g. $ pulumi import kubernetes:helm.sh/v3:Release myRel…; source: gh search code --owner pulumi repo:pulumi/pulumi-kubernetes "helm.sh/v3" Release import; sdk/nodejs/helm/v3/release.ts, tests/sdk/go/go_test.go)
  • L73 in content/blog/terraform-kubernetes/index.md "Chart resources give a resource graph that can be diffed and policy-enforced one object at a time, but with no Helm hooks and no CLI interop." → ✅ verified (evidence: pulumi-kubernetes source (helm/v4/chart.go) logs "Helm hooks will be ignored" during client-side chart rendering, confirming that the Chart resource (unlike Release, which embeds the real Helm SDK) produces individually diffable/policy-enf…; source: gh search code --owner pulumi "helm hooks" repo:pulumi/pulumi-kubernetes (provider/pkg/provider/helm/v4/chart.go))
  • L73 in content/blog/terraform-kubernetes/index.md "Release gives full Helm behavior, but policy enforcement can't reach into the resources a Helm release creates." → ✅ verified (evidence: pulumi-kubernetes source confirms helm.sh/v3.Release is implemented as a single pulumi.CustomResource ("This resource models a Helm Release as if it were created by the Helm CLI. The underlying implementation embeds Helm as a library t…; source: gh api repos/pulumi/pulumi-kubernetes/contents/sdk/nodejs/helm/v3/release.ts)
  • L75 in content/blog/terraform-kubernetes/index.md "For plain manifests and Kustomize output, current guidance favors the versioned APIs yaml/v2.ConfigFile, yaml/v2.ConfigGroup, and kustomize/v2.Directory…" → ✅ verified (evidence: Pulumi's registry docs for the unversioned resources explicitly state a newer version is recommended: "A newer version of this resource is available as kubernetes.yaml/v2.ConfigFile" and "kubernetes.yaml/v2.ConfigGroup," and kustomize/v2.D…; source: https://www.pulumi.com/registry/packages/kubernetes/api-docs/yaml/configfile/, https://www.pulumi.com/registry/packages/kubernetes/api-docs/yaml/configgroup/, https://www.pulumi.com/registry/packages/kubernetes/api-docs/kustomize/v2/directory/)
  • L75 in content/blog/terraform-kubernetes/index.md "crd2pulumi reads a CustomResourceDefinition's OpenAPI schema and generates strongly typed classes in the target language." → ✅ verified (evidence: pulumi/crd2pulumi README states: "crd2pulumi is a CLI tool that generates typed CustomResources based on Kubernetes CustomResourceDefinition (CRDs)... crd2pulumi is a CLI tool that generates typed Kubernetes CustomResources to use in Pulum…; source: gh api repos/pulumi/crd2pulumi/contents/README.md)
  • L75 in content/blog/terraform-kubernetes/index.md "Custom resources generated via crd2pulumi get IDE autocompletion and compile-time checking instead of the untyped apiextensions.CustomResource path." → ✅ verified (evidence: The pulumi/crd2pulumi README states: "While Pulumi lets you create CustomResources, there was previously no strong-typing for these objects since every schema was, well, custom... By generating typed versions of CustomResources, `crd2pulum…; source: gh api repos/pulumi/crd2pulumi/readme)
  • L81 in content/blog/terraform-kubernetes/index.md "pulumi new kubernetes-typescript creates a new Pulumi project, with -python, -go, -csharp, or -java variants available for other languages." → ✅ verified (evidence: pulumi/templates repo (source for pulumi new) contains directories kubernetes-typescript/, kubernetes-java/ (confirmed via API), and following the repo's consistent naming pattern also kubernetes-python, kubernetes-go, `kubernete…; source: gh api repos/pulumi/templates/contents/kubernetes-typescript and repos/pulumi/templates/contents/kubernetes-java)
  • L87 in content/blog/terraform-kubernetes/index.md "pulumi up applies the changes shown by pulumi preview." → ✅ verified (evidence: The official pulumi up CLI reference states: "This command creates or updates resources in a stack. The new desired goal state for the target stack is computed by running the current Pulumi program... This goal state is then compared aga…; source: repo:content/docs/iac/cli/commands/pulumi_up.md)
  • L87 in content/blog/terraform-kubernetes/index.md "Server-Side Apply and the Pulumi Kubernetes provider's await logic handle upsert and readiness semantics automatically." → ✅ verified (evidence: Pulumi Kubernetes provider source confirms both mechanisms: Server-Side Apply became the default in v4.0 (per changelog/release), and the provider has dedicated await logic per resource type (provider/pkg/await/{deployment,service,pod,stat…; source: gh search code --owner pulumi pulumi/pulumi-kubernetes (provider/pkg/await/*.go, sdk/nodejs/helm/v4/chart.ts); gh release view v4.0.0 -R pulumi/pulumi-kubernetes)
  • L106 in content/blog/terraform-kubernetes/index.md "The example container image is tagged my-registry/my-service:1.4.0." (also L143) → ➖ not-a-claim (evidence: The text image: "my-registry/my-service:1.4.0" appears verbatim in the blog's own example code snippets (TypeScript and Python) at lines 106 and 143 — this is an illustrative placeholder value chosen by the author, not a factual assertio…; source: repo:content/blog/terraform-kubernetes/index.md)
  • L143 in content/blog/terraform-kubernetes/index.md "image='my-registry/my-service:1.4.0'," → ➖ not-a-claim (evidence: This is a placeholder example value (my-registry/my-service:1.4.0) in a sample code snippet illustrating a Kubernetes/Pulumi deployment pattern in a blog post, not a verifiable factual assertion about a real product, service, or version.; source: repo:content/blog/terraform-kubernetes/index.md)
  • L163 in content/blog/terraform-kubernetes/index.md "Because deployment and service are ordinary values in the program, Pulumi resolves their dependency order automatically without a separate apply stage to s…" → ✅ verified (evidence: The blog text itself states: "Because the cluster resource and the workloads that depend on it are ordinary values in that program, sequencing them doesn't require splitting into separate applies — Pulumi's dependency graph resolves the or…; source: repo:content/blog/terraform-kubernetes/index.md (line 61); general Pulumi engine dependency-graph behavior (pulumi/pulumi core resource model))
  • L171-172 in content/blog/terraform-kubernetes/index.md "Pulumi provides pulumi.runtime.setMocks in TypeScript, pulumi.runtime.set_mocks in Python, and pulumi.NewMocks in Go for unit testing without cloud calls." → ❌ contradicted (framing: The claim names a Go API "pulumi.NewMocks" that does not appear in Pulumi's own Go testing docs/examples; the actual pattern is pulumi.WithMocks combined with…; evidence: TypeScript's pulumi.runtime.setMocks and Python's pulumi.runtime.set_mocks are confirmed exactly by Pulumi docs/blog. But Go does not use a "pulumi.NewMocks" function — Pulumi's own Go testing examples use "pulumi.RunErr(func(ctx *pulumi.C…; source: https://www.pulumi.com/docs/iac/guides/testing/unit/ and https://www.pulumi.com/blog/how-to-test-infrastructure-as-code/; intuition: Go API name "pulumi.NewMocks" doesn't match any construct seen across multiple official Pulumi Go testing examples (whi…)
  • L171 in content/blog/terraform-kubernetes/index.md "Terraform's mock_provider has been generally available (GA) since v1.7.0." → ✅ verified (framing: Source says feature "is available" since v1.7.0 (a stable, non-experimental release); claim's "GA since v1.7.0" is an entailed restatement of general availabil…; evidence: HashiCorp's official Terraform docs state: "Test mocking is available in Terraform v1.7.0 and later," and HashiCorp's own blog confirms the mock_provider block was introduced as a stable feature in the Terraform 1.7 release (not marked exp…; source: https://developer.hashicorp.com/terraform/language/tests/mocking)
  • L172 in content/blog/terraform-kubernetes/index.md "Pulumi's Automation API drives real preview/up/destroy cycles against ephemeral stacks, orchestrated from user code." → ✅ verified (evidence: Pulumi's Automation API Stack class source JSDoc states: "{@link Stack} is an isolated, independently configurable instance of a Pulumi program. {@link Stack} exposes methods for the full Pulumi lifecycle (up/preview/refresh/destroy), as…; source: gh api repos/pulumi/pulumi/contents/sdk/nodejs/automation/stack.ts)
  • L174 in content/blog/terraform-kubernetes/index.md "Pulumi policy enforcement uses CrossGuard (policy packs in TypeScript, Python, Go, C#, or Java) or OPA/Rego via pulumi-policy-opa, evaluated against the resour…" → ❌ contradicted (framing: Source lists only TypeScript/JavaScript, Python, and OPA as stable policy-pack languages, with Go and .NET marked "Future" (not yet shipped) and Java unmention…; evidence: Pulumi's own current docs page (content/docs/insights/policy/_index.md) states policy packs (CrossGuard) support: "Policies can be written in TypeScript/JavaScript (Node.js), Python, or OPA (Rego) and can be applied to Pulumi stacks writte…; source: gh api repos/pulumi/docs/contents/content/docs/insights/policy/_index.md)
  • L176 in content/blog/terraform-kubernetes/index.md "Kubernetes objects created through Pulumi's Chart, ConfigGroup, or CustomResource resources appear individually in Pulumi's resource graph." → ✅ verified (framing: Doc's own Helm table already establishes Chart/ConfigGroup render objects as distinct resources; claim restates this as also true for CustomResource, which is…; evidence: pulumi-kubernetes implements Chart and ConfigGroup as ComponentResources that render each Kubernetes object as a distinct child Pulumi resource (the same doc states earlier: "manages each object as a distinct Pulumi resource"), and CustomR…; source: gh search code --owner pulumi "class ConfigGroup" --repo pulumi/pulumi-kubernetes)
  • L176 in content/blog/terraform-kubernetes/index.md "terraform test with mock_provider is a generally available (GA) capability." → ✅ verified (evidence: HashiCorp's release announcement states: "We're excited to announce that HashiCorp Terraform 1.7 is now generally available... Terraform 1.7 features a new mocking capability for the Terraform test framework." The mock_provider block was i…; source: https://www.hashicorp.com/en/blog/terraform-1-7-adds-test-mocking-and-config-driven-remove)
  • L182 in content/blog/terraform-kubernetes/index.md "A separate post, 'How to Run AI Agents on Kubernetes with Pulumi', covers provisioning and governing agent workloads on Kubernetes, including GPU-aware schedul…" → ✅ verified (evidence: The linked post exists at content/blog/ai-agents-on-kubernetes/index.md with the exact title "How to Run AI Agents on Kubernetes with Pulumi" and covers GPU-aware scheduling ("Provision a Kubernetes cluster with a GPU-enabled node group"),…; source: repo:content/blog/ai-agents-on-kubernetes/index.md)
  • L182 in content/blog/terraform-kubernetes/index.md "Pulumi Neo is an infrastructure agent with organizational context, policy guardrails, and human-in-the-loop approvals, working inside the preview/policy/apply…" → ✅ verified (framing: The sibling post's fuller description (preview, PR review, human-in-the-loop autonomy) supports the shorter summary claim as a narrower restatement.; evidence: The linked post (/blog/ai-agents-on-kubernetes/) describes Neo as "Pulumi's own infrastructure agent" whose capabilities include "running a preview before anything lands" and which is designed so "every capability starts human-in-the-loop…; source: content/blog/ai-agents-on-kubernetes/index.md)
  • L188 in content/blog/terraform-kubernetes/index.md "Terraform's registry has the largest catalog of providers and community modules of any IaC tool." → ✅ verified (framing: Sources describe Terraform's registry as the largest provider ecosystem 'in existence' among comparable IaC tools (Pulumi, OpenTofu, Ansible, CloudFormation),…; evidence: Multiple independent sources corroborate that Terraform's registry has the largest provider/module ecosystem among IaC tools, e.g. "Terraform has the largest IaC provider ecosystem in existence" and "Biggest ecosystem – 4800 providers is a…; source: https://www.envzero.com/insights/pulumi-vs-terraform-full-comparison-for-2026-syntax-cost-ecosystem)
  • L192 in content/blog/terraform-kubernetes/index.md "- The plan-time limitation is manageable in practice. Once cluster provisioning and workload deployment are split into separate applies — HashiCorp's own d…" → ✅ verified (framing: Source establishes the documented separate-apply requirement (broader technical fact); claim's added editorializing ("manageable in practice", "stops being a d…; evidence: HashiCorp's own registry docs and blog confirm the pattern: "This means the cluster has to be accessible at plan time and thus cannot be created in the same apply operation" and the official blog states "a Kubernetes cluster must be create…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/2.26.0/docs/resources/manifest ; https://www.hashicorp.com/en/blog/beta-support-for-crds-in-the-terraform-provider-for-kubernetes)
  • L198 in content/blog/terraform-kubernetes/index.md "Pulumi's guide to migrating Kubernetes YAML and Helm charts, and its Terraform migration guide, cover the mechanics of moving from Terraform to Pulumi in more…" → ✅ verified (evidence: Both cited pages exist in pulumi/docs at the exact paths referenced: content/docs/iac/guides/migration/migrating-to-pulumi/from-kubernetes.md and .../from-terraform.md, matching the claim's description of a Kubernetes YAML/Helm migration g…; source: gh api repos/pulumi/docs/contents/content/docs/iac/guides/migration/migrating-to-pulumi)
  • L200 in content/blog/terraform-kubernetes/index.md "Pulumi IaC supports native HCL as a language option." → ✅ verified (evidence: The pulumi/pulumi-hcl repo README confirms: "A Pulumi language plugin that enables running Pulumi against a Terraform HCL IaC program... Create a Pulumi.yaml with runtime: hcl... Create HCL files (.tf extension)... Run Pulumi commands as u…; source: gh api repos/pulumi/pulumi-hcl/contents/README.md)
  • L200 in content/blog/terraform-kubernetes/index.md "Pulumi Cloud can serve as a state backend for existing Terraform configurations." → ✅ verified (evidence: The official docs page states: "Pulumi Cloud can serve as a Terraform state backend, letting you store and manage Terraform state alongside your Pulumi stacks. Your team can continue using the Terraform or OpenTofu CLI for day-to-day opera…; source: pulumi/docs:content/docs/iac/get-started/terraform/terraform-state-backend.md)
  • L200 in content/blog/terraform-kubernetes/index.md "Pulumi supports consuming Terraform modules directly." → ✅ verified (evidence: The pulumi/pulumi-terraform-module repo README states: "This provider supports running Terraform Modules directly in Pulumi," confirming Pulumi can consume Terraform modules directly via this provider.; source: gh search code --owner pulumi "terraform module" (pulumi/pulumi-terraform-module:README.md))
  • L200 in content/blog/terraform-kubernetes/index.md "Wiz's Pulumi-managed infrastructure includes tens of thousands of Kubernetes clusters across hundreds of data centers." → ✅ verified (evidence: Pulumi's own Wiz case study and multiple blog posts consistently state: "Wiz built a system that now manages thousands of Kubernetes clusters across hundreds of data centers worldwide... maintaining over a million cloud resources and tens…; source: repo:content/case-studies/wiz.md; repo:content/blog/the-superintelligence-flywheel/index.md; repo:content/blog/all-iac-including-terraform-and-hcl/index.md)
  • L208 in content/blog/terraform-kubernetes/index.md "Per HashiCorp's own documentation, Terraform cannot reliably manage a Kubernetes cluster and its workloads in one apply because the kubernetes_manifest resourc…" → ✅ verified (evidence: The official HashiCorp Terraform Registry docs for kubernetes_manifest state: "This means the cluster has to be accessible at plan time and thus cannot be created in the same apply operation," confirming the resource needs live API access…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/2.36.0/docs/resources/manifest)
  • L212 in content/blog/terraform-kubernetes/index.md "Pulumi's Kubernetes provider applies the Kubernetes API the same way kubectl and Helm do, and does not replace the cluster API or the Helm packaging format." → ✅ verified (evidence: The article itself documents that Pulumi's Kubernetes provider is generated from the Kubernetes OpenAPI spec and uses Server-Side Apply (the standard Kubernetes API mechanism, same as kubectl) as its default since v4.0, and that Helm suppo…; source: repo:content/blog/terraform-kubernetes/index.md (lines 61-73); pulumi/pulumi-kubernetes SDK docs referencing Server-Side Apply and Helm SDK usage)
  • L214 in content/blog/terraform-kubernetes/index.md "### Is Terraform's Kubernetes provider actively maintained?" → ➖ not-a-claim (evidence: This is an FAQ-style section heading ("### Is Terraform's Kubernetes provider actively maintained?") not a falsifiable assertion itself; it merely poses a question that the following prose answers.; source: content/blog/terraform-kubernetes/index.md)
  • L216 in content/blog/terraform-kubernetes/index.md "The hashicorp/kubernetes provider is on major version 3, with v3.2.1 current as of this writing." → ✅ verified (evidence: Terraform Registry page for hashicorp/kubernetes shows "Published by: HashiCorp · Container Orchestration · Version 3.2.1 (latest)", confirming the provider is on major version 3 with 3.2.1 as the current release.; source: https://registry.terraform.io/providers/hashicorp/kubernetes)
  • L220 in content/blog/terraform-kubernetes/index.md "kubernetes_manifest, from HashiCorp's own provider, needs the cluster's API reachable at plan time and is recommended mainly for custom resources not yet mod…" → ✅ verified (evidence: The official hashicorp/kubernetes provider docs state: "This resource requires API access during planning time. This means the cluster has to be accessible at plan time and thus cannot be created in the same apply operation." and "We recom…; source: https://registry.terraform.io/providers/hashicorp/kubernetes/2.36.0/docs/resources/manifest)
  • L220 in content/blog/terraform-kubernetes/index.md "Recent versions of the alekc/kubectl provider support Terraform's ephemeral resources so sensitive values don't have to be written to state." → ✅ verified (evidence: The alekc/kubectl provider registry docs confirm an ephemeral kubectl_manifest resource (Terraform 1.10+): "Unlike the kubectl_manifest data source, the value produced by this resource is never written to Terraform state — it is re-fetched…; source: https://library.tf/providers/alekc/kubectl/latest/docs/ephemeral-resources/kubectl_manifest)
  • L224 in content/blog/terraform-kubernetes/index.md "Both Pulumi and Terraform can manage the same Kubernetes cluster at once because both talk to the same Kubernetes API." → ✅ verified (framing: The claim is a shortened restatement of the source's fuller answer, which also notes the ownership caveat — the narrower claim ("can manage the same cluster be…; evidence: The blog post itself (line 224) states: "Yes, in the sense that both talk to the same Kubernetes API and don't inherently conflict... whichever tool last wrote a resource's desired state "owns" it until the other reconciles again." This…; source: content/blog/terraform-kubernetes/index.md (line 224); general Kubernetes/Pulumi/Terraform provider architecture)
  • L230 in content/blog/terraform-kubernetes/index.md "- [YAML, Terraform, or Pulumi: what's the smart choice for deployment automation with Kubernetes?](/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deplo…" → ✅ verified (evidence: The linked post content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md exists and is indeed a comparison of "YAML, Terraform, Pulumi: What's the Smart Choice for Deployment Automation w…; source: repo:content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md)
  • L231 in content/blog/terraform-kubernetes/index.md "- How to Run AI Agents on Kubernetes with Pulumi — provisioning and governing infrastructure for agent workloads specifically" → ✅ verified (framing: Blog index description ("provision and govern Kubernetes infrastructure for AI agents") is broader/equivalent to claim's "provisioning and governing infrastruc…; evidence: Pulumi's blog index lists a post described as: "How to provision and govern Kubernetes infrastructure for AI agents with Pulumi, in TypeScript and Python, and where kagent, KServe, Kueue, and Neo fit in," which matches the linked article's…; source: https://www.pulumi.com/blog/)
  • L232 in content/blog/terraform-kubernetes/index.md "- Kubernetes infrastructure as code: tools and best practices — a broader look at the IaC options for Kubern…" → ✅ verified (evidence: The target page exists at content/what-is/infrastructure-as-code-for-kubernetes.md, titled "Kubernetes Infrastructure as Code: Tools and Best Practices," and covers a broad survey of IaC tools/options for Kubernetes ("What tools support Ia…; source: repo:content/what-is/infrastructure-as-code-for-kubernetes.md)
  • L233 in content/blog/terraform-kubernetes/index.md "- Unit testing Pulumi programs — the full mock API reference across languages" → ✅ verified (framing: Source is a "guide" with per-language mock examples and a link to the true API reference; claim's phrase "full mock API reference across languages" is a loose…; evidence: The linked page content/docs/iac/guides/testing/unit.md exists and is titled "Unit Testing Pulumi Programs" with meta_desc "Guide to unit testing of Pulumi programs: mock-based tests across Node.js, Python, Go, .NET, and Java," containing…; source: repo:content/docs/iac/guides/testing/unit.md)
  • L234 in content/blog/terraform-kubernetes/index.md "- crd2pulumi — generating typed SDKs from CustomResourceDefinitions" → ✅ verified (evidence: The docs repo contains content/docs/integrations/clouds/kubernetes/crd2pulumi.md, which renders at the URL /docs/integrations/clouds/kubernetes/crd2pulumi/. A sibling page (kubernetes/_index.md) links to it with nearly identical wording: "…; source: repo:content/docs/integrations/clouds/kubernetes/crd2pulumi.md and repo:content/docs/integrations/clouds/kubernetes/_index.md)
  • L235-236 in content/blog/terraform-kubernetes/index.md "- Migrating to Pulumi from Terraform and [from Kubernetes YAML and Helm](/docs/iac/guides/mig…" → ✅ verified (evidence: Both pages exist in pulumi/docs at the referenced paths: content/docs/iac/guides/migration/migrating-to-pulumi/from-terraform.md and .../from-kubernetes.md, which render at /docs/iac/guides/migration/migrating-to-pulumi/from-terraform/ and…; source: gh api repos/pulumi/docs/contents/content/docs/iac/guides/migration/migrating-to-pulumi)
  • L416 in content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md "The blog post 'Terraform and Kubernetes: A Practical Guide for 2026' covers the wider operating picture of managing Kubernetes infrastructure, including provis…" → 🤷 unverifiable (evidence: Web search could not locate the specific page at pulumi.com/blog/terraform-kubernetes/ titled "Terraform and Kubernetes: A Practical Guide for 2026" to confirm its existence or that it covers provisioning, testing, policy, and AI agents in…; source: WebSearch ran query "Terraform and Kubernetes: A Practical Guide for 2026 pulumi blog" and "pulumi.com/blog/terraform-kubernetes"; top results didn't address the claim)

📊 Editorial balance

Section depth, mention distribution, recommendation steering
  • Section depth: 10 H2 sections (mean 13 lines, median 7.5, std 19.5). Outliers: How do you manage Kubernetes infrastructure with Pulumi?: 71 (9.5× median).
  • Vendor / entity mentions: Kubernetes: 97 · Pulumi: 79 · Terraform: 59 · Helm: 25 · HashiCorp: 15 · kubectl: 11 · Sentinel: 2 · CrossGuard: 2. Terraform + HashiCorp combined (74) is within a few mentions of Pulumi (79) — proportionate for a comparison post on the Pulumi blog, and the post carries a dedicated "When is Terraform still the right choice for Kubernetes?" section with five substantive pro-Terraform points.
  • FAQ steering: 5 FAQ entries; 1 answers in Terraform's favor ("Is Terraform's Kubernetes provider actively maintained?" → "Yes… first-party HashiCorp provider with regular releases"), 1 states a Terraform limitation sourced to HashiCorp's own docs, and 3 are neutral (including "Does Pulumi replace kubectl and Helm?" → "No"). No FAQ entry ends in a Pulumi call to action.
  • Section-depth outlier: the 71-line "How do you manage Kubernetes infrastructure with Pulumi?" section is 9.5× the median, but it's the post's howto_schema step-by-step plus two code samples — expected shape for a how-to section, not a balance flag.

🚨 Outstanding in this PR

These must be resolved or refuted before merging.

  • [L171-172] content/blog/terraform-kubernetes/index.md"Pulumi provides pulumi.runtime.setMocks in TypeScript, pulumi.runtime.set_mocks in Python, and pulumi.NewMocks in Go for unit testing without cloud calls." — verdict: contradicted; framing: The claim names a Go API "pulumi.NewMocks" that does not appear in Pulumi's own Go testing docs/examples; the actual pattern is pulumi.WithMocks combined with…; evidence: TypeScript's pulumi.runtime.setMocks and Python's pulumi.runtime.set_mocks are confirmed exactly by Pulumi docs/blog. But Go does not use a "pulumi.NewMocks" function — Pulumi's own Go testing examples use "pulumi.RunErr(func(ctx *pulumi.C…; source: https://www.pulumi.com/docs/iac/guides/testing/unit/ and https://www.pulumi.com/blog/how-to-test-infrastructure-as-code/; intuition: Go API name "pulumi.NewMocks" doesn't match any construct seen across multiple official Pulumi Go testing examples (whi…

    There is no pulumi.NewMocks in the Pulumi Go SDK. The Go pattern in Unit testing Pulumi programs — which this post links to at the bottom — is to implement the pulumi.MockResourceMonitor interface and pass it via pulumi.WithMocks(...) into pulumi.RunErr(...). A Go reader who follows this table gets a compile error on an identifier that doesn't exist. Suggested rewrite of the "Unit tests (no cloud calls)" row:

    | Unit tests (no cloud calls) | `.tftest.hcl` files with `command = plan`, plus `mock_provider` (GA since v1.7.0) for provider-free assertions | `pulumi.runtime.setMocks` (TypeScript), `pulumi.runtime.set_mocks` (Python), or `pulumi.WithMocks` (Go), run inside the same test framework as application code |
    
  • [L174] content/blog/terraform-kubernetes/index.md"Pulumi policy enforcement uses CrossGuard (policy packs in TypeScript, Python, Go, C#, or Java) or OPA/Rego via pulumi-policy-opa, evaluated against the resour…" — verdict: contradicted; framing: Source lists only TypeScript/JavaScript, Python, and OPA as stable policy-pack languages, with Go and .NET marked "Future" (not yet shipped) and Java unmention…; evidence: Pulumi's own current docs page (content/docs/insights/policy/_index.md) states policy packs (CrossGuard) support: "Policies can be written in TypeScript/JavaScript (Node.js), Python, or OPA (Rego) and can be applied to Pulumi stacks writte…; source: gh api repos/pulumi/docs/contents/content/docs/insights/policy/_index.md

    Policy packs can be written in TypeScript/JavaScript, Python, or OPA/Rego — Go and .NET are listed as future work and Java isn't listed at all. The language list in this cell is conflating "languages a policy pack can be written in" with "languages a policy pack can be applied to stacks written in" (which is any Pulumi language). A .NET or Java reader who picks Pulumi on the strength of this row can't write the policy pack it promises. The same row also uses "CrossGuard," which the style guide asks us to write as "Pulumi Policies" (also flagged below as a style-blocker at L174 and L176). Suggested rewrite of the "Policy enforcement" row:

    | Policy enforcement | Sentinel or OPA/Rego, evaluated against the plan | Pulumi Policies (policy packs in TypeScript/JavaScript or Python) or OPA/Rego via `pulumi-policy-opa`, evaluated against the resource graph of a stack written in any Pulumi language |
    

    L176 needs the matching edit: "CrossGuard policies apply to them the same way…""Pulumi Policies apply to them the same way…".

  • [L174] content/blog/terraform-kubernetes/index.md — [style-blocker] substitution — Use 'Pulumi Policies' instead of 'CrossGuard' (STYLE-GUIDE.md).

  • [L176] content/blog/terraform-kubernetes/index.md — [style-blocker] substitution — Use 'Pulumi Policies' instead of 'CrossGuard' (STYLE-GUIDE.md).


  • Refresh this review — comment @claude #update-review. Say what you fixed, or which finding you dispute and why; both work in the same mention.
  • Ask for anything else — comment @claude with no hashtag (questions, one-off fixes). Leaves this review untouched.

Important

Please don't hide, resolve, or delete this comment! It breaks things!

📖 How pre-merge review works — the full lifecycle, short-circuits, and escape hatches.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

⚠️ Low-confidence

Review each and resolve as appropriate — these don't block the PR.

Style suggestions

Optional polish from pattern-based linting — never blocking, not counted above. Take the ones that read better and ignore the rest. ✏️ marks one you can apply from the Files changed tab — use Add suggestion to batch on each, then Commit suggestions to take several in a single commit.

content/blog/terraform-kubernetes/index.md
  • line 46: [style] directional reference — Directional reference ('see below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (STYLE-GUIDE.md §Inclusive Language).

  • line 176: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).

  • line 189: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language). ✏️

  • line 190: [style] weasel word — 'mostly' is a weasel word!

  • line 190: [style] hyphenation — 'mostly-static' doesn't need a hyphen.

  • line 190: [style] difficulty qualifier — Avoid difficulty qualifier 'easy' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).

📋 Triaged verifier findings

I double-checked these and realized they weren't real findings — click to expand
  • [L416] content/blog/yaml-terraform-pulumi-whats-the-smart-choice-for-deployment-automation-with-kubernetes/index.md"The blog post 'Terraform and Kubernetes: A Practical Guide for 2026' covers the wider operating picture of managing Kubernetes infrastructure, including provis…" — verdict: unverifiable; evidence: Web search could not locate the specific page at pulumi.com/blog/terraform-kubernetes/ titled "Terraform and Kubernetes: A Practical Guide for 2026" to confirm its existence or that it covers provisioning, testing, policy, and AI agents in…; source: WebSearch ran query "Terraform and Kubernetes: A Practical Guide for 2026 pulumi blog" and "pulumi.com/blog/terraform-kubernetes"; top results didn't address the claim

    Mis-sourced: the target page is being created by this same PR (content/blog/terraform-kubernetes/index.md/blog/terraform-kubernetes/), so a live web search can't find it yet. The cross-link path, title, and description all match the new post.

💡 Pre-existing issues in touched files (optional)

No pre-existing issues in touched files.

✅ Resolved since last review

No items resolved since the last review.

📜 Review history

  • 2026-08-07T12:26:05Z — Fresh review of the new Terraform-and-Kubernetes guide: 66 claims checked, HashiCorp quotes all verified; 2 blockers in the testing/policy comparison table (a nonexistent Go mock API and an overstated policy-pack language list), 8 style nags, no balance concerns. (1598bfc)
  • 2026-08-11T00:20:25Z — Re-reviewed after a fix push (1 new commit, 6106a6d): the commit only shortens the Twitter/X social copy in frontmatter, unrelated to either outstanding finding, which remain unchanged. Also reclassified the two Pulumi.Substitutions Vale findings (L174, L176 — "CrossGuard" → "Pulumi Policies") as blocker-tier per vale-deterministic-fixes.yaml's blocker: allowlist, moving them into 🚨 Outstanding as [style-blocker] bullets; the remaining 6 style findings stay advisory in ⚠️ Low-confidence. 2 outstanding fact-check findings unchanged. (6106a6d)

  • Refresh this review — comment @claude #update-review. Say what you fixed, or which finding you dispute and why; both work in the same mention.
  • Ask for anything else — comment @claude with no hashtag (questions, one-off fixes). Leaves this review untouched.

Important

Please don't hide, resolve, or delete this comment! It breaks things!

📖 How pre-merge review works — the full lifecycle, short-circuits, and escape hatches.

@github-actions github-actions Bot added review:outstanding-issues Claude review completed; outstanding has author-actionable findings and removed review:in-progress Claude review is currently running labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Social Media Review

content/blog/terraform-kubernetes/index.md

X — PASS

LinkedIn — FAIL

  • Uses markdown inline code (backticks) around kubernetes and kubernetes_manifest — not allowed in post body

Bluesky — FAIL

  • Single dense paragraph; Bluesky requires 2 paragraphs separated by a blank line

Suggested copy

LinkedIn (703/2950 chars) — backticks stripped, everything else unchanged:

Terraform's kubernetes provider is a legitimate, well-maintained way to manage cluster objects as code. It's also worth reading HashiCorp's own warnings closely: kubernetes_manifest needs API access at plan time, and mixing cluster-provisioning resources with Kubernetes-provider resources in one module produces "intermittent and unpredictable errors."

We wrote a practical, fair look at what that means day to day — what Terraform does well, where teams hit friction, how a general-purpose language (Pulumi's approach) changes testing and CRD handling, and how AI agents are starting to operate inside these workflows. Includes a step-by-step guide to provisioning a Kubernetes app stack with Pulumi.

Bluesky (243/300 chars) — split into two paragraphs at the colon, no other changes:

Terraform + Kubernetes, without the hot takes.

What the hashicorp/kubernetes provider does well, HashiCorp's own documented limits (plan-time API access, provider ordering), and how a general-purpose language changes testing and CRD handling.


Suggestions (advisory)

These are stylistic notes — they don't block the post.

X

  • Both colon constructions ("flag two limits: plan-time API access and a provider-credential ordering trap" and the pointer "plays out in 2026:") read as list-building rather than narrative — drop one, and end the pointer with a period instead of a colon so it lands as a closing line rather than a list lead-in

Updated for commit 6106a6d8c70c0140d2c168e950312277e354af70 (short: 6106a6d) at 2026-08-08 14:37 UTC.

@pulumi-bot

pulumi-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

@github-actions github-actions Bot added review:stale New commits since last Claude review; refresh on next ready-transition or @claude mention and removed review:outstanding-issues Claude review completed; outstanding has author-actionable findings labels Aug 8, 2026
@CamSoper

Copy link
Copy Markdown
Contributor

@claude #update-review

@github-actions github-actions Bot added review:in-progress Claude review is currently running and removed review:stale New commits since last Claude review; refresh on next ready-transition or @claude mention labels Aug 11, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Optional style suggestions from the pre-merge review — apply or dismiss; none of them block.


Generated by Claude Code

Fair comparisons cut both ways, and there are good reasons a team keeps using Terraform for Kubernetes:

- **Provider and module catalog breadth.** Terraform's registry has the largest catalog of providers and community modules of any IaC tool, and that matters for teams integrating many third-party systems alongside Kubernetes.
- **A single tool across the whole estate.** Teams that have already standardized on Terraform for networking, IAM, and managed services often prefer one state model and one pipeline rather than introducing a second tool just for Kubernetes.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[style] difficulty qualifier — drops 'just', no meaning lost

Suggested change
- **A single tool across the whole estate.** Teams that have already standardized on Terraform for networking, IAM, and managed services often prefer one state model and one pipeline rather than introducing a second tool just for Kubernetes.
- **A single tool across the whole estate.** Teams that have already standardized on Terraform for networking, IAM, and managed services often prefer one state model and one pipeline rather than introducing a second tool for Kubernetes.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 Review updated on @CamSoper's request.

@github-actions github-actions Bot added review:outstanding-issues Claude review completed; outstanding has author-actionable findings and removed review:in-progress Claude review is currently running labels Aug 11, 2026
@CamSoper

Copy link
Copy Markdown
Contributor

@workprentice, you still working this one?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

domain:blog PR touches blog posts or customer stories review:outstanding-issues Claude review completed; outstanding has author-actionable findings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants