Rebrand /what-is/ as Pulumi Resources at /resources/ (existing article URLs preserved) - #20595
Rebrand /what-is/ as Pulumi Resources at /resources/ (existing article URLs preserved)#20595CamSoper wants to merge 7 commits into
Conversation
17747a4 to
cba5c9a
Compare
|
Your site preview for commit da9c50b is ready! 🎉 http://www-testing-pulumi-docs-origin-pr-20595-da9c50b9.s3-website.us-west-2.amazonaws.com Changed pages: |
Lighthouse Performance ReportCommit: da9c50b | Metric definitions
|
cba5c9a to
8b52c7a
Compare
|
@copilot resolve the merge conflicts in this pull request |
Merge conflicts resolved in commit The only conflict was
|
f5091ca to
762a6de
Compare
|
Heads up: the branch was force-pushed with a rebase onto current master ( Generated by Claude Code |
There was a problem hiding this comment.
Pull request overview
Rebrands the “What Is…” explainer section as Pulumi Learn by moving content and templates to /learn/ while preserving existing explainer article URLs under /what-is/<slug>/ via per-page url: frontmatter pins.
Changes:
- Migrates explainer content, layouts, data, and client-side filter UI from
what-is→learn, and updates schema/SEO-related helpers accordingly. - Introduces a new
/learn/landing page (with an alias redirect from/what-is/) and frees/learnfrom the Tutorials section alias. - Updates internal references (meta-image generation, llms.txt index, marketing relrefs) to point at the new Learn section structure.
Reviewed changes
Copilot reviewed 100 out of 101 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| theme/src/ts/main.ts | Switches the bootstrapped filter module import from what-is-list to learn-list. |
| theme/src/ts/learn-list.ts | Implements the Learn landing-page filter behavior and updates DOM contract selectors. |
| theme/src/scss/_blog.scss | Updates active-pill styling selector to [data-learn-filter]. |
| scripts/meta-images/render.mjs | Updates template comment to reflect “learn” usage. |
| scripts/generate-meta-images.mjs | Renames the “title” section registry from what-is to learn and updates docs/comments. |
| layouts/partials/schema/graph-builder.html | Gates FAQ schema on .Type == "learn" instead of "what-is". |
| layouts/partials/schema/collectors/main-entity.html | Treats learn pages as Article/CollectionPage (replacing what-is). |
| layouts/partials/schema/collectors/breadcrumb-entity.html | Updates breadcrumb JSON-LD logic and section partial reference for learn. |
| layouts/partials/schema/collectors/article-entity.html | Updates schema comment to reference learn pages. |
| layouts/partials/meta-image-url.html | Updates docs/comments to reflect learn section in generated meta-image pathing. |
| layouts/partials/learn/section-for-page.html | New/renamed helper to map a learn page to its curated section from data/learn_sections.yml. |
| layouts/partials/learn/row.html | New/renamed partial to render a single Learn explainer row. |
| layouts/page/why-pulumi.html | Updates relref to the moved explainer content path under /learn/. |
| layouts/learn/single.html | New/renamed single-page layout for learn explainers (breadcrumb now “Learn”). |
| layouts/learn/list.html | New/renamed landing-page template, including the section filter UI and grouped rows. |
| layouts/index.llms.txt | Renames the llms.txt index entry from “What is…” to “Pulumi Learn” and points at /learn/. |
| layouts/case-studies/single.html | Updates comment referencing the learn pages. |
| data/learn_sections.yml | Renames/ports the curated section grouping data file from what-is to learn. |
| content/what-is/_index.md | Removes the old section landing frontmatter (section landing now lives at /learn/). |
| content/tutorials/_index.md | Removes the legacy /learn alias so /learn/ can serve Pulumi Learn. |
| content/topics/why-is-python-so-popular.md | Retypes the page to learn to use the learn layout. |
| content/learn/_index.md | Adds the new Pulumi Learn section landing page with aliases: [/what-is/]. |
| content/learn/what-is-yaml.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-terragrunt.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-terraform-state.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-soc-2.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-serverless.md | Retypes to learn, pins URL to /what-is/.../, and updates an embedded image link path. |
| content/learn/what-is-secrets-management.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-pulumi.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-policy-as-code.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-platform-engineering.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-infrastructure-drift.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-infrastructure-as-software.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-infrastructure-as-code.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-immutable-infrastructure.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-hitrust.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-hipaa.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-hashicorp-vault.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-google-cloud-secret-manager.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-gitops.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-devops.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-devops-automation.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-configuration-management.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-cloud-security.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-cloud-misconfiguration.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-cloud-infrastructure-autoscaling.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-ci-cd.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-azure-key-vault.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-aws-secrets-manager.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-an-internal-developer-platform.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-agentic-infrastructure.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-a-terraform-module.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-a-github-action-secret.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-a-cloudflare-secret.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-is-a-circleci-secret.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-are-kubernetes-secrets.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-are-docker-secrets.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/what-are-docker-configs.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-sts-get-caller-identity-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-s3-sync-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-s3-ls-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-s3-cp-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-lambda-list-functions-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-iam-list-users-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-ec2-stop-instances-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-ec2-start-instances-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-ec2-describe-instances-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-dynamodb-list-tables-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/run-aws-cloudwatch-get-metric-data-with-dynamic-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/resolve-unable-to-locate-credentials.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/resolve-list-buckets-signature-does-not-match.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/resolve-list-buckets-invalid-client-token-id.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/resolve-list-buckets-invalid-access-key-id.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/resolve-list-buckets-expired-token.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/python-for-devops.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/mcp-for-infrastructure-as-code.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/javascript-and-infrastructure-as-code.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/is-kubernetes-infrastructure-as-code.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/infrastructure-as-code-for-kubernetes.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/infrastructure-as-code-for-devops.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/guide-to-automating-file-expiration-in-aws-s3.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/database-comparison-cosmos-db-vs-dynamodb.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/cosmos-db-vs-mongodb-know-the-differences.md | Retypes to learn and pins URL to /what-is/.../. |
| content/learn/amazon-dynamodb-vs-google-cloud-bigtable.md | Retypes to learn and pins URL to /what-is/.../. |
| AGENTS.md | Updates repo guidance to replace “what-is” references with “learn”. |
| .github/workflows/claude-update.yml | Updates prose-file path filters to remove content/what-is/. |
| .github/workflows/claude-triage.yml | Updates prose-file path filters to remove content/what-is/. |
| .github/workflows/claude-code-review.yml | Updates prose-file path filters to remove content/what-is/. |
| .github/labels-pr-review.md | Updates docs-domain label definition to remove content/what-is/. |
| .claude/commands/seo-analyze/SKILL.md | Updates SEO analyze skill text/examples from what-is to learn. |
| .claude/commands/pr-review/scripts/should-fact-check.sh | Updates content-path trigger logic to remove what-is. |
| .claude/commands/new-doc/references/meta-images.md | Updates meta-image coverage docs from what-is to learn. |
| .claude/commands/docs-review/scripts/validate-pinned.py | Updates prose-path documentation comment to remove what-is. |
| .claude/commands/docs-review/scripts/triage-classify.py | Updates domain routing to remove content/what-is/. |
| .claude/commands/docs-review/scripts/extract-urls-and-fetch.py | Updates prose-path filter regex/docs to remove what-is. |
| .claude/commands/docs-review/references/website.md | Updates scope description to remove what-is. |
| .claude/commands/docs-review/references/domain-routing.md | Updates domain routing table to remove content/what-is/**. |
| .claude/commands/docs-review/references/docs.md | Updates docs-review criteria text from what-is to learn. |
Comments suppressed due to low confidence (2)
content/learn/what-is-serverless.md:88
- The page links to an image at
/learn/serverless-resources.png, but the only matching asset in the repo iscontent/learn/serverless-resources.png. Hugo only serves files fromstatic/by default (seeconfig/_default/config.ymlmounts), so this absolute URL will likely 404 in production.
layouts/learn/list.html:85 - The filter UI is described (and implemented in learn-list.ts) as progressive enhancement over real anchor links, but the "All" pill is a . Without JS, it won’t provide the same link behavior as the other pills, and it contradicts the stated no-JS/crawler fallback.
| @@ -39,7 +39,7 @@ | |||
| // blog-list.ts) and the /what-is/ section filter pill (moved by what-is-list.ts). | |||
| // Styled to match the mockup's selected pill. | |||
| [data-blog-filter] .is-active, | |||
| [data-what-is-filter] .is-active, | |||
| [data-learn-filter] .is-active, | |||
|
Flipping back to draft, @cnunciato already has plans for |
…e URLs Move content/what-is/ to content/learn/ and retype pages what-is -> learn. Every existing article keeps its /what-is/<slug>/ URL via a per-page url: pin (no redirects), per SEO guidance. The section landing moves to /learn/ with an alias from /what-is/. The bare /learn alias on the tutorials section (legacy Learn Pulumi redirect) is removed to free the URL; the /learn/<path>/ sub-aliases remain intact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
…ages Rename layouts/what-is -> layouts/learn, partials/what-is -> partials/learn, data/what_is_sections.yml -> learn_sections.yml, and the filter UI contract (what-is-list.ts -> learn-list.ts, data-what-is-filter -> data-learn-filter). Update .Type comparisons in the schema partials, the breadcrumb landing URL and label, the why-pulumi relref content path, the llms.txt section entry, and the generate-meta-images section registry. Analytics data-track slugs keep their existing what-is-* names for reporting continuity. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
content/what-is/ no longer exists, so drop it from content-path filters and review-skill references. Internal-link URL matchers keep what-is because the pinned article URLs remain live. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
Master's #20593 enabled markdown artifacts for /what-is/; carry the outputs/cascade front matter onto the relocated Pulumi Learn landing and add /learn/ to the CloudFront allowlist. Pinned articles keep emitting under /what-is/, which stays allowlisted; the bare /what-is/ landing is now an alias with no artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
/learn/ is spoken for, so the explainer section lands at /resources/ as Pulumi Resources: content/learn -> content/resources, type learn -> resources, layouts/partials/data/theme renamed to match, and the CloudFront markdown allowlist, meta-image registry, llms.txt entry, and schema breadcrumbs repointed. The bare /learn alias on the tutorials section is restored, since this branch no longer needs that URL. Existing article URLs are untouched — every page keeps its /what-is/<slug>/ pin, and /what-is/ still aliases to the section landing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
dda08c3 to
e225342
Compare
Pre-merge Review — Last updated 2026-08-05T23:08:51ZTip Summary: This is a fix-response follow-up on the Review confidence:
Investigation log
🔍 Verification trail90 claims extracted · 39 verified · 1 unverifiable · 5 contradicted · 2 detector findings
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. |
🚨 Outstanding in this PRNo outstanding findings — both blockers from the prior review are fixed; see ✅ Resolved below.
|
…otiation - content/events/_index.md claimed /resources as an alias (added when the migration hub was removed in #20247), which competed with the new section landing for the same output path. Drop it; /resources now belongs to the explainer section, and /webinar and /webinars still redirect to /events/. - The CloudFront markdown allowlist matched the bare /what-is/ landing on a plain prefix test, so an Accept: text/markdown request would rewrite to /what-is/index.md — an artifact that no longer exists now that the landing is only an alias. Exclude the bare landing; pinned /what-is/<slug>/ paths still negotiate normally. - Fix a stale 'learn' comment in the schema collector, restore indentation lost in layouts/resources/single.html, refresh the Vale path list comment, and note that the filter's what-is-* data-track ids are kept deliberately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdvcXL9p6GrBM6YnHdSP1
|
@claude #update-review Both blockers were real and are fixed in Fixed
Disputed / clarified
On the confidence notes: your read of the Generated by Claude Code |
|
🤖 Review updated on @CamSoper's request. |

Proposed changes
Rebrands the SEO explainer section ("What Is…") as Pulumi Resources, with the section landing at
/resources/, per SEO consultant guidance. Per that same guidance, no existing article URL changes — this is the load-bearing constraint of the PR, so reviewers: the per-pageurl:pins are intentional, not mistakes.Content
content/what-is/→content/resources/(git mv, history preserved). Every article gets aurl: /what-is/<slug>/front-matter pin, so it is served at its exact old URL with no redirect, andtype: what-is→type: resources. New articles added to the section get/resources/<slug>/URLs by default./resources/(titled "Pulumi Resources") withaliases: [/what-is/]— the single deliberate redirect.content/topics/why-is-python-so-popular.mdretyped (it borrows the section layout).Type/layout rename (
what-is→resources)layouts/what-is/→layouts/resources/,layouts/partials/what-is/→layouts/partials/resources/,data/what_is_sections.yml→data/resource_sections.yml..Typecomparisons updated in the schema partials (breadcrumb, main-entity, FAQ graph-builder); breadcrumb crumb is now "Resources" →/resources/.theme/src/ts/what-is-list.ts→resources-list.ts,data-what-is-filter→data-resources-filter(template + TS + SCSS kept in sync). Analyticsdata-trackslugs keep their existingwhat-is-*names for reporting continuity.scripts/generate-meta-images.mjssection registry,layouts/index.llms.txtsection entry, and thewhy-pulumirelref (content-path based) updated.outputs/cascadefront matter, and the CloudFront allowlist ininfrastructure/cloudfrontFunctions.tscovers/resources/alongside the still-live pinned/what-is/article paths (BUILD-AND-DEPLOY.mdupdated to match).content/resources/; internal-link URL matchers deliberately keepwhat-isbecause the pinned article URLs remain live.Verified with
make build: all 63 pinned articles render as full pages (no meta-refresh) at their old/what-is/<slug>/URLs and stay in the sitemap;/resources/renders the landing with rows linking to the pinned URLs;/what-is/emits the alias redirect to/resources/;/learnstill redirects to Tutorials;/resources/index.mdand the per-article.mdartifacts are emitted; JSON-LD breadcrumbs point at/resources/.make lintpasses.