Skip to content

Fix /docs/using-pulumi/ link defects and remaining /docs/iac/concepts/options/* redirect hops - #21155

Merged
CamSoper merged 2 commits into
masterfrom
seo/using-pulumi-options-redirect-hops-20260826
Aug 27, 2026
Merged

Fix /docs/using-pulumi/ link defects and remaining /docs/iac/concepts/options/* redirect hops#21155
CamSoper merged 2 commits into
masterfrom
seo/using-pulumi-options-redirect-hops-20260826

Conversation

@workprentice

@workprentice workprentice Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Internal redirect-hop and broken-link cleanup, split out from PR #21138 and PR #21146 to stay single-purpose. Fixes two things: three defects in the /docs/using-pulumi/ URL space (surfaced by PR #21138's review), and the remaining /docs/iac/concepts/options/* redirect hops PR #21145 didn't cover (that PR only owns the blog file).

/docs/using-pulumi/ defects (3, each independently verified before editing)

  1. Stray alias collision -- content/docs/iac/guides/building-extending/providers/debugging-providers.md carried /docs/using-pulumi/pulumi-packages/ in its aliases: list, amid a run of .../debugging-provider-packages/ variants that looks like a truncated copy-paste. That path is also aliased on content/docs/iac/concepts/packages/_index.md:14 -- the debugging page's declaration wins the collision (aliases are resolved by declaration order across the site build), so the link never reached the packages index it was presumably meant to reach. Deleted the stray entry; the correct, non-colliding alias on the packages page is untouched.

  2. Dead anchor -- content/docs/iac/guides/migration/import/_index.md:501 linked "component package" to /docs/using-pulumi/pulumi-packages/#types-of-pulumi-packages. I checked both plausible targets for a types-of-pulumi-packages heading or matching anchor text -- the debugging page and content/docs/iac/concepts/packages/_index.md (which has a "Package types" H2, not "types-of-pulumi-packages") -- and the anchor exists on neither. Repointed the link to /docs/iac/concepts/packages/ without a fragment rather than guess at an anchor that isn't there.

  3. Redirect hop -- content/docs/iac/comparisons/terraform/opentofu.md:148 linked to /docs/using-pulumi/adopting-pulumi/migrating-to-pulumi/#conversion, which 301s (via scripts/redirects/general-broken-links-redirects.txt:7) to /docs/iac/guides/migration/. Confirmed #conversion is a real H3 on that target page (content/docs/iac/guides/migration/_index.md:76). Pointed the link directly at the live destination.

A repo-wide sweep confirms no other live body link (as opposed to an aliases: entry) remains under /docs/using-pulumi/ anywhere in the tree.

/docs/iac/concepts/options/* redirect hops (8 files, outside PR #21145's scope)

Every internal link to /docs/iac/concepts/options/<name>/ 301s to /docs/iac/concepts/resources/options/<name>/ (each target page declares the old path under its own aliases: frontmatter). PR #21145 already owns content/blog/why-choose-pulumi-over-terraform/index.md -- its 5 remaining occurrences there are intentionally left alone here to avoid a stacked/conflicting diff on a file another open PR is editing. Everywhere else in the tree, fixed:

  • content/blog/aws-cdk-on-pulumi-1.0/index.md
  • content/docs/iac/cli/commands/pulumi_state_protect.md
  • content/docs/iac/concepts/resources/options/parent.md (two internal cross-links to sibling option pages)
  • content/docs/iac/guides/clouds/aws/cdk.md
  • content/docs/insights/policy/policy-packs/authoring.md (three occurrences)
  • content/tutorials/creating-resources-gcp/index.md
  • content/tutorials/creating-resources-kubernetes/index.md

Every rewritten target verified live (200, no further hop) via curl before committing. aliases: frontmatter entries under both prefixes are left untouched everywhere -- they are the redirect stubs, not the defect.

Verification

  • Every old URL curl-checked for its live 301 chain and every new URL curl-checked for a direct 200, before editing.
  • Every anchor claim checked against the actual heading/anchor text in the target file's source, not assumed from the URL slug.
  • git commit ran clean through the repo's husky pre-commit hook (node ./scripts/lint/lint-markdown.js + prettier via lint-staged) with no fixups needed.

🧠 This PR was created by workprentice.

… and /docs/iac/concepts/options/ hop classes

Three /docs/using-pulumi/ link defects, each independently verified:

- debugging-providers.md carried a stray `/docs/using-pulumi/pulumi-packages/`
  alias that collides with the same alias already declared on
  content/docs/iac/concepts/packages/_index.md:14 (the debugging page wins
  the collision, so the link never reached the packages index). Looks like a
  truncated copy-paste amid a run of `.../debugging-provider-packages/`
  aliases on the same page. Deleted the stray entry.
- import/_index.md:501 linked "component package" to
  /docs/using-pulumi/pulumi-packages/#types-of-pulumi-packages, an anchor
  that exists on neither the debugging page nor the packages index (checked
  both). Repointed to the packages concepts page itself, without the
  nonexistent fragment.
- opentofu.md:148 hopped via scripts/redirects/general-broken-links-redirects.txt:7
  to /docs/iac/guides/migration/, whose #conversion anchor does exist
  (confirmed at guides/migration/_index.md:76). Pointed directly at the
  canonical URL.

Also folded in the remaining /docs/iac/concepts/options/* redirect-hop
occurrences outside the blog file already covered by PR #21145: 8 more
files with live body links to the old /docs/iac/concepts/options/<name>/
path, each verified live (301 -> /docs/iac/concepts/resources/options/<name>/,
confirmed via curl) and rewritten to the canonical
/docs/iac/concepts/resources/options/<name>/ path. aliases: frontmatter
entries under both prefixes were left untouched -- they are legitimate
redirect stubs, not violations.
@github-actions github-actions Bot added the review:triaging Claude Triage is currently classifying the PR label Aug 26, 2026
@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 26, 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

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Pre-merge Review — Last updated 2026-08-26T21:11:37Z

Tip

Summary: A link-maintenance PR: it rewrites nine /docs/iac/concepts/options/* and /docs/using-pulumi/* links across docs, a tutorial pair, and one blog post to their canonical /docs/iac/concepts/resources/options/* (and /docs/iac/concepts/packages/, /docs/iac/guides/migration/#conversion) targets, and drops a duplicated /docs/using-pulumi/pulumi-packages/ alias from debugging-providers.md. The wrongness that would hurt a reader here is a rewritten link that lands somewhere different from the old one — a 404, a page about a different topic, or a dropped anchor — so the pass focused on resolving every new target and anchor, checking the removed alias is still claimed elsewhere, and confirming the surrounding prose still describes what the new destination actually says. Every new target resolves, the #conversion and #stack-transformations anchors exist, and the removed alias is owned by content/docs/iac/concepts/packages/_index.md. The one remaining redirect hop — the slashless transformations and deletedWith links in parent.md — was fixed in 915dafb, and a re-sweep of every /docs/… link the PR adds finds no slashless form left. Nothing blocks.

Review confidence:

Dimension Level Notes
mechanics HIGH
facts HIGH
coherence HIGH
cross-sibling consistency HIGH Link targets, anchors, and the removed alias's new owner all read directly.
Investigation log
  • Cross-sibling reads: 4 of 246 siblings
  • External claim verification: 29 of 29 claims verified (0 unverifiable, 0 contradicted) · 4 specialists (numerical, cross-reference, capability, framing); 0 cross-specialist corroborations · routed: 0 inline, 24 Pass 1, 3 Pass 2 (verified 3, contradicted 0, unverifiable 0), 2 Pass 3 (verified 2, contradicted 0, unverifiable 0).
  • Cited-claim spot-checks: 3 of 3 cited claims fetched and compared
  • Frontmatter sweep: ran on body + meta_desc
  • 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)
  • Re-entrant pass (915dafb): fix-response — re-verified the one low-confidence finding, curl-checked both rewritten targets, and re-swept every /docs/… link the PR adds for a missing trailing slash.
🚨 Outstanding ⚠️ Low-confidence 💡 Pre-existing ✅ Resolved
0 0 0 1

🔍 Verification trail

29 claims extracted · 29 verified · 0 unverifiable · 0 contradicted
  • L197 in content/blog/aws-cdk-on-pulumi-1.0/index.md "Resources read or created via Pulumi's cross-provider support can be integrated with CDK stacks." → ✅ verified (evidence: The blog states "Pulumi let's you read and create any resource type across thousands of different cloud service providers and integrate them with your CDK stacks," and demonstrates it with a working example combining CloudFlare resources…; source: repo:content/blog/aws-cdk-on-pulumi-1.0/index.md (lines 197, 204-260))
  • L197 in content/blog/aws-cdk-on-pulumi-1.0/index.md "Pulumi lets users read and create any resource type across thousands of different cloud service providers." → ✅ verified (framing: Source: "thousands of other providers through the Pulumi Registry" — claim narrows this to reading/creating "any resource type," which is entailed by…; evidence: Pulumi's own docs state: "Pulumi integrates with AWS, Azure, Google Cloud, Kubernetes, and thousands of other providers through the Pulumi Registry" and that users can "Browse the Pulumi Registry for thousands of additional cloud and…; source: https://www.pulumi.com/docs/integrations/clouds/)
  • L199-201 in content/blog/aws-cdk-on-pulumi-1.0/index.md "Pulumi allows customizing resource options (for example, to protect a database against accidental deletion or to deploy to multiple regions in the same…" → ✅ verified (evidence: The cited URL returns HTTP 200 and is titled "Resource Options | Pulumi Concepts | Pulumi Docs," matching the claim that resource options (e.g., protect, deletion, multi-region deployment) are documented there. The page body was…; source: https://www.pulumi.com/docs/iac/concepts/resources/options/)
  • L21-22 in content/docs/iac/cli/commands/pulumi_state_protect.md "If a Pulumi program does not also set the 'protect' resource option, Pulumi will unprotect the resource the next time the program runs (e.g. as part of a…" → ✅ verified (evidence: Source pulumi/pulumi pkg/cmd/pulumi/state/state_protect.go contains: "If your program does not also set the 'protect' resource option, Pulumi will unprotect the resource the next time your program runs (e.g. as part of a pulumi up)."…; source: gh search code --owner pulumi "unprotect the resource the next time" (pulumi/pulumi:pkg/cmd/pulumi/state/state_protect.go))
  • L21-25 in content/docs/iac/cli/commands/pulumi_state_protect.md "The URL https://www.pulumi.com/docs/iac/concepts/resources/options/protect/ provides more information on the 'protect' resource option and how it can be used…" → ✅ verified (evidence: The cited URL returns HTTP 200 and is titled "protect | Resource Options | Pulumi Docs", confirming it is the correct documentation page describing the 'protect' resource option, matching the claim's description.; source: https://www.pulumi.com/docs/iac/concepts/resources/options/protect/)
  • L27 in content/docs/iac/cli/commands/pulumi_state_protect.md "To unprotect a resource, use pulumi unprotect on the resource URN." → ✅ verified (evidence: The auto-generated CLI reference for pulumi state protect (sourced from github.com/pulumi/pulumi cobra command help) states verbatim: "To unprotect a resource, use pulumi unprotecton the resource URN." This matches the CLI's actual…; source: repo:content/docs/iac/cli/commands/pulumi_state_protect.md (auto-generated from pulumi/pulumi cobra markdown); gh search code --owner pulumi "pulumi state unprotect")
  • L148 in content/docs/iac/comparisons/terraform/opentofu.md "Pulumi's conversion process handles the static program structure and automatically generates a new, fully-functional Pulumi program that matches the source…" → ✅ verified (evidence: Pulumi's own architecture docs describe pulumi convert program conversion as: "the process of converting an existing infrastructure as code program written in one language (e.g. Terraform HCL) into a Pulumi program that when run…; source: gh api repos/pulumi/pulumi/contents/docs/architecture/converters.md)
  • L148 in content/docs/iac/comparisons/terraform/opentofu.md "The 'Conversion' section referenced at /docs/iac/guides/migration/#conversion exists within the Adopting Pulumi user guide and provides more information on…" → ✅ verified (evidence: The Adopting Pulumi migration guide at content/docs/iac/guides/migration/_index.md contains a heading "### Conversion" (line 76) which resolves to the #conversion anchor, and its content ("The final approach is to convert an existing…; source: repo:content/docs/iac/guides/migration/_index.md)
  • L134 in content/docs/iac/concepts/resources/options/parent.md "Transforms applied to a parent resource will run on the parent and on all child resources." → ✅ verified (evidence: parent.md itself states: "Transforms applied to a parent will run on the parent and on all child resources," and the dedicated transforms.md page confirms: "The transforms resource option provides a list of transforms to apply to a…; source: repo:content/docs/iac/concepts/resources/options/parent.md (L134) and repo:content/docs/iac/concepts/resources/options/transforms.md)
  • L134 in content/docs/iac/concepts/resources/options/parent.md "A transform can be applied to a component to intercept and modify any resources created by its children." → ✅ verified (evidence: The linked transforms.md doc states: "The transforms resource option provides a list of transforms to apply to a resource and all of its children. This option is used to override or modify the inputs to the child resources of a…; source: repo:content/docs/iac/concepts/resources/options/transforms.md)
  • L134 in content/docs/iac/concepts/resources/options/parent.md "Stack transforms are applied to all resources because all resources are ultimately parented directly or indirectly by the root stack resource." → 🤝 matches (evidence: The sibling page transforms.md independently states: "Transforms can also be applied in bulk to many or all resources in a stack by using Stack transforms, which are applied to the root stack resource and as a result inherited by all…; source: content/docs/iac/concepts/resources/options/transforms.md (Stack Transforms section))
  • L134 in content/docs/iac/concepts/resources/options/parent.md "The transforms resource option links to the documentation page at /docs/iac/concepts/resources/options/transforms/." → ✅ verified (evidence: parent.md line 134 links transforms to /docs/iac/concepts/resources/options/transforms/, and that page exists at content/docs/iac/concepts/resources/options/transforms.md with title "transforms" and a "## Stack Transforms" section…; source: repo:content/docs/iac/concepts/resources/options/transforms.md)
  • L136 in content/docs/iac/concepts/resources/options/parent.md "Stack transformations are applied to all resources because all resources are ultimately parented directly or indirectly by the root stack resource." → 🤝 matches (evidence: The sibling transformations.md page states: "Stack Transformations...are applied to the root stack resource and as a result inherited by all other resources in the stack," which is consistent with parent.md's claim that stack…; source: repo:content/docs/iac/concepts/resources/options/transformations.md)
  • L136 in content/docs/iac/concepts/resources/options/parent.md "The transformations resource option is deprecated in favor of transforms, and transforms should be preferred over transformations." → ✅ verified (evidence: The Pulumi docs page for the parent resource option states verbatim: "Prefer transforms over transformations as the latter is deprecated." This is corroborated by the transforms/transformations docs pages noting transformations "will…; source: https://www.pulumi.com/docs/iac/concepts/options/parent/)
  • L136 in content/docs/iac/concepts/resources/options/parent.md "The transformations resource option links to the documentation page at /docs/iac/concepts/resources/options/transformations." → ✅ verified (evidence: The parent.md file links [transformations](/docs/iac/concepts/resources/options/transformations) on line 136, and the target file content/docs/iac/concepts/resources/options/transformations.md exists with front matter title…; source: repo:content/docs/iac/concepts/resources/options/transformations.md)
  • L138 in content/docs/iac/concepts/resources/options/parent.md "Containing resources such as a Kubernetes namespace or a cloud resource group cascade-delete their contents in the backing provider." → ✅ verified (framing: deletedwith.md gives Kubernetes namespace/cluster as example of implicit cascade deletion; parent.md's claim (namespace or cloud resource group) is a…; evidence: The deletedWith doc gives the same example: "if you are deleting a Kubernetes cluster or Kubernetes namespace, you might want to speed up deletion by skipping delete on any Pulumi managed resources created in that Kubernetes cluster or…; source: repo:content/docs/iac/concepts/resources/options/deletedwith.md)
  • L639 in content/docs/iac/guides/clouds/aws/cdk.md "You can set Pulumi resource options for CDK resources by using Transforms, documented at https://www.pulumi.com/docs/iac/concepts/resources/options/transforms/." → ✅ verified (evidence: The URL resolves (HTTP 200) to the Pulumi docs page titled "transforms | Resource Options | Pulumi Docs", which matches the claim's assertion that Transforms are documented at this URL for setting Pulumi resource options.; source: https://www.pulumi.com/docs/iac/concepts/resources/options/transforms/)
  • L501 in content/docs/iac/guides/migration/import/_index.md "The remote field is a boolean, optional (not required), and indicates whether the resource is a component in a Pulumi component package as documented at…" → ✅ verified (evidence: pulumi/pulumi source (pkg/cmd/pulumi/operations/import.go) defines the import spec struct field as Remote bool json:"remote,omitempty", confirming remote is a boolean, optional field. The doc table itself states: 'remote |…; source: gh api repos/pulumi/pulumi/contents/pkg/cmd/pulumi/operations/import.go; repo:content/docs/iac/concepts/packages/_index.md)
  • L501 in content/docs/iac/guides/migration/import/_index.md "Setting remote: true in an import file entry indicates the resource is a component in a component package." → ✅ verified (evidence: The ImportResource struct in pulumi/pulumi's sdk/go/auto/optimport/optimport.go defines Remote bool with the comment: "When the resource is a component, this specifies it as a remote component." This matches the doc table's claim…; source: gh api repos/pulumi/pulumi/contents/sdk/go/auto/optimport/optimport.go)
  • L758 in content/docs/insights/policy/policy-packs/authoring.md "The args.opts object mirrors the resource options set on the resource under validation, letting policies make decisions based on how a resource is…" → ✅ verified (evidence: The pulumi-policy SDK defines PolicyResourceOptions as "the bag of settings that control a resource's behavior," with fields protect, ignoreChanges, deleteBeforeReplace, aliases, customTimeouts, additionalSecretOutputs…; source: gh search code --owner pulumi "PolicyResourceOptions" (pulumi/pulumi-policy sdk/nodejs/policy/policy.ts))
  • L760-761 in content/docs/insights/policy/policy-packs/authoring.md "The PolicyResourceOptions object includes an ignoreChanges field (named ignore_changes in Python) listing properties whose changes the engine ignores." → ✅ verified (evidence: pulumi-policy SDK's PolicyResourceOptions interface (nodejs/policy/policy.ts) declares ignoreChanges: string[], and the Python SDK (pulumi_policy.PolicyResourceOptions) exposes it as ignore_changes: List[str], matching the doc's…; source: gh search code --owner pulumi "PolicyResourceOptions ignoreChanges" (pulumi/pulumi-policy sdk/nodejs/policy/policy.ts; pulumi/docs static-prebuilt python reference))
  • L761 in content/docs/insights/policy/policy-packs/authoring.md "PolicyResourceOptions includes an ignoreChanges field (named ignore_changes in Python) listing properties whose changes the engine ignores." → ✅ verified (evidence: In pulumi/pulumi-policy source: sdk/nodejs/policy/policy.ts defines PolicyResourceOptions with field ignoreChanges: string[];, and sdk/python/lib/pulumi_policy/policy.py defines the corresponding Python class attribute…; source: gh search code -R pulumi/pulumi-policy "ignoreChanges" / "ignore_changes"; repos/pulumi/pulumi-policy/contents/sdk/nodejs/policy/policy.ts)
  • L763-764 in content/docs/insights/policy/policy-packs/authoring.md "The PolicyResourceOptions object includes a customTimeouts field (named custom_timeouts in Python) specifying custom create, update, and delete timeouts." → ✅ verified (evidence: The pulumi-policy nodejs SDK's PolicyResourceOptions interface includes customTimeouts: PolicyCustomTimeouts (source.ts:398, per generated docs: "customTimeouts: PolicyCustomTimeouts"), and the generated Python reference shows the…; source: gh search code --owner pulumi "PolicyResourceOptions customTimeouts" (pulumi/pulumi-policy sdk/nodejs/policy/policy.ts; pulumi/docs static-prebuilt reference pages))
  • L764-765 in content/docs/insights/policy/policy-packs/authoring.md "PolicyResourceOptions includes an additionalSecretOutputs field (named additional_secret_outputs in Python) listing outputs always treated as secrets." → ✅ verified (evidence: In pulumi/pulumi-policy sdk/nodejs/policy/policy.ts, the PolicyResourceOptions interface declares additionalSecretOutputs: string[];, and sdk/python/lib/pulumi_policy/policy.py's PolicyResourceOptions class uses…; source: gh search code "additionalSecretOutputs" --repo pulumi/pulumi-policy; gh search code "PolicyResourceOptions" --repo pulumi/pulumi-policy)
  • L765-766 in content/docs/insights/policy/policy-packs/authoring.md "For a resource created directly at the stack root rather than as a child of another resource or component, the parent field's URN is the URN of the root…" → ✅ verified (framing: names.md describes the URN parent-type path generally (excluding root Stack); the claim states the specific, well-established consequence that a root-level…; evidence: pulumi/pulumi source confirms the root stack resource type constant: const RootStackType Type = "pulumi:pulumi:Stack" (sdk/go/common/tokens/stack_type.go), and the linked names.md URNs section explains the URN's parent-type path runs…; source: gh search code --owner pulumi "pulumi:pulumi:Stack" (sdk/go/common/tokens/stack_type.go); content/docs/iac/concepts/resources/names.md#urns)
  • L843 in content/docs/insights/policy/policy-packs/authoring.md "The documentation page describing resource options (for what each option means on the resource side) is located at /docs/iac/concepts/resources/options/." → ✅ verified (evidence: The page at content/docs/iac/concepts/resources/options/_index.md exists with title "Resource options" and describes "All Pulumi IaC resources support a common set of options that allow you to customize how your resources are managed,"…; source: repo:content/docs/iac/concepts/resources/options/_index.md)
  • L843 in content/docs/insights/policy/policy-packs/authoring.md "To reason about parent-child relationships across the full resource graph, one should use a stack validation policy and inspect args.resources." → ✅ verified (evidence: The pulumi-policy SDK's PolicyResource (returned in args.resources for stack validation policies) exposes the resource's parent URN (server.ts: "/** The resource's parent URN (if it has one). */ parent?: string;"), and pulumi-policy…; source: gh search code --owner pulumi "parent" repo:pulumi/pulumi-policy (sdk/nodejs/policy/server.ts); gh search code --owner pulumi "resources/options" repo:pulumi/docs)
  • L229 in content/tutorials/creating-resources-gcp/index.md "Resource options let you control certain aspects of a resource, such as showing explicit dependencies or importing existing infrastructure." → ✅ verified (framing: Claim cites two specific options (explicit dependencies, import) as examples of what resource options control; source's table and reference pages confirm…; evidence: The Resource options page at /docs/iac/concepts/resources/options/ states: "Resource options allow you to do things like protect resources from being deleted, express more fine-grained control to the order in which resources are changed…; source: repo:content/docs/iac/concepts/resources/options/_index.md)
  • L263 in content/tutorials/creating-resources-kubernetes/index.md "Resource options let you control certain aspects of a resource, such as showing explicit dependencies or importing existing infrastructure." → ✅ verified (framing: Source describes resource options broadly (protect from deletion, order control, custom code); claim cites two specific examples (dependsOn, import) which…; evidence: The options page states: "Resource options allow you to do things like protect resources from being deleted, express more fine-grained control to the order in which resources are changed, or apply custom code..." and the resource options…; source: repo:content/docs/iac/concepts/resources/options/_index.md)
  • L136 in content/docs/iac/concepts/resources/options/parent.md "Both rewritten transformations links omit the trailing slash the canonical page URL carries" → ⚔️ mismatch (evidence: the sibling transforms links on L134 end in /, and every other docs link to this page uses /docs/iac/concepts/resources/options/transformations/; a slashless URL is served as a 301 to the trailing-slash form; source: repo:content/docs/iac/concepts/resources/options/parent.md L134-136)
  • L136-138 in content/docs/iac/concepts/resources/options/parent.md "Both transformations links and the deletedWith link now carry the trailing slash and resolve without a redirect hop" → ✅ verified (evidence: after 915dafb the diff shows /docs/iac/concepts/resources/options/transformations/, /docs/iac/concepts/resources/options/transformations/#stack-transformations, and /docs/iac/concepts/resources/options/deletedwith/; curl -o /dev/null -w '%{http_code}' returns 200 directly (no 301) for both page URLs, and a re-sweep of every /docs/… link the PR adds finds no remaining slashless form; source: gh api repos/pulumi/docs/compare/99dcd7f...915dafb; curl)

📊 Editorial balance

Single-subject post; balance check N/A.

🚨 Outstanding in this PR

No outstanding findings in this PR.

⚠️ Low-confidence

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

No low-confidence findings.

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/aws-cdk-on-pulumi-1.0/index.md — 1 (1 misspelling)
  • line 199: [style] misspelling — 'eg' isn't in the dictionary or styles/Pulumi/ignore/tech-vocabulary.txt. Fix the spelling, or add the term if it's genuinely correct.
content/docs/iac/comparisons/terraform/opentofu.md — 3 (1 hyphenation, 1 misspelling, 1 wordiness)
  • line 148: [style] wordiness — 'in terms of' is too wordy.
  • line 148: [style] misspelling — 'configurability' isn't in the dictionary or styles/Pulumi/ignore/tech-vocabulary.txt. Fix the spelling, or add the term if it's genuinely correct.
  • line 148: [style] hyphenation — 'fully-functional' doesn't need a hyphen.

💡 Pre-existing issues in touched files (optional)

No pre-existing issues in touched files.

✅ Resolved since last review

  • [L136] content/docs/iac/concepts/resources/options/parent.md — the two rewritten transformations links dropped the trailing slash and still took a 301 hop (resolved in 915dafb). The fix also covers the deletedWith link on L138, which had the same omission and wasn't called out in the original finding. Both targets now return 200 directly, and no /docs/… link the PR adds is missing its trailing slash.

📜 Review history

  • 2026-08-26T20:36:25Z — All nine rewritten links resolve and the removed alias is still owned by content/docs/iac/concepts/packages/_index.md; one touched line in parent.md still links without a trailing slash and keeps a redirect hop. (99dcd7f)
  • 2026-08-26T21:11:37Z — re-reviewed after fix push (1 new commit, 915dafb). The sole low-confidence finding is resolved: transformations, transformations/#stack-transformations, and deletedWith all carry the trailing slash, and curl confirms both page URLs return 200 with no 301. Re-swept every /docs/… link the PR adds — none is slashless. @workprentice[bot] declined the advisory style nits on aws-cdk-on-pulumi-1.0/index.md:199 and opentofu.md:148 as pre-existing prose the PR doesn't reword; that's accepted, and the one-click suggestions are withdrawn. The Vale bullets stay listed because that block is regenerated from the current lint run each refresh, not tracked across reviews. Nothing outstanding — this is clear to merge.

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

Important

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

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

@github-actions github-actions Bot added review:no-blockers Claude review completed cleanly; outstanding is empty and removed review:in-progress Claude review is currently running labels Aug 26, 2026
@github-actions github-actions Bot added review:stale New commits since last Claude review; refresh on next ready-transition or @claude mention and removed review:no-blockers Claude review completed cleanly; outstanding is empty labels Aug 26, 2026
@workprentice

workprentice Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor Author

Fixed the one Low-confidence finding: the two rewritten transformations links on content/docs/iac/concepts/resources/options/parent.md L136 (and the deletedWith link on L138, same omission) were missing their trailing slash, so they still 301'd. Added the slash to both — curl-verified both now resolve directly at 200. Pushed in 915dafb.

The style suggestions on aws-cdk-on-pulumi-1.0/index.md:199 and opentofu.md:148 are pre-existing prose this PR doesn't touch (only the link target on opentofu.md:148 changed, not the surrounding wording), so leaving those per the reviewer's own "optional, take what reads better" framing.

@claude #update-review

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

Copy link
Copy Markdown
Contributor

🤖 Review updated on @workprentice[bot]'s request.

@github-actions github-actions Bot added review:no-blockers Claude review completed cleanly; outstanding is empty and removed review:in-progress Claude review is currently running labels Aug 26, 2026
@workprentice

workprentice Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

Ready for human review. Live-verified against HEAD 915dafba (2026-08-27 ~12:15 UTC):

CI: all required checks green (Install deps and build site 13m38s, test, social-review, mark-stale, Update Changelog).

Bot review: tally is 0 Outstanding / 0 Low-confidence / 0 Pre-existing / 1 Resolved, confirmed against the current headRefOid. The two remaining items (a spelling nit on aws-cdk-on-pulumi-1.0/index.md:199 and wordiness/hyphenation on opentofu.md:148) are optional style suggestions on pre-existing prose this PR does not author — already addressed in the 21:07 UTC comment on this thread.

Live redirect/anchor check (curled against www.pulumi.com):

Old target New target Result
/docs/using-pulumi/adopting-pulumi/migrating-to-pulumi/#conversion /docs/iac/guides/migration/#conversion Old 301s to new; #conversion anchor present
/docs/using-pulumi/pulumi-packages/#types-of-pulumi-packages /docs/iac/concepts/packages/ New target 200s directly
/docs/iac/concepts/options/ /docs/iac/concepts/resources/options/ Old 301s to new; new 200s directly
/docs/iac/concepts/options/protect/ .../resources/options/protect/ Old 301s to new; new 200s directly
/docs/iac/concepts/options/parent/ .../resources/options/parent/ Old 301s to new; new 200s directly
/docs/iac/concepts/options/transformations/ .../resources/options/transformations/ (with trailing slash) New 200s directly; #stack-transformations anchor present on the page
/docs/iac/concepts/options/transforms/ .../resources/options/transforms/ New 200s directly
(unchanged) /docs/iac/concepts/resources/names/#urns #urns anchor confirmed present

Alias-removal safety (the one structurally risky change, dropping - /docs/using-pulumi/pulumi-packages/ from debugging-providers.md): confirmed against current master that content/docs/iac/concepts/packages/_index.md declares the identical alias, so it remains the sole owner after this removal. In fact, curling the live URL today shows it currently 301s to the wrong page (debugging-providers/) — this PR fixes that collision, it doesn't just clean up a duplicate.

No new occurrences of the old link forms were introduced elsewhere in master since this branch was cut; the residual /docs/iac/concepts/options/ and /docs/using-pulumi/* hits left in the tree are either legitimate aliases: front matter (expected, working as designed) or a distinct class of blog-post redirect-hop debt outside this PR's scope, which I'm tracking separately.

No blockers from this review pass.

@CamSoper
CamSoper merged commit c20d84c into master Aug 27, 2026
13 checks passed
@CamSoper
CamSoper deleted the seo/using-pulumi-options-redirect-hops-20260826 branch August 27, 2026 18:12
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:no-blockers Claude review completed cleanly; outstanding is empty

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants