Skip to content

Fix latent @id mismatches in unwired product-entities.html / related-content.html - #21071

Open
workprentice[bot] wants to merge 1 commit into
masterfrom
schema/fix-latent-id-mismatches-unwired-partials
Open

Fix latent @id mismatches in unwired product-entities.html / related-content.html#21071
workprentice[bot] wants to merge 1 commit into
masterfrom
schema/fix-latent-id-mismatches-unwired-partials

Conversation

@workprentice

@workprentice workprentice Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

This closes out the two latent JSON-LD @id mismatches identified in the 2026-08-15 audit (PR #20908) for layouts/partials/schema/utils/product-entities.html and layouts/partials/schema/utils/related-content.html. Both partials are confirmed unwired dead code today (grep-verified: nothing calls product-entities.html or related-content.html from graph-builder.html or any collector), so this changes zero live rendered output. The fix exists so whoever eventually wires either partial in doesn't inherit a pre-existing dangling reference.

What was dangling and what it now resolves to

product-entities.html:

  • The 4x isPartOf reference to the Pulumi Platform node used https://www.pulumi.com/product/#pulumi-platform. The real node (graph-builder.html) only ever exists at the homepage root, https://www.pulumi.com/#pulumi-platform. This is the audit's original finding.
  • Sister bugs, same defect class, same file: the CLI/Cloud/ESC/Insights entries used invented @ids (#pulumi-cli, #software) that no collector defines anywhere in the pipeline. Every product page's real main-entity id is the relative #main-content emitted by product-entity.html, so each now points at <that product page>#main-content.
  • The ESC and Insights entries also carried the pre-redirect URLs /product/esc/ and /product/pulumi-insights/, both now 301 aliases onto /product/secrets-management/ and /product/insights-governance/. Updated both @id and url.

related-content.html:

  • The tutorial→docs and docs→product cross-links used #article and #software fragments no collector defines; the real id is #main-content.
  • The tutorial→docs links pointed at /docs/clouds/{cloud}/get-started/, which now redirect (301) to /docs/iac/get-started/{cloud}/.
  • The docs→tutorial links declared @type: Course, which nothing in the pipeline ever emits. Rendering the real tutorial pages through an isolated Hugo harness shows they emit TechArticle. Updated the type and the #course/#article fragments to match, and updated the parallel Article stubs for the cloud docs pages to TechArticle to match how article-entity.html actually types docs pages.

Why beyond the ticket

The ticket only called out the 4x #pulumi-platform case in product-entities.html. The other issues are the same defect class in the same two files (dangling @id references to nodes that don't exist, or stale pre-redirect URLs), so I fixed the whole set in one pass rather than leaving a partial fix that would need a second PR to finish.

How this was verified

Live pulumi.com fetches from this environment return 404 (bot-blocked), so I built an isolated Hugo harness: copied the real layouts/partials and content trees from origin/master into a minimal site, rendered schema/graph-builder.html for the homepage, every affected product page, /docs/get-started/, all four /docs/iac/get-started/{cloud}/ pages, and all four /tutorials/creating-resources-{cloud}/ pages, and parsed the actual @id/@type pairs each page emits. Every @id this PR introduces matches a node the harness confirmed exists. I then rendered the full 80-page harness output before and after this change and diffed it: byte-identical, confirming the partials remain fully unwired and this PR has zero effect on shipped HTML.


🧠 This PR was created by workprentice.

…content.html

Both partials are confirmed unwired dead code (grep-verified: never
called from graph-builder.html or any collector), so this changes zero
rendered output today. Fixing the dangling @id references now so
whoever eventually wires these into graph-builder.html does not
inherit pre-existing reference-integrity bugs.

product-entities.html:
- The 4x isPartOf reference to the Pulumi Platform SoftwareApplication
  node used "https://www.pulumi.com/product/#pulumi-platform", but
  that node is only ever defined at the homepage root,
  "https://www.pulumi.com/#pulumi-platform" (graph-builder.html).
  This was the audit finding (PR #20908).
- Sister bugs in the same file, same defect class: the CLI, Cloud,
  ESC, and Insights entries used made-up @ids (#pulumi-cli, #software)
  that no collector anywhere defines. Every product page's real main
  entity id is the relative "#main-content" emitted by
  product-entity.html, so these now point at
  "<product page>#main-content" instead.
- The ESC and Insights entries also used the pre-redirect URLs
  /product/esc/ and /product/pulumi-insights/, which are now 301
  aliases onto /product/secrets-management/ and
  /product/insights-governance/ respectively. Updated both the @id and
  url fields to the canonical pages.

related-content.html:
- Docs/tutorial cross-links used "#article", "#software", and
  "#course" @id fragments that no collector defines; the real main
  entity id on every page is "#main-content".
- The tutorial-to-docs links pointed at /docs/clouds/{cloud}/get-started/,
  which now redirect (301) to /docs/iac/get-started/{cloud}/.
- The doc-to-tutorial links declared @type "Course", but no collector
  in the pipeline ever emits Course; rendering the real tutorial pages
  through an isolated Hugo harness confirms they emit TechArticle. The
  Article stubs for cloud docs were also updated to TechArticle to
  match how article-entity.html actually types docs pages.

Verified with an isolated Hugo harness that copies the real
layouts/partials and content trees and renders schema/graph-builder.html
for every affected page: rendered output (all 80 pages) is byte-identical
before and after this change, confirming zero live-render impact, and
every @id this change introduces matches a node the harness actually
emits on the real page.

---

🧠 This PR was created by workprentice (https://github.com/workprentice).
@github-actions github-actions Bot added review:triaging Claude Triage is currently classifying the PR domain:infra PR touches workflows, scripts, infra, Makefile, or build config 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

Copy link
Copy Markdown
Contributor

Pre-merge Review — Last updated 2026-08-22T12:57:59Z

Tip

Summary: This is an infrastructure change to two JSON-LD schema partials — product-entities.html and related-content.html — realigning their @id fragments (#software / #article / #course#main-content), their @type values (Article / CourseTechArticle), and four stale product URLs (/product/esc//product/secrets-management/, /product/pulumi-insights//product/insights-governance/). The reader-facing risk here is structured data that points at pages which don't exist or that declares a different @type than the target page's own graph node emits — either one degrades rich results and entity consolidation. Both risks check out clean: every referenced page exists in the repo (/product/infrastructure-as-code/, /product/secrets-management/, /product/insights-governance/, /product/pulumi-deployments/, /product/neo/, /product/, /docs/get-started/, the four /docs/iac/get-started/* pages, and the four /tutorials/creating-resources-* pages), the #main-content fragment matches the anchor every collector under layouts/partials/schema/collectors/ emits, TechArticle matches what article-entity.html emits at that anchor, and https://www.pulumi.com/#pulumi-platform matches the platform node defined in graph-builder.html. Every @id and its sibling url field now agree. The PR's "unwired" framing also holds — loader.html calls only graph-builder.html, which invokes neither of these two partials, so nothing here changes rendered output today; the value is that the latent mismatches are gone before either partial is wired up. Passes run: infra review of the full diff, cross-partial consistency reads against the schema collectors and graph builder, existence checks on all 15 referenced URLs, and external claim verification (23 claims, 0 contradicted).

Review confidence:

Dimension Level Notes
mechanics HIGH
facts HIGH
infra HIGH Every @id, @type, and url in the diff cross-checked against the schema collectors, graph-builder.html, and the live content tree; both partials confirmed uninvoked, so there is no rendered-output risk.
Investigation log
  • Cross-sibling reads: not run (not in a templated section)
  • External claim verification: 8 of 23 claims verified (0 unverifiable, 0 contradicted) · 4 specialists (numerical, cross-reference, capability, framing); 0 cross-specialist corroborations · routed: 0 inline, 22 Pass 1, 0 Pass 2, 1 Pass 3 (verified 0, contradicted 0, unverifiable 1).
  • Cited-claim spot-checks: not run (no cited claims)
  • Frontmatter sweep: not run (no frontmatter in diff)
  • Temporal-trigger sweep: not run (no trigger words)
  • Code execution: not run (no static/programs/ change)
  • Code-examples checks: not run (no fenced code blocks in content files)
  • Editorial-balance pass: not run (not under content/blog/)
🚨 Outstanding ⚠️ Low-confidence 💡 Pre-existing ✅ Resolved
0 0 0 0

🔍 Verification trail

23 claims extracted · 8 verified · 0 unverifiable · 0 contradicted
  • L10 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/product/infrastructure-as-code/#main-content'" → ➖ not-a-claim (evidence: This is a JSON-LD @id value in a Hugo partial template used to build structured-data entity graphs for the site's own product pages. The @id https://www.pulumi.com/product/infrastructure-as-code/#main-content corresponds to the…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L22 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/#pulumi-platform'" → ➖ not-a-claim (evidence: The "@id": "https://www.pulumi.com/#pulumi-platform" is a JSON-LD schema.org identifier used internally to link SoftwareApplication entities (Pulumi CLI, Cloud, ESC, Insights) via isPartOf to an abstract "Pulumi Platform" entity for…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L29 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/product/#main-content'" → ➖ not-a-claim (evidence: This is a JSON-LD @id identifier defined in the site's own Hugo schema partial, used to uniquely identify the "Pulumi Cloud" entity in structured data. It corresponds to the site's own /product/ page (https://www.pulumi.com/product/)…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L35 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/#pulumi-platform'" → ➖ not-a-claim (evidence: The @id "https://www.pulumi.com/#pulumi-platform" is an internal JSON-LD entity identifier (a URI fragment identifier, not necessarily a resolvable anchor) used consistently across all four product dicts in this file's isPartOf field…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L42 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/product/secrets-management/#main-content'" → ➖ not-a-claim (evidence: (escalated from pass1 after exhausting its 12-turn cap) This is a schema.org JSON-LD @id fragment identifier in a template file pointing to Pulumi's own live product page. The page exists: "Centralized Configuration & Secrets…; source: https://www.pulumi.com/product/secrets-management/)
  • L46 in layouts/partials/schema/utils/product-entities.html "'url' 'https://www.pulumi.com/product/secrets-management/'" → ✅ verified (evidence: The path content/product/secrets-management.md exists in pulumi/docs and is consistently referenced across the site (README.md, blog posts, what-is pages) as https://www.pulumi.com/product/secrets-management/ — the canonical URL for the…; source: gh search code --owner pulumi product/secrets-management (pulumi/docs:content/product/secrets-management.md, pulumi/pulumi README.md))
  • L49 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/#pulumi-platform'" → ➖ not-a-claim (evidence: This is a schema.org JSON-LD @id value used as an internal fragment identifier to link product entities (CLI, Cloud, ESC, Insights) to a common "Pulumi Platform" parent node within the site's own structured data. It's an internal…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L56 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/product/insights-governance/#main-content'" → ➖ not-a-claim (evidence: This is a JSON-LD @id identifier for the Pulumi Insights product entity in the site's own schema.org structured-data generator, mirroring the same #main-content anchor pattern used for the CLI, Cloud, and ESC product entities in this…; source: repo:layouts/partials/schema/utils/product-entities.html; repo:content/product/insights-governance.md)
  • L59 in layouts/partials/schema/utils/product-entities.html "'url' 'https://www.pulumi.com/product/insights-governance/'" → ✅ verified (evidence: The URL corresponds to an existing content page: pulumi/docs:content/product/insights-governance.md, and the same URL is used consistently elsewhere in the repo (data/footer.yml, data/header_nav.yaml, and multiple blog posts link to…; source: gh search code --owner pulumi insights-governance)
  • L62 in layouts/partials/schema/utils/product-entities.html "'@id' 'https://www.pulumi.com/#pulumi-platform'" → ➖ not-a-claim (evidence: This is a schema.org @id identifier (a fragment URL used as an internal reference key for structured data linking across the file, e.g. isPartOf entries pointing to the "Pulumi Platform" entity) rather than a factual/falsifiable…; source: repo:layouts/partials/schema/utils/product-entities.html)
  • L11 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/docs/iac/get-started/aws/#main-content'" → ➖ not-a-claim (evidence: This is a schema.org @id value produced by the PR author's own Hugo partial template logic (related-content.html), used as an internal structured-data cross-link, not an external factual assertion. The referenced page…; source: gh api repos/pulumi/docs/contents/content/docs/iac/get-started/aws)
  • L17 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/docs/iac/get-started/azure/#main-content'" → ➖ not-a-claim (evidence: This is a Hugo template generating a schema.org JSON-LD @id identifier pointing to the site's own Azure get-started doc page, which exists at content/docs/iac/get-started/azure/_index.md in the pulumi/docs repo. It's an internal…; source: repo:pulumi/docs content/docs/iac/get-started/azure/_index.md)
  • L23 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/docs/iac/get-started/gcp/#main-content'" → ✅ verified (evidence: The template generates a schema.org @id linking to /docs/iac/get-started/gcp/#main-content when tutorial content mentions "gcp". Confirmed content/docs/iac/get-started/gcp/_index.md exists in the pulumi/docs repo, so the referenced page…; source: gh api repos/pulumi/docs/contents/content/docs/iac/get-started/gcp)
  • L29 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/docs/iac/get-started/kubernetes/#main-content'" → ✅ verified (evidence: The template generates this @id conditionally when tutorial content mentions "kubernetes", pointing to the page at content/docs/iac/get-started/kubernetes/_index.md, which exists in the repo (title: "Get Started with Pulumi and…; source: repo:content/docs/iac/get-started/kubernetes/_index.md and repo:layouts/partials/schema/utils/related-content.html)
  • L37 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/docs/get-started/#main-content'" → ➖ not-a-claim (evidence: This is a Hugo template partial that programmatically constructs schema.org JSON-LD @id values (URL + fragment identifiers) for related-content linking, pointing to the site's own /docs/get-started/ page. It's the author's own…; source: repo:layouts/partials/schema/utils/related-content.html)
  • L49 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/product/#main-content'" → ➖ not-a-claim (evidence: This is a Hugo template literal generating a schema.org JSON-LD @id field pointing to the internal /product/ page anchor, used for structured-data relatedContent linking when blog content mentions 'Pulumi Cloud'. It is not a…; source: repo:layouts/partials/schema/utils/related-content.html)
  • L57 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/product/pulumi-deployments/#main-content'" → ✅ verified (evidence: The pulumi/docs repo contains content/product/pulumi-deployments.md (layout: pulumi-deployments), which builds to the live page at https://www.pulumi.com/product/pulumi-deployments/, matching the @id URL used in the related-content…; source: gh search code --owner pulumi pulumi-deployments (pulumi/docs:content/product/pulumi-deployments.md))
  • L65 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/product/secrets-management/#main-content'" → ✅ verified (evidence: content/product/secrets-management.md exists in the repo and renders at /product/secrets-management/ (title: "Centralized Configuration & Secrets Management – Pulumi ESC"), matching the @id URL…; source: repo:content/product/secrets-management.md; repo:layouts/partials/schema/utils/related-content.html)
  • L73 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/product/neo/#main-content'" → ➖ not-a-claim (evidence: This is a schema.org @id anchor generated by the template's own related-content logic, pointing to /product/neo/#main-content, which corresponds to the existing, live Pulumi Neo product page (content/product/neo.md in the docs…; source: repo:layouts/partials/schema/utils/related-content.html; repo:content/product/neo.md)
  • L86 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/tutorials/creating-resources-aws/#main-content'" → ✅ verified (evidence: The tutorial page content/tutorials/creating-resources-aws/index.md genuinely exists in pulumi/docs, confirming the URL path referenced in the schema @id is a real, valid page. The #main-content fragment is a standard anchor pattern used…; source: gh api repos/pulumi/docs/contents/content/tutorials/creating-resources-aws)
  • L92 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/tutorials/creating-resources-azure/#main-content'" → ➖ not-a-claim (evidence: This is a Hugo template line generating a JSON-LD @id value for schema.org structured data — it's the PR author's own template construct (an internal identifier fragment), not an assertion about external fact. The live pulumi/docs repo…; source: repo:layouts/partials/schema/utils/related-content.html)
  • L98 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/tutorials/creating-resources-gcp/#main-content'" → ✅ verified (evidence: The referenced page content/tutorials/creating-resources-gcp/index.md exists in pulumi/docs, confirming the URL path https://www.pulumi.com/tutorials/creating-resources-gcp/ is valid. The "#main-content" fragment matches the consistent…; source: gh api repos/pulumi/docs/contents/content/tutorials/creating-resources-gcp)
  • L104 in layouts/partials/schema/utils/related-content.html "'@id' 'https://www.pulumi.com/tutorials/creating-resources-kubernetes/#main-content'" → ➖ not-a-claim (evidence: This is a Hugo template line generating a schema.org JSON-LD "@id" URL for internal cross-linking, not a factual assertion. The target page content/tutorials/creating-resources-kubernetes/index.md exists in pulumi/docs, confirming the…; source: gh api repos/pulumi/docs/contents/layouts/partials/schema/utils/related-content.html; gh search code --repo pulumi/docs creating-resources-kubernetes)

🚨 Outstanding in this PR

No outstanding findings in this PR.

⚠️ Low-confidence

No low-confidence findings.

💡 Pre-existing issues in touched files (optional)

No pre-existing issues in touched files.

✅ Resolved since last review

No items resolved since the last review.

📜 Review history

  • 2026-08-22T12:57:59Z — No blockers — all 15 referenced URLs exist, and the new #main-content / TechArticle / #pulumi-platform values match the conventions in the schema collectors and graph builder (8f5fa6d)

  • 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 22, 2026
@pulumi-bot

Copy link
Copy Markdown
Collaborator

@pulumi-bot

Copy link
Copy Markdown
Collaborator

Lighthouse Performance Report

Commit: 8f5fa6d | Metric definitions

Page Device Score FCP LCP TBT CLS SI
Homepage Mobile 🟡 55 3.1s 4.0s 1199ms 0.062 4.4s
Homepage Desktop 🟢 94 0.8s 1.3s 131ms 0.011 0.9s
Install Pulumi Mobile 🟡 57 7.5s 15.7s 113ms 0.000 7.5s
Install Pulumi Desktop 🟢 90 1.2s 1.8s 0ms 0.022 1.2s
AWS Get Started Mobile 🟡 59 5.4s 7.7s 57ms 0.105 5.4s
AWS Get Started Desktop 🟢 90 1.1s 1.7s 0ms 0.040 1.1s

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

Labels

domain:infra PR touches workflows, scripts, infra, Makefile, or build config review:no-blockers Claude review completed cleanly; outstanding is empty

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants