Commit 47bd693
* Add Vale rule for overcapitalized generic concepts (issue #20653)
The brand writing-style guide says only proper nouns are capitalized:
"stack" not "Stack", "environment" not "Environment", "infrastructure as
code" not "Infrastructure as Code" mid-sentence. Product-name casing and
retired names are already well covered by Pulumi.Nomenclature and
Pulumi.DeprecatedProductNames, but nothing enforced this rule, so generic
IaC concepts kept drifting into Title Case.
Add Pulumi.Overcapitalization, an existence rule flagging a determiner
followed by capitalized "Stack" and a lowercase word followed by
"Infrastructure as Code". Both tokens use a negative lookahead (Vale's
regexp2 fallback, same technique as Pulumi.NarrativeWe) to skip a
following capitalized word, so compound proper nouns like "Stack Admin",
"Stack Tags", and "Stack API" aren't mistaken for the generic concept.
Tuned against the full content/ tree (2,241 files): the Pulumi Kubernetes
Operator's `Stack` custom resource (a Kubernetes CRD Kind) and the Pulumi
CDK bridge's `pulumicdk.Stack` class both legitimately capitalize "Stack",
so the operator docs subtree, the operator's launch/update blog posts,
the ArgoCD integration guide, and the CDK guide are opted out in
.vale.ini. A handful of other posts had the same CRD/class bleed into
otherwise-generic prose; those got backticks instead of a rule
exception. One 2019 blog post (stack-readme) treats "Stack" as a UI
feature name throughout and is opted out rather than rewritten wholesale.
Every other true violation the rule found -- about a dozen, split
between docs and blog -- is fixed in this same commit, following the
precedent set by #19975 and #20689 of shipping a new rule against
already-clean copy. The tree now has zero Overcapitalization findings.
The rule ships at warning, alongside DeprecatedProductNames rather than
Nomenclature/Substitutions: telling the generic concept from a genuine
proper noun is a judgment call, not a fixed substitution, so it isn't
added to the pinned-review blocker list. STYLE-GUIDE.md's Product Names
section now states the rule explicitly.
Issue #20653 is terse (a title plus a link to a closed, abandoned draft),
so this is a scope judgment: interpreting it as closing the gap between
the brand guide's naming rules and what Vale actually enforces, and
picking the clearest unenforced gap in that guide as the concrete
deliverable. Flagging this as a proposal on scope, not a foregone
conclusion -- redirect me if a different reading of the issue was
intended.
* Address review follow-up: finish overcapitalization sweep, fix broken link, fix operator provider-count attribution
- Repair a years-old broken markdown link in new-kubernetes-superpowers/index.md L46 (unclosed link swallowed "extends"), while updating the stale "Pulumi Service" name to "Pulumi Cloud".
- Finish the overcapitalization sweep in pulumi-yaml/index.md (L12 x2, L16) and opt the file out of the rule with a stated reason for the two legitimate proper-noun uses (workshop title, "Universal Infrastructure as Code platform" branded phrase) that should stay capitalized.
- Finish the overcapitalization sweep in why-every-cloud-engineer-needs-pulumi-esc-secrets-management/index.md L161 (L105 was already fixed).
- Fix what-is-gitops.md L91/L97: stop attributing a registry-wide provider count to the Pulumi Kubernetes Operator specifically; use the framing-preserving "every provider Pulumi supports" instead, consistent with L115's existing prose.
* Address round-2 review: finish sweep, fix branded-phrase false positive
Three issues from the re-entrant review pass, which re-greps every
occurrence of a phrase a prior finding quoted rather than only the
locations named:
- content/blog/new-kubernetes-superpowers/index.md L32 and
content/docs/esc/guides/integrate-with/cloudflare.md L176 still had
mid-sentence "Infrastructure as Code" the earlier sweep missed.
Lowercased both.
- The rule's lookahead only excludes a compound proper noun whose
capitalized half comes *after* the phrase ("Infrastructure as Code
(IaC)"), not one where it comes first. Pulumi's own branded
"Universal Infrastructure as Code" phrase recurs in 12 content files,
so the per-file .vale.ini opt-out added for pulumi-yaml patched one of
twelve. Replaced it with a global TokenIgnores entry (alongside the
existing shortcode ignores) that covers all 12 at once, and trimmed
the pulumi-yaml opt-out comment down to its one remaining real reason
(a workshop title).
- Also lowercased two more "the Stack" console-breadcrumb instances
the reviewer found in content/docs/deployments/concepts/{ttl,schedules}.md
(list-item text, same generic concept).
Re-verified against the full content/ tree: zero Pulumi.Overcapitalization
findings.
* Fix terminology on a line this PR already touches: Business Critical edition, not tier
content/blog/pulumi-policy-mgmt-launch/index.md's lowercased-IaC sentence also said "Business Critical tier," but current product vocabulary (see content/pricing/_index.md, policy-packs/metadata.md) is "edition," not "tier." Fixed on the same line this PR is already editing.
* Fix silent boundary bug, drop unvalidated IaC token
While double-checking the round-3 review's residual-finding claim by hand rather than trusting either side, found the real cause: the 'Infrastructure as Code' token used a bare [a-z] to anchor the preceding context. Vale auto-wraps existence tokens in \b...\b, and \b only holds at a genuine word/non-word transition. A single-character class only sits at that boundary when it's preceded by punctuation (an apostrophe, as in "Pulumi's"), so the token silently missed the overwhelmingly common case of an ordinary word immediately before the phrase ("the Infrastructure as Code", "your Infrastructure as Code"). The tree-wide validation stayed at zero findings not because the copy was clean, but because a whole class of true positives never matched in the first place.
Fixing the anchor to a full word ([a-z]+) rather than a single character surfaces the real violation surface: 161 hits across 78 files, almost entirely blog posts written over several years. That's a real, separate editorial sweep, not something to rush through under review pressure in the same PR as the Stack token (which has been validated clean, hand-audited, and review-approved across three rounds).
Scoping this PR down to the Stack token only. Dropped the IaC token, the .vale.ini TokenIgnores entry that existed solely to support it, and the pulumi-yaml opt-out whose only remaining reason was IaC-specific. Re-verified zero Pulumi.Overcapitalization findings tree-wide with the Stack-only rule. Filing the IaC sweep as a follow-up issue rather than shipping it half-validated.
* Apply suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Document scope:paragraph as deliberate, confirm headings excluded
Per CamSoper's review: record that scope: paragraph is a considered choice, not an oversight, and that widening it to text or bare heading would flag correct Title-Case H1s -- this repo already hit that wall with Google.Headings. Confirmed empirically with a minimal repro that paragraph scope does exclude headings, which means the argocd.md opt-out (whose only match on that page is an H2) currently covers nothing. Left the opt-out in place -- removing it on a premise this comment only now confirms would be a separate speculative edit -- but documented so the next reader doesn't mistake it for load-bearing. Tracked alongside the dropped IaC token's own scope question in issue #20958.
---------
Co-authored-by: workprentice <257153108+workprentice@users.noreply.github.com>
Co-authored-by: Cam Soper <csoper@pulumi.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent eb990cf commit 47bd693
20 files changed
Lines changed: 119 additions & 27 deletions
File tree
- content
- blog
- automation-api-dotnet
- aws-cdk-on-pulumi
- azure-native-defaultazurecredential-and-private-cloud
- data-science-in-the-cloud
- kubecon-na-2024-roundup
- managing-github-with-pulumi
- new-kubernetes-superpowers
- pulumi-policy-mgmt-launch
- pulumi-yaml
- using-pulumi-with-aws-sqs-and-lambdas
- why-every-cloud-engineer-needs-pulumi-esc-secrets-management
- docs
- deployments/concepts
- esc/guides/integrate-with
- iac
- comparisons/terraform
- operations/continuous-delivery
- what-is
- styles/Pulumi
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
328 | 328 | | |
329 | 329 | | |
330 | 330 | | |
| 331 | + | |
331 | 332 | | |
332 | 333 | | |
333 | 334 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
291 | 291 | | |
292 | 292 | | |
293 | 293 | | |
294 | | - | |
| 294 | + | |
295 | 295 | | |
296 | 296 | | |
297 | 297 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
| 30 | + | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
228 | 228 | | |
229 | 229 | | |
230 | 230 | | |
231 | | - | |
| 231 | + | |
232 | 232 | | |
233 | 233 | | |
234 | 234 | | |
| |||
343 | 343 | | |
344 | 344 | | |
345 | 345 | | |
346 | | - | |
| 346 | + | |
347 | 347 | | |
348 | 348 | | |
349 | 349 | | |
| |||
479 | 479 | | |
480 | 480 | | |
481 | 481 | | |
482 | | - | |
| 482 | + | |
483 | 483 | | |
484 | 484 | | |
485 | 485 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
| 32 | + | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
| 46 | + | |
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
0 commit comments