Skip to content

Fix internal links to old /docs/concepts/ URLs (redirect-hop cleanup) - #21072

Open
workprentice[bot] wants to merge 1 commit into
masterfrom
seo/fix-docs-concepts-internal-links-20260822
Open

Fix internal links to old /docs/concepts/ URLs (redirect-hop cleanup)#21072
workprentice[bot] wants to merge 1 commit into
masterfrom
seo/fix-docs-concepts-internal-links-20260822

Conversation

@workprentice

@workprentice workprentice Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

What

Fixes internal links that still point at the pre-restructure /docs/concepts/... URL space. Those URLs now 301 redirect (some via a double hop through a trailing-slash normalization) to their current homes under /docs/iac/concepts/..., /docs/esc/concepts/, or /docs/reference/glossary/.

Why

Internal links that force a redirect hop waste crawl budget, dilute link equity, and add avoidable latency for readers. /docs/iac/concepts/ is one of the highest-impression pages on the site per Search Console, so cleaning up the links that feed it (and its sibling pages) is a direct, low-risk technical-SEO win.

Scope

  • 79 files changed, 154 link occurrences across docs, tutorials, and blog content.
  • Covers both root-relative markdown links ([label](/docs/concepts/...)) and fully-qualified links (https://www.pulumi.com/docs/concepts/...).
  • Every target was resolved by following the live redirect chain to its final 200 destination before rewriting (not guessed), and anchors (#fragment) were preserved.
  • One file with the same pattern, content/blog/why-choose-pulumi-over-terraform/index.md, was deliberately left untouched because it already has open PRs (SEO: fix CTR + internal links for "agentic infrastructure" query #21062, fix(seo): correct unsourceable claims and stale enumerations across blog #21066) touching it; a follow-up board card will catch it once those land.

Verification

  • node ./scripts/lint/lint-markdown.js on all 79 changed files: 0 errors.
  • yarn prettier --check on all 79 changed files: all pass.
  • Every distinct old target path was fetched live and its full redirect chain followed to confirm a 200 final destination before use in the replacement map (30 distinct paths resolved).
  • git diff --numstat confirms 1:1 line replacement in every file (no unintended changes).

🧠 This PR was created by workprentice.

Several docs, blog, and tutorial pages still link to the pre-restructure /docs/concepts/... URLs, which now 301 (some via a double hop) to their current /docs/iac/concepts/..., /docs/esc/concepts/, or /docs/reference/glossary/ locations. Updated 79 files (154 link occurrences, both root-relative markdown links and fully-qualified https://www.pulumi.com/... links) to point directly at the final destination, verified live against the current redirect map. Every fragment (#anchor) and the handful of double-hop cases (missing trailing slash -> slash -> new path) were preserved/collapsed correctly.

One additional file with the same pattern (content/blog/why-choose-pulumi-over-terraform/index.md) was intentionally left untouched because it already has open PRs (#21062, #21066) touching it today; filed a follow-up board card to catch it separately.
@github-actions github-actions Bot added the review:triaging Claude Triage is currently classifying the PR label Aug 22, 2026
@workprentice

workprentice Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

@claude #new-review

@github-actions github-actions Bot added domain:docs PR touches technical docs domain:mixed PR touches more than one domain 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 22, 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

A resource provider is an extension of the API exposed by the respective cloud providers. As such, it can be the limiting factor. Thankfully, there is a solution to this. Since the Pulumi engine works with life-cycle callbacks handing control to the provider at appropriate times, it is easy to write a provider that implements custom logic in those callbacks.

Learn more about how Pulumi works [here](https://www.pulumi.com/docs/concepts/how-pulumi-works/).
Learn more about how Pulumi works [here](https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/).

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] vague link text — Link text now names the destination

Suggested change
Learn more about how Pulumi works [here](https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/).
Learn more about [how Pulumi works](https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/).

| `parent` | `string` | No | The name of the [parent](/docs/concepts/options/parent/) resource. The mentioned name must be present in the `nameTable`. |
| `provider` | `string` | No | The name of the [provider](/docs/concepts/options/provider/) resource. The mentioned name must be present in the `nameTable`. |
| `version` | `string` | No | The [version](/docs/concepts/options/version/) of the provider to use. |
| `logicalName` | `string` | No | The [logical name](/docs/iac/concepts/resources/names/#logicalname) of the resource. The original `name` property is then used just for codegen purposes (i.e. the source name). If either property is not set then the other field is used to fill it in. |

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'; meaning unchanged

Suggested change
| `logicalName` | `string` | No | The [logical name](/docs/iac/concepts/resources/names/#logicalname) of the resource. The original `name` property is then used just for codegen purposes (i.e. the source name). If either property is not set then the other field is used to fill it in. |
| `logicalName` | `string` | No | The [logical name](/docs/iac/concepts/resources/names/#logicalname) of the resource. The original `name` property is then used for codegen purposes (i.e. the source name). If either property is not set then the other field is used to fill it in. |

@github-actions

Copy link
Copy Markdown
Contributor

Pre-merge Review — Last updated 2026-08-22T13:01:51Z

Tip

Summary: This is a mechanical SEO cleanup across 79 blog, docs, and tutorial files: every internal link to a legacy /docs/concepts/… URL is rewritten to its current /docs/iac/concepts/… target so readers stop taking a redirect hop. The path rewrites themselves are correct — spot-checks confirm the destination pages exist, and the five changed docs/tutorial files have no leftover legacy links. The problem is anchors. On about a dozen touched lines the rewrite preserved a #fragment whose content has since moved off the resources page entirely (#components, #autonaming, #urns, #dependson, #explicit-provider-configuration). Those links now land on /docs/iac/concepts/resources/ and only reach the right section via the client-side JavaScript redirect that page carries — which is a second hop, exactly the thing this PR set out to remove. Two docs-page links (retainOnDelete → the protect page, #autonaming → a page that has no such anchor) are worth fixing regardless of the redirect question. Passes run: fact verification over 158 extracted claims, a cross-sibling read of all 5 sibling pages, frontmatter and Hugo preflight, and pattern-based prose linting.

Review confidence:

Dimension Level Notes
mechanics HIGH
facts MEDIUM 16 claims came back unverifiable because the fetched page bodies were truncated to site navigation; the underlying pages do exist.
coherence HIGH
cross-sibling consistency HIGH
Investigation log
  • Cross-sibling reads: 5 of 5 siblings
  • External claim verification: 118 of 158 claims verified (16 unverifiable, 10 contradicted, 2 framing-drift) · 4 specialists (numerical, cross-reference, capability, framing); 0 cross-specialist corroborations · routed: 0 inline, 113 Pass 1, 37 Pass 2 (verified 20, contradicted 2, unverifiable 15), 8 Pass 3 (verified 6, contradicted 0, unverifiable 2).
  • Cited-claim spot-checks: 37 of 37 cited claims fetched and compared
  • Frontmatter sweep: ran on body + meta_desc + social.{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: not run (no fenced code blocks in content files)
  • Editorial-balance pass: ran (single-subject, N/A)
🚨 Outstanding ⚠️ Low-confidence 💡 Pre-existing ✅ Resolved
16 12 3 0

✏️ 2 one-click style suggestions are posted inline — apply them from the Files changed tab, individually or with Add suggestion to batch.

🔍 Verification trail

158 claims extracted · 118 verified · 16 unverifiable · 10 contradicted · 2 framing-drift · 2 detector findings
  • L140 in content/blog/advanced-aws-networking-part-1/index.md "You can improve a component's readability by placing its code in a separate file, in this case inspection.py." → ➖ not-a-claim (evidence: The text is the author's own stylistic advice about organizing example code ("You can also improve the component's readability by placing its code in a separate file (in this case, inspection.py)"), describing their own example repo's…; source: content/blog/advanced-aws-networking-part-1/index.md:140)
  • L140 in content/blog/advanced-aws-networking-part-1/index.md "Implementing the inspection VPC as a component resource enhances the readability of both the code and the output by grouping all resources that belong to the…" → ✅ verified (framing: Claim describes a specific use case (inspection VPC) of the general component resource benefit (grouping resources in CLI output) that the docs page covers…; evidence: The Component Resources docs page describes component resources as a way to group related resources under a single parent, improving organization of both code and CLI output such as pulumi up/pulumi preview display trees, which…; source: https://www.pulumi.com/docs/iac/concepts/components/)
  • L250 in content/blog/advanced-aws-networking-part-1/index.md "You need to create both sets of routes within an apply because of the need to access the raw values of each of the subnet ids." → 🌀 framing-drift (framing: The claim is a specific application (needing both sets of routes inside one apply due to needing raw subnet ids) of the general apply mechanism described…; evidence: The cited Pulumi docs page on Inputs & Outputs documents the apply method as the mechanism to access the underlying/raw value of an Output once it is resolved, which supports the claim's technical premise that raw values (e.g., subnet…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/#apply)
  • L58 in content/blog/advanced-aws-networking-part-2/index.md "1. Defined your inspection VPC as a Pulumi component resource." → ✅ verified (evidence: Cited URL resolves (HTTP 200) to Pulumi's "Component Resources" docs page, which is the correct concept referenced by the claim (defining an inspection VPC as a Pulumi component resource). The page title and topic ("Component Resources |…; source: https://www.pulumi.com/docs/iac/concepts/components/)
  • L15 in content/blog/advanced-typescript-type-ftw/index.md "A core part of the Pulumi programming model is that we allow people to express complex" → ✅ verified (evidence: The linked page content/docs/iac/concepts/_index.md exists and describes Pulumi's programming model: "Pulumi programs, written in general-purpose programming languages, describe how your cloud infrastructure should be composed," directly…; source: repo:pulumi/docs content/docs/iac/concepts/_index.md)
  • L284 in content/blog/ai-slack-bot-adding-data-to-pinecone-using-s3-embedchain-and-pulumi-on-aws/index.md "If you're new to Pulumi, you might be wondering what's going on with the lambda_environment, why isn't app_bucket.id referenced directly, and what is…" → ✅ verified (evidence: The Inputs & Outputs concepts page confirms the All method page exists at this exact path and describes its function: "All allows you to access multiple outputs' plain values." This matches the…; source: repo:content/docs/iac/concepts/inputs-outputs/_index.md)
  • L120 in content/blog/announcing-infrastructure-as-code-with-java-and-pulumi/index.md "- General Pulumi overview (concepts and architecture)" → ✅ verified (evidence: The cited URL returns HTTP 200 and is titled "What is Pulumi? | Pulumi Docs", the general Pulumi concepts/architecture overview page, matching the link text and description in the blog post.; source: https://www.pulumi.com/docs/iac/concepts/)
  • L560 in content/blog/applying-attribute-based-access-controls-to-aws-lambda-functions/index.md "For the purposes of testing, we are now going to create a specific AWS Provider resource that we can…" → ✅ verified (evidence: The cited URL is Pulumi's official "Resource Providers" docs page (HTTP 200), which is the general concept page for creating explicit provider resources (e.g., AWS provider) that can be configured and passed IAM/assume-role details…; source: https://www.pulumi.com/docs/iac/concepts/providers/)
  • L104 in content/blog/architecture-as-code-kubernetes/index.md "Deploying modern applications is complex. Any one of the architectures we’ve examined -- virtual machines, microservices, serverless and Kubernetes …" → 🤷 unverifiable (evidence: The cited Medium URL returned HTTP 403 (Forbidden) with an empty body, so the supporting passage could not be retrieved. The claim text itself is a generic statement about deployment complexity rather than a specific factual assertion…; source: https://medium.com/@Joachim8675309/devops-concepts-pets-vs-cattle-2380b5aab313; intuition: 403 responses from Medium are often anti-bot blocks rather than true dead links; a manual browser fetch might…)
  • L105 in content/blog/architecture-as-code-serverless/index.md "To learn more about creating reusable components, read about Pulumi's programming model, which shows how to…" → ❌ contradicted (framing: The link targets an anchor (#components) on the resources page that no longer exists; the actual "Components" content lives at a distinct URL…; evidence: The current /docs/iac/concepts/resources/ page has no "components" section or anchor; components content was moved to a separate page (/docs/iac/concepts/components/). The resources page even carries a client-side redirect script mapping…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/components/_index.md)
  • L26 in content/blog/automation-api-as-platform/index.md "We use an inline Pulumi program that doesn't require a separate package with index.ts and Pulumi.yaml files, although they can be authored in an…" → ✅ verified (evidence: Pulumi's own Automation API concept docs state: "Unlike traditional Pulumi programs, an inline program doesn't require a separate package on disk with its own file and Pulumi.yaml. Inline programs are functions that can be authored in…; source: repo:content/docs/iac/concepts/automation-api.md (Inline programs section))
  • L130 in content/blog/aws-serverless-analytics/index.md "The Pulumi stack outputs documentation is located at /docs/iac/concepts/stacks/#outputs." → ✅ verified (evidence: The stacks docs page (content/docs/iac/concepts/stacks/_index.md, retrieved via pulumi/docs repo) contains the heading "## Stack outputs {#outputs}" which matches the anchor /docs/iac/concepts/stacks/#outputs, and this anchor is used…; source: repo:content/docs/iac/concepts/stacks/_index.md)
  • L130 in content/blog/aws-serverless-analytics/index.md "Kinesis input streams can be exported as Pulumi stack outputs that can be referenced in other projects." → ✅ verified (evidence: The blog's own code sample exports the Kinesis stream names as stack outputs (export const impressionInputStream = impressionsInputStream.name;) and the accompanying text states "We export our Kinesis input streams as stack outputs…; source: content/blog/aws-serverless-analytics/index.md (lines 125-130); Pulumi stack outputs docs at /docs/iac/concepts/stacks/#outputs referenced inline)
  • L130 in content/blog/aws-serverless-analytics/index.md "The Pulumi serverless streaming input architecture implicitly creates an arrival-time partition scheme with the key 'inserted_at'." → 🤷 unverifiable (framing: The source explains generic partitioning concepts; it does not reference Pulumi's architecture or an 'inserted_at' key, so it cannot verify this specific…; evidence: The cited AWS Athena docs page explains general partitioning concepts (time-based partitioning, Hive vs non-Hive schemes) but says nothing about Pulumi's specific serverless streaming architecture or a key named 'inserted_at'. The claim…; source: https://docs.aws.amazon.com/athena/latest/ug/partitions.html)
  • L132 in content/blog/aws-serverless-analytics/index.md "This Pulumi component, though described imperatively, produces a declarative output in the form of a state file." → ✅ verified (evidence: Pulumi's architecture: programs are written imperatively in general-purpose languages, but the engine records the resulting desired resource graph declaratively in a state file, which per Pulumi docs/source (pkg/backend/diy/state.go…; source: repo:content/blog/aws-serverless-analytics/index.md L132; pulumi/pulumi changelog v0.15.2.md ("local backend...stores your deployment's state file locally, instead of on pulumi.com"))
  • L132 in content/blog/aws-serverless-analytics/index.md "The Pulumi state-and-backends documentation is located at /docs/iac/concepts/state-and-backends/." → ✅ verified (evidence: Numerous pages in pulumi/docs reference this exact path, e.g. content/docs/iac/concepts/_index.md: "State and backends — Learn how Pulumi stores state and manages concurrency," confirming the…; source: gh search code --repo pulumi/docs "state-and-backends")
  • L132 in content/blog/aws-serverless-analytics/index.md "A Pulumi state file can be managed locally, in an object store like S3, or by the Pulumi Service backend." → ✅ verified (evidence: Pulumi docs confirm: "Backend options include Pulumi Cloud... in addition to simple object storage in AWS S3... or a local filesystem" and describe DIY backends storing state in S3/Azure/GCS/local filesystem alongside the managed Pulumi…; source: repo:content/docs/iac/concepts/state-and-backends.md)
  • L132 in content/blog/aws-serverless-analytics/index.md "Running 'pulumi up' for this example creates 45 AWS resources and lists the stack outputs to the console." → 🤷 unverifiable (evidence: The claim restates the blog post's own text ("Running a 'pulumi up' shows that we've created 45 AWS resources, and lists our stack outputs to the console") which is illustrated by an accompanying screenshot (PulumiUpOutput.png) not…; source: repo:content/blog/aws-serverless-analytics/index.md (line 132))
  • L460 in content/blog/aws-serverless-analytics/index.md "The described workflow verifies that data ingested into Kinesis is read out the other end by Athena, using a shell script with stack outputs and a query in…" → ➖ not-a-claim (evidence: Line 460 reads: "Our workflow is to make a change, run a pulumi up, and then verify that data ingested into Kinesis is read out the other end by Athena. A simple shell script using stack outputs and…; source: repo:content/blog/aws-serverless-analytics/index.md)
  • L396 in content/blog/command-provider-ga/index.md "- The CopyFile resource is superseded by the new CopyToRemote resource. It can copy whole…" → 🤷 unverifiable (evidence: The pre-fetched body only contains generic GitHub page boilerplate (a modulepreload link tag) with no rendered PR content, so the claim that PR Typo #423 introduces CopyToRemote superseding CopyFile could not be confirmed from the fetched…; source: CopyFile: support assets, archives, and recursive copying pulumi-command#423)
  • L424 in content/blog/community-aws-iam-package/index.md "- If you’re interested in learning more about Pulumi concepts, try the Concepts page." → ✅ verified (evidence: content/docs/iac/concepts/_index.md exists, titled "Concepts" (h1: "What is Pulumi?"), and covers Pulumi concepts (projects, stacks, resources, config, etc.), matching the claim's description and link target /docs/iac/concepts/.; source: repo:content/docs/iac/concepts/_index.md)
  • L313 in content/blog/controlling-aws-costs-with-lambda-and-pulumi/index.md "take advantage of explicit provider configuration" → ❌ contradicted (evidence: The "Explicit provider configuration" section no longer exists on content/docs/iac/concepts/resources/_index.md. That page now only contains a client-side JS redirect map showing the anchor moved: `"#explicit-provider-configuration"…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/providers/_index.md)
  • L65 in content/blog/create-eks-clusters-in-your-favorite-language/index.md "[resources]: https://www.pulumi.com/docs/iac/concepts/resources/" → ✅ verified (evidence: The cited URL resolves (HTTP 200) to the Pulumi Docs "Resources" concepts page, matching the link definition target exactly.; source: https://www.pulumi.com/docs/iac/concepts/resources/)
  • L50 in content/blog/crosswalk-for-aws-1-0/index.md "One of our guiding lights for Pulumi has always been to help organizations to scale up the complexity, capability, and richness of what they can build in the…" → 🤷 unverifiable (framing: The claim is an editorial/philosophical statement from the blog author, not a factual assertion the linked Components docs page is meant to prove or disprove.; evidence: The pre-fetched page (Component Resources docs) is generic navigation/marketing boilerplate with no content addressing the claim's specific narrative about Pulumi's guiding philosophy or scaling complexity on AWS. The claim text itself…; source: https://www.pulumi.com/docs/iac/concepts/components/)
  • L117 in content/blog/deploy-aws-static-website-with-angular-components/index.md "* If you’re interested in learning more about Pulumi concepts, try the Concepts page." → ✅ verified (evidence: content/docs/iac/concepts/_index.md exists with title "Concepts" (h1 "What is Pulumi?") at path /docs/iac/concepts/, matching the link text and href in the claim exactly.; source: repo:content/docs/iac/concepts/_index.md)
  • L202 in content/blog/deploy-aws-static-website-with-yaml/index.md "* If you’re interested in learning more about Pulumi concepts, try the Concepts page." → ✅ verified (evidence: The page at content/docs/iac/concepts/_index.md exists, titled "Concepts" ("What is Pulumi?"), and covers Pulumi concepts (projects, stacks, resources, config, etc.), matching the claim's description as a place to learn more about Pulumi…; source: repo:content/docs/iac/concepts/_index.md)
  • L30 in content/blog/dynamic-providers/index.md "Learn more about how Pulumi works here." → ✅ verified (evidence: The cited URL resolves (HTTP 200) to a live Pulumi Docs page titled "How Pulumi IaC Works | Pulumi Guides | Pulumi Docs", which matches the anchor text "Learn more about how Pulumi works here" linking to that guide.; source: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/)
  • L51 in content/blog/enhanced-search-intuitive-navigation-new-docs-experience/index.md "The Pulumi concept docs are where you can dive into Pulumi concepts. Learn how they work together and how to effectively use them to…" → ✅ verified (evidence: The page at content/docs/iac/concepts/_index.md exists with title "Concepts" (h1 "What is Pulumi?") and a "Concepts in depth" section linking to core concepts (Projects, Stacks, Resources, Config, etc.) explaining how Pulumi components…; source: repo:content/docs/iac/concepts/_index.md)
  • L21 in content/blog/faster-secrets-management/index.md "Pulumi now handles secrets more efficiently through optimized encryption and decryption processes…" → 🤷 unverifiable (evidence: The pre-fetched page is the general Pulumi Secrets Handling concepts doc; its truncated body is mostly nav/marketing chrome and does not mention 'optimized encryption/decryption processes' or reduced deployment times. No passage supports…; source: https://www.pulumi.com/docs/iac/concepts/secrets/; intuition: Claim asserts a specific performance improvement (optimized encryption/decryption reducing deployment times) that is…)
  • L29 in content/blog/full-access-to-helm-features-through-new-helm-release-resource-for-kubernetes/index.md "Pulumi's Helm Chart integration was implemented as a Component Resource which effectively extracts the…" → 🌀 framing-drift (framing: shifted — claim links to an in-page anchor #components on the resources page, but that content has since moved to a standalone…; evidence: The current Resources concepts page has no #components section anchor; "Components" content now lives on a separate page (/docs/iac/concepts/components/), linked only via a "Related topics" bullet…; source: repo:content/docs/iac/concepts/resources/_index.md)
  • L199 in content/blog/full-coverage-of-azure-resources-with-azure-native/index.md "You can also apply transformations to define your own naming schemas: see [this…" → ✅ verified (framing: Claim simply links to the docs page describing transformations as a mechanism to customize resource naming/properties, which the page's existence and topic…; evidence: The cited page (Pulumi Concepts: Resources) returned HTTP 200 and is the official docs page describing resource concepts, including a transformations section (anchor #transformations) matching the claim's link. The page content includes…; source: https://www.pulumi.com/docs/iac/concepts/resources/#transformations)
  • L91 in content/blog/functions-accept-outputs/index.md "string (see Inputs and Outputs)." → ✅ verified (evidence: The cited URL resolves (HTTP 200) to the Pulumi docs page titled "Inputs & Outputs | Pulumi Concepts | Pulumi Docs", matching the link text and topic referenced by the claim.; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L58 in content/blog/go-sdk-road-to-2/index.md "Pulumi’s programming model is inherently asynchronous. Consider creating a new AWS SecurityGroup, and using it to provision an EC2…" → ✅ verified (evidence: The linked page /docs/iac/concepts/ describes Pulumi's programming model and includes the exact same illustrative example: "the following program shows how to create an AWS EC2 security group named web-sg with a single ingress rule and a…; source: repo:pulumi/docs content/docs/iac/concepts/_index.md)
  • L57 in content/blog/iac-best-practices-enabling-developer-stacks-git-branches/index.md "* Both of the project's stack-configuration files, Pulumi.dev.yaml and Pulumi.prod.yaml, are checked into version control. This is safe and considered…" → ✅ verified (framing: Claim links to the secrets docs as support for "even with secrets" being safe due to encryption; page is the canonical secrets-handling reference, entailing…; evidence: The cited page is Pulumi's official "Secrets Handling" concepts doc, which is the correct target for a link about secrets in config files; the fetched body confirms the page exists and covers secrets & configuration management…; source: https://www.pulumi.com/docs/iac/concepts/secrets/)
  • L82 in content/blog/iac-best-practices-understanding-code-organization-stacks/index.md "This use case---needing to have multiple, separate instances of the infrastructure and applications created by a single Pulumi program---is exactly what…" → ✅ verified (evidence: The cited URL (https://www.pulumi.com/docs/iac/concepts/stacks/) returns HTTP 200 and is the official Pulumi Concepts page on Stacks; page content confirms it is the canonical stacks documentation page, consistent with the claim that…; source: https://www.pulumi.com/docs/iac/concepts/stacks/)
  • L153 in content/blog/if-you-liked-ksonnet-youll-love-pulumi/index.md "overview of the programming model" → ✅ verified (evidence: content/docs/iac/concepts/_index.md exists at the /docs/iac/concepts/ path and titled "Concepts" / "What is Pulumi?", containing a "How does Pulumi work?" section describing the programming model (programs, resources, stacks, projects…; source: repo:content/docs/iac/concepts/_index.md)
  • L125 in content/blog/improving-kubernetes-management-with-pulumis-await-logic/index.md "overview of the programming model" → ✅ verified (evidence: The page at content/docs/iac/concepts/_index.md (served at /docs/iac/concepts/) is titled "Concepts" / "What is Pulumi?" and describes Pulumi's programming model: programs, resources, stacks, projects, SDK, CLI, and deployment engine …; source: repo:content/docs/iac/concepts/_index.md)
  • L85 in content/blog/infrastructure-testing-concepts/index.md "In cloud engineering, an infrastructure integration test uses infrastructure deployed in an [ephemeral environment](https://about.gitlab.com/blog/kubecon-na-20…" → 🤷 unverifiable (evidence: The cited URL returns HTTP 200 but the pre-fetched body is just page chrome/CSS boilerplate with no article text about ephemeral environments visible, so the supporting passage for the hyperlink's usage cannot be confirmed from the…; source: https://about.gitlab.com/blog/kubecon-na-2019-are-you-about-to-break-prod/)
  • L137 in content/blog/intro-to-step-functions/index.md "Finally, we need to update the state machine with a new workflow that includes our new function. The state machine takes three arguments, a name, an IAM…" → ➖ not-a-claim (evidence: This text is the blog author's own explanatory narrative describing their tutorial code (state machine setup with name, IAM role, and JSON workflow), not a falsifiable claim about a third-party fact or product behavior.; source: content/blog/intro-to-step-functions/index.md)
  • L165 in content/blog/jamstack-with-pulumi/index.md "1. Install dependencies for our Pulumi program." → ⚔️ mismatch (framing: shifted — anchor text promises instructions/context for "installing dependencies" but the target page covers general conceptual overview of how Pulumi works…; evidence: The linked page ("How Pulumi IaC Works") is a general conceptual guide explaining Pulumi's architecture and workflow, not a page about installing dependencies for a Pulumi program. The anchor text "Install dependencies" links to a page…; source: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/; intuition: Link text and destination topic appear mismatched — likely a broken or miscopied hyperlink target in the blog post.)
  • L20 in content/blog/keep-your-secrets-secure-by-default/index.md "Every Pulumi stack gets a unique encryption key." → ✅ verified (evidence: Pulumi docs state: "By default, the encryption method uses automatic, per-stack encryption keys provided by Pulumi Cloud" and "Pulumi Cloud automatically manages per-stack encryption keys on your behalf," and "the Pulumi CLI uses the…; source: repo:content/docs/iac/concepts/secrets/_index.md)
  • L20 in content/blog/keep-your-secrets-secure-by-default/index.md "If you use a self-managed backend like AWS S3 or Google Cloud Storage, secrets are protected by a passphrase that you choose when you start a new stack with…" → 🤷 unverifiable (evidence: The pre-fetched page body is only a truncated nav/header snippet from the Secrets Handling docs page and does not contain the specific passphrase/passphrase-provider content needed to confirm or deny the claim about self-managed backends…; source: https://www.pulumi.com/docs/iac/concepts/secrets/)
  • L27-28 in content/blog/keep-your-secrets-secure-by-default/index.md "The documentation page for explicitly marking resource outputs as secrets is located at https://www.pulumi.com/docs/iac/concepts/secrets/#explicitly-marking-re…" → ✅ verified (evidence: The URL returns HTTP 200 and resolves to the "Secrets Handling | Pulumi Concepts | Pulumi Docs" page; the pre-fetched body is truncated (nav/boilerplate only) and doesn't show the specific anchor section text, but the page exists and…; source: https://www.pulumi.com/docs/iac/concepts/secrets/#explicitly-marking-resource-outputs-as-secrets)
  • L34 in content/blog/keep-your-secrets-secure-by-default/index.md "The documentation page for initializing a stack with alternative encryption is located at https://www.pulumi.com/docs/iac/concepts/secrets/#initializing-a-stac…" → ✅ verified (evidence: The URL returns HTTP 200 and resolves to the Pulumi Docs "Secrets Handling | Pulumi Concepts" page, consistent with the claim's described location; the truncated body does not show the specific anchor section text but the page and anchor…; source: https://www.pulumi.com/docs/iac/concepts/secrets/#initializing-a-stack-with-alternative-encryption)
  • L34 in content/blog/keep-your-secrets-secure-by-default/index.md "Pulumi integrates with AWS Key Management System, Azure Key Vault, Google Cloud Key Management, and Hashicorp Vault to make it easy to protect secrets in the…" → ✅ verified (framing: Source confirms AWS KMS exists as a key management product; Pulumi's own documented secrets providers (not shown in this fetch) corroborate the integration…; evidence: The cited URL confirms AWS Key Management Service (KMS) is a real AWS product for encryption/key management, supporting the claim that Pulumi can integrate with it (note: the claim's name "Key Management System" is a slight misnomer for…; source: https://aws.amazon.com/kms/; intuition: Claim says "AWS Key Management System" but the actual product name is "AWS Key Management Service" (KMS) — minor…)
  • L40 in content/blog/keep-your-secrets-secure-by-default/index.md "Pulumi's secret storage documentation is located at https://www.pulumi.com/docs/iac/concepts/secrets/." → ✅ verified (evidence: The URL resolves with HTTP 200 to the "Secrets Handling | Pulumi Concepts | Pulumi Docs" page, confirming this is indeed Pulumi's secret storage documentation location.; source: https://www.pulumi.com/docs/iac/concepts/secrets/)
  • L52 in content/blog/kubernetes-yaml-v2/index.md "Pulumi autonaming is not supported for objects defined within the manifest (in the context of the ConfigGroup/ConfigFile resource discussed)." → ✅ verified (evidence: The pulumi-kubernetes yamlv2 provider code enforces contract.Requiref(obj.GetName() != "", "obj", "expected .metadata.name"), meaning objects parsed from a ConfigGroup/ConfigFile manifest must already have an explicit metadata.name …; source: gh search code --owner pulumi repo:pulumi/pulumi-kubernetes provider/pkg/provider/yaml/v2/yaml.go)
  • L52 in content/blog/kubernetes-yaml-v2/index.md "Pulumi autonaming is not supported within Kubernetes YAML v2 manifest resources, and documentation on autonaming is available at…" → ✅ verified (evidence: The linked page's "Physical Names and Auto-Naming" section (anchor #autonaming) documents Pulumi's autonaming feature generally: "Pulumi auto-names most resources by default, using the logical name and a random suffix to construct a…; source: gh search code -R pulumi/pulumi-kubernetes "must have a metadata.name" / provider/pkg/gen/_go-templates/yaml/yaml.tmpl; content/docs/iac/concepts/resources/names.md#autonaming)
  • L146 in content/blog/kubernetes-yaml-v2/index.md "The purpose of the resource prefix is to ensure the uniqueness of child resource names, as described in the Pulumi Resource Names documentation at…" → ✅ verified (evidence: The Pulumi Resource Names doc's #urns section states: "Resources constructed as children of a component resource must include the component resource's name as part of their names (e.g., as a prefix). This ensures uniqueness across…; source: repo:content/docs/iac/concepts/resources/names.md#urns)
  • L147 in content/blog/kubernetes-yaml-v2/index.md "Using the component name as a prefix is the best practice, and this is now the default behavior." → ✅ verified (evidence: The same doc's property tables state resourcePrefix "Defaults to the ConfigGroup name" / "Defaults to the ConfigFile name", confirming the component name is used as the default prefix, consistent with the claim that this is now the…; source: content/blog/kubernetes-yaml-v2/index.md (lines 48, 168); gh search pulumi/pulumi-kubernetes resourcePrefix usage)
  • L149 in content/blog/kubernetes-yaml-v2/index.md "The resource prefix is not applied to the Kubernetes object names." → ✅ verified (evidence: Pulumi-kubernetes SDK source confirms resourcePrefix only affects the Pulumi resource name/URN, not the Kubernetes object name: e.g. ConfigGroup.cs states "A prefix for the auto-generated resource names... Example: A resource created…; source: gh search code --owner pulumi resourcePrefix repo:pulumi/pulumi-kubernetes (sdk/dotnet/Yaml/V2/ConfigGroup.cs))
  • L147 in content/blog/managing-aws-credentials-on-cicd-part-2/index.md "Pulumi stack's configuration, and hard-code the specific set of projects and encrypted environment…" → ✅ verified (evidence: The URL https://www.pulumi.com/docs/iac/concepts/config/ resolves to content/docs/iac/concepts/config.md in pulumi/docs, the canonical page documenting Pulumi stack configuration, which matches the anchor text "Pulumi stack's…; source: gh api repos/pulumi/docs/contents/content/docs/iac/concepts/config.md)
  • L270 in content/blog/managing-aws-credentials-on-cicd-part-3/index.md "Pulumi supports encrypting sensitive configuration data, as documented at https://www.pulumi.com/docs/iac/concepts/config/#secrets." → ✅ verified (framing: Claim states Pulumi supports encrypting sensitive config data; source confirms this exactly, though the specific URL/anchor may have moved from…; evidence: (escalated from pass1) Pulumi's docs confirm: "Pulumi Cloud transmits and stores entire state files securely, but Pulumi also supports encrypting individual values as secrets for additional protection." The content now lives at…; source: https://www.pulumi.com/docs/iac/concepts/secrets/)
  • L271 in content/blog/managing-aws-credentials-on-cicd-part-3/index.md "You can encrypt a Pulumi configuration setting by adding the --secret flag." → ✅ verified (evidence: Pulumi changelog v2.14.0 confirms: config values set via pulumi config set --secret "that are used as inputs to providers are encrypted"; widely used across pulumi/examples READMEs (pulumi config set --secret <key> <value>) as the…; source: gh search code --owner pulumi "config set --secret" (pulumi/pulumi:changelog/v2.14.0.md, pulumi/examples READMEs))
  • L284 in content/blog/managing-aws-credentials-on-cicd-part-3/index.md "Pulumi keeps track of your cloud resources in a checkpoint file, documented at /docs/iac/concepts/state-and-backends/." → ✅ verified (evidence: The state-and-backends doc page (at content/docs/iac/concepts/state-and-backends.md, i.e. /docs/iac/concepts/state-and-backends/) has a "Checkpoints" section stating: "Pulumi state is usually stored in a transactional snapshot called a…; source: repo:content/docs/iac/concepts/state-and-backends.md)
  • L285 in content/blog/managing-aws-credentials-on-cicd-part-3/index.md "A Pulumi resource might have a 'password' output property that could contain sensitive information stored in the checkpoint file." → ✅ verified (evidence: Pulumi's own docs on additionalSecretOutputs use the identical example: "This example ensures that the password generated for a database resource is an encrypted secret" — i.e., a resource's "password" output property is the canonical…; source: repo:content/docs/iac/concepts/resources/options/additionalsecretoutputs.md)
  • L287-290 in content/blog/managing-aws-credentials-on-cicd-part-3/index.md "If a resource output is marked secret and encrypted in the checkpoint file, viewing the checkpoint file contents via pulumi stack export would not allow…" → ✅ verified (evidence: The blog text itself (which is the claim under review) states that additionalSecretOutputs marks a resource output as secret and encrypts it in the checkpoint file, so viewing via pulumi stack export would not recover the plaintext.…; source: Pulumi docs concept: additionalSecretOutputs resource option and pulumi stack export encrypting secret values in state (redirect target /docs/iac/concepts/resources/options/additionalsecretoutputs referenced in content/docs/iac/concepts/resources/_index.md))
  • L52-53 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "Pulumi component resources, documented at https://www.pulumi.com/docs/iac/concepts/resources/#components, can be used to group resources into logical groups…" → ❌ contradicted (framing: claim cites resources page anchor #components, but that content/anchor lives at the separate /docs/iac/concepts/components/ page instead; evidence: The current docs site has no #components section on /docs/iac/concepts/resources/. That page only links out to a separate page, /docs/iac/concepts/components/ ("Components - Learn what a component resource is..."), which is where…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/components/_index.md)
  • L53 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "- Read Pulumi's own overview and naming docs…" → ✅ verified (evidence: The cited URL (https://www.pulumi.com/docs/iac/concepts/) resolves with HTTP 200 and is Pulumi's "What is Pulumi?" concepts overview page, matching the claim's description of it as Pulumi's "overview" docs. The claim is a…; source: https://www.pulumi.com/docs/iac/concepts/)
  • L132 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "Pulumi's component resources, documented at https://www.pulumi.com/docs/iac/concepts/resources/#components, are 'logical components' that the user defines…" → ✅ verified (framing: Source: "logical grouping of Pulumi resources... encapsulates implementation details"; claim paraphrases as "logical components... defined by the user... to…; evidence: The linked docs page (resources/#components, which redirects to /docs/iac/concepts/components/) defines a component as "a logical grouping of Pulumi resources that is exposed as a single Pulumi resource," authored by users to encapsulate…; source: repo:content/docs/iac/concepts/components/_index.md and content/docs/iac/concepts/resources/_index.md)
  • L153 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "Each resource in Pulumi has a globally unique URN, as documented at https://www.pulumi.com/docs/iac/concepts/resources/#urns." → ✅ verified (evidence: The docs page content/docs/iac/concepts/resources/names.md states: "Each resource is assigned a [Uniform Resource Name (URN)]... that uniquely identifies that resource globally." and "The URN must be globally unique." The cited URL's…; source: repo:content/docs/iac/concepts/resources/names.md)
  • L334 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "The .apply method can be useful for troubleshooting when you need to access the particular value of an output." → ➖ not-a-claim (evidence: This is the blog author's own subjective tip/opinion about a personal workflow technique ("The .apply method can also be useful for troubleshooting when you need to access the particular value of an output"), not a falsifiable…; source: repo:content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md)
  • L334 in content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md "Pulumi's documentation for Inputs and Outputs is located at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/." → ✅ verified (evidence: The URL https://www.pulumi.com/docs/iac/concepts/inputs-outputs/ returns HTTP 200 and its title is "Inputs & Outputs | Pulumi Concepts | Pulumi Docs", confirming this is indeed Pulumi's documentation page for Inputs and Outputs.; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L101 in content/blog/mlops-huggingface-llm-aws-sagemaker-python/index.md "While creating a new project from the sagemaker-aws-python Pulumi template, you will be prompted for a [project](https://www.pulumi.com/docs/iac/concepts/pro…" → 🤷 unverifiable (evidence: The claim's text cites two links: projects concept page and stacks concept page. The pre-fetched content corresponds to the stacks page (https://www.pulumi.com/docs/iac/concepts/stacks/), but the source_hint and primary target of this…; source: https://www.pulumi.com/docs/iac/concepts/projects/)
  • L34 in content/blog/multicloud-with-kubernetes-and-pulumi/index.md "The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/components/ describes a Component Resource as an abstraction on top of other Pulumi…" → 🤷 unverifiable (evidence: The pre-fetched page body is truncated to generic site navigation/header content and does not contain the actual definition of Component Resource, so I cannot confirm or deny the specific phrasing "abstraction on top of other Pulumi…; source: https://www.pulumi.com/docs/iac/concepts/components/; intuition: Component Resources are typically described as an abstraction composed of other resources (not specifically…)
  • L53 in content/blog/multicloud-with-kubernetes-and-pulumi/index.md "The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/secrets/#using-configuration-and-secrets-in-code documents using configuration and…" → ✅ verified (evidence: The docs page content/docs/iac/concepts/secrets/_index.md contains the section "## Using configuration and secrets in code" (line 327), which matches the URL fragment #using-configuration-and-secrets-in-code and describes using…; source: repo:content/docs/iac/concepts/secrets/_index.md)
  • L352-355 in content/blog/next-level-iac-breakpoint-debugging/index.md "The Pulumi documentation page describing the apply function is located at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/apply/." → ✅ verified (evidence: The repo's own markdown defines [apply-docs]: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/apply/, and the pulumi/docs repo confirms a real page exists at content/docs/iac/concepts/inputs-outputs/apply.md, matching that URL…; source: gh api repos/pulumi/docs/contents/content/docs/iac/concepts/inputs-outputs)
  • L180-187 in content/blog/next-level-iac-briding-the-declarative-gap/index.md "The Pulumi documentation page explaining the declarative and imperative approach is located at https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/#…" → ❌ contradicted (framing: Claim asserts the anchor exists at the cited URL; the current page content shows no matching heading/anchor.; evidence: The current content/docs/iac/guides/basics/how-pulumi-works.md page has no "Declarative and imperative approach" heading/anchor — its sections are "Running a Pulumi program", "Resource operations", "Creation and deletion order"…; source: repo:content/docs/iac/guides/basics/how-pulumi-works.md)
  • L119 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "Running processes synchronously means they complete before Pulumi starts registering resources, as documented at https://www.pulumi.com/docs/iac/guides/basics/…" → 🤷 unverifiable (evidence: The pre-fetched body is truncated to generic nav/header content and does not contain any passage describing synchronous process execution or resource registration ordering, so the specific claim cannot be confirmed against this fetch.; source: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/)
  • L293 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The function returns early for Pulumi previews so the cache isn't cleared if the site hasn't changed." → ✅ verified (evidence: The code sample shows if (pulumi.runtime.isDryRun()) { console.log("This is a Pulumi preview, so skipping cache invalidation."); return; } before the CloudFront invalidation logic, and the accompanying prose states "The function…; source: repo:content/blog/next-level-iac-pulumi-runtime-logic/index.md (lines 256-261, 293))
  • L293 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The code uses the AWS SDK for JavaScript to submit the invalidation request to CloudFront, naming it uniquely with a timestamp and logging the result to the…" → ➖ not-a-claim (evidence: This is a description of the blog author's own example code (a Pulumi program invoking the AWS SDK for JavaScript to create a CloudFront invalidation), not a third-party factual claim to verify against aws.amazon.com/sdk-for-javascript/.; source: content/blog/next-level-iac-pulumi-runtime-logic/index.md (author's own code description))
  • L293 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The call to process.on('beforeExit') registers a function to be invoked just before the program exits, using the resolved ID of the distribution." → ✅ verified (framing: Source describes the general beforeExit mechanism; claim describes a narrower, specific usage (with the distribution's resolved ID) that is a valid…; evidence: Node.js docs state: "The 'beforeExit' event is emitted when Node.js empties its event loop and has no additional work to schedule," and a listener registered on it runs before the process would otherwise exit — matching the claim that…; source: https://nodejs.org/api/process.html#event-beforeexit)
  • L331 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The function returns early for Pulumi previews so the cache isn't cleared if the site hasn't changed." → ➖ not-a-claim (evidence: The blog's own code sample shows if pulumi.runtime.is_dry_run(): ... return with the accompanying prose stating "The function returns early for Pulumi previews --- no sense clearing the cache if the site hasn't changed". This is the…; source: repo:content/blog/next-level-iac-pulumi-runtime-logic/index.md (lines 304-331))
  • L331 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The code uses Boto3 to submit the invalidation request to CloudFront, naming it uniquely with a timestamp and logging the result to the console." → ➖ not-a-claim (evidence: This is a description of the blog post's own example code/design (using Boto3 to invalidate CloudFront with a timestamp-based caller reference and console logging), not a checkable third-party factual assertion. The cited Boto3 docs…; source: content/blog/next-level-iac-pulumi-runtime-logic/index.md (author's own code walkthrough))
  • L331 in content/blog/next-level-iac-pulumi-runtime-logic/index.md "The call to atexit.register() registers a function to be invoked just before the program exits, using the resolved ID of the distribution." → ✅ verified (framing: Source: "Register func as a function to be executed at termination" / "automatically executed upon normal interpreter termination" — claim narrows this to…; evidence: Python docs state: "Register func as a function to be executed at termination," and functions "are automatically executed upon normal interpreter termination" (i.e., just before the program exits). The claim's mention of "the resolved ID…; source: https://docs.python.org/3/library/atexit.html)
  • L49 in content/blog/nx-monorepo/index.md "In this post, we'll show how you can build a seamless development workflow by integrating Pulumi code level abstractions, such as [Component…" → ✅ verified (evidence: The cited URL resolves (HTTP 200) to Pulumi's "Component Resources" docs page, confirming this is a real, live doc concept referenced correctly as "Component Resources" in the claim.; source: https://www.pulumi.com/docs/iac/concepts/components/)
  • L87 in content/blog/organizing-aws-accounts-with-pulumi/index.md "// https://www.pulumi.com/docs/iac/concepts/resources/options/protect/" → ✅ verified (evidence: The pulumi/docs repo contains content/docs/iac/concepts/resources/options/protect.md with title "protect | Resource Options", which renders at the URL /docs/iac/concepts/resources/options/protect/ referenced in the blog post's code comment.; source: gh search code --owner pulumi repo:pulumi/docs protect path:content/docs/iac/concepts/resources/options)
  • L78 in content/blog/p3-some-assembly-required/index.md "Pulumi documentation allows mapping teams to stacks to grant access at specific permission levels, as documented at https://www.pulumi.com/docs/pulumi-cloud/ac…" → ✅ verified (evidence: (escalated from pass1 after exhausting its 12-turn cap) The cited page confirms the substance of the claim: "Teams can be granted access to stacks, which grants all team members access to those stack based on the selected permission…; source: https://www.pulumi.com/docs/pulumi-cloud/access-management/teams/)
  • L82 in content/blog/p3-some-assembly-required/index.md "Deploying a Pulumi stack requires secrets such as cloud credentials and other configuration values that are provided to the deployment engine." → ✅ verified (framing: The claim is a general statement about deployment requiring secrets/config; the ESC docs page describes the broader ESC system that manages exactly this…; evidence: The ESC concepts page confirms environments are "collections of configuration values and secrets" consumed "from your applications, infrastructure, and CI/CD pipelines," and that ESC "eliminates duplicated secrets and configuration…; source: repo:content/docs/esc/concepts/_index.md)
  • L204 in content/blog/p3-some-assembly-required/index.md "In a custom internal developer platform, users can define their own Pulumi component resources and bake appropriate settings/configuration directly into the…" → ➖ not-a-claim (evidence: The claim is a near-verbatim restatement of the blog's own explanatory text: "However, in a custom internal developer platform you can define your own components, and bake appropriate settings/configuration directly into the underlying…; source: content/blog/p3-some-assembly-required/index.md:204)
  • L204 in content/blog/p3-some-assembly-required/index.md "In Pulumi, a component resource, as documented at https://www.pulumi.com/docs/iac/concepts/components/, is something that developers can import in their…" → 🤷 unverifiable (evidence: The pre-fetched page returned only navigation/header boilerplate (200 OK) with no body content addressing component resources' definition or the specific claim about importing/instantiating/modifying them; the truncated content doesn't…; source: https://www.pulumi.com/docs/iac/concepts/components/)
  • L206 in content/blog/p3-some-assembly-required/index.md "A multi-language component (MLC) lets a user author a component in their language of choice and then generate an SDK that surfaces that component into all of…" → ✅ verified (evidence: The blog itself and Pulumi's known MLC feature (component provider boilerplate repos for Python/TypeScript/Go, used to "Generate an SDK for the other languages") confirm that a Multi-Language Component lets an author write a component…; source: repo:content/blog/p3-some-assembly-required/index.md (L206, L210-214))
  • L206 in content/blog/p3-some-assembly-required/index.md "Pulumi supports writing components that can be consumed from Python, Go, and Node.js, among other languages." → ✅ verified (framing: Source says components are available in "all supported programming languages"; claim names a narrower subset (Python, Go, Node.js) plus "among other…; evidence: The pulumi-component-provider-py-boilerplate README (a Pulumi-maintained reference repo linked in the same blog section) states: "Pulumi component providers make component resources available to Pulumi code in all supported programming…; source: gh api repos/pulumi/pulumi-component-provider-py-boilerplate/contents/README.md)
  • L64 in content/blog/pulumi-3-0/index.md "Pulumi Packages are the core technology that enables cloud infrastructure resource provisioning to be defined once, and made available to users in all…" → ➖ not-a-claim (evidence: This is the blog author's own description of Pulumi's product/feature (Pulumi Packages and Components) at the Pulumi 3.0 launch, not a third-party factual assertion. Current docs corroborate the underlying concept: "A component resource…; source: repo:content/docs/iac/concepts/resources/_index.md)
  • L65 in content/blog/pulumi-and-localstack/index.md "The big thing to remember is that a Pulumi 'output' value [is not known until after the infrastructure has been fully provisioned](https://www.pulumi.com/docs/…" → 🤷 unverifiable (evidence: The pre-fetched page returned HTTP 200 but the truncated body only shows generic Pulumi site navigation/marketing content, not the actual Inputs & Outputs conceptual documentation text needed to confirm the specific claim about outputs…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L41 in content/blog/pulumi-loves-python/index.md "Pulumi has long supported creating and managing virtual environments using Python's builtin package manager pip." → ✅ verified (evidence: The pulumi/pulumi repo's sdk/python/toolchain/pip.go implements virtualenv creation/management via pip as the default Python toolchain, and the blog text itself (L41) states "Pulumi has long had support to create and manage virtual…; source: gh search code --owner pulumi "virtualenv" repo:pulumi/pulumi (sdk/python/toolchain/pip.go))
  • L41 in content/blog/pulumi-loves-python/index.md "Poetry allows users to declare dependencies in a simple and concise way and manage their virtual environment with ease." → ➖ not-a-claim (evidence: This is a general, non-falsifiable descriptive statement about Poetry's widely-known purpose (dependency declaration and virtual environment management) rather than a specific factual claim about Pulumi's product or behavior. Poetry's…; source: General knowledge of Poetry (python-poetry.org) purpose; not a Pulumi-specific claim.)
  • L41 in content/blog/pulumi-loves-python/index.md "Poetry is a popular Python dependency management tool that allows users to declare dependencies in a simple and concise way and manage their virtual…" → ✅ verified (evidence: Official Poetry docs state: "Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you," and it is widely described…; source: https://python-poetry.org/docs/)
  • L41 in content/blog/pulumi-loves-python/index.md "The latest release of Pulumi referenced at https://github.com/pulumi/pulumi/releases/tag/v3.121.0 adds support for Poetry as a Python dependency management…" → ✅ verified (evidence: Release notes for v3.121.0 include: "[sdk/python] Automatically convert requirements.txt to pyproject.toml when using Poetry" (PR Update pulumi_import.md #16346), confirming Poetry support was added in this release.; source: gh release view v3.121.0 -R pulumi/pulumi)
  • L43 in content/blog/pulumi-loves-python/index.md "To opt in to using Poetry for an existing Pulumi project, a user must set the toolchain runtime option (documented at…" → ✅ verified (evidence: The project-file docs list toolchain as a runtime option: "Toolchain to use for managing virtual environments, pip, poetry, or uv." confirming a user can set toolchain: poetry to opt into Poetry for the python runtime, then run…; source: repo:content/docs/iac/concepts/projects/project-file.md)
  • L43 in content/blog/pulumi-loves-python/index.md "If a user chooses to use Poetry when creating a new Pulumi project, the Pulumi CLI automatically creates a new Poetry project and installs the necessary…" → ✅ verified (framing: Source (changelog) confirms the feature generally; the project-file doc page documents the toolchain option that invokes it — claim is a faithful narrower…; evidence: Pulumi v3.120.0 changelog confirms: "[sdk/python] Support Poetry as Python toolchain" and "[sdk/python] Autoinstall dependencies using Poetry in GetRequiredPlugins", matching the blog's description that choosing Poetry causes the CLI to…; source: gh search code --owner pulumi "poetry" (pulumi/pulumi:changelog/v3.120.0.md: "Support Poetry as Python toolchain", "Autoinstall dependencies using Poetry in GetRequiredPlugins"))
  • L55 in content/blog/pulumi-loves-python/index.md "Pulumi Python SDKs include type hints compatible with type checkers such as MyPy and Pyright." → ✅ verified (evidence: Pulumi's Python SDK toolchain source (sdk/python/toolchain/toolchain.go) defines TypeCheckerMypy, and sdk/python/Makefile runs both mypy and pyright for type checking; the project file typechecker runtime option accepts mypy or…; source: gh search code --repo pulumi/pulumi mypy/pyright; sdk/python/toolchain/toolchain.go; sdk/python/Makefile)
  • L55 in content/blog/pulumi-loves-python/index.md "In the latest release of Pulumi, users can configure Pulumi to run their typechecker of choice as part of Pulumi operations and fail if there are type errors." → ✅ verified (evidence: Pulumi added a 'typechecker' runtime option for Python (PR Regen dev version pulumi@3.190.0-alpha.xf18d36d #15725 "Add 'typechecker' option to python runtime", released in changelog v3.113.0: "[sdk/python] Add 'typeChecker' runtime option to the Python language host"). It supports…; source: gh search prs --repo pulumi/pulumi typechecker; pulumi/pulumi changelog/v3.113.0.md)
  • L57 in content/blog/pulumi-loves-python/index.md "To enable automatic type checking, add the typechecker of your choice to your dependencies and set the typechecker runtime option (documented at…" → ✅ verified (evidence: The project-file docs (Runtime Options section) list: "typechecker | Only applies to the python runtime | Type checker library to use." and further state "This option can be set to mypy or pyright. ... If set, the given type…; source: repo:content/docs/iac/concepts/projects/project-file.md)
  • L136-140 in content/blog/pulumi-release-notes-85/index.md "Pulumi experimented with showing an extra option 'yes, using Update Plans' at the update prompt to get extra feedback from users, and that experiment is now…" → ✅ verified (evidence: Pulumi changelog v3.55.0 confirms: "[cli] Remove the [experimental] yes, using Update Plans prompt." This matches the blog's description that Pulumi experimented with the option to get user feedback and then removed it once the…; source: gh search code --owner pulumi "yes, using Update Plans" (pulumi/pulumi:changelog/v3.55.0.md))
  • L146 in content/blog/pulumi-release-notes-85/index.md "Pulumi SDKs ship helper serialization and deserialization functions that natively understand the type Output, streamlining the combination of JSON…" → 🤷 unverifiable (evidence: The pre-fetched body is truncated to generic site navigation/header content and does not include the specific section discussing JSON serialization/deserialization helper functions for Output. Cannot confirm or deny the specific claim…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L170 in content/blog/pulumi-release-notes-85/index.md "The Pulumi documentation page for Stacks (including Stack References) is located at https://www.pulumi.com/docs/iac/concepts/stacks/#stackreferences." → ✅ verified (evidence: The pulumi/docs repo contains content/docs/iac/concepts/stacks.md with a heading ## Stack references {#stackreferences}, which renders at the URL https://www.pulumi.com/docs/iac/concepts/stacks/#stackreferences — matching the claim…; source: gh search code --repo pulumi/docs "StackReferences" (content/docs/iac/concepts/stacks.md: "## Stack references {#stackreferences}"))

  • 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

Copy link
Copy Markdown
Contributor
continued from previous comment
  • L172 in content/blog/pulumi-release-notes-85/index.md "Recent Pulumi SDKs shipped a method called StackReference.getOutputDetails." → ✅ verified (evidence: changelog/v3.55.0.md confirms: "[sdk/nodejs] Adds StackReference.getOutputDetails to retrieve outputs from StackReferences as plain objects." and the method is implemented in sdk/nodejs/stackReference.ts (`public async…; source: gh search code --owner pulumi getOutputDetails (pulumi/pulumi changelog/v3.55.0.md, sdk/nodejs/stackReference.ts))
  • L172 in content/blog/pulumi-release-notes-85/index.md "StackReference.getOutputDetails returns a plain object with two fields, value and secretValue, of which at most one is set depending on whether the stack…" → ✅ verified (evidence: Blog text and the pulumi/pulumi nodejs SDK implementation confirm: "This method returns a plain object with two fields: value and secretValue. At most one of these fields is set, depending on whether the stack reference output is a…; source: gh search code --owner pulumi getOutputDetails (pulumi/pulumi sdk/nodejs/stackReference.ts; pulumi/docs content/blog/pulumi-release-notes-85/index.md))
  • L48 in content/blog/pulumi-release-notes-m60/index.md "With updates to the Pulumi Packages schema and the Provider interface, it is now possible to make a component's methods available in all languages." → ✅ verified (evidence: GitHub issue Support methods for multi-language components pulumi#7072 ("Support methods for multi-language components", milestone 0.60, resolved/fixed) states: "Components often have methods that provide additional functionality associated with an instance of a component. We…; source: gh issue view 7072 -R pulumi/pulumi)
  • L54 in content/blog/pulumi-release-notes-m60/index.md "Now, depending on a Pulumi Component Package's component will always wait on all of that component's children, regardless of language." → ✅ verified (evidence: GitHub issue [sdk/nodejs] dependsOn of a multi-language component resource doesn't wait on the children of the component pulumi#7540 (linked in the same blog paragraph) documents that dependsOn on a multi-language component didn't wait on all the component's children in Node.js, "This is different than the Python and Go SDKs, and not…; source: gh issue view 7540 -R pulumi/pulumi)
  • L54 in content/blog/pulumi-release-notes-m60/index.md "Passing Inputs and Outputs to dependsOn can be especially useful in Kubernetes and Helm workflows where you need to depend on the output of a resource…" → ✅ verified (framing: Source confirms the general feature (Input/Output support in dependsOn across languages); the claim's Kubernetes/Helm illustration is a narrower, plausible…; evidence: GitHub issue Update Hugo modules #7542 (referenced in the post, part of the Pulumi 0.60 milestone) confirms the dependsOn cross-language inconsistency fix, and the release notes' own example demonstrates exactly the Kubernetes/Helm-style use case…; source: gh api repos/Consistently implement (and document) depends on a component across languages pulumi#7542; content/blog/pulumi-release-notes-m60/index.md)
  • L54 in content/blog/pulumi-release-notes-m60/index.md "The dependsOn option creates a list of explicit dependencies between resources, useful when you need to explicitly specify additional dependencies that…" → ✅ verified (evidence: The dependsOn docs page (now at /docs/iac/concepts/resources/options/dependson, redirected from the old #dependson anchor) states: "The dependsOn resource option creates a list of explicit dependencies between resources... you may need…; source: repo:content/docs/iac/concepts/resources/options/dependson.md)
  • L36 in content/blog/pulumi-release-notes-m64/index.md "Pulumi's dependsOn option enables you to write programs that deploy resources in a specific order. Previously…" → ✅ verified (evidence: The linked page content/docs/iac/concepts/resources/_index.md contains a client-side redirect mapping #dependson to /docs/iac/concepts/resources/options/dependson, which is the canonical dependsOn resource option page ("Resource…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/resources/options/dependson.md)
  • L188 in content/blog/redis-cloud-provider/index.md "If you are unfamiliar with the call to apply(), you can learn more about why this is necessary in [Inputs and Outputs](https://www.pulumi.com/docs/iac/concep…" → ✅ verified (framing: The claim simply points readers to the docs page for background on apply(), which the page covers; the additional assertion ("creating resources within…; evidence: The cited URL (https://www.pulumi.com/docs/iac/concepts/inputs-outputs/#apply) returns HTTP 200 and is the Pulumi docs page on Inputs & Outputs, which documents the apply() method. The pre-fetched body is a generic page header/nav…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/#apply)
  • L27 in content/blog/refactoring-iac/index.md "A similar situation occurs with component resources, i.e., a logical grouping of related resources such as…" → ❌ contradicted (evidence: The linked page content/docs/iac/concepts/resources/_index.md has no heading or anchor named "components" — it only briefly mentions ComponentResource in one bullet ("A component resource is a logical grouping of other resources...")…; source: repo:content/docs/iac/concepts/resources/_index.md)
  • L444 in content/blog/remediation-policies/index.md "Finally, Pulumi has always had transformations to perform in-memory…" → ✅ verified (evidence: The docs page content/docs/iac/concepts/resources/options/transformations.md (served at the cited URL) documents both per-resource transformations and "Stack Transformations," stating they "can also be applied in bulk to many or all…; source: repo:pulumi/docs content/docs/iac/concepts/resources/options/transformations.md)
  • L230 in content/blog/run-your-own-rss-server/index.md "In this post, we've seen how easy it is to run a container as a service connected to an RDS database with Pulumi, and to expose that container securely on…" → ❌ contradicted (framing: claim links to /docs/iac/concepts/resources/#components but that anchor doesn't exist there; the real Components content is at /docs/iac/concepts/components/; evidence: The linked page content/docs/iac/concepts/resources/_index.md has no heading or anchor named "components" — it only contains a "Related topics" list item linking out to the separate page /docs/iac/concepts/components/, which is where the…; source: repo:content/docs/iac/concepts/resources/_index.md)
  • L13 in content/blog/safe-lambda-secrets/index.md "The subject of how to make use of secrets in Lambda Functions comes up a fair bit, and although there seems to be a lot of discussion on where you should…" → ✅ verified (evidence: The linked page content/docs/iac/concepts/config.md exists in the pulumi/docs repo and is the canonical stack configuration documentation, referenced identically ("stack config file"/"stack configuration") throughout dozens of other docs…; source: gh search code --owner pulumi "concepts/config" --repo pulumi/docs)
  • L44 in content/blog/scaling-apps-across-multiple-regions/index.md "A stack is a distinct deployment target within a Pulumi project. Stacks enable you to organize, version, and manage your infrastructure code effectively.…" → ✅ verified (framing: Truncated fetch prevented quoting the exact body text defining stacks, but the page target matches the claim's citation and topic.; evidence: The cited Pulumi docs page on Stacks (https://www.pulumi.com/docs/iac/concepts/stacks/) confirms stacks are the mechanism for organizing distinct deployment targets within a project; the pre-fetched body is truncated to nav content but…; source: https://www.pulumi.com/docs/iac/concepts/stacks/)
  • L24 in content/blog/six-things-about-pulumi-service/index.md "As a reader of this blog, you've probably heard of the Pulumi Service, the default state-management…" → ✅ verified (framing: Product was later renamed from "Pulumi Service" to "Pulumi Cloud"; the alias preserves link validity and the underlying claim (default backend) still holds…; evidence: /product/pulumi-service/ is a registered alias in content/product/_index.md ("aliases: - /product/pulumi-cloud/ - /product/pulumi-service/ ..."), so the link resolves to the current Product page. The state-and-backends doc…; source: repo:content/product/_index.md and repo:content/docs/iac/concepts/state-and-backends.md)
  • L96 in content/blog/six-things-about-pulumi-service/index.md "Notice here that the resources that are part of a component are grouped together. Also…" → ❌ contradicted (framing: Claim links to resources/#components anchor; that content has since moved to a standalone /docs/iac/concepts/components/ page, leaving the cited anchor…; evidence: The cited URL is https://www.pulumi.com/docs/iac/concepts/resources/#components, but the current resources page (content/docs/iac/concepts/resources/_index.md) has no '#components' heading/anchor — its "Related topics" section merely…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/components/_index.md)
  • L49 in content/blog/stack-readme/index.md "There are a lot of operational activities that happen around Pulumi Stacks, but critical information is…" → ✅ verified (evidence: The cited URL resolves (HTTP 200) to Pulumi's official "Stacks" concepts documentation page, which is the correct target for the link text "Pulumi Stacks". The claim itself is just a link reference plus general commentary about tooling…; source: https://www.pulumi.com/docs/iac/concepts/stacks/)
  • L131 in content/blog/testing-in-practice/index.md "The following code sets up the Pulumi stack and S3 bucket with Automation API. It's interesting to note that the tests don't import…" → ✅ verified (evidence: The linked page /docs/iac/concepts/ exists and explains Pulumi stacks: "Programs reside in a project... This command creates an isolated and configurable instance of your program, known as a stack." This supports the blog's use of…; source: repo:content/docs/iac/concepts/_index.md)
  • L544 in content/blog/testing-pulumi-programs-with-jest/index.md "Finally, open index.ts (which should still be empty) and add a couple of lines to import the resources module and export the function URL as a Pulumi…" → ✅ verified (evidence: The file content/docs/iac/concepts/stacks.md contains a section '## Stack outputs {#outputs}' stating: 'A stack can export values as stack outputs. These outputs are shown during an update, can be easily retrieved with the Pulumi CLI…; source: repo:content/docs/iac/concepts/stacks.md)
  • L88 in content/blog/tour-pulumi-equinix-provider/index.md "Now that your cluster is provisioned, you can deploy a workload (or any other Kubernetes or Helm resource) using the [Pulumi Kubernetes…" → ✅ verified (evidence: The Pulumi Kubernetes provider registry page exists at /registry/packages/kubernetes/ and documents that "The Kubernetes provider for Pulumi can be used to provision any resources available in the Kubernetes API," including Helm charts…; source: gh search code --owner pulumi repo:pulumi/registry "kubernetes provider" (themes/default/content/registry/packages/kubernetes/_index.md))
  • L113 in content/blog/tour-pulumi-equinix-provider/index.md "You can then add resources to the cluster by specifying your explicit provider as a [resource option](https://www.pulumi.com/docs/iac/concepts/resources/option…" → ✅ verified (evidence: The linked page content/docs/iac/concepts/resources/options/_index.md is the canonical "Resource options" reference page, which documents the provider resource option used to specify an explicit provider — matching the claim's…; source: repo:content/docs/iac/concepts/resources/options/_index.md)
  • L329 in content/blog/unit-testing-cloud-deployments-with-dotnet/index.md "To learn more about outputs, read this article." → ✅ verified (evidence: content/docs/iac/concepts/stacks.md contains a section '## Stack outputs {#outputs}' which matches the linked path/anchor /docs/iac/concepts/stacks/#outputs, describing stack outputs in detail.; source: repo:content/docs/iac/concepts/stacks.md (line 210: "## Stack outputs {#outputs}"))
  • L34 in content/docs/deployments/operations/permissions.md "- If your organization has default stack permissions set to NONE, then any deployment created by a git push or a pull request will not be able to access…" → ✅ verified (evidence: The link target resolves correctly: content/docs/iac/concepts/stacks.md has a "## Stack references {#stackreferences}" section defining StackReference, matching the anchor #stackreferences in the cited URL. The permissions.md page's own…; source: repo:content/docs/iac/concepts/stacks.md (line 550: "## Stack references {#stackreferences}"))
  • L146-150 in content/docs/iac/concepts/inputs-outputs/apply.md "This function (Output[T].str in Python) may throw in a future version of Pulumi." → ✅ verified (evidence: Found the exact string in pulumi/pulumi sdk/python/lib/pulumi/output.py: msg += "\nThis function may throw in a future version of Pulumi.", appended to the __str__ "not supported" diagnostic message, matching the doc's quoted CLI…; source: gh search code "may throw in a future version" --owner pulumi (pulumi/pulumi:sdk/python/lib/pulumi/output.py))
  • L146-149 in content/docs/iac/concepts/inputs-outputs/apply.md "The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/ provides more details on converting an Output[T] to an Output[str]…" → 🤷 unverifiable (evidence: The pre-fetched page returned HTTP 200 but the truncated body only shows generic Pulumi navigation/marketing content; it does not contain the specific text about converting Output[T] to Output[str] via apply() with an f-string example.…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L173-176 in content/docs/iac/concepts/inputs-outputs/apply.md "The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/ provides more details on converting an Output to an…" → 🤷 unverifiable (evidence: The pre-fetched page body is truncated to generic navigation/header content and does not include the specific section discussing Output, Apply, or Output.Format examples, so the claim's specific details cannot be confirmed from the…; source: https://www.pulumi.com/docs/iac/concepts/inputs-outputs/)
  • L176-177 in content/docs/iac/concepts/inputs-outputs/apply.md "The relevant string-conversion function may throw in a future version of Pulumi (referring to the .NET Output ToString-equivalent behavior)." → ✅ verified (evidence: pulumi/pulumi-dotnet sdk/Pulumi/Core/Output.cs contains: return string.Join(Environment.NewLine, message, "This function may throw in a future version of Pulumi."); alongside the "Calling [ToString] on an [Output] is not supported."…; source: gh search code --owner pulumi "This function may throw in a future version" -> pulumi/pulumi-dotnet:sdk/Pulumi/Core/Output.cs)
  • L476-477 in content/docs/iac/concepts/inputs-outputs/apply.md "Outputs that return to the engine as strings cannot be used directly in operations such as string concatenation until the output value has returned to…" → ➖ not-a-claim (evidence: The line is from content/docs/iac/concepts/inputs-outputs/apply.md itself, linking to its own page (/docs/iac/concepts/inputs-outputs/apply/) as the reference for using apply — a self-referential link within the same document, not a…; source: repo:content/docs/iac/concepts/inputs-outputs/apply.md)
  • L479-480 in content/docs/iac/concepts/inputs-outputs/apply.md "For the common case of building a string from output values, Pulumi's output helpers, documented at /docs/iac/concepts/inputs-outputs/helpers/#string-interpola…" → ✅ verified (evidence: The target page content/docs/iac/concepts/inputs-outputs/helpers.md exists with a "## String interpolation" heading (anchor #string-interpolation) stating: "Pulumi's string interpolation helpers let you construct a string from one or…; source: repo:content/docs/iac/concepts/inputs-outputs/helpers.md)
  • L583-584 in content/docs/iac/concepts/inputs-outputs/apply.md "A consolidated reference of all JSON helpers is available at /docs/iac/concepts/inputs-outputs/helpers/#json-helpers." → ✅ verified (evidence: The helpers.md page contains a section heading "## JSON helpers" (line 90), which produces the anchor #json-helpers referenced by the claim's link /docs/iac/concepts/inputs-outputs/helpers/#json-helpers, and the apply.md source line…; source: repo:content/docs/iac/concepts/inputs-outputs/helpers.md and repo:content/docs/iac/concepts/inputs-outputs/apply.md)
  • L583-584 in content/docs/iac/concepts/inputs-outputs/apply.md "The Pulumi SDK provides helper methods in most languages to make it easier to work with Pulumi outputs and JSON documents." → ✅ verified (evidence: The linked helpers.md#json-helpers page documents JSON stringify/parse helpers for TypeScript (pulumi.jsonStringify()/jsonParse()), Python (json_dumps()/json_loads()), Go (JSONMarshal()), C#…; source: repo:content/docs/iac/concepts/inputs-outputs/helpers.md)
  • L239 in content/docs/iac/concepts/projects/_index.md "For more information about configuration and how to manage these files on the command line and programmatically, refer to the…" → ✅ verified (evidence: Both linked pages exist in the docs repo: content/docs/iac/concepts/config.md (title: "Configuration") and content/docs/iac/concepts/secrets/_index.md (title: "Secrets Handling"), confirming the cross-references in the sentence resolve…; source: repo:content/docs/iac/concepts/config.md and repo:content/docs/iac/concepts/secrets/_index.md)
  • L495-498 in content/docs/iac/guides/migration/import/_index.md "The logicalName field is a string type, is not required (optional), and represents the logical name of the resource; the original name property is used…" → ✅ verified (evidence: The Pulumi CLI source (pkg/cmd/pulumi/operations/import.go) defines LogicalName string \json:"logicalName,omitempty"`with the comment "LogicalName is the resources Pulumi name (i.e. the first argument tonew Resource`)" …; source: gh api repos/pulumi/pulumi/contents/pkg/cmd/pulumi/operations/import.go)
  • L507 in content/docs/iac/guides/migration/import/_index.md "For new work, CLI-first import or program-first (bulk) import is preferred over the import resource option." → ✅ verified (evidence: The Pulumi docs page on importing existing cloud infrastructure states: "It's documented here for completeness and because existing programs still use it, but for new work prefer CLI-first import or program-first (bulk) import, described…; source: https://www.pulumi.com/docs/iac/guides/migration/import/)
  • L507 in content/docs/iac/guides/migration/import/_index.md "Before pulumi preview --import-file existed, the import resource option was the recommended way to import multiple resources across multiple stacks or…" → ✅ verified (evidence: Changelog confirms --import-file was added to pulumi preview in v3.96.0 ("[cli] Add --import-file to pulumi preview to generate a placeholder import file..."), well after the import resource option had long existed as the…; source: gh search code --owner pulumi "import-file" (pulumi/pulumi:changelog/v3.96.0.md); repo:content/docs/iac/guides/migration/import/_index.md)
  • L509 in content/docs/iac/guides/migration/import/_index.md "Code-based import (using the import resource option) does not imperatively modify the state of the current stack, unlike running pulumi import with the…" → ✅ verified (evidence: The doc's own surrounding text (line 507-509) explains: "Before pulumi preview --import-file existed, the import resource option was the recommended way to import... Pulumi imported the resource on the next update" and "running…; source: repo:content/docs/iac/guides/migration/import/_index.md (lines 505-509))
  • L625 in content/docs/iac/guides/migration/import/_index.md "After successfully importing a resource, you can delete the import option, re-run pulumi up, and all subsequent operations will then behave as though…" → ✅ verified (evidence: The doc itself states at line 625: "After successfully importing a resource, you can delete the import option if you like, then re-run pulumi up, and all subsequent operations will now behave as though Pulumi had provisioned the…; source: repo:content/docs/iac/guides/migration/import/_index.md (line 625))
  • L627 in content/docs/iac/guides/migration/import/_index.md "The retainOnDelete resource option is documented at /docs/iac/concepts/resources/options/protect/." → ❌ contradicted (framing: The link text names retainOnDelete but points to the protect option's reference page — the two are distinct, separately documented resource options.; evidence: The site's resource-options data file (data/resource_options.yaml) defines retainOnDelete as its own distinct option ("Retain the resource in the cloud provider when Pulumi deletes it"), separate from protect ("Prevent accidental…; source: repo:data/resource_options.yaml (retainOnDelete and protect entries); repo:layouts/shortcodes/resource-options-table.html)
  • L627 in content/docs/iac/guides/migration/import/_index.md "Once an imported resource has been brought under management with Pulumi, destroying its containing stack will delete the imported resource as well, in the…" → ✅ verified (evidence: The docs' own resource_options.yaml (canonical option reference) defines retainOnDelete: "Retain the resource in the cloud provider when Pulumi deletes it," confirming that without this option, destroying the stack deletes the imported…; source: repo:data/resource_options.yaml (retainOnDelete entry))
  • L675 in content/docs/iac/guides/migration/import/_index.md "To have subsequent updates preserve a specific name for an auto-named resource (for example, to handle naming conflicts across multiple stacks), you must…" → ✅ verified (evidence: Sibling doc content/docs/iac/concepts/resources/options/import.md states: "Unless you explicitly specify a name, Pulumi will auto-generate one... To fix this problem, explicitly specify the resource's name or disable auto-naming." This…; source: repo:content/docs/iac/concepts/resources/options/import.md, repo:content/docs/iac/concepts/resources/names.md)
  • L675 in content/docs/iac/guides/migration/import/_index.md "Auto-named resources import cleanly because Pulumi reads the imported resource's actual name from the cloud provider and uses it before the update checks…" → ❌ contradicted (framing: Link target names the wrong path (/docs/iac/concepts/resources/#autonaming) for an anchor that exists only at /docs/iac/concepts/resources/names/#autonaming.; evidence: The cited link target /docs/iac/concepts/resources/#autonaming does not contain an #autonaming anchor — that page's content (content/docs/iac/concepts/resources/_index.md) has no such heading. The actual autonaming section with heading…; source: repo:content/docs/iac/concepts/resources/_index.md and repo:content/docs/iac/concepts/resources/names.md)
  • L337 in content/docs/iac/guides/testing/unit.md "If your program uses StackReference to read outputs from another stack, you need to handle them in your mocks.…" → ✅ verified (evidence: The target page content/docs/iac/concepts/stacks.md contains a heading "## Stack references {#stackreferences}" which matches the anchor /docs/iac/concepts/stacks/#stackreferences, and describes StackReference exactly as the claim…; source: repo:content/docs/iac/concepts/stacks.md)
  • L810 in content/docs/iac/guides/testing/unit.md "- Because all Pulumi resource properties are outputs—since many of them are computed asynchronously—we need…" → ✅ verified (evidence: The linked page states: "Outputs represent asynchronous values... Because outputs represent asynchronous values, they must be handled differently... The Pulumi SDK provides these methods for accessing the plain values of outputs once…; source: content/docs/iac/concepts/inputs-outputs/_index.md)
  • L78 in content/docs/iac/languages-sdks/yaml/yaml-component-reference.md "The value of outputs is an object whose keys are the logical names of the outputs that are…" → ✅ verified (framing: The stacks page describes general stack outputs; the YAML component reference applies the same concept narrowly to component outputs, which is a valid…; evidence: The stacks concepts page has an anchored section ## Stack outputs {#outputs} stating "A stack can export values as stack outputs... The value of a stack export can be a regular value, an Output... or a Promise" — matching the linked…; source: repo:content/docs/iac/concepts/stacks.md (line 210: "## Stack outputs {#outputs}"))
  • L274 in content/docs/iac/languages-sdks/yaml/yaml-language-reference.md "The value of outputs is an object whose keys are the logical names of the outputs that are…" → ✅ verified (evidence: The stacks concept page has a "Stack outputs {#outputs}" section stating "A stack can export values as stack outputs. These outputs are shown during an update, can be easily retrieved with the Pulumi CLI..." and links to `pulumi stack…; source: repo:content/docs/iac/concepts/stacks.md (line 210-212, 282) and repo:content/docs/iac/cli/commands/pulumi_stack_output.md)
  • L261 in content/tutorials/building-with-pulumi/secrets/index.md "To learn more about Pulumi secrets, see the secrets documentation." → ✅ verified (evidence: The page at content/docs/iac/concepts/secrets/_index.md exists (title "Secrets Handling | Pulumi Concepts") and provides a full overview of Pulumi's secrets handling, matching the link target /docs/iac/concepts/secrets/ and the claim's…; source: repo:content/docs/iac/concepts/secrets/_index.md)
  • L152 in content/tutorials/creating-resources-aws/index.md "All resources have a required name argument. Each resource has both a [logical…" → ✅ verified (evidence: The pulumi/docs page content/docs/iac/concepts/resources/names.md exists at that URL and contains headings ## Logical Names {#logicalname} and ## Physical Names and Auto-Naming {#autonaming}, along with the definitions: "Logical name…; source: gh api repos/pulumi/docs/contents/content/docs/iac/concepts/resources/names.md)
  • L192 in content/tutorials/creating-resources-azure/index.md "All resources have a required name argument. Each resource has both a [logical…" → ✅ verified (evidence: The target page content/docs/iac/concepts/resources/names.md exists and contains both anchors cited: ## Logical Names {#logicalname} ("Every resource managed by Pulumi has a logical name that you specify as an argument to its…; source: repo:content/docs/iac/concepts/resources/names.md)
  • L213 in content/tutorials/creating-resources-gcp/index.md "All resources have a required name argument. Each resource has both a [logical…" → ✅ verified (evidence: The target page content/docs/iac/concepts/resources/names.md exists and contains both anchors used in the claim: ## Logical Names {#logicalname} and ## Physical Names and Auto-Naming {#autonaming}, matching the linked concepts of…; source: repo:content/docs/iac/concepts/resources/names.md)
  • L249 in content/tutorials/creating-resources-kubernetes/index.md "All resources have a required name argument. Each resource has both a [logical…" → ✅ verified (evidence: The Names doc page confirms both anchors: ## Logical Names {#logicalname} defines the logical name concept, and the physical name section (anchored {#autonaming}, i.e. the truncated #a... in the claim) states "A resource's logical…; source: repo:content/docs/iac/concepts/resources/names.md)
  • L74 in content/tutorials/inspecting-infrastructure/index.md "The pulumi stack command is used to provide a quick overview of the current stack's status and configuration. Running…" → ✅ verified (evidence: The auto-generated CLI reference page at /docs/iac/cli/commands/pulumi_stack/ confirms pulumi stack "Manage[s] stacks and view[s] stack state" including resources and outputs, matching the claim's description of a quick overview of…; source: repo:content/docs/iac/cli/commands/pulumi_stack.md)
  • L150-152 in content/tutorials/pulumi-fundamentals/create-a-pulumi-project/index.md "The glossary definition of 'project' is located at https://www.pulumi.com/docs/reference/glossary/#project." → ➖ not-a-claim (evidence: Lines 150-152 are HTML comments (<!-- [^1]: [project](...) -->) in the markdown source, meaning this footnote/glossary link is commented out and not rendered to readers at all — it is not a live assertion being published.; source: repo:content/tutorials/pulumi-fundamentals/create-a-pulumi-project/index.md)
  • L244 in content/tutorials/stack-outputs-refs-aws/index.md "The Pulumi documentation page at /docs/iac/concepts/stacks/#outputs describes how to export values of resource properties from a Pulumi program." → ✅ verified (evidence: The pulumi/docs source file content/docs/iac/concepts/stacks.md contains a section header ## Stack outputs {#outputs} immediately followed by "A stack can export values as stack outputs. These outputs are shown during an update, can be…; source: gh api repos/pulumi/docs/contents/content/docs/iac/concepts/stacks.md)
  • L432 in content/tutorials/stack-outputs-refs-aws/index.md "The Pulumi documentation page at /docs/iac/concepts/stacks/#outputs describes the pulumi stack output command." → ✅ verified (evidence: The stacks docs page has a "## Stack outputs {#outputs}" section (matching the #outputs anchor) which states: "From the CLI, you can then use pulumi stack output url to get the value..." and further discusses `pulumi stack output…; source: repo:content/docs/iac/concepts/stacks.md (section anchored #outputs))
  • L488 in content/tutorials/stack-outputs-refs-aws/index.md "A fully qualified Pulumi stack reference name is comprised of the organization, project, and stack names in the format <organization>/<project>/<stack>." → ✅ verified (evidence: The cited doc page content/docs/iac/concepts/stacks.md states: "The StackReference constructor takes as input a string of the form <organization>/<project>/<stack>, and lets you access the outputs of that stack." This exactly matches…; source: repo:content/docs/iac/concepts/stacks.md (line 833))
  • L767-768 in content/tutorials/stack-outputs-refs-aws/index.md "Stack outputs and references are documented at /docs/iac/concepts/stacks/#stackreferences in the Pulumi documentation." → ✅ verified (evidence: The same anchor /docs/iac/concepts/stacks/#stackreferences is used earlier in this same tutorial (line 488: "This can be done using Pulumi's Stack Reference functionality"), confirming it…; source: repo:content/tutorials/stack-outputs-refs-aws/index.md (line 488, 767))
  • L346 in content/tutorials/stack-outputs-refs-azure/index.md "A fully qualified stack name in Pulumi is comprised of the organization, project, and stack names in the format //." → ✅ verified (evidence: The claim matches Pulumi's documented StackReference convention: fully qualified stack names are structured as //, as shown in the same doc's own example (acmecorp/infra/dev) and consistent with Pulumi's…; source: content/tutorials/stack-outputs-refs-azure/index.md (line 346, with cross-references to /docs/pulumi-cloud/organizations/, /docs/iac/concepts/projects/, /docs/iac/concepts/stacks/))
  • L346 in content/tutorials/stack-outputs-refs-azure/index.md "Pulumi's Stack Reference functionality is documented at /docs/iac/concepts/stacks/#stackreferences." → ✅ verified (evidence: content/docs/iac/concepts/stacks.md contains the heading "## Stack references {#stackreferences}" which renders at the URL /docs/iac/concepts/stacks/#stackreferences, and documents the StackReference type and functionality exactly as…; source: repo:content/docs/iac/concepts/stacks.md)
  • L828-829 in content/tutorials/stack-outputs-refs-azure/index.md "Pulumi's documentation on stack outputs and references is located at /docs/iac/concepts/stacks/#stackreferences." → ✅ verified (evidence: content/docs/iac/concepts/stacks.md contains the heading "## Stack references {#stackreferences}" which corresponds exactly to the cited URL /docs/iac/concepts/stacks/#stackreferences, documenting StackReference usage.; source: repo:content/docs/iac/concepts/stacks.md (line 550: "## Stack references {#stackreferences}"))
  • L341 in content/tutorials/stack-outputs-refs-gcp/index.md "A fully qualified stack name is comprised of the organization, project, and stack names in the format //." → ✅ verified (evidence: The Stacks concept doc, which the tutorial links to, states: "Stack names must be fully qualified, including the organization, project, and stack name components, in the format <organization>/<project>/<stack>." This exactly matches…; source: repo:content/docs/iac/concepts/stacks.md (line 621))
  • L341 in content/tutorials/stack-outputs-refs-gcp/index.md "Pulumi's Stack Reference functionality is documented at /docs/iac/concepts/stacks/#stackreferences." → ✅ verified (evidence: content/docs/iac/concepts/stacks.md contains a section "## Stack references {#stackreferences}" documenting StackReference functionality, confirming the URL /docs/iac/concepts/stacks/#stackreferences correctly points to Pulumi's Stack…; source: repo:content/docs/iac/concepts/stacks.md (line 550: "## Stack references {#stackreferences}"))
  • L820-821 in content/tutorials/stack-outputs-refs-gcp/index.md "Stack outputs and references are documented at /docs/iac/concepts/stacks/#stackreferences in the Pulumi documentation." → ✅ verified (evidence: The file content/docs/iac/concepts/stacks.md contains the heading "## Stack references {#stackreferences}" which describes StackReference usage for accessing outputs of one stack from another — matching the URL…; source: repo:content/docs/iac/concepts/stacks.md)
  • L654-703 in content/blog/applying-attribute-based-access-controls-to-aws-lambda-functions/index.md "new aws.iam.RolePolicyAttachment( deletePolicy, { policyArn: deletePolicy.arn, role: role, }, { parent: deletePolicy })" → 🚩 flagged (readthrough: missing-step)
  • L27 in content/blog/faster-secrets-management/index.md "Pulumi also offers Pulumi ESC (Environments, Secrets, and Configuration), which provides centralized secrets management with hie" → 🚩 flagged (readthrough: self-redundancy)

📊 Editorial balance

Single-subject post; balance check N/A.

🚨 Outstanding in this PR

These must be resolved or refuted before merging.

The anchor problem, once. Nine of the bullets below are the same defect. The rewrite added the iac/ segment but kept a #fragment whose section no longer lives on /docs/iac/concepts/resources/. Those links still work, but only because that page ships a client-side JavaScript redirect map that bounces the reader to the real page — a second hop, which is what this PR exists to remove. The mapping to apply:

Legacy anchor on resources/ Current target
#components /docs/iac/concepts/components/
#autonaming /docs/iac/concepts/resources/names/#autonaming
#urns /docs/iac/concepts/resources/names/#urns
#dependson /docs/iac/concepts/resources/options/dependson/
#explicit-provider-configuration /docs/iac/concepts/providers/
#additionalsecretoutputs /docs/iac/concepts/resources/options/additionalsecretoutputs/
#transformations /docs/iac/concepts/resources/options/transformations/

Per AGENTS.md, retargeting a blog link to its current equivalent is exactly the sanctioned "equivalent replacement," so these are in scope even in /content/blog/. Several touched lines carry anchors not individually flagged below (#urns, #dependson, #additionalsecretoutputs, #transformations) — a sweep against the table above will catch them all in one pass.

  • [L105] content/blog/architecture-as-code-serverless/index.md"To learn more about creating reusable components, read about Pulumi's programming model, which shows how to…" — verdict: contradicted; framing: The link targets an anchor (#components) on the resources page that no longer exists; the actual "Components" content lives at a distinct URL. Point the link at the components page instead:

    To learn more about creating [reusable components](/docs/iac/concepts/components/), read about Pulumi's programming model, which shows how to author components.
    
  • [L313] content/blog/controlling-aws-costs-with-lambda-and-pulumi/index.md"take advantage of explicit provider configuration" — verdict: contradicted. The resources page has no #explicit-provider-configuration section; provider configuration now has its own page. Change the target to /docs/iac/concepts/providers/.

  • [L52-53] content/blog/migrating-my-infrastructure-from-terraform-to-pulumi/index.md"Pulumi component resources, documented at https://www.pulumi.com/docs/iac/concepts/resources/#components, can be used to group resources into logical groups…" — verdict: contradicted; the #components anchor lives on the separate /docs/iac/concepts/components/ page. Retarget to https://www.pulumi.com/docs/iac/concepts/components/.

    Same file, same hunk (L53): the next bullet's [naming](https://www.pulumi.com/docs/iac/concepts/resources/#autonaming) link has the identical problem — #autonaming is on the names page. Change it to https://www.pulumi.com/docs/iac/concepts/resources/names/#autonaming. L153's #urns link in the same file needs .../resources/names/#urns.

  • [L180-187] content/blog/next-level-iac-briding-the-declarative-gap/index.md"The Pulumi documentation page explaining the declarative and imperative approach is located at https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/#…" — verdict: contradicted; framing: Claim asserts the anchor exists at the cited URL; the current page content shows no matching heading/anchor.

    This hunk rewrites three link definitions at once, and all three anchors need checking against the new page — how-pulumi-works.md's headings are "Running a Pulumi program", "Resource operations", "Creation and deletion order", so #declarative-and-imperative-approach has no target at all:

    [pulumi-declarative-imperative-docs]: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/#declarative-and-imperative-approach
    [pulumi-engine-docs]: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/#deployment-engine
    [pulumi-providers-docs]: https://www.pulumi.com/docs/iac/guides/basics/how-pulumi-works/#resource-providers
    

    Drop the dead #declarative-and-imperative-approach fragment (link to the page root) or repoint it at whichever current heading covers that material, and confirm #deployment-engine and #resource-providers still resolve on the new page.

  • [L27] content/blog/refactoring-iac/index.md"A similar situation occurs with component resources, i.e., a logical grouping of related resources such as…" — verdict: contradicted. This line carries the #components anchor twice — once on component resources and again on the parent option later in the sentence. The first should become /docs/iac/concepts/components/; the second is pointing at the wrong concept entirely and wants /docs/iac/concepts/resources/options/parent/.

  • [L230] content/blog/run-your-own-rss-server/index.md"In this post, we've seen how easy it is to run a container as a service connected to an RDS database with Pulumi, and to expose that container securely on…" — verdict: contradicted; framing: claim links to /docs/iac/concepts/resources/#components but that anchor doesn't exist there; the real Components content is at /docs/iac/concepts/components/. Change the Pulumi [Components](…) target on this line to /docs/iac/concepts/components/.

  • [L96] content/blog/six-things-about-pulumi-service/index.md"Notice here that the resources that are part of a component are grouped together. Also…" — verdict: contradicted; framing: Claim links to resources/#components anchor; that content has since moved to a standalone /docs/iac/concepts/components/ page, leaving the cited anchor dead:

    Notice here that the resources that are part of a [_component_](https://www.pulumi.com/docs/iac/concepts/components/) are grouped together. Also, you can double click on those nodes in the graph to expand or collapse them!
    
  • [L627] content/docs/iac/guides/migration/import/_index.md"The retainOnDelete resource option is documented at /docs/iac/concepts/resources/options/protect/." — verdict: contradicted; framing: The link text names retainOnDelete but points to the protect option's reference page — the two are distinct, separately documented resource options. retainOnDelete has its own page (content/docs/iac/concepts/resources/options/retainOnDelete.md), and data/resource_options.yaml lists them as separate entries with different behavior ("retain the resource in the cloud provider when Pulumi deletes it" vs. "prevent accidental deletion"). Sending a reader who wants retainOnDelete to the protect page gives them the wrong option for the job:

    Be aware this applies to `destroy` operations also. Once an imported resource has been brought under management with Pulumi, destroying its containing stack will delete the imported resource as well in the usual way. If you wish to ensure that an imported resource survives through `pulumi destroy`, consider using the `retainOnDelete` resource option.
    

    The mislabel predates this PR — the old /docs/concepts/options/protect/ target was wrong in the same way — but the line is being rewritten here anyway, so this is the cheap moment to correct it.

  • [L675] content/docs/iac/guides/migration/import/_index.md"Auto-named resources import cleanly because Pulumi reads the imported resource's actual name from the cloud provider and uses it before the update checks…" — verdict: contradicted; framing: Link target names the wrong path (/docs/iac/concepts/resources/#autonaming) for an anchor that exists only at /docs/iac/concepts/resources/names/#autonaming. This one is on a docs page, where AGENTS.md requires internal links to use the full canonical path:

    [Auto-named](/docs/iac/concepts/resources/names/#autonaming) resources import cleanly: Pulumi reads the imported resource's actual name from the cloud provider and uses it before the update checks run, so auto-naming does not produce a name mismatch. That said, if you want subsequent updates to preserve a specific name — for example, to handle naming conflicts across multiple stacks — specify the `name` property explicitly, using [Pulumi configuration](/docs/iac/concepts/config/) where necessary.
    
  • [L29] content/blog/full-access-to-helm-features-through-new-helm-release-resource-for-kubernetes/index.md"Pulumi's Helm Chart integration was implemented as a Component Resource which effectively extracts the…" — the #components anchor no longer exists on the resources page; Components content now lives at its own page. Same fix as the others: retarget to /docs/iac/concepts/components/.

  • [L20] content/blog/keep-your-secrets-secure-by-default/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).

  • [L20] content/blog/keep-your-secrets-secure-by-default/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).

  • [L20] content/blog/keep-your-secrets-secure-by-default/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).

  • [L24] content/blog/six-things-about-pulumi-service/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).

  • [L49] content/blog/stack-readme/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).

  • [L49] content/blog/stack-readme/index.md — [style-blocker] deprecated product name — 'Pulumi Service' is the former name of Pulumi Cloud. Use the specific current product for this context -- e.g. Pulumi Cloud, Pulumi ESC, or Pulumi Deployments (STYLE-GUIDE.md §Product Names).


  • 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

Copy link
Copy Markdown
Contributor

⚠️ Low-confidence

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

  • [L132] content/blog/aws-serverless-analytics/index.md"Running 'pulumi up' for this example creates 45 AWS resources and lists the stack outputs to the console." — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L396] content/blog/command-provider-ga/index.md"- The CopyFile resource is superseded by the new CopyToRemote resource. It can copy whole…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L21] content/blog/faster-secrets-management/index.md"Pulumi now handles secrets more efficiently through optimized encryption and decryption processes…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L85] content/blog/infrastructure-testing-concepts/index.md"In cloud engineering, an infrastructure integration test uses infrastructure deployed in an [ephemeral environment](https://about.gitlab.com/blog/kubecon-na-20…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L20] content/blog/keep-your-secrets-secure-by-default/index.md"If you use a self-managed backend like AWS S3 or Google Cloud Storage, secrets are protected by a passphrase that you choose when you start a new stack with…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L34] content/blog/multicloud-with-kubernetes-and-pulumi/index.md"The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/components/ describes a Component Resource as an abstraction on top of other Pulumi…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L119] content/blog/next-level-iac-pulumi-runtime-logic/index.md"Running processes synchronously means they complete before Pulumi starts registering resources, as documented at https://www.pulumi.com/docs/iac/guides/basics/…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L204] content/blog/p3-some-assembly-required/index.md"In Pulumi, a component resource, as documented at https://www.pulumi.com/docs/iac/concepts/components/, is something that developers can import in their…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L65] content/blog/pulumi-and-localstack/index.md"The big thing to remember is that a Pulumi 'output' value [is not known until after the infrastructure has been fully provisioned](https://www.pulumi.com/docs/…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L146] content/blog/pulumi-release-notes-85/index.md"Pulumi SDKs ship helper serialization and deserialization functions that natively understand the type Output, streamlining the combination of JSON…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L146-149] content/docs/iac/concepts/inputs-outputs/apply.md"The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/ provides more details on converting an Output[T] to an Output[str]…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

  • [L173-176] content/docs/iac/concepts/inputs-outputs/apply.md"The Pulumi documentation page at https://www.pulumi.com/docs/iac/concepts/inputs-outputs/ provides more details on converting an Output to an…" — verdict: unverifiable — the cited page returned only its navigation chrome, so the supporting passage couldn't be read back. The destination page does exist and the link resolves; this is a limitation of the check, not evidence of a wrong link. Nothing here blocks the merge. Author question: this PR only rewrote the URL path — if you happen to know the claim itself has gone stale, that's worth a follow-up, but it's out of scope for a link sweep.

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/advanced-aws-networking-part-1/index.md — 2 (1 punctuation, 1 wordiness)
  • line 250: [style] punctuation — Commas and periods go inside quotation marks.
  • line 250: [style] wordiness — 'all of' is too wordy.
content/blog/ai-slack-bot-adding-data-to-pinecone-using-s3-embedchain-and-pulumi-on-aws/index.md — 4 (2 spacing, 1 difficulty qualifier, 1 weasel word)
  • line 284: [style] spacing — 'i.O' should have one space.
  • line 284: [style] difficulty qualifier — Avoid difficulty qualifier 'Simply' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
  • line 284: [style] spacing — 'g. T' should have one space.
  • line 284: [style] weasel word — 'largely' is a weasel word!
content/blog/architecture-as-code-kubernetes/index.md — 1 (1 punctuation)
  • line 104: [style] punctuation — Commas and periods go inside quotation marks.
content/blog/aws-serverless-analytics/index.md — 2 (1 difficulty qualifier, 1 unbacked CLI command)
  • line 460: [style] unbacked CLI command — CLI command 'pulumi up' should be wrapped in backticks in prose (STYLE-GUIDE.md §References to Commands or UI). Example: pulumi up.
  • line 460: [style] difficulty qualifier — Avoid difficulty qualifier 'simple' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/dynamic-providers/index.md — 1 (1 vague link text)
  • line 30: [style] vague link text — Vague link text ('here'). Use descriptive text that conveys the destination (STYLE-GUIDE.md §Links). ✏️
content/blog/iac-best-practices-enabling-developer-stacks-git-branches/index.md — 1 (1 difficulty qualifier)
  • line 57: [style] difficulty qualifier — Avoid difficulty qualifier 'easily' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/iac-best-practices-understanding-code-organization-stacks/index.md — 1 (1 difficulty qualifier)
  • line 82: [style] difficulty qualifier — Avoid difficulty qualifier 'simple' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/keep-your-secrets-secure-by-default/index.md — 5 (2 difficulty qualifier, 2 wordiness, 1 weasel word)
  • line 20: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
  • line 28: [style] wordiness — 'In addition' is too wordy.
  • line 34: [style] weasel word — 'usually' is a weasel word!
  • line 34: [style] wordiness — 'sufficient' is too wordy.
  • line 34: [style] difficulty qualifier — Avoid difficulty qualifier 'easy' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/next-level-iac-pulumi-runtime-logic/index.md — 2 (2 difficulty qualifier)
  • line 293: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
  • line 331: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/p3-some-assembly-required/index.md — 2 (1 filler, 1 wordiness)
  • line 82: [style] wordiness — 'In order to' is too wordy.
  • line 204: [style] filler — Don't start a sentence with 'There are'.
content/blog/pulumi-3-0/index.md — 3 (2 spacing, 1 difficulty qualifier)
  • line 64: [style] spacing — 'e. W' should have one space.
  • line 64: [style] spacing — 's. T' should have one space.
  • line 64: [style] difficulty qualifier — Avoid difficulty qualifier 'easy' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
content/blog/pulumi-and-localstack/index.md — 1 (1 weasel word)
  • line 65: [style] weasel word — 'very' is a weasel word!
content/blog/pulumi-release-notes-85/index.md — 2 (1 weasel word, 1 wordiness)
  • line 146: [style] weasel word — 'quite' is a weasel word!
  • line 170: [style] wordiness — 'in order to' is too wordy.
content/blog/pulumi-release-notes-m60/index.md — 1 (1 wordiness)
  • line 54: [style] wordiness — 'all of' is too wordy.
content/blog/run-your-own-rss-server/index.md — 2 (1 difficulty qualifier, 1 wordiness)
  • line 230: [style] difficulty qualifier — Avoid difficulty qualifier 'easy' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language).
  • line 230: [style] wordiness — 'it is' is too wordy.
content/blog/scaling-apps-across-multiple-regions/index.md — 1 (1 vague link text)
  • line 44: [style] vague link text — Vague link text ('this'). Use descriptive text that conveys the destination (STYLE-GUIDE.md §Links).
content/blog/six-things-about-pulumi-service/index.md — 2 (1 word choice, 1 wordiness)
  • line 24: [style] wordiness — 'a number of' is too wordy.
  • line 96: [style] word choice — Use 'select' instead of 'click' (STYLE-GUIDE.md).
content/blog/stack-readme/index.md — 1 (1 filler)
  • line 49: [style] filler — Don't start a sentence with 'There are'.
content/blog/tour-pulumi-equinix-provider/index.md — 1 (1 wordiness)
  • line 88: [style] wordiness — 'In order to' is too wordy.
content/docs/iac/guides/migration/import/_index.md — 2 (1 difficulty qualifier, 1 wordiness)
  • line 495: [style] difficulty qualifier — Avoid difficulty qualifier 'just' -- it judges difficulty for the reader (STYLE-GUIDE.md §Inclusive Language). ✏️
  • line 675: [style] wordiness — 'subsequent' is too wordy.
content/tutorials/stack-outputs-refs-aws/index.md — 1 (1 directional reference)
  • line 432: [style] directional reference — Directional reference ('as shown below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (STYLE-GUIDE.md §Inclusive Language).

📋 Triaged verifier findings

I double-checked these and realized they weren't real findings — click to expand
  • [L250] content/blog/advanced-aws-networking-part-1/index.md"You need to create both sets of routes within an apply because of the need to access the raw values of each of the subnet ids."Spurious: the framing comparison treated an ordinary specific application of apply as drift. The post describes one concrete case of the general mechanism the linked page documents, which is normal writing, not a shift in meaning.

  • [L104] content/blog/architecture-as-code-kubernetes/index.md"Deploying modern applications is complex. Any one of the architectures we've examined -- virtual machines, microservices, serverless and Kubernetes …"Mis-sourced: the cited Medium article returned HTTP 403 with an empty body, which is Medium's anti-bot response rather than a dead link. The claim is also a general statement about deployment complexity, not something that page was cited to prove.

  • [L130] content/blog/aws-serverless-analytics/index.md"The Pulumi serverless streaming input architecture implicitly creates an arrival-time partition scheme with the key 'inserted_at'."Mis-sourced: the check was run against the AWS Athena partitioning docs, which cover generic partitioning concepts and never mention Pulumi or an inserted_at key. The right source would be the post's own example code.

  • [L101] content/blog/mlops-huggingface-llm-aws-sagemaker-python/index.md"While creating a new project from the sagemaker-aws-python Pulumi template, you will be prompted for a [project](https://www.pulumi.com/docs/iac/concepts/pro…"Mis-sourced: the wrong URL was followed. The claim's primary target is the projects concept page, but the stacks page was fetched and compared instead.

💡 Pre-existing issues in touched files (optional)

  • [L165] content/blog/jamstack-with-pulumi/index.md"1. Install dependencies for our Pulumi program."Pre-existing: the link text promises dependency-install instructions but the target is a conceptual overview of how Pulumi works. That mismatch is unchanged by this PR — the old /docs/concepts/how-pulumi-works/ target was equally off-topic, and the diff only added the iac/guides/basics/ path segment. Worth a separate fix pointing at a getting-started or install page.

  • [L654-703] content/blog/applying-attribute-based-access-controls-to-aws-lambda-functions/index.md — a readthrough check flagged a missing step around the RolePolicyAttachment code block. Pre-existing: this PR touches only the link on L560; the code walkthrough is untouched.

  • [L27] content/blog/faster-secrets-management/index.md — a readthrough check flagged the Pulumi ESC paragraph as restating what the surrounding text already says. Pre-existing: this PR touches only L21; L27 is unchanged.

✅ Resolved since last review

No items resolved since the last review.

📜 Review history

  • 2026-08-22T13:01:51Z — Path rewrites are correct, but ~a dozen touched links kept #fragment anchors whose sections have moved off the resources page, so they still take a client-side redirect hop; two docs links (retainOnDelete, #autonaming) point at the wrong page outright. (6046be5)

  • 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.

@pulumi-bot

Copy link
Copy Markdown
Collaborator

Your site preview for commit 6046be5 is ready! 🎉

http://www-testing-pulumi-docs-origin-pr-21072-6046be51.s3-website.us-west-2.amazonaws.com

Changed pages:

@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 22, 2026
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 domain:docs PR touches technical docs domain:mixed PR touches more than one domain review:outstanding-issues Claude review completed; outstanding has author-actionable findings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants