Tighten product-name linting: fix retired-name copy, sharpen the DeprecatedProductNames rule - #20689
Conversation
…ecatedProductNames rule, add a Pulumi UI substitution Addresses #20653.
Pre-merge Review — Last updated 2026-08-04T14:43:15ZTip Summary: This is a terminology-hygiene PR across 13 docs pages plus two Vale style rules: it replaces the retired "Pulumi Service" / "your Pulumi service" / "Pulumi UI" product names with the current ones ("Pulumi Cloud", "Pulumi Cloud console", "Pulumi Self-Hosted container images"), sharpens Review confidence:
Investigation log
🔍 Verification trail37 claims extracted · 29 verified · 1 unverifiable · 0 contradicted
🚨 Outstanding in this PRNo outstanding findings in this PR.
|
|
Applied the casing suggestion (Pulumi services -> Pulumi Services) from the pre-merge review. The other two notes (pre-existing "the Service" casing on aks-hosted.md:45, and the Pulumi UI nag landing inside a case-studies customer quote) are left as follow-up items since they're outside this PR's touched scope. |
Scoping note
Issue #20653 ("Product and feature name linting and validation") is filed as a one-line pointer at a now-closed draft PR that never implemented anything. It is under-specified, so this PR makes an explicit scoping call rather than attempting the whole enhancement: the repo already has a Vale-based product-name linting layer (
styles/Pulumi/Nomenclature.ymlfor canonical casing,styles/Pulumi/DeprecatedProductNames.ymlfor the retired "Pulumi Service" name). That existing layer just isn't trustworthy enough to promote from a nag (make lint-prose, which always exits 0) to a real gate, because roughly two-thirds of its findings are false positives. This PR fixes the content, sharpens the rule, and reports what it deliberately left alone — treat it as one slice of #20653, not the whole thing.What changed
Content (13 sites across 12 files): replaced the retired "Pulumi Service" / "Pulumi UI" names with the current product name, chosen per-site from neighboring copy rather than a blanket find/replace:
Pulumi Cloudfor the ESC/Deployments OIDC "grant access to your Pulumi service" family (esc/guides/configuring-oidc/{vault,aws,gcp}.md,deployments/guides/oidc/gcp.md), the SCIMmeta_desc, and the OpenSearch admin copy (administration/self-hosting/components/search.md).Pulumi Cloud consoleforidp/concepts/_index.md's "Pulumi UI" (explicitly disallowed by the brand guide) — its sibling phrase "Pulumi services" (the IDP Services concept) is left untouched, it isn't the same thing.Pulumi Self-Hosted container images/Pulumi Cloud containersfor the self-hosting family (airgapped.mdand the fivedeployment-options/*.md"update the Pulumi Service containers" pages), matching how neighboring lines in the same pages already say "the Pulumi Cloud."styles/Pulumi/DeprecatedProductNames.yml: the existence rule's token was\bPulumi Service\bwithignorecase: true, which also matched "Pulumi Service Provider" / "Pulumi Service provider" — the still-current name of thepulumi-pulumiserviceTerraform/Pulumi provider (its upstream repo, registry packagepulumiservice, and this site's ownesc/integrations/pulumi-service-provider.mdall still use that name; renaming it is a product/IA decision with URL-alias consequences, out of scope here). Added a negative lookahead so the rule stops flagging the provider name:\bPulumi Service\b(?!s\b)(?!\s+provider\b). Verified empirically that Vale 3.14.1 accepts this RE2-syntax lookahead. Also corrected the rule's own header comment, which asserted "the 'Pulumi Service provider' is now the 'Pulumi Cloud provider'" — that's not true; the provider still ships under its historic name.styles/Pulumi/Nomenclature.yml: added'\bPulumi UI\b': Pulumi Cloud console, grounded in the brand guide's explicit list of canonical product names (which disallows "Pulumi UI").Measured evidence
Ran Vale 3.14.1 over
content/docs/with a throwaway config (BasedOnStyles = Pulumi) before and after this change:Pulumi.DeprecatedProductNames: 54 → 6 findings. The 6 remaining are deliberately out of scope (see below), not oversights.Pulumi.Nomenclature: 171 → 171 (the one "Pulumi UI" occurrence incontent/docs/was fixed as a direct content edit, not left for the new rule to catch at review time).content/docs/across all rules.make lint(markdownlint + prettier) passes; pre-commit hooks (lint-staged) also ran clean on commit.Deliberately deferred (not fixed here)
content/docs/support/pulumi-cloud-faq.md:183— inside PR Add Pulumi Cloud edition markers to docs #20560's ("Add Pulumi Cloud edition markers") active diff hunk (lines 137-205); editing it here would create a merge conflict.content/docs/iac/get-started/{aws,azure,gcp,kubernetes}/deploy-stack.mdimage alt text ("as shown in the Pulumi Service") — inside PR Trim the Getting Started guides and rename the StaticPage component #20360's ("Trim the Getting Started guides") rewrite hunks, same reason.content/docs/iac/cli/commands/pulumi_stack_webhook_delivery_redeliver.md— auto-generated from the Pulumi CLI's own help text (github.com/pulumi/pulumi/v3/pkg/cmd/pulumi/markdown); fixable only upstream in the CLI repo, not here.content/blog/**— legitimately uses the period-correct "Pulumi Service" name in posts from before the 2022 rename;make lint-prose's default scope is alreadycontent/(docs|blog), so leaving these alone is a judgment call, not a gap: rewriting historical blog copy to a name that didn't exist yet would be revisionist.content/case-studies/imagine-learning.md— 2 more "Pulumi UI" hits, one of them inside a verbatim customer quote (should never be edited) and neither reachable by prose lint anyway, sincelint-prose.sh's default scope iscontent/(docs|blog), notcontent/case-studies.Both deferred
content/docs/cases will surface to whoever lands #20560/#20360, sincelint-prose.shruns against files changed vs.masterby default — that's the intended safety net, not something this PR needs to chase down.Rules considered and rejected (with the evidence)
Pulumi Copilot→Pulumi Neosubstitution: rejected. Only 1 hit incontent/docs/and it's correct as written (describes the legacy Copilot conversation API/VS Code extension while pointing readers to Neo); 28content/blog/**files also legitimately use the period-correct name. A substitution rule here would be pure false positives.CrossGuardas a deprecated/retired term: rejected. 324 live hits acrosscontent/— this is not a dead term in this repo and renaming it is a product decision, not a lint fix.conditionalrule: rejected for v1. 29 files undercontent/docs/use bare "ESC" without ever expanding it on that page, and "ESC" collides with unrelated meanings (the Escape key, the retiredescCLI binary). Flagging as a follow-up idea for a maintainer to weigh, with the count, rather than shipping code for it.Pulumi Enterprise: not retired, it's a live pricing-tier name — no rule added.Nomenclature.yml(e.g.pulumi neo,pulumi insights): the existing rule already covers these, and the remaining raw-text hits are literal CLI syntax (pulumi neo,pulumi insights account scan list) inside code spans that Vale already skips.What this PR deliberately does not touch
No changes to
.vale.ini,STYLE-GUIDE.md,AGENTS.md,styles/Pulumi/HeadingSentenceCase.yml,.claude/**, or any.github/workflows/**file. Two other open PRs are actively working in exactly those files (#20663, tiering Vale findings into pre-merge review blockers; #20664, brand-voice consolidation), and this PR is scoped to stay clear of both. If anything, this PR is complementary to #20663: makingPulumi.DeprecatedProductNamesprecise (54 → 6, with the 6 remainders explained rather than noise) is a prerequisite for trusting it enough to tier as a blocker.🧠 This PR was created by workprentice.