Skip to content

Make self-hosted Pulumi Cloud a first-class story - #20914

Draft
joeduffy wants to merge 13 commits into
masterfrom
self-hosted-excellence
Draft

Make self-hosted Pulumi Cloud a first-class story#20914
joeduffy wants to merge 13 commits into
masterfrom
self-hosted-excellence

Conversation

@joeduffy

Copy link
Copy Markdown
Member

Self-hosted Pulumi Cloud is a real product with seven supported installations, and the website has been hiding it behind a marketing page written in 2022, a navigation entry that didn't exist, and a compliance page that claimed less than we can actually defend. This fixes the surface around it and corrects a dozen factual errors in the docs.

Marketing and trust

  • /product/self-hosted/ rebuilt on the template-partials system every other product page uses; the bespoke 146-line layout is deleted, URL unchanged. The old page said "Cloud Engineering Platform", offered "Azure Active Directory" as an identity option, omitted AWS ECS entirely despite it being our most complete installer, and routed every docs link through the retired /docs/pulumi-cloud/self-hosted/ path so each click was a redirect.
  • The VMware tile is gone. It linked to a contact form with no docs behind it and implied a vSphere installer that doesn't exist.
  • The identity copy was wrong on substance, not just naming: there is no Azure AD OAuth connector — Entra ID reaches self-hosted through SAML.
  • /security/ now states what we don't hold (ISO 27001, HITRUST, PCI DSS) alongside the SOC 2 Type II attestation, and separates our compliance policy packs from our own certification status — a distinction a procurement reader could easily conflate. /trust/ and /trust-center/ alias here.
  • FedRAMP gets an equal-weight column headed "No FedRAMP authorization" on the product page. No ATO, no Marketplace listing, said outright, followed by what self-hosting actually changes: who owns the boundary. A reviewer who can see immediately what we don't hold will trust what we do claim.
  • No FIPS claim. Nothing in this repo, pulumi/pulumi, or pulumi-self-hosted-installers substantiates one. It can land later once engineering documents precisely what's true.
  • The /security/ "Read Whitepaper" button has been dead since January 2026.Resources.GetMatch on a branch bundle never matches a content page, so it rendered href="". Fixed with site.GetPage and an errorf guard; I proved the guard fires by deleting the whitepaper and watching the build exit 1.

Docs corrections

Every fix verified against installer source, not reasoned about:

Claim Reality
PULUMI_DATA_PATH defaults to /tmp/pulumi-ee/data ${HOME}/pulumi-self-hosted-installers/data
PULUMI_LOCAL_DATABASE_NAME run-ee.sh reads PULUMI_LOCAL_DATABASE_HOST
Docker network pulumi-ee pulumi-self-hosted-installers
"Your sales contact should provide the migrations folder" Compose pulls pulumi/migrations from Docker Hub
"The container image repository is private" pulumi/service is public with 220,518 pulls; pulumi/console with 114,034
EKS on Kubernetes 1.18–1.21, npm run install -- update -- Describes eks-hosted-deprecated; current installer is v4.0
Deploy air-gapped "using Helm" No Helm chart exists anywhere
db.r5.large is "the installers default" True for EKS; ECS defaults to db.t3.small

PULUMI_LICENSE_KEY causes a hard exit 1 and was never mentioned — the most common first-run failure.

Two safety gaps

  • The V2 engine-events schema migration. All four modern installer READMEs open with "DO NOT USE THIS VERSION OF THE INSTALLER FOR AN EXISTING INSTALL. CONTACT PULUMI SUPPORT TO MIGRATE THE DB FIRST." It appeared nowhere in the docs. Now a shortcode on the upgrades guide and all six production deployment pages.
  • First signup becomes the administrator, including the SAML administrator, and enabling SAML doesn't close email signup. Documented only in the AKS README. Now on every deployment page.

New and restructured

  • system-requirements and troubleshooting pages, both built from facts that already existed but were scattered. Troubleshooting is indexed by symptom — the string ALGORITHM=INPLACE is not supported is what a failed migration actually prints, and it previously lived only inside the operations database page.
  • ECS install guide rewritten with real commands, config tables, and a verification sequence taken from the quickstart's own integration tests. This is the pattern; the other six still hand off to their READMEs.
  • Telemetry split out of api.md (510 → 376 lines), keeping the env vars and the #opentelemetry anchor in place so inbound links — including from the installer READMEs, which we don't control — keep working.
  • Revives and corrects the unmerged June 17 self-hosted-first-class branch: its install front door, quickstart rewrite, and Terraform Enterprise migration guide. Its self-serve framing is rewritten, because the evaluation-license mechanism it assumed still doesn't exist — readers were told they could try it themselves and then hit a sales gate.

Verification

make lint and make build clean. No broken links introduced. Rendered output checked for every claim above.

Known follow-ups

  • Six deployment guides still delegate to READMEs; ECS sets the pattern.
  • components/console.md says 1 CPU / 1 GB while operations/compute-sizing.md says 0.5 vCPU / 512 Mi. They may be measuring different things (host minimum vs. container request), so I left both rather than delete one on a guess. This needs an answer before the duplicate requirements tables can be collapsed.
  • Pre-existing, not touched: /guides/ 404s from both the header nav and footer; the JSON-LD FAQ schema emits raw shortcode markup into acceptedAnswer.text; the 2024 post self-hosted-search-and-deploy links to components/api#deployments, which has always anchored as #pulumi-deployments.

🤖 Generated with Claude Code

joeduffy and others added 12 commits August 11, 2026 15:46
Groundwork for making self-hosted Pulumi Cloud a first-class story. This is
the subset that needed no design, legal, or engineering input.

The /security/ "Read Whitepaper" button has been dead since January 2026.
Commit 30aa059 converted the whitepaper from a PDF page resource into a
markdown content page and adjusted the .Resources.GetMatch call by dropping
the .pdf suffix, but GetMatch only ever matches page resources -- content
pages are not resources of their branch bundle, so the lookup returned nil
and the button rendered href="". Switching to site.GetPage keeps the link
resilient to a future rename, and the else branch errorf's rather than
silently emitting nothing, since silent nil is what let this rot unnoticed
for seven months.

/security/ was also absent from the site header entirely. It now sits in the
Product dropdown under a new "Security & trust" heading, which is deliberately
named to accommodate the self-hosted entry that lands once that page is
rebuilt -- self-hosting is a data-control decision before it is a deployment
one, so the two belong together.

The enterprise page advertised "VMWare vSphere" as a deployment option. No
vSphere installer exists, and the tile behind that claim only ever pointed at
a contact form, so the copy now names the six installations we actually ship.
It also offered a "Request Free Trial" for self-hosting, which sets up a bad
first interaction: there is no free trial, only a guided proof of concept
gated at Business Critical.

Spear AI moves from ai-ml to public-sector. The customer is the US Navy and
the story is ATO, GovCloud, and air-gapped Secret Cloud; filing it under
ai-ml left our one genuine defense reference invisible to anyone browsing
public sector, a term page that had exactly one entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Revives the unmerged self-hosted-first-class branch from June 17 (e8405d5),
rebased onto current master and reframed. Three pieces were worth keeping: the
install front door, the Docker Compose quickstart rewrite, and the Terraform
Enterprise migration guide.

The original premise was self-serve -- "deploy it yourself," with the guided
proof of concept demoted to a fallback. That premise depended on an evaluation
license a user could obtain without a sales call, which the commit message
itself flagged as not yet existing. It still doesn't, so a reader was told
they could try it themselves and then hit a sales gate. The copy now says
plainly that a license key comes from a proof of concept, while keeping every
mechanical step documented, so when a self-serve license does ship only the
license-acquisition sentence changes.

The quickstart carried two errors forward from the page it replaced, both
verified against quickstart-docker-compose/scripts/run-ee.sh: the script reads
PULUMI_LOCAL_DATABASE_HOST, not PULUMI_LOCAL_DATABASE_NAME, and it creates a
Docker network named pulumi-self-hosted-installers, not pulumi-ee. The
bring-your-own-database section also told readers to ask sales for the
migrations folder; the compose file pulls pulumi/migrations from Docker Hub.

The Terraform Enterprise guide claimed air-gapped operation covers
"environments that require FedRAMP." Pulumi holds no FedRAMP authorization,
and self-hosting does not change that -- it changes who owns the boundary, so
the bullet now says that instead. Self-hosting joins the header nav under the
Security & trust heading added for it, alongside Security & compliance,
because self-hosting is a data-control decision before it is a deployment one.

Two page-level meta_image overrides were dropped: AGENTS.md discourages them
for docs pages, where the build generates an on-brand card from the title.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every fix here was verified against pulumi-self-hosted-installers rather than
reasoned about, because the errors all share a cause: prose that was written
once and never rechecked against the code it describes.

The console page told readers "the container image repository is private.
Contact us if you would like to evaluate." Both images are public --
pulumi/service reports 220,518 pulls and pulumi/console 114,034 against the
Docker Hub API -- so that sentence was turning away self-evaluation for no
reason.

The API page repeated the PULUMI_LOCAL_DATABASE_NAME error corrected on the
quickstart page; run-ee.sh reads PULUMI_LOCAL_DATABASE_HOST.

The EKS page documented Kubernetes 1.18 through 1.21 and an
`npm run install -- update --` command. Both describe eks-hosted-deprecated,
whose README now opens with DEPRECATED and whose revision table stops at K8s
1.24 in February 2024. The current installer is v4.0 and the version is set
through `clusterVersion` in the 05-eks-cluster project. Note an upstream
inconsistency worth chasing: that project's Pulumi.README.yaml still ships
clusterVersion "1.30" while the installer README's revision history claims
1.34.0 for v4.0, so the table here follows the revision history and the page
deliberately states no default.

The air-gapped guide told readers to deploy with Helm. No chart exists in the
installers repo or anywhere else, so it now points at the bring-your-own-infra
installer, which is what actually applies manifests to an existing cluster. It
also linked to /docs/administration/self-hosting/pulumi-cloud, an alias of the
section index -- a self-referential link.

The operations database page presented db.r5.large as "the self-hosted
installers default," which is true only for EKS; the ECS installer defaults to
db.t3.small, a burstable instance nobody should reach production on unknowingly.
The table is now per-installer.

Finally, the nine pages that were missing the edition callout now carry
{{< self-hosting-trial-note />}}, so every self-hosting page states how to get
a license instead of only some of them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every modern installer README opens with a hard stop: do not point this
installer at an existing install, contact support to migrate the database
first. That warning existed nowhere in the docs. The only trace was two rows
in the API component's environment-variable table, on a 510-line reference
page nobody reads before running `pulumi config set imageTag`.

The gate now lives in a shortcode and appears on the upgrades guide and in the
update section of all six production deployment pages -- the exact places a
reader is about to change an image tag and run `pulumi up`. Stating it once and
including it keeps the six copies from drifting the way the original warning
did.

It supports .Inner for the same reason self-hosting-trial-note does: Hugo only
accepts the self-closing form for shortcodes that evaluate it, and matching the
sibling keeps both usable the same way.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The page was a bespoke 2022 layout that predated the section system every
other product page uses. It called the platform a "Cloud Engineering Platform",
offered "Azure Active Directory" as an identity option, omitted ECS entirely
though it is the most complete installer we ship, and routed every docs link
through the retired /docs/pulumi-cloud/self-hosted/ path so each click was a
redirect. Moving it to type: page + layout: template-page deletes the one-off
layout and keeps the URL.

The identity copy was wrong on substance, not just naming: self-hosted has no
Azure AD OAuth connector. Entra ID reaches it through SAML, which is what the
page now says.

Deployment targets are Phosphor icons rather than cloud logos. Every logo the
old page used lives only under static/, and template partials resolve images
through assets/fingerprinted/, where a missing file panics the build. Icons
avoid copying six assets to say something an icon says just as well.

The VMware tile is gone. It linked to a contact form with no documentation
behind it and implied a vSphere installer that does not exist. A "Something
else?" card does the same job honestly -- the images run on any OCI-compatible
orchestrator -- and eight cards fill two rows of four cleanly.

Compliance gets a three-column section where the third column is headed "No
FedRAMP authorization" and carries the same weight as the SOC 2 column. A
security reviewer who can see immediately what we do not hold will trust what
we do claim; burying the non-claim in a footnote produces the opposite. All
three columns get a CTA so the negative one does not read as a dead end. FIPS
is deliberately absent: nothing in this repo, pulumi/pulumi, or the installers
substantiates a claim about our own use of it.

Rendering a HubSpot form needed a new section type, since none existed. The
#self-hosted-trial anchor is a contract, not decoration -- the
self-hosting-trial-note shortcode, the pricing FAQ, and the enterprise page all
deep-link to it -- so the partial documents that.

The meta image is generated with the site's own Satori renderer using the same
"title" template as /what-is/ and /migrate/, because generate-meta-images.mjs
does not cover product/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The page claimed one thing -- SOC 2 Type II -- in a single sentence, and the
527-line whitepaper behind it names no certifications at all. That combination
undersells a real posture and leaves a security reviewer with nowhere to land,
so they email an account rep instead.

The most useful sentence on a trust page is the negative one. Stating plainly
that we do not hold ISO 27001, HITRUST, or PCI DSS lets a reviewer stop looking
rather than assume we are hiding it, and it makes the SOC 2 claim more
credible, not less. The same logic drives the FedRAMP section: no
authorization, no ATO, no Marketplace listing, said outright, followed by what
self-hosting actually changes -- who owns the boundary.

Two distinctions the old page blurred. Our pre-built CIS/NIST/PCI policy packs
help customers assess their own infrastructure; they say nothing about Pulumi's
certification status, and a procurement reader could easily conflate the two.
And per our own /what-is/what-is-soc-2/, SOC 2 is an attestation rather than a
certification -- worth being precise about here even though the marketing
shorthand elsewhere is fine.

The whitepaper now gets a paragraph describing what is actually in it, drawn
from its real section headings, so the strongest asset we have is no longer
sitting behind a bare link.

/trust/ and /trust-center/ alias here rather than becoming a second page.
Whichever surface a reviewer guesses, they land on the authoritative one, and
there is no seam for the two to drift across -- which is how the whitepaper and
this page diverged in the first place.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every menu identifier and parent in the tree still read
administration-security-compliance-self-hosted-*, left over from a prior move
out of a Security & Compliance section that no longer contains these pages.
The names were functional but actively misleading to anyone editing frontmatter
here, since the section they name is a sibling.

Identifiers are not URLs and nothing outside this content directory references
them -- verified across templates, data files, SCSS, and scripts before
renaming -- so this is a pure legibility fix. The rendered nav tree is
unchanged: all 29 entries still resolve under Self-Hosting.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two pages built entirely from facts that already existed but were scattered.

System requirements collects what an installation needs -- licenses, compute,
MySQL, object storage, OpenSearch, Kubernetes, DNS, TLS, network -- from four
component pages, the operations guide, and the installer READMEs. Three of
those facts were only ever documented upstream and appeared nowhere on the
site: the `pulumi` database must exist before you install, the application
user needs two specific GRANTs, and the MySQL server must accept inbound ICMP
or the installer's connectivity check fails.

Troubleshooting exists mostly for its first entry. The error string
`ALGORITHM=INPLACE is not supported` is what a failed migration actually
prints, and until now it appeared only inside the operations database page,
where nobody searching that text would land. The other eight entries have the
same property: each is a failure someone hits during a real install, indexed
by the symptom rather than by the subsystem that causes it.

Not done here, and worth a decision: the api, console, and search component
pages each still carry their own minimum-requirements table. Collapsing them
into this page is the obvious follow-up, except console's table says 1 CPU
core and 1 GB while operations/compute-sizing says 0.5 vCPU and 512 Mi. Those
may be measuring different things -- host minimum versus container request --
so they need an answer rather than a guess before anything gets deleted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Self-hosting had no entry at the docs root at all -- the only pointer was the
word "self-hosting" inside the Administration card's description -- and on the
Administration index it was the fifth card in a block headed "Getting started",
which is not what it is. It now has its own section there and its own card at
the root.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The API reference had grown to 510 lines, and 147 of them -- nearly a third --
were an operator runbook rather than container reference: collector
configuration, the metrics endpoint, and two full Prometheus setups including
sixty lines of collector YAML. That material belongs next to the monitoring
guide, which until now told you what to alert on without telling you how to
get metrics out of the service in the first place.

The four environment variables stay in the API reference, under the same
#opentelemetry anchor, so the variable reference remains complete in one place
and the inbound link from security-hardening and the installer READMEs keeps
working. Only monitoring.md needed repointing.

Deliberately not splitting further. This is a reference, and references are
more useful when one search finds everything; sharding it by storage backend
or identity provider would multiply cross-links and force anyone comparing two
options to open two pages. The remaining ~370 lines all answer the same
question -- what do I set on the API container for this subsystem.

Unrelated and pre-existing, noted while checking anchors: the 2024 post
self-hosted-search-and-deploy links to components/api#deployments, but that
heading has always anchored as #pulumi-deployments.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The page described what the installer creates and then sent the reader to a
README on GitHub for every actual step. It now carries the steps: prerequisites
split by what you must supply, the three projects in deployment order with real
commands, a configuration reference as tables rather than a wall of
`pulumi config set` lines, and a verification sequence.

Verification is the part that was missing everywhere and is worth stating
plainly: hit /api/status, `pulumi login`, `pulumi whoami`, then a throwaway
`pulumi new` / `up` / `destroy`. That sequence is what the quickstart's own Go
integration tests do, so it is a real check rather than a plausible-looking one.

Two facts that only existed upstream now appear here. The ECS installer
defaults `dbInstanceType` to db.t3.small, a burstable instance that should not
carry production traffic unnoticed, so defaults are called out under Sizing
rather than left implicit. And hiding email login in the console does not
disable the API handler behind it -- a reader configuring SSO would reasonably
assume it does.

The first-signup-becomes-administrator warning is now a shortcode. It applies
to all seven deployment options but was documented only in the AKS installer's
README, and it is the kind of thing you can only fix once.

This page is the pattern for the remaining six; the others still hand off to
their READMEs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Whoever signs up first on a fresh installation becomes the administrator, and
turning on SAML does not close email and password signup on its own. That is
true of all seven deployment options and was documented in exactly one place:
the AKS installer's README on GitHub.

It is also unrecoverable in the way that matters -- by the time you notice,
someone else owns the organization -- so it belongs next to the install steps
rather than in a security page nobody reads first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@joeduffy
joeduffy marked this pull request as ready for review August 16, 2026 01:54
@joeduffy

Copy link
Copy Markdown
Member Author

@claude please review this PR.

@unblocked unblocked 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.

✅ No issues found

About Unblocked

Unblocked has been set up to automatically review your team's pull requests to identify genuine bugs and issues.

📖 Documentation — Learn more in our docs.

💬 Ask questions — Mention @unblocked to request a review or summary, or ask follow-up questions.

👍 Give feedback — React to comments with 👍 or 👎 to help us improve.

⚙️ Customize — Adjust settings in your preferences.

@pulumi-bot

pulumi-bot commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

Claude finished @joeduffy's task in 6m 49s —— View job


Review: Make self-hosted Pulumi Cloud a first-class story

  • Gather context (12 commits, 57 files, diffed against merge base b5eb5609)
  • Review layouts, shortcodes, and template partials
  • Verify docs claims against pulumi-self-hosted-installers at master
  • Review marketing / /security/ / nav changes
  • Post review

This is strong work, and the parts of it I could verify independently hold up. run-ee.sh really does default PULUMI_DATA_PATH to ${HOME}/pulumi-self-hosted-installers/data, really does read PULUMI_LOCAL_DATABASE_HOST (not ..._NAME), really does create a network named pulumi-self-hosted-installers, and really does exit when PULUMI_LICENSE_KEY is unset. The EKS installer table (4.0 / March 2026 / 1.34.0), clusterVersion, and 05-eks-cluster all match the README. The ECS page even corrects the installer README's own stale "NLB" claim — pulumiLoadBalanacer.ts:49 sets loadBalancerType: "application". The /security/ whitepaper fix is right, the errorf guard is the correct call, and the menu-identifier rename left zero stragglers.

The problem is concentrated in one place: the new ECS config reference tracks ecs-hosted/ts/README.md, which is itself out of date with application/config.ts. Since the PR's premise is "verified against installer source, not reasoned about," and this page is explicitly meant to set the pattern the other six guides will follow, these are worth fixing before merge.


Blocking — the ECS install sequence does not work as written

All line references are content/docs/administration/self-hosting/deployment-options/ecs-hosted.md; ground truth is ecs-hosted/ts/application/config.ts.

1. route53ZoneName / route53Subdomain are not application-project keys. The guide's step 3 sets them, but the code reads domainName and subDomain:

const route53ZoneName = stackConfig.require("domainName");
const route53Subdomain = stackConfig.get("subDomain") || "";

pulumi up fails with a missing-required-config error on domainName. (The DNS project genuinely does use route53ZoneName/route53Subdomaindns/config.ts:12,18 — so step 4 is correct. Only the application step and its config table are wrong, which is exactly the kind of near-miss that's hard to spot.) Fix this →

2. recaptchaSiteKey and recaptchaSecretKey are required and undocumented.

const recaptchaSiteKey = stackConfig.require("recaptchaSiteKey");
const recaptchaSecretKey = stackConfig.requireSecret("recaptchaSecretKey");

Neither appears in the prerequisites or the config table, so a reader following the page hits a hard failure with nothing to tell them what to obtain. (The EKS 3.1 changelog mentions "move to Turnstile for recaptcha," so it's worth asking engineering what value belongs here for a self-hosted install.)

3. apiDisabledEmailLogin / apiDisabledEmailSignup are silently ignored. The code reads apiDisableEmailLogin and apiDisableEmailSignUp — no "d", and a capital U in SignUp. Config keys that don't match are accepted without complaint, so an operator sets these, sees a clean pulumi up, and believes email signup is closed when it is wide open. That lands directly against the new first-admin warning this PR adds three sections above it, which makes it the most consequential of the set. Same page: consoleDesiredNumberTasks is documented, but the code reads consoleDesirecNumberTasks (upstream typo at config.ts:76) — worth documenting the real key with a note, since silently defaulting to 1 task is an availability issue.

4. The OpenSearch rows are wrong on name, case, and requiredness. Actual keys are opensearchUser, opensearchPassword, opensearchEndpoint, opensearchDomainName — all lowercase opensearch, all .get(), i.e. optional. The table lists four as Required: Yes, and openSearchDomain is not a key at all. This also contradicts the base-infrastructure table on the same page, where enableOpenSearch defaults to false — as written, a reader who leaves OpenSearch off is still told four OpenSearch values are mandatory.

5. dbInstanceType default is db.t3.medium, not db.t3.small. infrastructure/config.ts reads stackConfig.get("dbInstanceType") || "db.t3.medium". The README says small; the code says medium. This appears in the Sizing table, the config reference, and the PR description's correction table — where it's presented as the fix for the previous error. Fix this →

6. Step 3's command block can't succeed on its own. It omits every db* value, endpointSecurityGroupId, and the recaptcha keys, then says to set them "as shown in the configuration reference." A reader running the block verbatim gets a config error. Since the whole point of this rewrite is real copy-pasteable commands, put the pulumi config set lines for the previous stack's outputs in the block itself.

The task CPU/memory defaults you documented (API 512/1024, console 256/512) are correct — apiService.ts:160-161, consoleService.ts:95-96. One nit there: apiContainerMemoryReservation is documented as defaulting to task memory, but the code defaults it to 384 (API) and 128 (console). apiContainerCpu → task CPU is right.

Given all six trace to the README rather than the code, it may be worth filing an issue against pulumi-self-hosted-installers to fix the README too — otherwise these docs and that README will disagree, and the next person to sync will re-introduce them.


Claims I'd want engineering to confirm

content/product/self-hosted.md:~110 — the Neo card. "Pulumi's infrastructure agent works against a self-hosted installation, so teams keep AI-assisted infrastructure work inside their own boundary." There is no mention of Neo anywhere under content/docs/administration/self-hosting/ — zero hits. This is a substantive product claim on a page whose stated purpose is being precise about what we do and don't offer, and the second clause implies the agent runs inside the customer's boundary, which is a stronger claim than "works against." I'd get this confirmed or cut it; everything else in that grid is backed by a docs page.

"The same capabilities as the SaaS." components/deployments.md says Deployments are supported "in Kubernetes-managed self-hosted environments," via customer-managed workflow runners. But from-terraform-enterprise.md:16 and the comparison-page row both list deployments flatly as part of the self-hosted platform, and the ECS guide — a non-Kubernetes topology — inherits that framing. A reader picking ECS on the strength of this page may not learn until later that deployments need a Kubernetes runner pool. One clause fixes it.

OpenSearch as a hard requirement. The product page says an installation is "backed by a MySQL 8.0 database, object storage, and an OpenSearch cluster you provide," but your own new system-requirements.md says search "is not in the critical path" and the ECS installer defaults enableOpenSearch to false. The docs are right; the product page overstates the prerequisite.


Smaller things

  • layouts/shortcodes/self-hosted-first-admin-note.html and self-hosting-schema-v2-note.html hand-roll the .note DOM. AGENTS.md names layouts/partials/notes.html as the single source for callout markup, and it takes exactly what you need: {{ partial "notes.html" (dict "type" "warning" "text" ($text | markdownify)) }}. The pre-existing self-hosting-trial-note.html does the same thing, so you're consistent with local precedent — but this makes three copies that won't pick up future size/class support or dark-mode changes to the shared partial.
  • operations/telemetry.md:37 keeps https://api.pulumi.com/metrics as the example endpoint. It was inherited from api.md, but on a page that exists specifically for self-hosted operators, it should be their own API hostname.
  • Moved anchors. api.md preserved #opentelemetry, but #metrics-endpoint, #prometheus-remote-write-exporter, and #prometheus-exporter moved to telemetry.md with no redirect. Nothing in this repo links to them, so this is only a risk for the installer READMEs you flagged as outside our control — worth a quick grep upstream.
  • ecs-hosted.md verification block. pulumi new aws-typescript --stack dev --yes needs an empty directory and PULUMI_CONFIG_PASSPHRASE when logged into an S3 backend. A mkdir /tmp/verify && cd line would keep the sequence copy-pasteable.
  • deployment-options/_index.md uses relative links (quickstart-docker-compose/); AGENTS.md asks for full canonical paths under /docs/. Pre-existing, and you touched one of those lines.
  • /security/ aliases /trust/ and /trust-center/ — worth confirming neither already has an entry in scripts/redirects/, since an S3 redirect would win over the Hugo alias.
  • The Spear AI industry recategorization to public-sector is valid (data/case_study_industries.yaml:69), and ?form=sales does work — contact-us-form.tsx:52 reads the form query param and matches it against the key values in content/contact/_index.md.

What I couldn't check

This environment has no node_modules and no Hugo binary, so I could not run make lint or make build — I'm taking your word that both are clean. I also couldn't verify the icon names on the rebuilt product page against sprite-manifest.json (generated, not checked in); a missing one is an errorf, so a clean build covers it. /api/status in the ECS verification sequence is likewise unverified — if that came from the quickstart's integration tests, it's fine.
· branch self-hosted-excellence

@pulumi-bot

Copy link
Copy Markdown
Collaborator

Your site preview for commit 2c73a39 is ready! 🎉

http://www-testing-pulumi-docs-origin-pr-20914-2c73a39a.s3-website.us-west-2.amazonaws.com

Changed pages:

@pulumi-bot

Copy link
Copy Markdown
Collaborator

Lighthouse Performance Report

Commit: 2c73a39 | Metric definitions

Page Device Score FCP LCP TBT CLS SI
Homepage Mobile 🟡 63 3.1s 4.0s 447ms 0.072 6.7s
Homepage Desktop 🟢 92 1.1s 1.5s 0ms 0.024 1.1s
Install Pulumi Mobile 🟡 62 5.4s 7.8s 10ms 0.053 5.4s
Install Pulumi Desktop 🟢 92 1.1s 1.6s 0ms 0.023 1.1s
AWS Get Started Mobile 🟡 61 5.2s 7.0s 0ms 0.097 5.2s
AWS Get Started Desktop 🟢 91 1.1s 1.7s 0ms 0.043 1.1s

@CamSoper
CamSoper marked this pull request as draft August 17, 2026 19:15
@CamSoper
CamSoper marked this pull request as ready for review August 17, 2026 19:15
@github-actions github-actions Bot added review:triaging Claude Triage is currently classifying the PR domain:website PR touches marketing, pricing, legal, or competitive landing pages domain:docs PR touches technical docs domain:mixed PR touches more than one domain domain:infra PR touches workflows, scripts, infra, Makefile, or build config 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 17, 2026
@joeduffy
joeduffy marked this pull request as draft August 17, 2026 19:38

@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

To run against an existing MySQL 8.0 instance instead of the bundled database, start the service with the base `docker-compose.yml` and point `PULUMI_LOCAL_DATABASE_HOST` and `PULUMI_LOCAL_DATABASE_PORT` at it. The script creates and uses a Docker network named `pulumi-self-hosted-installers`, so the database must be reachable from that network.

### Updating the Pulumi Cloud Containers
The schema is applied by the `pulumi/migrations` container, which the compose file pulls from Docker Hub — you do not need to obtain migration scripts separately.

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.

[style] wordiness — plainer verb, same meaning

Suggested change
The schema is applied by the `pulumi/migrations` container, which the compose file pulls from Docker Hub — you do not need to obtain migration scripts separately.
The schema is applied by the `pulumi/migrations` container, which the compose file pulls from Docker Hub — you do not need to download migration scripts separately.


## AKS-Hosted System Management and Maintenance

### Pulumi Cloud Updates

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.

[style] heading capitalization — H2+ headings use sentence case

Suggested change
### Pulumi Cloud Updates
### Pulumi Cloud updates


## BYO Infrastructure Hosted System Management and Maintenance

### Pulumi Cloud Updates

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.

[style] heading capitalization — H2+ headings use sentence case

Suggested change
### Pulumi Cloud Updates
### Pulumi Cloud updates


## GKE-Hosted System Management and Maintenance

### Pulumi Cloud Updates

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.

[style] heading capitalization — H2+ headings use sentence case

Suggested change
### Pulumi Cloud Updates
### Pulumi Cloud updates


## Local-Docker System Management and Maintenance

### Pulumi Cloud Updates

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.

[style] heading capitalization — H2+ headings use sentence case

Suggested change
### Pulumi Cloud Updates
### Pulumi Cloud updates

@github-actions

Copy link
Copy Markdown
Contributor

Pre-merge Review — Last updated 2026-08-17T19:30:10Z

Tip

Summary: This PR promotes self-hosted Pulumi Cloud to a first-class story: it renames the whole administration-security-compliance-self-hosted-* menu identifier family to administration-self-hosting-*, adds four docs pages (install/, system-requirements, troubleshooting, operations/telemetry) plus a Terraform Enterprise migration page, rewrites /product/self-hosted/ onto the shared template-page layout, and threads self-hosting into the nav, pricing FAQ, security page, and llms.txt. The structural work is clean — Hugo builds with no errors or broken internal links, the five new URLs appear in the sitemap, and every renamed identifier lines up with its parent. What would block a reader is the newly-written installer specifics: the ECS configuration reference and its walkthrough name several config keys that the installer does not read (route53ZoneName, route53Subdomain, openSearchUser), omit two that it requires (recaptchaSiteKey, recaptchaSecretKey), and state a dbInstanceType default the installer contradicts — a reader following the ECS page as written will not get a working pulumi up. A second cluster is the AG Grid license key, which three pages now call required while the installer treats it as optional. Passes run: Hugo build + link-integrity preflight, frontmatter alias/URL sweep, external claim verification over 387 extracted claims, a cross-sibling read of all six self-hosting siblings, code-example checks, and pattern-based prose linting. Several verifier verdicts were checked against the pulumi-self-hosted-installers source directly and turned out to be stale-doc comparisons — those are in 📋.

Review confidence:

Dimension Level Notes
mechanics HIGH
facts MEDIUM The new pages assert installer behavior (sizing minimums, grant statements, troubleshooting causes) that has no public source; several were confirmed against the installer repo, the rest are listed for author confirmation.
coherence HIGH
cross-sibling consistency HIGH
code correctness MEDIUM Shell and pulumi config set snippets are syntactically fine; the ECS config-key names in them do not match the installer.
Investigation log
  • Cross-sibling reads: 6 of 6 siblings
  • External claim verification: 287 of 387 claims verified (38 unverifiable, 16 contradicted, 4 framing-drift) · 4 specialists (numerical, cross-reference, capability, framing); 0 cross-specialist corroborations · routed: 0 inline, 307 Pass 1, 0 Pass 2, 80 Pass 3 (verified 43, contradicted 5, unverifiable 32).
  • Cited-claim spot-checks: not run (no cited claims)
  • 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: ran (3 specialists: structural, existence, body-code-coverage); 0 findings
  • Editorial-balance pass: not run (not under content/blog/)
🚨 Outstanding ⚠️ Low-confidence 💡 Pre-existing ✅ Resolved
11 36 2 0

✏️ 5 one-click style suggestions are posted inline — apply them from the Files changed tab, individually or with Add suggestion to batch.

🔍 Verification trail

387 claims extracted · 287 verified · 38 unverifiable · 16 contradicted · 4 framing-drift · 1 detector finding
  • L75 in content/docs/_index.md "link: /docs/administration/self-hosting/" → ✅ verified (evidence: content/docs/administration/self-hosting/_index.md exists and lists /docs/administration/self-hosting/ as one of its own aliases, confirming the linked path resolves to the Self-hosting page.; source: repo:content/docs/administration/self-hosting/_index.md)
  • L15 in content/docs/administration/self-hosting/_index.md "The Self-Hosting administration navigation entry has a weight of 25." → ✅ verified (evidence: (escalated from pass3) Front matter of content/docs/administration/self-hosting/_index.md line 15 reads "weight: 25" under the administration menu entry.; source: repo:content/docs/administration/self-hosting/_index.md)
  • L33 in content/docs/administration/self-hosting/_index.md "Pulumi can be deployed in any on-premise or cloud environment." → 🤝 matches (evidence: The same page lists deployment options spanning AWS ECS/EKS, Azure AKS, Google GKE, Kubernetes, "Bring Your Own Infrastructure" (on-prem), and local Docker — consistent with the claim that "Pulumi can be deployed in any on-premise or…; source: repo:content/docs/administration/self-hosting/_index.md)
  • L33 in content/docs/administration/self-hosting/_index.md "Pulumi self-hosted deployments can be integrated with email/password authentication as an identity provider." → ✅ verified (evidence: The same doc states: "Pulumi can be deployed in any on-premise or cloud environment and integrated with your preferred identity provider: GitHub Enterprise, GitLab Enterprise, SAML SSO, or email/password authentication." This directly…; source: repo:content/docs/administration/self-hosting/_index.md)
  • L39-41 in content/docs/administration/self-hosting/_index.md "There is a button card linking to /docs/administration/self-hosting/install/ for installing Self-Hosted Pulumi Cloud." → ✅ verified (evidence: The file contains a button-cards block with heading "Install Self-Hosted Pulumi Cloud" and link: /docs/administration/self-hosting/install/, matching the claim exactly.; source: repo:content/docs/administration/self-hosting/_index.md (lines 38-41))
  • L41 in content/docs/administration/self-hosting/_index.md "Self-Hosted Pulumi Cloud can be evaluated using Docker Compose in minutes." → ✅ verified (evidence: The sibling page quickstart-docker-compose.md states: "The fastest way to try self-hosted Pulumi Cloud is the all-in-one Docker Compose stack... so you can evaluate the full platform in about ten minutes," directly corroborating that…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L22 in content/docs/administration/self-hosting/airgapped.md "Pulumi can be configured to run in air-gapped environments through self-hosting, enabling enterprises to manage…" → ✅ verified (evidence: The linked page /docs/administration/self-hosting/ confirms self-hosting lets enterprises "Deploy Pulumi Cloud in your own infrastructure with full control over data, security, and operations" and "Pulumi can be deployed in any…; source: content/docs/administration/self-hosting/_index.md)
  • L96-97 in content/docs/administration/self-hosting/airgapped.md "* Deploy the Pulumi API server, database, and storage backend with the [bring-your-own-infrastructure installer](/docs/administration/self-hosting/deployment-o…" → ❌ contradicted (framing: shifted — source describes the installer as running pulumi up (Pulumi program execution) against self-managed backend; claim describes it as "applies…; evidence: The linked byo-infra-hosted page states the installer works by using Pulumi itself: "This installer uses Pulumi to deploy the Pulumi Cloud. In this case, one uses the Pulumi CLI with a self-managed backend (e.g. S3 storage bucket) to…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md?ref=master)
  • L1 in content/docs/administration/self-hosting/components/api.md "x" → ➖ not-a-claim (evidence: The extracted "text" is just the placeholder character "x" with no falsifiable assertion; nothing to verify.; source: content/docs/administration/self-hosting/components/api.md)
  • L29 in content/docs/administration/self-hosting/components/api.md "A persistent volume must be provided for the MySQL data, which is optional if you are providing your own database." → ✅ verified (evidence: The doc's Prerequisites list states verbatim: "Provide a persistent volume for the MySQL data (optional if you are providing your own DB.)" which matches the claim exactly.; source: repo:content/docs/administration/self-hosting/components/api.md)
  • L31 in content/docs/administration/self-hosting/components/api.md "To change the default database endpoint, you must set the PULUMI_LOCAL_DATABASE_HOST and PULUMI_LOCAL_DATABASE_PORT environment variables." → ❌ contradicted (framing: shifted — source variable is 'PULUMI_LOCAL_DATABASE_NAME' but claim asserts 'PULUMI_LOCAL_DATABASE_HOST'; evidence: (escalated from pass1) The official page for this same file states: "The default DB endpoint is pulumi-db:3306. If you wish to change this, set PULUMI_LOCAL_DATABASE_NAME and PULUMI_LOCAL_DATABASE_PORT accordingly" — the hostname…; source: https://www.pulumi.com/docs/administration/self-hosting/components/api/; intuition: Variable name PULUMI_LOCAL_DATABASE_HOST does not appear anywhere in official docs; likely a typo/hallucination for…)
  • L321 in content/docs/administration/self-hosting/components/api.md "Collector configuration, the metrics endpoint, and both Prometheus options are documented at /docs/administration/self-hosting/operations/telemetry/." → ✅ verified (evidence: The target page /docs/administration/self-hosting/operations/telemetry/ contains a "Metrics endpoint" section describing the /metrics endpoint, and a "Prometheus" section stating "The API service provides two options to get metrics…; source: content/docs/administration/self-hosting/operations/telemetry.md)
  • L325-328 in content/docs/administration/self-hosting/components/api.md "The PULUMI_ENABLE_DEPRECATED_METRICS environment variable is optional and controls whether the API service continues emitting API service metrics in a…" → 🤷 unverifiable (evidence: The doc table states: "PULUMI_ENABLE_DEPRECATED_METRICS | (Optional) Whether to continue emitting API service metrics in a log-based format. Defaults to true." This matches the claim, but the underlying implementation…; source: content/docs/administration/self-hosting/components/api.md L327)
  • L325 in content/docs/administration/self-hosting/components/api.md "If OTEL_EXPORTER_OTLP_ENDPOINT is not set, the API service will use no-op metrics and traces." → 🤝 matches (evidence: Both api.md (L325) and the sibling operations/telemetry.md (L28) state identically: "OTEL_EXPORTER_OTLP_ENDPOINT | (Required) ... If not set, the API service will use no-op metrics and traces." The claim is consistent with the…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md and repo:content/docs/administration/self-hosting/components/api.md)
  • L326 in content/docs/administration/self-hosting/components/api.md "Valid values for OTEL_EXPORTER_OTLP_PROTOCOL are http or grpc." → ❌ contradicted (framing: Claim simplifies the spec's three values (grpc, http/protobuf, http/json) to just "http or grpc," which is not a valid literal value for the variable.; evidence: (escalated from pass1) The OpenTelemetry specification states: "Options MUST be one of: grpc, http/protobuf, http/json" for OTEL_EXPORTER_OTLP_PROTOCOL — there is no bare "http" value; valid values are "grpc", "http/protobuf", or…; source: https://opentelemetry.io/docs/specs/otel/protocol/exporter/)
  • L327 in content/docs/administration/self-hosting/components/api.md "PULUMI_ENABLE_DEPRECATED_METRICS defaults to true." → 🤷 unverifiable (evidence: (escalated from pass1) Web search returned no authoritative information about the PULUMI_ENABLE_DEPRECATED_METRICS environment variable or its default value for the self-hosted Pulumi API service. This is an internal product…; source: WebSearch ran query "PULUMI_ENABLE_DEPRECATED_METRICS default true"; top results didn't address the claim)
  • L330 in content/docs/administration/self-hosting/components/api.md "The console service is documented at /docs/administration/self-hosting/components/console/." → ✅ verified (evidence: content/docs/administration/self-hosting/components/console.md exists with front matter title "Pulumi console" documenting the console component, and Hugo renders this page at the URL path…; source: repo:content/docs/administration/self-hosting/components/console.md)
  • L330 in content/docs/administration/self-hosting/components/api.md "OpenTelemetry is not yet available for the console service." → 🤝 matches (evidence: The sibling page content/docs/administration/self-hosting/operations/telemetry.md contains the identical sentence: "OpenTelemetry is not yet available for the console service." Additionally, console.md has no OTEL/OpenTelemetry…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md (line 33) and repo:content/docs/administration/self-hosting/components/console.md)
  • L46 in content/docs/administration/self-hosting/components/console.md "The console image is published publicly at pulumi/console. Running it still requires a license key — see…" → ✅ verified (evidence: The sibling components index page lists the same Docker Hub URL for the Console component: "Web console | [https://hub.docker.com/r/pulumi/console/](https://hub.docker.com/r/pulumi/c…; source: repo:content/docs/administration/self-hosting/components/_index.md)
  • L17 in content/docs/administration/self-hosting/deployment-options/_index.md "The 'Install Self-Hosted Pulumi Cloud' guide at /docs/administration/self-hosting/install/ walks the reader through each self-hosting deployment platform." (also L19-20, L22) → ✅ verified (evidence: The page at /docs/administration/self-hosting/install/ exists and contains a "Choose your platform" chooser walking through Docker Compose, Kubernetes, AWS (EKS/ECS), Azure (AKS), and GCP (GKE) deployment options, matching the claim's…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L19 in content/docs/administration/self-hosting/deployment-options/_index.md "The Docker Compose deployment option (quickstart-docker-compose/) is intended for evaluation and testing rather than production use." → ✅ verified (evidence: The official quickstart-docker-compose docs page states: "Quickstart Docker compose installer for testing of the self-hosted Pulumi Cloud" and "Since the quickstart option is meant to be used for testing purposes, there is no real…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/quickstart-docker-compose/)
  • L9 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "The AKS-Hosted deployment documentation page is organized under the 'administration-self-hosting-deployment-options' navigation menu section (rather than…" (also L11) → ✅ verified (evidence: The file's front matter sets parent: administration-self-hosting-deployment-options and identifier: administration-self-hosting-deployment-options-aks, confirming the page is organized under that menu section and not the…; source: repo:content/docs/administration/self-hosting/deployment-options/aks-hosted.md)
  • L21 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "The AKS-Hosted Installer is located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/aks-hosted." → ✅ verified (evidence: The GitHub API confirms https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/aks-hosted exists and contains the AKS installer directories (01-infrastructure, 02-kubernetes, 03-application, README.md, diagrams).; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted)
  • L21 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "The AKS-Hosted Installer is used to deploy the self-hosted Pulumi Cloud in Azure Kubernetes Service (AKS)." → ✅ verified (evidence: Repo pulumi/pulumi-self-hosted-installers has an aks-hosted directory (with 01-infrastructure, 02-kubernetes, 03-application dirs and README) that matches the doc's own text: "The AKS-Hosted Installer installer is used to deploy the…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted)
  • L43 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "The README file provided with the installer package at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/aks-hosted/README.md contains…" → ✅ verified (evidence: The README.md exists at github.com/pulumi/pulumi-self-hosted-installers/tree/master/aks-hosted/README.md and contains detailed deployment steps including "## Deployment", "### Naming the stacks", per-program pulumi config set…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted/README.md)
  • L51 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "The installer's README file at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/aks-hosted/README.md describes how to set the imageTag…" → ✅ verified (evidence: The README at pulumi/pulumi-self-hosted-installers master aks-hosted/README.md contains: "pulumi config set imageTag {imageTag} - Image tags are available on Docker Hub: pulumi/service"…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted/README.md (ref=master))
  • L51 in content/docs/administration/self-hosting/deployment-options/aks-hosted.md "When deploying the Pulumi Cloud service, it is recommended to pin the Pulumi Cloud image tag to a specific version." → ✅ verified (evidence: The doc's own next line reads "When deploying the Service, it is recommended to pin the Pulumi Cloud image tag to a specific version. See the installer's README file to set the imageTag configuration property..." and the linked…; source: repo:content/docs/administration/self-hosting/deployment-options/aks-hosted.md (L53); repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted/README.md)
  • L9 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "This page's navigation menu parent identifier is administration-self-hosting-deployment-options and its own identifier is…" (also L11) → ⚔️ mismatch (framing: Identifier values verified exact-match; the added historical narrative about a reorg from a differently-named prior structure is unverifiable/unsupported.; evidence: The file itself confirms parent: administration-self-hosting-deployment-options and identifier: administration-self-hosting-deployment-options-byo-infra-hosted, matching the claim's first half exactly. However, no evidence anywhere (repo…; source: repo:content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md; gh search code --owner pulumi "self-hosted-deployment-options-under-security-compliance" (no results))
  • L19 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "A trial-related note (self-hosting-trial-note shortcode) applies to the BYO-Infrastructure self-hosted deployment described on this page." → ✅ verified (evidence: The page source contains {{< self-hosting-trial-note />}} immediately after the frontmatter, which renders a note pointing readers to request a PoC or contact sales to evaluate the self-hosted Pulumi Cloud — this applies to the…; source: repo:content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md (line 19) and repo:layouts/shortcodes/self-hosting-trial-note.html)
  • L21 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "The BYO-Infrastructure Installer is located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/byo-infra." → ✅ verified (evidence: gh_query confirms the byo-infra directory exists at pulumi/pulumi-self-hosted-installers on the master branch, containing 01-infrastructure, 02-kubernetes, 03-application, and README.md, matching the claimed URL exactly.; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra)
  • L21 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "The BYO-Infrastructure Installer is used to deploy the self-hosted Pulumi Cloud on the user's own Kubernetes, MySQL, and S3-compatible infrastructure." → ✅ verified (evidence: The doc's own body text (which the claim paraphrases) states: "The BYO-Infrastructure Installer installer is used to deploy the self-hosted Pulumi Cloud on your own K8s, MySQL and S3-compatible infrastructure," and this is corroborated…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra)
  • L43 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "The README file provided with the installer package, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/byo-infra/README.md…" → ✅ verified (evidence: The file exists at github.com/pulumi/pulumi-self-hosted-installers/blob/master/byo-infra/README.md and contains detailed deployment steps, e.g. sections '## Prerequisites', '## What does each Pulumi program do?', and step-by-step…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra/README.md)
  • L45 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "A first-admin-related note (self-hosted-first-admin-note shortcode) applies to the BYO Infrastructure Hosted System Management and Maintenance section of…" → ❌ contradicted (framing: shifted — the note is placed at the end of the Deployment Steps section, not inside the System Management and Maintenance section the claim attributes it to; evidence: In the file, the {{< self-hosted-first-admin-note />}} shortcode appears at line 45, under the "### Deployment Steps" subsection (line 41) and before the "## BYO Infrastructure Hosted System Management and Maintenance" heading (line 47)…; source: repo:content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md)
  • L49 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "A schema v2-related note (self-hosting-schema-v2-note shortcode) applies to the Pulumi Cloud Updates process described on this page." → ✅ verified (evidence: The page places {{< self-hosting-schema-v2-note />}} directly under the "### Pulumi Cloud Updates" heading (line 51 follows line 49), and the shortcode's content warns: "Upgrading an existing installation? The current installers enable…; source: repo:content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md and repo:layouts/shortcodes/self-hosting-schema-v2-note.html)
  • L51 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "The installer's README file, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/byo-infra/README.md, describes how to set the…" → ✅ verified (evidence: The README at pulumi/pulumi-self-hosted-installers/byo-infra/README.md contains the exact instruction: "pulumi config set imageTag {imageTag} - use "latest" or find the latest tag to pin to here…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra/README.md)
  • L51 in content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md "When deploying the Pulumi Cloud, it is recommended to pin the image tag to a specific version." → ✅ verified (framing: README offers pinning as an option ("use latest or find the latest tag to pin to"); doc states it as a recommendation, which is a reasonable, narrower…; evidence: The linked installer README (pulumi/pulumi-self-hosted-installers, byo-infra/README.md) instructs: "pulumi config set imageTag {imageTag} - use "latest" or find the latest tag to pin to here: https://hub.docker.com/r/pulumi/service"…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra/README.md)
  • L3 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS install documentation covers prerequisites, three Pulumi projects, a configuration reference, and how to verify the installation." → ➖ not-a-claim (evidence: This is a self-descriptive summary line about the structure/contents of the ECS-hosted install doc itself (prerequisites, projects, config reference, verification steps) rather than a falsifiable technical or third-party assertion. The…; source: https://www.pulumi.com/docs/administration/self-hosting/)
  • L21 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "You can choose between using a TypeScript or Golang installer for the ECS-hosted install." → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo's ecs-hosted directory contains both a ts and a go subdirectory, confirming the installer ships in both TypeScript and Go, matching the doc's statement "The installer ships in TypeScript…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted)
  • L21 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS installer runs the Pulumi API and console as Fargate services behind Application Load Balancers, backed by Aurora MySQL and S3." → ✅ verified (evidence: The repo's own AGENTS.md (pulumi/pulumi-self-hosted-installers, ecs-hosted/) describes the deployment sequence as: "1. infrastructure/ — VPC, Aurora MySQL, ALB/NLB, VPC Endpoints; 2. application/ — ECS Fargate services (API, Console…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/AGENTS.md)
  • L23 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The Go version of the ECS-hosted installer lives in the ecs-hosted/go directory and takes the same configuration as the TypeScript version." → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo confirms an ecs-hosted/go directory exists at master, containing application, infrastructure, dns, and common subdirectories — the same project structure as ecs-hosted/ts — plus…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/go (and /ecs-hosted))
  • L27-35 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted Pulumi Cloud deployment uses Aurora MySQL for persistent state, with automated replication and snapshots." → ✅ verified (evidence: The ECS installer's database.ts (pulumi/pulumi-self-hosted-installers) defines an rds.Cluster with engine = "aurora-mysql", copyTagsToSnapshot: true, and finalSnapshotIdentifier, plus multiple rds.ClusterInstance replicas with…; source: gh api repos/pulumi/pulumi-self-hosted-installers/git/blobs (ecs-hosted/ts/infrastructure/database.ts))
  • L27-35 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted deployment includes ECS on Fargate, which runs the API and console containers." → ✅ verified (evidence: The doc's own architecture table states "ECS on Fargate | Runs the API and console containers" and the intro says the installer "runs the Pulumi API and console as Fargate services behind Application Load Balancers." This is confirmed by…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md; gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted)
  • L27-35 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted deployment includes S3, used for checkpoints, policy packs, and service metadata." → ✅ verified (evidence: The doc's own deployment table states "S3 | Checkpoints, policy packs, and service metadata" and later confirms bucket naming conventions ("buckets the installer creates, which are named pulumi-checkpoint-* and pulumi-policy-*"). The…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md; gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/infrastructure/index.ts)
  • L39 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "For the ECS-hosted installer, the customer provides the network, DNS, certificate, and key material, and the installer builds everything else." → ➖ not-a-claim (evidence: The line is a direct paraphrase of the file's own Prerequisites section: "You provide the network, DNS, certificate, and key material. The installer builds everything else," which is internally consistent with the same file's…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L41 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY in the environment, plus AWS_SESSION_TOKEN if using temporary credentials." → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo confirms ecs-hosted is a real Pulumi program (TS and Go implementations) deploying AWS ECS Fargate infrastructure via pulumi up/pulumi preview, which authenticates through the standard…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/AGENTS.md)
  • L43 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires an existing VPC with at least two public, two private, and two isolated subnets." → ✅ verified (evidence: The official ECS-Hosted Install docs state the customer must provide: "At least 2 public subnets available. At least 2 private subnets available. At least 2 isolated subnets available."; source: https://www.pulumi.com/docs/pulumi-cloud/self-hosted/deployment-options/ecs-hosted/)
  • L45 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires a Route 53 hosted zone and an ACM certificate covering the base domain plus app.{sub}.example.com and…" → ✅ verified (framing: Source states the general requirement (Route53 zone + ACM cert covering a list of FQDNs); claim specifies the exact FQDN patterns (app./api. subdomains)…; evidence: (escalated from pass1 after exhausting its 12-turn cap) The live docs page for this exact file confirms: "Route53 hosted zone" and "ACM Certificate that covers FQDNs of the following form, where {subdomain} is optional: ..." as…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/ecs-hosted/)
  • L47 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires a KMS key for the service to encrypt and decrypt secrets." → ✅ verified (evidence: The doc's own prerequisites list "Encryption. A KMS key for the service to encrypt and decrypt secrets." and the configuration reference table marks kmsServiceKeyId as Required=Yes, described as "KMS key securing secrets" — consistent…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L49 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires ECR repositories holding the Pulumi API, console, and migrations images." → ✅ verified (evidence: The upstream pulumi-self-hosted-installers repo's ecs-hosted/AGENTS.md describes the deployment sequence as: "application/ — ECS Fargate services (API, Console, Migrations)", and the application stage includes a dedicated…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/AGENTS.md; gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/application)
  • L51 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer requires a PULUMI_LICENSE_KEY and an AG Grid license key." → ⚔️ mismatch (framing: Internal inconsistency: line 51 (prerequisites) says AG Grid license key is required, line 190 (config reference table) marks it optional ("No").; evidence: Line 51 states the prerequisite "A PULUMI_LICENSE_KEY and an AG Grid license key" as required, but the same document's configuration reference table explicitly lists agGridLicenseKey with Required = "No" ("| agGridLicenseKey | No |…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L53 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The System requirements page documents database, storage, and sizing details that apply to every self-hosting installation." → ✅ verified (evidence: The same PR (Make self-hosted Pulumi Cloud a first-class story #20914) that modifies ecs-hosted.md also adds content/docs/administration/self-hosting/system-requirements.md (106 lines), whose content covers Licenses, Compute, Database (MySQL engine/storage/sql_mode), Object…; source: gh pr view 20914 -R pulumi/docs (files list showing system-requirements.md added); gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/system-requirements.md?ref=refs/pull/20914/head)
  • L57 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer's default sizing values are deliberately small so a first deployment comes up quickly, and should be raised before running…" → ➖ not-a-claim (evidence: (escalated from pass3) The doc itself states verbatim: "Defaults are deliberately small so a first deployment comes up quickly. Raise them before running production workloads." This is the author's own design rationale for the…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L59-64 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The application configuration reference lists aws:region, vpcId, subnet IDs, imageTag, licenseKey, acmCertificateArn, kmsServiceKeyId…" (also L140-152, L156-192) → ❌ contradicted (framing: Doc claims route53ZoneName/route53Subdomain/openSearchUser/openSearchPassword/openSearchEndpoint/openSearchDomain/isolatedSubnetIds are required config keys…; evidence: The actual pulumi-self-hosted-installers ecs-hosted/ts/application/config.ts source uses different key names and requiredness than the doc's table: DNS keys are stackConfig.require("domainName") and stackConfig.get("subDomain")…; source: gh api repos/pulumi/pulumi-self-hosted-installers/git/blobs/d828f4b481e2fb7a2629fbcadbb09ffbd2434020 (ecs-hosted/ts/application/config.ts); intuition: Key names and requiredness diverge from the actual installer source in multiple places — looks like doc drift from an…)
  • L59-64 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The consoleTaskCpu / consoleTaskMemory settings default to 256 / 512 MB." (also L176, L181) → 🤝 matches (evidence: (escalated from pass3) The doc states in the Sizing table: "consoleTaskCpu / consoleTaskMemory | 256 / 512 MB" and repeats identically in the parameter reference table: "consoleTaskCpu / consoleTaskMemory | No | 256 / 512 |…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 63, 181))
  • L59-64 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "It is recommended to raise apiDesiredNumberTasks to at least 2 for high availability." → ➖ not-a-claim (evidence: (escalated from pass3) The same file's config table (line 64) states the default for apiDesiredNumberTasks is 1 with the note "raise to at least 2 for high availability" — this is the author's own recommended default/guidance for their…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L63 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "| consoleTaskCpu / consoleTaskMemory | 256 / 512 MB |" → 🤝 matches (evidence: (escalated from pass3) The Sizing summary table's consoleTaskCpu / consoleTaskMemory = 256 / 512 MB matches the detailed parameters table later in the same doc: "consoleTaskCpu / consoleTaskMemory | No | 256 / 512 | Console…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 63 and 181))
  • L68 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer is itself a set of Pulumi programs that require a state backend, and uses an S3 bucket for this purpose, keeping the installer's own…" → ✅ verified (evidence: The same doc shows the installer commands using pulumi login s3://<your-state-bucket> before deploying the three Pulumi projects (infrastructure, application, dns) that make up the ECS-hosted installer, confirming it is itself a set of…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 68, 74-78, 228-229))
  • L68 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The installer uses an S3 bucket as its state backend, which keeps the installer's own state independent of the installation it creates." → ✅ verified (evidence: The same doc states: "The installer is itself a set of Pulumi programs, so you need a state backend for them. These use an S3 bucket, which keeps the installer's own state independent of the installation it creates," and the install…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (line 68, 77))
  • L70 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted install process deploys three Pulumi projects in order, with each consuming outputs from the one before it." → ✅ verified (evidence: The pulumi-self-hosted-installers repo's ecs-hosted/ts directory contains exactly three Pulumi project directories: infrastructure, application, and dns — matching the doc's own text "Deploy the three projects in order. Each consumes…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts (dirs: application, dns, infrastructure); content/docs/administration/self-hosting/deployment-options/ecs-hosted.md L70, L239)
  • L74-78 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Cloning the installer and running pulumi login s3://<your-state-bucket> from pulumi-self-hosted-installers/ecs-hosted/ts is the first step to get the…" → ✅ verified (evidence: Upstream README (pulumi/pulumi-self-hosted-installers, ecs-hosted/ts) states: "1. Clone the repo and install dependencies: git clone https://github.com/pulumi/pulumi-self-hosted-installers.git; cd ecs-hosted/{ts|go} 2. Login to…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/README.md)
  • L75 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "git clone https://github.com/pulumi/pulumi-self-hosted-installers.git" → ✅ verified (evidence: GitHub API confirms repo pulumi/pulumi-self-hosted-installers exists and is public, with "clone_url":"https://github.com/pulumi/pulumi-self-hosted-installers.git" matching the claimed clone command exactly.; source: gh api repos/pulumi/pulumi-self-hosted-installers)
  • L82 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The base infrastructure project of the ECS-hosted installer creates the Aurora cluster, VPC endpoints, and security groups." → ✅ verified (evidence: The ecs-hosted/ts/infrastructure/index.ts source in pulumi/pulumi-self-hosted-installers instantiates a Database (Aurora cluster, exposing dbSecurityGroupId) and, when enableVpcEndpoints is set, calls createVpcEndpoints, which…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/infrastructure/index.ts?ref=master)
  • L88-92 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The base infrastructure config includes vpcId, publicSubnetIds, privateSubnetIds, and isolatedSubnetIds settings." → ✅ verified (evidence: The file's own "Base infrastructure" configuration reference table lists exactly these four keys as required: vpcId, publicSubnetIds, privateSubnetIds, isolatedSubnetIds, matching the setup commands shown earlier in the doc…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 140-146, 89-92))
  • L98 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The application project of the ECS-hosted installer creates the ECS clusters and the API and console services." → ✅ verified (evidence: Doc line 96-98 reads "### 3. Deploy the application ... Creates the ECS clusters and the API and console services." directly under the application project's cd ../application step, matching the claim verbatim.; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L104-110 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The application config includes aws:region, imageTag, acmCertificateArn, kmsServiceKeyId, licenseKey (set with --secret), route53ZoneName, and…" → ✅ verified (evidence: Lines 104-110 show the exact commands: pulumi config set aws:region, imageTag, acmCertificateArn, kmsServiceKeyId, licenseKey ... --secret, route53ZoneName, route53Subdomain; and the Application config table at L156-166…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L114 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The database, security group, and OpenSearch values for the application project come from the base infrastructure stack's outputs." → ✅ verified (evidence: Doc text states "The database, security group, and OpenSearch values come from the previous stack's outputs" and the Application config reference table lists dbClusterEndpoint, dbSecurityGroupId, endpointSecurityGroupId…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (L114, L167-174); gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/infrastructure)
  • L116-118 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Pinning imageTag to a specific version rather than latest prevents an unrelated pulumi up from rolling the service forward unintentionally." → ➖ not-a-claim (evidence: This is the doc author's own operational guidance/design recommendation (pin imageTag to avoid an unrelated pulumi up rolling the service forward), not a third-party factual assertion; the Docker Hub link is just a pointer to available…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md L116-118)
  • L122-134 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The DNS-record-creation step's config includes aws:region, route53ZoneName, route53Subdomain, apiLoadBalancerDnsName, apiLoadBalancerZoneId…" → 🤝 matches (evidence: Lines 126-132 of the DNS step show exactly: pulumi config set aws:region, route53ZoneName, route53Subdomain, apiLoadBalancerDnsName, apiLoadBalancerZoneId, consoleLoadBalancerDnsName, consoleLoadBalancerZoneId — and the…; source: content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L140-152 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The base infrastructure configuration reference lists aws:region, vpcId, publicSubnetIds, privateSubnetIds, and isolatedSubnetIds as required keys…" → ➖ not-a-claim (evidence: The claim merely restates the table's own content from lines 140-146 of the same file (aws:region, vpcId, publicSubnetIds, privateSubnetIds, isolatedSubnetIds all marked 'Yes' with blank Default column). This is the PR's own authored…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L158 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "| aws:region | Yes | | AWS region |" → ✅ verified (framing: Source shows aws:region is a generally required Pulumi AWS provider config key; claim applies this same well-established requirement to the ECS-hosted…; evidence: Pulumi's AWS provider treats aws:region as a required configuration key when not otherwise supplied via environment/credentials file: "missing required configuration key "aws:region": The region where AWS operations will take place."…; source: Error message about missing region config isn't great pulumi-aws-native#220; https://www.pulumi.com/docs/iac/concepts/config/)
  • L192 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Hiding email login in the console does not disable the API handler behind it." → ✅ verified (evidence: The table lists consoleHideEmailLogin ("Hide email login and signup in the UI") as distinct from apiDisabledEmailLogin ("Disable the email login and signup handlers"), confirming that hiding the console UI element is separate from…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 179, 184, 192))
  • L192 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "To fully turn off the email login/signup handler, both apiDisabledEmailLogin and apiDisabledEmailSignup must be set." → ✅ verified (evidence: Doc line 192 states: "Hiding email login in the console does not disable the API handler behind it. To turn the handler off, set apiDisabledEmailLogin and apiDisabledEmailSignup as well." This matches the table entry (line 179)…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L196-202 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The DNS configuration reference lists aws:region, route53ZoneName, route53Subdomain, apiLoadBalancerDnsName/apiLoadBalancerZoneId, and…" → ✅ verified (evidence: The DNS configuration reference table (lines 196-202) lists exactly: aws:region (Yes), route53ZoneName (Yes), route53Subdomain (Yes), apiLoadBalancerDnsName/apiLoadBalancerZoneId (Yes), and…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L206-210 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Verifying the installation involves curling https://api.{sub}.example.com/api/status, then running pulumi login https://api.{sub}.example.com and pulumi…" → ➖ not-a-claim (evidence: The text is a faithful restatement of the doc's own verification steps (curl the status endpoint, pulumi login, pulumi whoami`) shown verbatim in the same file at lines 206-210; it describes the PR author's own documented procedure…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L212 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "After verification, the first account is created by opening https://app.{sub}.example.com." → ➖ not-a-claim (evidence: (escalated from pass3) Line 212 of the doc reads "Then open https://app.{sub}.example.com and create the first account." This is the PR author's own instructional documentation of their self-hosting setup process using a placeholder…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L218-222 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Confirming an end-to-end update works involves running pulumi new aws-typescript --stack dev --yes, pulumi up --yes, and pulumi destroy --yes." → ➖ not-a-claim (evidence: This is the doc's own author-authored verification steps (self-hosting installer guide instructing the reader how to smoke-test their deployment), using standard documented Pulumi CLI flags (pulumi new <template> --stack <name> --yes…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md L218-222)
  • L228-233 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Updating the Pulumi Cloud image involves logging into the S3 state backend, changing to the application directory, setting imageTag to the new value, and…" → ➖ not-a-claim (evidence: The claim is a faithful paraphrase of the file's own "Upgrade" section (lines 228-233): "pulumi login s3://", "cd pulumi-self-hosted-installers/ecs-hosted/ts/application", "pulumi config set imageTag "…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L235 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "A page exists at /docs/administration/self-hosting/operations/upgrades/ documenting staged rollouts and ordering for upgrades." → ✅ verified (evidence: The file content/docs/administration/self-hosting/operations/upgrades.md exists with a "Staged rollouts" section and an ordered update process (Infrastructure layer, Compute layer, Application layer), matching the claim's description.; source: repo:content/docs/administration/self-hosting/operations/upgrades.md)
  • L239 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "To uninstall the ECS-hosted Pulumi Cloud, the three projects must be destroyed in reverse order: dns, then application, then infrastructure." → ✅ verified (evidence: The doc's Install section deploys projects in order infrastructure (step 2) → application (step 3) → dns (step 4), and the Uninstall section states: "Destroy the projects in reverse order — dns, then application, then…; source: content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 66-127, 237-239))
  • L239 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Aurora and S3 carry deletion protection in this installer, which must be removed first if the customer intends to delete the data." → ❌ contradicted (framing: shifted — claim says "deletion protection" (implying AWS's deletion_protection attribute) but the code sets deletionProtection: false and uses Pulumi's…; evidence: The actual installer source (ecs-hosted/ts/infrastructure/database.ts) sets deletionProtection: false on the Aurora RDS Cluster resource — AWS-level deletion protection is explicitly disabled. The installer instead uses Pulumi's own…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/infrastructure/database.ts (master branch); intuition: Claim conflates Pulumi's protect: true CLI-level resource protection with AWS's native deletionProtection…)
  • L243 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer creates S3 buckets named pulumi-checkpoint-* and pulumi-policy-*, and customers should consider enabling AWS Backup on these…" → ❌ contradicted (framing: shifted — source has fixed literal bucket names (pulumi-checkpoints, pulumi-policypacks) with no name-suffix variability; claim asserts a wildcard/prefix…; evidence: The installer's actual source (ecs-hosted/ts/application/index.ts) creates buckets named literally pulumi-checkpoints, pulumi-policypacks, and pulumi-service-metadata — not a pulumi-checkpoint-* / pulumi-policy-* wildcard…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/application/index.ts)
  • L243 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted installer configures Aurora for replication and automated snapshots, so no routine database maintenance work is needed by the customer." → ✅ verified (framing: Source shows automated backupRetentionPeriod and multi-AZ replica provisioning done by the installer; claim's conclusion ("no routine database maintenance…; evidence: The installer's database.ts creates an rds.Cluster with backupRetentionPeriod: 7 (days), copyTagsToSnapshot: true, and provisions multiple rds.ClusterInstance replicas across AZs with a comment: "If there is a problem with the primary…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/ecs-hosted/ts/infrastructure/database.ts)
  • L247 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "Migrations failing with ALGORITHM=INPLACE is not supported means sql_mode is missing STRICT_TRANS_TABLES, and Aurora MySQL 8.0 does not set that mode…" → 🤝 matches (evidence: Sibling pages state the identical claim in more detail: troubleshooting.md: "Cause. The database's sql_mode does not include STRICT_TRANS_TABLES. Aurora MySQL 8.0 does not set it by default." and operations/database.md: "This is a common…; source: repo:content/docs/administration/self-hosting/troubleshooting.md; repo:content/docs/administration/self-hosting/operations/database.md)
  • L248 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The ECS-hosted Pulumi API cannot start without a licenseKey value being set." → ✅ verified (evidence: The same page's configuration reference table marks licenseKey as Required ("Yes") for the Application stack, and the Requirements section lists "A PULUMI_LICENSE_KEY" as a prerequisite — consistent with self-hosted Pulumi's…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md (lines 51, 162, 248))
  • L250 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "The Troubleshooting page contains the full list of troubleshooting items for the ECS-hosted installer." → ✅ verified (evidence: The linked page content/docs/administration/self-hosting/troubleshooting.md exists and contains a list of troubleshooting items for self-hosted Pulumi Cloud, including the same ALGORITHM=INPLACE is not supported issue mentioned in the…; source: repo:content/docs/administration/self-hosting/troubleshooting.md)
  • L250 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "A page exists at /docs/administration/self-hosting/troubleshooting/ documenting the full list of troubleshooting items." → ✅ verified (evidence: The file content/docs/administration/self-hosting/troubleshooting.md exists, titled "Troubleshooting Self-Hosted Pulumi Cloud", with menu identifier "administration-self-hosting-troubleshooting" (rendering at…; source: repo:content/docs/administration/self-hosting/troubleshooting.md)
  • L9 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The EKS documentation page's menu parent identifier is 'administration-self-hosting-deployment-options'." → ✅ verified (evidence: The front matter of eks-hosted.md shows parent: administration-self-hosting-deployment-options under the menu.administration section, exactly matching the claim.; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md)
  • L11 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The EKS documentation page's menu identifier is 'administration-self-hosting-deployment-options-eks'." → ✅ verified (evidence: Front matter of eks-hosted.md shows identifier: administration-self-hosting-deployment-options-eks under the menu.administration block, matching the claim exactly.; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md)
  • L21 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The EKS-Hosted Installer is used to deploy the self-hosted Pulumi Cloud in Amazon Elastic Kubernetes Service (EKS)." → ✅ verified (evidence: The doc's own linked repo pulumi/pulumi-self-hosted-installers contains an eks-hosted/ directory with numbered Pulumi projects (01-iam, 05-eks-cluster, 20-database, 90-pulumi-service, etc.) and a README, confirming it is indeed an…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/eks-hosted)
  • L52 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The README file at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/eks-hosted/README.md, provided with the installer package, contains…" → ✅ verified (evidence: The file exists at github.com/pulumi/pulumi-self-hosted-installers/blob/master/eks-hosted/README.md and contains sections titled "How to Use", "State Management", "Configuration", "Deployment Order", and "Deployment Instructions" with…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/eks-hosted/README.md)
  • L60 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The installer's README file, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/eks-hosted/README.md, describes how to set the…" → 🌀 framing-drift (framing: shifted — claim attributes the imageTag documentation to eks-hosted/README.md, but that specific config property is actually documented in a per-project…; evidence: The cited file eks-hosted/README.md does not itself mention imageTag at all — it only says generically "Each project folder has a Pulumi.EXAMPLE.yaml file that includes instructions for setting up the configuration." The actual…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/eks-hosted/README.md and .../eks-hosted/90-pulumi-service/Pulumi.README.yaml)
  • L60 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "When deploying the service, it is recommended to pin the Pulumi Cloud image tag to a specific version." → ✅ verified (framing: README shows imageTag as an explicit configurable version-pinning mechanism; doc's recommendation to pin it is a natural best-practice reading of that…; evidence: The pulumi-self-hosted-installers EKS README documents an imageTag configuration property used to set the Pulumi Cloud container version explicitly (e.g. "pulumi config set imageTag {image tag}"), consistent with the doc's…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/eks-hosted/README.md)
  • L78 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "The document section listing supported Kubernetes versions by installer version is titled 'Supported Kubernetes versions'." → ✅ verified (evidence: The file contains a section heading "### Supported Kubernetes versions" (line 82) directly above a table listing Installer version / Released / Kubernetes columns, matching the claim's description.; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md)
  • L80-86 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "EKS-Hosted Installer version 3.1 was released in February 2025 and supports Kubernetes version 1.31.0." → ✅ verified (evidence: (escalated from pass1) The official pulumi-self-hosted-installers README changelog lists: "3.1 · Feb, 2025 · 1.31.0 · Migrated off archived @pulumi/kubernetesx package to use core @pulumi/kubernetes resources." This exactly matches the…; source: https://github.com/pulumi/pulumi-self-hosted-installers/blob/master/eks-hosted/README.md)

  • 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

Copy link
Copy Markdown
Contributor
continued from previous comment
  • L90 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "To update the EKS cluster Kubernetes version, you set clusterVersion in the 05-eks-cluster project's stack configuration to the desired version, then run…" → ➖ not-a-claim (evidence: The doc text at line 94 reads: "Set clusterVersion in the 05-eks-cluster project's stack configuration to the version you want, then run pulumi up in that project." This is the doc's own faithful description of the self-hosting…; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md)
  • L93 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "AWS upgrades the EKS control plane one minor release at a time, so moving from Kubernetes 1.31 to 1.34 requires repeating the upgrade step for each…" → ✅ verified (evidence: AWS's official EKS best practices docs and multiple third-party sources confirm control plane upgrades happen one minor version at a time: "You can only upgrade one minor version at a time" and "Amazon EKS Add-ons may only be upgraded…; source: https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html; https://repost.aws/knowledge-center/eks-upgrade-cluster-add-custom-controllers)
  • L96 in content/docs/administration/self-hosting/deployment-options/eks-hosted.md "Users still running an EKS installer released before October 2024 should contact Pulumi support to plan a migration to the current installer before changing…" → ➖ not-a-claim (evidence: (escalated from pass3) The line is a verbatim restatement of the doc's own instructional text ("If you are still running an EKS installer released before October 2024, contact Pulumi support to plan a migration to the current installer…; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md)
  • L9 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "The GKE-Hosted deployment option page is now organized under the 'administration-self-hosting-deployment-options' navigation section/menu identifier rather…" (also L11) → ✅ verified (evidence: The file's frontmatter shows parent: administration-self-hosting-deployment-options (identifier administration-self-hosting-deployment-options-gke), confirming the page is now organized under that navigation section as claimed.; source: repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L11 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "The GKE deployment-options page's menu identifier is 'administration-self-hosting-deployment-options-gke'." → ✅ verified (evidence: Frontmatter of gke-hosted.md shows identifier: administration-self-hosting-deployment-options-gke under the administration menu, matching the claim exactly.; source: repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L19 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "A self-hosting trial note applies to this GKE-Hosted deployment guide, implying a trial option/period is available for this self-hosted deployment method." → ✅ verified (evidence: Line 19 of the file includes {{< self-hosting-trial-note />}}, whose shortcode template renders: "If you would like to evaluate the self-hosted Pulumi Cloud, request a Proof of Concept (PoC)…; source: repo:layouts/shortcodes/self-hosting-trial-note.html and repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L21 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "The GKE-Hosted Installer is available at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/gke-hosted and is used to deploy the self-hosted…" → ✅ verified (evidence: The GitHub API confirms the path pulumi/pulumi-self-hosted-installers/tree/master/gke-hosted exists and contains infrastructure, kubernetes, and application deployment stages plus a README describing GKE-hosted self-hosted Pulumi Cloud…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/gke-hosted)
  • L42 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "The README file provided with the GKE-Hosted installer package, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/gke-hosted/READM…" → ✅ verified (evidence: The README.md exists at github.com/pulumi/pulumi-self-hosted-installers/tree/master/gke-hosted/README.md and contains detailed deployment steps including prerequisites, GCP authentication, and step-by-step instructions for deploying…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/gke-hosted/README.md)
  • L44 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "A first-admin note applies after the installer README reference and before the GKE-Hosted System Management and Maintenance section, implying there is a…" → ✅ verified (evidence: Line 42 links the installer README, line 44 renders {{< self-hosted-first-admin-note />}}, and line 46 begins "## GKE-Hosted System Management and Maintenance" — confirming the note's placement. The shortcode itself warns: "On a fresh…; source: repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md and repo:layouts/shortcodes/self-hosted-first-admin-note.html)
  • L48 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "A schema-v2 note applies to the Pulumi Cloud Updates section, implying there is a version 2 schema relevant to updating the self-hosted Pulumi Cloud." → ✅ verified (evidence: The page includes the {{< self-hosting-schema-v2-note />}} shortcode under "Pulumi Cloud Updates", and the shortcode's own definition confirms this refers to a real "V2 engine events database schema (PULUMI_ENGINE_EVENTS_SCHEMA_V2)"…; source: repo:layouts/shortcodes/self-hosting-schema-v2-note.html; repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L50 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "The installer's README file, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/gke-hosted/README.md, documents how to set the…" → ✅ verified (evidence: The gke-hosted README (fetched from pulumi/pulumi-self-hosted-installers master) contains the step: "pulumi config set imageTag {imageTag} - use "latest" or find the latest tag to pin to here…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/gke-hosted/README.md)
  • L50 in content/docs/administration/self-hosting/deployment-options/gke-hosted.md "When deploying the Pulumi Cloud, it is recommended to pin the image tag to a specific version." → ✅ verified (framing: README presents 'latest' and pinning as alternative options; docs claim recommends pinning specifically, which is a reasonable operational best-practice…; evidence: The linked installer README instructs: "pulumi config set imageTag {imageTag} - use "latest" or find the latest tag to pin to here: https://hub.docker.com/r/pulumi/service", confirming the imageTag config property exists and that…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/gke-hosted/README.md)
  • L9 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The Local-Docker deployment-options page is now organized under the 'administration-self-hosting-deployment-options' navigation parent/identifier instead of…" (also L11) → 🤝 matches (evidence: local-docker.md's front matter shows parent: administration-self-hosting-deployment-options and identifier: administration-self-hosting-deployment-options-local-docker, consistent with sibling pages in the same directory (e.g.…; source: repo:content/docs/administration/self-hosting/deployment-options/local-docker.md and repo:content/docs/administration/self-hosting/deployment-options/aks-hosted.md)
  • L11 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The Local-Docker page's navigation menu identifier is 'administration-self-hosting-deployment-options-local-docker'." → ✅ verified (evidence: Line 11 of the file's front matter reads identifier: administration-self-hosting-deployment-options-local-docker, exactly matching the claim.; source: repo:content/docs/administration/self-hosting/deployment-options/local-docker.md)
  • L19 in content/docs/administration/self-hosting/deployment-options/local-docker.md "A self-hosting trial note shortcode ({{< self-hosting-trial-note />}}) is included on this page, presumably conveying information about a self-hosting trial." → ✅ verified (evidence: The shortcode {{< self-hosting-trial-note />}} is present on line 19 of local-docker.md, and its definition in layouts/shortcodes/self-hosting-trial-note.html renders: "If you would like to evaluate the self-hosted Pulumi Cloud…; source: repo:layouts/shortcodes/self-hosting-trial-note.html; repo:content/docs/administration/self-hosting/deployment-options/local-docker.md)
  • L21 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The Local-Docker Installer is located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/local-docker." → ✅ verified (evidence: GitHub API confirms the local-docker directory exists at github.com/pulumi/pulumi-self-hosted-installers/tree/master/local-docker, containing files like README.md, Pulumi.yaml, index.ts, config.ts — matching the claimed URL exactly.; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/local-docker)
  • L21 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The Local-Docker Installer is generally meant to be used where an on-premise solution is needed or where cloud-based installation solutions (e.g., EKS, ECS…" → ✅ verified (evidence: The live Pulumi docs page for the Local-Docker Installer states verbatim: "The Local-Docker Installer is generally meant to be used where an on-premise solution is needed or where the cloud-based installation solutions (i.e. EKS, ECS…; source: https://www.pulumi.com/docs/pulumi-cloud/self-hosted/deployment-options/local-docker/)
  • L54 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The README file provided with the installer package, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/local-docker/README.md…" → ✅ verified (evidence: The file exists at github.com/pulumi/pulumi-self-hosted-installers/tree/master/local-docker/README.md and contains detailed setup steps including "## Prerequisites", "## Setup" with CLI/service/database/storage configuration, "###…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/local-docker/README.md)
  • L56 in content/docs/administration/self-hosting/deployment-options/local-docker.md "A 'first admin' note (rendered via the {{< self-hosted-first-admin-note />}} shortcode) applies after following the README-based deployment steps for the…" → ✅ verified (evidence: In local-docker.md, {{< self-hosted-first-admin-note />}} is placed directly after "### Deployment Steps" (which cites the installer's README) and directly before "## Local-Docker System Management and Maintenance", exactly matching…; source: repo:content/docs/administration/self-hosting/deployment-options/local-docker.md)
  • L60 in content/docs/administration/self-hosting/deployment-options/local-docker.md "A schema v2 note (rendered via the {{< self-hosting-schema-v2-note />}} shortcode) applies specifically to the Pulumi Cloud Updates process for Local-Docker…" → ✅ verified (framing: Shortcode is a general warning reused across installer pages ("wherever a reader is about to upgrade an install"); claim narrows it to "specifically"…; evidence: Line 60 "### Pulumi Cloud Updates" is immediately followed by line 62 {{< self-hosting-schema-v2-note />}}, confirming the shortcode is rendered within the Pulumi Cloud Updates section of the Local-Docker deployment page. The shortcode…; source: repo:content/docs/administration/self-hosting/deployment-options/local-docker.md and repo:layouts/shortcodes/self-hosting-schema-v2-note.html)
  • L62 in content/docs/administration/self-hosting/deployment-options/local-docker.md "The installer's README file, used to set the imageTag configuration property, is located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master…" → ✅ verified (evidence: The file exists at github.com/pulumi/pulumi-self-hosted-installers/blob/master/local-docker/README.md and contains the line "1. pulumi config set imageTag {imageTag}" with a note to see hub.docker.com/orgs/pulumi for available tags…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/local-docker/README.md)
  • L62 in content/docs/administration/self-hosting/deployment-options/local-docker.md "When deploying the Pulumi Cloud, it is recommended to pin the image tag to a specific version." → ✅ verified (evidence: The linked installer README instructs users to run pulumi config set imageTag {imageTag} and explicitly says: "see https://hub.docker.com/orgs/pulumi for the available tags. Pick the latest tag in the form of DATE-NUMBER-signed" …; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/local-docker/README.md)
  • L3 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Self-hosted Pulumi Cloud can be evaluated in about ten minutes with the all-in-one Docker Compose stack." → 🤷 unverifiable (evidence: The quickstart-docker-compose stack does exist in pulumi/pulumi-self-hosted-installers (confirmed via GitHub contents API), confirming the mechanism described, but "about ten minutes" is a subjective time-to-evaluate estimate with no…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose; intuition: Round "ten minutes" estimate is a plausible but unverifiable marketing-style approximation, not a measured figure.)
  • L9 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "This page's menu identifier is administration-self-hosting-deployment-options-quickstart-docker-compose, nested under the…" (also L11) → ✅ verified (evidence: Frontmatter shows: identifier: administration-self-hosting-deployment-options-quickstart-docker-compose and parent: administration-self-hosting-deployment-options, exactly matching the claim.; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L19 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The fastest way to try self-hosted Pulumi Cloud is the all-in-one Docker Compose stack. It runs the API, the web Console, a migrated MySQL database, and…" → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo's quickstart-docker-compose directory contains docker-compose.yml with api (port 8080) and console (port 3000) services, plus search_vars.env (OpenSearch) and database env vars (MySQL)…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose (and docker-compose.yml contents))
  • L21 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Production deployment options for self-hosted Pulumi Cloud are documented at /docs/administration/self-hosting/deployment-options/." → ✅ verified (evidence: The repo contains content/docs/administration/self-hosting/deployment-options/_index.md alongside sibling pages (aks-hosted.md, ecs-hosted.md, eks-hosted.md, gke-hosted.md, byo-infra-hosted.md, local-docker.md) confirming the linked path…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options)
  • L21 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The all-in-one Docker Compose stack runs the API, the web Console, a migrated MySQL database, and OpenSearch on a single host with working defaults." → ✅ verified (evidence: The all-in-one docker-compose.yml in pulumi/pulumi-self-hosted-installers defines exactly these services: opensearch/opensearch-dashboards, api (pulumi/service image), console (pulumi/console image), db (mysql:8.0 image), and a…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one/docker-compose.yml)
  • L23 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "- Docker Engine with the Docker Compose plugin (v2)." → ✅ verified (evidence: The URL https://docs.docker.com/engine/install/ is a live, official Docker Docs page titled "Install Docker Engine," confirming it is a valid reference for Docker Engine installation instructions. This section describes…; source: https://docs.docker.com/engine/install/)
  • L24 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "- A host with at least 2 CPU cores, 8 GB of memory, and 20 GB of free disk." → ➖ not-a-claim (evidence: (escalated from pass3) This is the PR author's own stated minimum hardware prerequisite for their all-in-one Docker Compose quickstart guide, not a third-party or externally verifiable technical assertion — it's a recommended spec choice…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (L26))
  • L25-28 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Running the all-in-one Docker Compose stack requires Docker Engine with the Docker Compose plugin version 2." → ✅ verified (evidence: The doc's own prerequisite line reads "Docker Engine with the Docker Compose plugin (v2)" and I confirmed via GitHub that pulumi/pulumi-self-hosted-installers' quickstart-docker-compose directory contains the docker-compose.yml and…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (L25) + gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose)
  • L27 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Ports 9200 and 5601 must be available on the host for OpenSearch." → ✅ verified (framing: Compose file also exposes 9300/9600 but doc only calls out 9200/5601 as the ones users need free on host; claim is a valid subset, not contradicted.; evidence: (escalated from pass3) The all-in-one docker-compose.yml maps opensearch ports "9200:9200" (also 9300, 9600 internally) and opensearch-dashboards port "5601:5601" to the host, confirming 9200 and 5601 must be free on the host for…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one/docker-compose.yml)
  • L28 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "A Pulumi license key is required to use the all-in-one Docker Compose stack." → ✅ verified (evidence: The actual run-ee.sh script in pulumi/pulumi-self-hosted-installers (quickstart-docker-compose/scripts/run-ee.sh) contains: `if [ -z "${PULUMI_LICENSE_KEY:-}" ]; then echo "Please set PULUMI_LICENSE_KEY. If you don't have a license key…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh)
  • L29 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "run-ee.sh exits immediately if PULUMI_LICENSE_KEY is not set. Request an evaluation license and a solutions…" → ✅ verified (evidence: The run-ee.sh script in pulumi/pulumi-self-hosted-installers contains: if [ -z "${PULUMI_LICENSE_KEY:-}" ]; then echo \"Please set PULUMI_LICENSE_KEY. If you don't have a license key, please contact sales@pulumi.com.\"; exit 1; fi …; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh)
  • L31 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The run-ee.sh script exits immediately if the PULUMI_LICENSE_KEY environment variable is not set." → 🤷 unverifiable (evidence: (escalated from pass1 after exhausting its 12-turn cap) This claim describes internal behavior of Pulumi's own run-ee.sh script (self-hosting deployment tooling). Web search cannot inspect this script's source/logic; verifying requires…; source: N/A - requires product source inspection (WebSearch dispatched but verification did not converge within the turn budget))
  • L31 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "An evaluation license can be requested at /product/self-hosted/#self-hosted-trial." → ✅ verified (evidence: The page content/product/self-hosted.md has a section with anchor: self-hosted-trial, titled "Request a proof of concept," whose description states: "A solutions architect will walk through your target environment, size the…; source: repo:content/product/self-hosted.md)
  • L31 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "You can request an evaluation license at /product/self-hosted/#self-hosted-trial and a solutions architect will provide a key." → ✅ verified (evidence: The /product/self-hosted page has a self-hosted-trial anchor section titled "Request a proof of concept" with description: "A solutions architect will walk through your target environment, size the installation, and get you the…; source: repo:content/product/self-hosted.md (anchor: self-hosted-trial))
  • L37 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "git clone https://github.com/pulumi/pulumi-self-hosted-installers.git" → ✅ verified (evidence: GitHub API confirms repo pulumi/pulumi-self-hosted-installers exists and its clone_url is exactly "https://github.com/pulumi/pulumi-self-hosted-installers.git", matching the git clone command in the doc.; source: gh api repos/pulumi/pulumi-self-hosted-installers)
  • L39 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The installer repository is cloned from https://github.com/pulumi/pulumi-self-hosted-installers.git." → ✅ verified (evidence: GitHub API confirms repo pulumi/pulumi-self-hosted-installers exists with clone_url "https://github.com/pulumi/pulumi-self-hosted-installers.git\", matching the claim exactly.; source: gh api repos/pulumi/pulumi-self-hosted-installers)
  • L40 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The quickstart Docker Compose files are located in the quickstart-docker-compose directory of the pulumi-self-hosted-installers repository." → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo root listing includes a quickstart-docker-compose directory, confirming the claim.; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/)
  • L46 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The license key is set via the PULUMI_LICENSE_KEY environment variable." → ✅ verified (evidence: (escalated from pass1) The DeepWiki documentation of the pulumi-self-hosted-installers repo shows the quickstart-docker-compose.yml API service environment block explicitly lists "PULUMI_LICENSE_KEY:" as one of the variables populated…; source: https://deepwiki.com/pulumi/pulumi-self-hosted-installers/7.2-secrets-management)
  • L52 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The stack is started by running ./scripts/run-ee.sh -f ./all-in-one/docker-compose.yml." → ❌ contradicted (evidence: The doc's own prior step clones pulumi/pulumi-self-hosted-installers, but that repo's actual top-level contents (fetched via GitHub API) contain only cloud-specific installer directories — aks-hosted, byo-infra…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents (master branch top-level listing); gh api search/repositories?q=org:pulumi+docker-compose; intuition: The entire Docker Compose "all-in-one" quickstart flow described in this doc page appears to be fabricated — the…)
  • L55 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The default checkpoint data storage location can be overridden with the PULUMI_DATA_PATH environment variable." → 🤷 unverifiable (evidence: (escalated from pass1 after exhausting its 12-turn cap) Web search surfaced Pulumi docs confirming the default local checkpoint directory is "The default directory for these JSON files is ~/.pulumi." and that…; source: WebSearch ran query "PULUMI_DATA_PATH"; top results didn't address the claim directly)
  • L55 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Running run-ee.sh starts every component with working defaults, including a MySQL container that is migrated automatically." → ✅ verified (evidence: The all-in-one docker-compose.yml in pulumi/pulumi-self-hosted-installers defines a db service (image: "mysql:8.0@sha256:...") and a separate migration service (image: "pulumi/migrations:latest@sha256:...") that depends on db…; source: gh api repos/pulumi/pulumi-self-hosted-installers/git/blobs (quickstart-docker-compose/all-in-one/docker-compose.yml and scripts/run-ee.sh))
  • L55 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The MySQL container is migrated automatically when the stack starts." → ✅ verified (evidence: The same doc states the compose stack includes "a migrated MySQL database" and that "The schema is applied by the pulumi/migrations container, which the compose file pulls from Docker Hub — you do not need to obtain migration scripts…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (lines 21, 87))
  • L55 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Checkpoint data is stored under $HOME/pulumi-self-hosted-installers/data by default." → ✅ verified (evidence: The run-ee.sh script in pulumi/pulumi-self-hosted-installers sets DEFAULT_DATA_PATH_BASE="${HOME}" and DEFAULT_DATA_PATH="${DEFAULT_DATA_PATH_BASE}/pulumi-self-hosted-installers/data", then defaults PULUMI_DATA_PATH to this value…; source: gh api repos/pulumi/pulumi-self-hosted-installers/git/blobs/e6e92d18ce4616dd7b968e2111c94777fe103752 (quickstart-docker-compose/scripts/run-ee.sh))
  • L55 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "1. Open the Console at http://localhost:3000 and create the first account. The first user to register becomes an administrator." → ✅ verified (evidence: (escalated from pass3) The pulumi/pulumi-self-hosted-installers docker-compose.yml maps the console service to port "3000:3000" and sets PULUMI_CONSOLE_DOMAIN/PULUMI_HOMEPAGE_DOMAIN to "localhost:3000", confirming the Console is…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/docker-compose.yml (console ports: ["3000:3000"], PULUMI_CONSOLE_DOMAIN: "localhost:3000"))
  • L57 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The Console can be opened at http://localhost:3000 after starting the stack." → ✅ verified (evidence: Pulumi's self-hosted console documentation states: "The console will be served using port 3000 over HTTP by default." This matches the claim that the Console can be opened at http://localhost:3000 after starting the docker-compose stack.; source: https://www.pulumi.com/docs/administration/self-hosting/components/console/)
  • L57 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The first user to register in the Console becomes an administrator." → ✅ verified (evidence: The shared shortcode self-hosted-first-admin-note.html, used across self-hosting deployment pages and sourced from the AKS installer README, states: "On a fresh installation the first user to sign up becomes the administrator…; source: layouts/shortcodes/self-hosted-first-admin-note.html)
  • L59 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Pointing the CLI at the instance requires following a prompt to create an access token." → ➖ not-a-claim (evidence: The claim is a direct restatement of the doc's own instructional step ("Point the CLI at your instance and follow the prompt to create an access token: pulumi login http://localhost:8080"), describing the PR author's own documented…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L59-62 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The Pulumi CLI can be pointed at the self-hosted instance using pulumi login http://localhost:8080, which prompts to create an access token." → ✅ verified (evidence: The doc's own prerequisites list port 8080 as the API port for the Docker Compose stack, and pulumi login <url> prompting to create/enter an access token when authenticating against a self-hosted backend is standard, documented Pulumi…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (lines 27, 59-62))
  • L62 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The CLI is pointed at the instance by running pulumi login http://localhost:8080." → ✅ verified (evidence: Doc's prerequisites state "Ports 3000 (Console), 8080 (API)... available on the host," and the CLI login step correctly targets http://localhost:8080, matching the documented API port and standard pulumi login <url> self-hosted…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (L27, L62))
  • L67-68 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Running pulumi whoami verifies the connection to the self-hosted instance." → ✅ verified (evidence: The doc itself instructs: "Verify the connection:" followed by pulumi whoami, right after pulumi login http://localhost:8080. pulumi whoami is a standard CLI command that queries the currently configured backend for the logged-in…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (L65-69))
  • L71 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Containers can be removed with the command docker compose -f ./all-in-one/docker-compose.yml down." → ✅ verified (evidence: The repo pulumi/pulumi-self-hosted-installers has a quickstart-docker-compose/all-in-one directory containing docker-compose.yml, matching the path used in the doc's start command (`./scripts/run-ee.sh -f…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose (shows all-in-one/docker-compose.yml exists))
  • L71 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "To stop the stack, you press Ctrl+C, then remove the containers with docker compose -f ./all-in-one/docker-compose.yml down." → ➖ not-a-claim (evidence: Line 71 of the file reads: "To stop the stack, press Ctrl+C, then remove the containers with docker compose -f ./all-in-one/docker-compose.yml down." This is the doc's own instructional/procedural text describing its own quickstart…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L71 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Deleting the data directory discards evaluation state." → ➖ not-a-claim (evidence: Line 71 of the same file states: "To stop the stack, press Ctrl+C, then remove the containers with docker compose -f ./all-in-one/docker-compose.yml down. Delete the data directory to discard evaluation state." This is the doc's own…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L75 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The run-ee.sh script honors environment variables, and unset variables fall back to working defaults." → ✅ verified (evidence: (escalated from pass1 after exhausting its 12-turn cap) The official docs page states: "These are used by the run-ee.sh script provided to you as part of the self-evaluation package. If any of these variables are not set when you run…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/quickstart-docker-compose/)
  • L77-79 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The PULUMI_DATA_PATH environment variable sets the persistent path for checkpoint objects and defaults to $HOME/pulumi-self-hosted-installers/data." → ❌ contradicted (framing: Claim asserts a specific default value that does not match the documented default.; evidence: (escalated from pass1 after exhausting its 12-turn cap) The official Pulumi self-hosting docs state: "PULUMI_DATA_PATH: The persistent path where the service should store the checkpoint objects. Default uses /tmp/pulumi-ee/data." This…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/quickstart-docker-compose/)
  • L79 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Other settings — identity providers, object storage, encryption keys — are configured in the environment blocks of ./all-in-one/docker-compose.yml. See…" → ✅ verified (evidence: The Components page (/docs/administration/self-hosting/components/) links to component subpages (API, Console, Search, Deployments); the API subpage has a detailed "Environment Variables for Core Infrastructure" section plus dedicated…; source: repo:content/docs/administration/self-hosting/components/_index.md, repo:content/docs/administration/self-hosting/components/api.md)
  • L81 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The Components page at /docs/administration/self-hosting/components/ documents the full set of variables each container accepts." → ✅ verified (evidence: The Components index page links to per-component pages (api.md, console.md, search.md, deployments.md), and e.g. api.md contains extensive tables of environment variables ("Environment Variables for Core Infrastructure", "Object storage"…; source: repo:content/docs/administration/self-hosting/components/api.md and content/docs/administration/self-hosting/components/_index.md)
  • L81 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Identity providers, object storage, and encryption keys are configured in the environment blocks of ./all-in-one/docker-compose.yml." → ✅ verified (evidence: Fetched quickstart-docker-compose/all-in-one/docker-compose.yml from pulumi/pulumi-self-hosted-installers: the console service's environment block contains GITHUB_OAUTH_ID, GITLAB_OAUTH_ID, BITBUCKET_OAUTH_ID (identity…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one/docker-compose.yml)
  • L85 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "The script creates and uses a Docker network named pulumi-self-hosted-installers, and the external database must be reachable from that network." → ✅ verified (framing: Source confirms the network name and its purpose; the claim's added detail about external DB reachability is a standard consequence of docker-compose network…; evidence: (escalated from pass1 after exhausting its 12-turn cap) A PR in pulumi/pulumi-self-hosted-installers confirms: "This name is not meant to refer to the repo, but to the name of the docker network used for this docker-compose installation…; source: move content into quickstart-docker-compose pulumi-self-hosted-installers#35)
  • L85 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "You can run against an existing MySQL 8.0 instance instead of the bundled database by starting the service with the base docker-compose.yml and pointing…" → 🤷 unverifiable (framing: Claim's variable name PULUMI_LOCAL_DATABASE_HOST doesn't match the publicly indexed PULUMI_LOCAL_DATABASE_NAME; could be a doc update not yet reflected in…; evidence: (escalated from pass1) Official Pulumi self-hosting docs describe pointing an external MySQL 8.0 instance via env vars, but name them PULUMI_LOCAL_DATABASE_NAME (hostname) and PULUMI_LOCAL_DATABASE_PORT — e.g.…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/quickstart-docker-compose/ (WebSearch dispatched but verification did not converge within the turn budget))
  • L87 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Users do not need to obtain migration scripts separately, since the pulumi/migrations container applies the schema." → ✅ verified (framing: Source confirms the migrations container's role in applying DB migrations; claim's assertion that users needn't obtain scripts separately is a reasonable…; evidence: (escalated from pass1 after exhausting its 12-turn cap) Docker Hub describes the pulumi/migrations image as providing "the database migrations needed to bring a MySQL database up for use as a primary data store for the Pulumi Service,"…; source: https://hub.docker.com/r/pulumi/migrations)
  • L87 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "Users do not need to obtain migration scripts separately." → ✅ verified (evidence: The all-in-one docker-compose.yml in pulumi/pulumi-self-hosted-installers defines a migration service using image: "pulumi/migrations:latest@sha256:..." pulled directly from a registry (no local build context, no separate script…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one/docker-compose.yml?ref=master)
  • L89 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "For evaluation, pin the latest image tag in the compose file and re-run run-ee.sh to pull newer service images. If you pinned a specific version, update…" → ✅ verified (evidence: The upstream quickstart-docker-compose/all-in-one/docker-compose.yml pins images with the latest tag (e.g. image: "pulumi/service:latest@sha256:...", pulumi/console:latest@sha256:..., pulumi/migrations:latest@sha256:...), and…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one/docker-compose.yml and .../scripts/run-ee.sh)
  • L91 in content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md "For evaluation, you should pin the latest image tag in the compose file and re-run run-ee.sh to pull newer service images." → ➖ not-a-claim (evidence: Line 91 reads: "For evaluation, pin the latest image tag in the compose file and re-run run-ee.sh to pull newer service images." This is the doc's own prescriptive instruction for its own quickstart workflow, not a third-party…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md#L91)
  • L3 in content/docs/administration/self-hosting/install/_index.md "The all-in-one Docker Compose stack can be used to evaluate self-hosted Pulumi Cloud on a single host." (also L18) → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo contains a "quickstart-docker-compose/all-in-one" directory with docker-compose.yml and run scripts, matching the doc's described commands (git clone repo, cd quickstart-docker-compose…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose)
  • L18 in content/docs/administration/self-hosting/install/_index.md "Users can choose a production deployment option for their platform after evaluating with Docker Compose." → ➖ not-a-claim (evidence: The page itself states: "Start with the all-in-one Docker Compose stack to evaluate on a single host, then choose a production deployment for your platform." This is the PR's own description of its documentation structure/workflow, not a…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L20-22 in content/docs/administration/self-hosting/install/_index.md "Requesting a Proof of Concept (PoC) for self-hosted Pulumi Cloud results in a solutions architect providing an evaluation key and walking through sizing." → ✅ verified (evidence: The #self-hosted-trial section on content/product/self-hosted.md states: "A solutions architect will walk through your target environment, size the installation, and get you the installer package and an evaluation license key." This…; source: repo:content/product/self-hosted.md (anchor: self-hosted-trial))
  • L30 in content/docs/administration/self-hosting/install/_index.md "The all-in-one Docker Compose stack runs the API, Console, database, and search components on a single host." → ✅ verified (framing: Env files (api, console, search, service vars) present in the all-in-one directory corroborate the component list; full YAML service definitions weren't…; evidence: The pulumi/pulumi-self-hosted-installers repo's mitch/local-docker-aws branch (the implementing branch for this docs PR's Docker Compose quickstart) contains quickstart-docker-compose/all-in-one/docker-compose.yml, exactly matching…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one?ref=mitch/local-docker-aws)
  • L32-37 in content/docs/administration/self-hosting/install/_index.md "The self-hosted Pulumi installers repository is located at https://github.com/pulumi/pulumi-self-hosted-installers.git." → ✅ verified (evidence: GitHub API confirms repo exists at pulumi/pulumi-self-hosted-installers with clone_url "https://github.com/pulumi/pulumi-self-hosted-installers.git", description "Repository for getting started with self-hosted Pulumi Service."; source: gh api repos/pulumi/pulumi-self-hosted-installers)
  • L32-37 in content/docs/administration/self-hosting/install/_index.md "Running ./scripts/run-ee.sh -f ./all-in-one/docker-compose.yml from the quickstart-docker-compose directory starts the all-in-one Docker Compose stack." → ✅ verified (evidence: The actual run-ee.sh script from pulumi/pulumi-self-hosted-installers contains a usage comment: "To specify alternate compose files, simply pass the compose files using the -f flag and they will be passed to the docker-compose up…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh)
  • L35 in content/docs/administration/self-hosting/install/_index.md "A PULUMI_LICENSE_KEY environment variable must be exported to run the Docker Compose stack." → ✅ verified (evidence: run-ee.sh (the script the docs instruct users to run) contains: if [ -z "${PULUMI_LICENSE_KEY:-}" ]; then echo "Please set PULUMI_LICENSE_KEY. If you don't have a license key, please contact sales@pulumi.com."; exit 1; fi — confirming…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh)
  • L36 in content/docs/administration/self-hosting/install/_index.md "The script ./scripts/run-ee.sh -f ./all-in-one/docker-compose.yml is used to start the all-in-one Docker Compose stack." → ✅ verified (evidence: The sibling page content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md independently documents the identical command: "./scripts/run-ee.sh -f ./all-in-one/docker-compose.yml" as the way to "Start the…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L39 in content/docs/administration/self-hosting/install/_index.md "After starting the all-in-one Docker Compose stack, the Console is accessible at http://localhost:3000." → ✅ verified (framing: Source states the console is served on port 3000 over HTTP by default (general product behavior); claim narrows this to the specific case of the all-in-one…; evidence: Pulumi's own self-hosting docs state: "The console will be served using port 3000 over HTTP by default," which corroborates that the all-in-one Docker Compose stack's Console is accessible at localhost:3000 (HTTP, no TLS configured).; source: https://www.pulumi.com/docs/administration/self-hosting/components/console/)
  • L39 in content/docs/administration/self-hosting/install/_index.md "After creating the first account in the Docker Compose stack, a user logs in by running pulumi login http://localhost:8080." → ✅ verified (framing: Source establishes default port 8080 for the API container generally; claim applies this specifically to the Docker Compose quickstart login step, a…; evidence: (escalated from pass1 after exhausting its 12-turn cap) Pulumi's self-hosted API component docs state: "By default, this container will serve using port 8080 over standard HTTP." This confirms the Docker Compose stack's default port…; source: https://pulumi.com/docs/pulumi-cloud/admin/self-hosted/components/api)
  • L41 in content/docs/administration/self-hosting/install/_index.md "See the Docker Compose quickstart for prerequisites, first login…" → ✅ verified (evidence: The linked page content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md exists and contains a "Prerequisites" section, login/verification steps ("Open the Console... create the first account", "Verify the…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L47 in content/docs/administration/self-hosting/install/_index.md "The Kubernetes-based deployment option for self-hosted Pulumi Cloud works in any environment, including air-gapped networks." → ✅ verified (evidence: Sibling docs pages corroborate: network.md states "self-hosted Pulumi Cloud can [be] configured to run in an air-gapped environment without external ingress and egress. Learn more in the Deploying Pulumi Self-Hosted in Air-Gapped…; source: repo:content/docs/administration/self-hosting/network.md; repo:content/docs/administration/self-hosting/airgapped.md)
  • L47 in content/docs/administration/self-hosting/install/_index.md "Deploying to a Kubernetes cluster with MySQL and S3-compatible object storage is described as the most flexible production option for self-hosted Pulumi Cloud." → ➖ not-a-claim (evidence: The line under review literally states: "Deploy to your own Kubernetes cluster with MySQL and S3-compatible object storage. This is the most flexible production option and works in any environment, including air-gapped networks." This is…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L49 in content/docs/administration/self-hosting/install/_index.md "See Bring your own infrastructure for the Kubernetes deployment guide." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md exists, titled "Bring-your-own infra", with meta_desc "Installer and installation instructions for deploying the self-hosted Pulumi Cloud on your…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md?ref=master)
  • L55-58 in content/docs/administration/self-hosting/install/_index.md "The Amazon ECS deployment option for self-hosted Pulumi Cloud uses ECS and Fargate, with RDS Aurora, S3, and an Application Load Balancer." → ✅ verified (evidence: The ECS install page (content/docs/administration/self-hosting/deployment-options/ecs-hosted.md) states the installer "runs the Pulumi API and console as Fargate services behind Application Load Balancers, backed by Aurora MySQL and S3,"…; source: repo:content/docs/administration/self-hosting/deployment-options/ecs-hosted.md)
  • L55-58 in content/docs/administration/self-hosting/install/_index.md "Two managed deployment options are available for running self-hosted Pulumi Cloud in production on AWS." → ✅ verified (evidence: The source file itself lists exactly two AWS deployment options: "Deploy a production system on AWS. Two managed options are available: - Amazon EKS ... - Amazon ECS ...", matching the claim's count and framing.; source: repo:content/docs/administration/self-hosting/install/_index.md L53-58)
  • L64 in content/docs/administration/self-hosting/install/_index.md "The Azure production deployment option for self-hosted Pulumi Cloud uses Azure Kubernetes Service with Azure Database for MySQL and Azure Blob Storage." → ✅ verified (evidence: The pulumi/pulumi-self-hosted-installers repo's aks-hosted/README.md states the 01-infrastructure program provisions "MySQL server and database" and "Storage account and blob storage containers", while 02-kubernetes "contains the program…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/aks-hosted/README.md)
  • L70 in content/docs/administration/self-hosting/install/_index.md "A production deployment of self-hosted Pulumi Cloud on Google Cloud uses Google Kubernetes Engine with Cloud SQL for MySQL and Cloud Storage." → ✅ verified (evidence: The linked gke-hosted page confirms: "The GKE-hosted installation of Pulumi deploys the following services: ... SQL Server and DB for persistent state and automated replication and snapshotting" and "Buckets for checkpoints and policy…; source: content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L78 in content/docs/administration/self-hosting/install/_index.md "The Operations guide covers high availability, backup and recovery, monitoring, sizing, and security hardening for self-hosted Pulumi Cloud." → ✅ verified (evidence: The Operations guide's index meta description reads "Production operations guide for self-hosted Pulumi Cloud covering high availability, disaster recovery, monitoring, sizing, and security hardening," and the directory contains matching…; source: repo:content/docs/administration/self-hosting/operations/_index.md and repos/pulumi/docs/contents/content/docs/administration/self-hosting/operations directory listing)
  • L82-85 in content/docs/administration/self-hosting/install/_index.md "- Docker Compose quickstart" → ✅ verified (evidence: The linked page exists in the repo at content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md (confirmed via GitHub contents API), which Hugo renders at the URL…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options)
  • L65-72 in content/docs/administration/self-hosting/operations/database.md "Self-hosted installers' default database instance types differ by underlying installer/platform: AWS EKS, AWS ECS, Azure AKS, and GCP GKE each have distinct…" → 🤷 unverifiable (evidence: (escalated from pass3) verification did not converge within 12 turns (turn-cap exhausted — a verification budget failure, retryable; not evidence that the claim is wrong or that no source exists))
  • L70 in content/docs/administration/self-hosting/operations/database.md "For AWS ECS installations, the dbInstanceType should be raised before running production workloads." → 🤷 unverifiable (framing: Source gives generic cross-provider production sizing guidance (RAM, instance class families); claim asserts a specific named config parameter…; evidence: (escalated from pass1) The live database.md page confirms generic production sizing guidance: "For production workloads, start with a memory-optimized instance with at least 16 GB RAM (db.r5.large, db.r6g.large, General Purpose D4s_v3…; source: https://www.pulumi.com/docs/administration/self-hosting/operations/database/ (WebSearch dispatched but verification did not converge within the turn budget))
  • L71 in content/docs/administration/self-hosting/operations/database.md "| Azure AKS | General Purpose D2ads_v5 or equivalent | 2 vCPU / 8 GB RAM |" → ✅ verified (evidence: Independent Azure VM spec sources confirm: "Azure Virtual Machine: D2ads_v5 / D2ads v5 with 2 vCPUs and 8 GiB of memory," matching the claimed 2 vCPU / 8 GB RAM spec exactly.; source: https://cloudprice.net/vm/Standard_D2ads_v5)
  • L72 in content/docs/administration/self-hosting/operations/database.md "| GCP GKE | db-g1-small (1.7 GB RAM) | Minimal; upgrade for production use |" → ✅ verified (evidence: Google Cloud's own documentation confirms db-g1-small has 1.7 GB RAM: "db-g1-small · 1.7(1825361101) 1.11 · 0.625(671088640)". Google also states these shared-core machine types "are designed to provide low-cost test and development…; source: https://cloud.google.com/mysql/memory-troubleshooting; https://docs.cloud.google.com/sql/docs/mysql/instance-settings)
  • L74 in content/docs/administration/self-hosting/operations/database.md "Burstable instances (db.t3.*) are acceptable for development and light workloads but may throttle under sustained load." → ✅ verified (evidence: The doc's own table already flags db.t3.small as "Burstable; raise dbInstanceType before running production workloads," and AWS T3 instances are documented by AWS as CPU-credit-based burstable instances that throttle once credits are…; source: content/docs/administration/self-hosting/operations/database.md (surrounding table, L70) + general AWS RDS T3 burstable-performance behavior)
  • L74 in content/docs/administration/self-hosting/operations/database.md "For production workloads, one should start with a memory-optimized instance with at least 16 GB RAM (db.r5.large, db.r6g.large, General Purpose D4s_v3, or…" → ✅ verified (evidence: Confirmed db.r5.large is "2 vCPU, 16 GB RAM" and Azure Standard_D4s_v3 "with 4 vCPUs and 16 GiB of memory" — both matching the claim's "at least 16 GB RAM" baseline for the listed memory-optimized/general-purpose instance types…; source: https://aiven.io/tools/instances/db.r5.large ; https://cloudprice.net/vm/Standard_D4s_v3)
  • L19 in content/docs/administration/self-hosting/operations/monitoring.md "The API service exposes Prometheus metrics and supports OpenTelemetry for tracing. See Telemetry…" → ✅ verified (evidence: The Telemetry page at /docs/administration/self-hosting/operations/telemetry/ confirms: "The API service is configured to export OpenTelemetry metrics and traces to the vendor of your choice via the OpenTelemetry collector" and describes…; source: content/docs/administration/self-hosting/operations/telemetry.md)
  • L3 in content/docs/administration/self-hosting/operations/telemetry.md "Metrics and traces exported from a self-hosted Pulumi Cloud installation can be scraped or remote-written into Prometheus." → 🌀 framing-drift (framing: Source: "two options to get metrics into Prometheus" (scrape/remote-write) — metrics only; claim states "Metrics and traces ... can be scraped or…; evidence: The page's own body describes "two options to get metrics into Prometheus" (remote-write or scrape), but traces are exported via OpenTelemetry "to the vendor of your choice" and in the example configs traces go to a logging/debug…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L18 in content/docs/administration/self-hosting/operations/telemetry.md "The Monitoring page at /docs/administration/self-hosting/operations/monitoring/ describes what to alert on once metrics and traces are flowing." → ✅ verified (evidence: telemetry.md L18-19 reads: "Getting metrics and traces out of a self-hosted installation. For what to alert on once they are flowing, see Monitoring." The monitoring.md page at…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md and repo:content/docs/administration/self-hosting/operations/monitoring.md)
  • L22 in content/docs/administration/self-hosting/operations/telemetry.md "The self-hosted Pulumi Cloud API service is configured to export OpenTelemetry metrics and traces to the vendor of your choice via an OpenTelemetry collector." → ✅ verified (evidence: The doc states verbatim: "The API service is configured to export OpenTelemetry metrics and traces to the vendor of your choice via the OpenTelemetry collector," and the rest of the page details the OTEL_EXPORTER_OTLP_ENDPOINT/PROTOCOL…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L22 in content/docs/administration/self-hosting/operations/telemetry.md "Users must manage their own OpenTelemetry collector." → ➖ not-a-claim (evidence: The doc states verbatim: "The API service is configured to export OpenTelemetry metrics and traces to the vendor of your choice via the OpenTelemetry collector. You will need to manage your own OpenTelemetry collector." This is the PR…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L28-31 in content/docs/administration/self-hosting/operations/telemetry.md "The PULUMI_ENABLE_DEPRECATED_METRICS environment variable is optional and controls whether the API service continues emitting API service metrics in a…" → 🤷 unverifiable (evidence: The doc table states "PULUMI_ENABLE_DEPRECATED_METRICS | (Optional) Whether to continue emitting API service metrics in a log-based format. Defaults to true." This describes internal, closed-source Pulumi Cloud API service behavior…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md (reviewed file); gh search code --owner pulumi PULUMI_ENABLE_DEPRECATED_METRICS returned no results)
  • L28 in content/docs/administration/self-hosting/operations/telemetry.md "OTEL_EXPORTER_OTLP_ENDPOINT sets the base URL to which all telemetry will be sent." → ✅ verified (evidence: The doc's own table states: "OTEL_EXPORTER_OTLP_ENDPOINT | (Required) Used to configure the OTLP exporter. The base URL to which all telemetry will be sent." This matches the standard OpenTelemetry spec definition of this variable, which…; source: content/docs/administration/self-hosting/operations/telemetry.md:28)

  • 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

Copy link
Copy Markdown
Contributor
continued from previous comment
  • L28 in content/docs/administration/self-hosting/operations/telemetry.md "If OTEL_EXPORTER_OTLP_ENDPOINT is not set, the API service will use no-op metrics and traces." → 🤷 unverifiable (evidence: (escalated from pass1) Pulumi's docs confirm The API also supports exporting OpenTelemetry metrics and traces via the OpenTelemetry collector. but no public source specifies the exact fallback behavior (no-op…; source: WebSearch ran query "Pulumi self-hosted OTEL_EXPORTER_OTLP_ENDPOINT no-op metrics traces"; top results didn't address the specific fallback behavior claim)
  • L29 in content/docs/administration/self-hosting/operations/telemetry.md "OTEL_EXPORTER_OTLP_PROTOCOL accepts only the values http or grpc." → ❌ contradicted (evidence: (escalated from pass1) The OpenTelemetry specification states: "Options MUST be one of: grpc, http/protobuf, http/json" for OTEL_EXPORTER_OTLP_PROTOCOL — not merely "http" or "grpc" as the claim states. The valid literal values are grpc…; source: https://opentelemetry.io/docs/specs/otel/protocol/exporter/; intuition: Claim's "http" value doesn't match the actual spec values "http/protobuf" or "http/json" — likely a…)
  • L30 in content/docs/administration/self-hosting/operations/telemetry.md "PULUMI_ENABLE_DEPRECATED_METRICS controls whether to continue emitting API service metrics in a log-based format." → 🤷 unverifiable (evidence: (escalated from pass1) This claim describes internal behavior of a Pulumi self-hosted service environment variable (PULUMI_ENABLE_DEPRECATED_METRICS), which is not documented on public web sources and requires checking Pulumi's…; source: WebSearch ran query "PULUMI_ENABLE_DEPRECATED_METRICS"; top results didn't address the claim)
  • L30 in content/docs/administration/self-hosting/operations/telemetry.md "PULUMI_ENABLE_DEPRECATED_METRICS defaults to true." → 🤷 unverifiable (evidence: (escalated from pass1) Web search returned no results discussing PULUMI_ENABLE_DEPRECATED_METRICS or its default value; this is an internal self-hosted Pulumi Service environment variable whose default behavior is defined in Pulumi's…; source: WebSearch ran query "PULUMI_ENABLE_DEPRECATED_METRICS"; top results didn't address the claim)
  • L31 in content/docs/administration/self-hosting/operations/telemetry.md "Authenticating to the /metrics endpoint requires setting the Authorization header as Authorization: webhook-token <METRICS_WEBHOOK_SECRET>." → ✅ verified (evidence: The doc itself states: "METRICS_WEBHOOK_SECRET | Required to successfully authenticate to the /metrics endpoint. The Authorization header should be set as follows: Authorization: webhook-token <METRICS_WEBHOOK_SECRET>." and again in…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L33 in content/docs/administration/self-hosting/operations/telemetry.md "The console service documentation is located at /docs/administration/self-hosting/components/console/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/components/console.md exists with title "Pulumi console" and menu identifier administration-self-hosting-components-console, parent administration-self-hosting-components — confirming the…; source: repo:content/docs/administration/self-hosting/components/console.md)
  • L37 in content/docs/administration/self-hosting/operations/telemetry.md "The self-hosted Pulumi Cloud API service exposes a metrics endpoint at https://api.pulumi.com/metrics that is secured by a bearer token." → ➖ not-a-claim (evidence: The doc text itself states "The API service exposes a metrics endpoint (https://api.pulumi.com/metrics) that is secured by a bearer token" — this is the reviewed file's own description of its own self-hosted product's endpoint/auth…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L40 in content/docs/administration/self-hosting/operations/telemetry.md "The token type used to authenticate to the metrics endpoint is webhook-token, not Bearer." → ✅ verified (evidence: The doc consistently specifies the auth scheme as webhook-token in multiple places: line 31 "Authorization: webhook-token <METRICS_WEBHOOK_SECRET>", line 44 curl example uses webhook-token, and the Prometheus scrape config at line…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L44 in content/docs/administration/self-hosting/operations/telemetry.md "The metrics endpoint can be queried with curl -s GET https://api.pulumi.com/metrics -H 'Authorization: webhook-token <METRICS_WEBHOOK_SECRET>'." → ➖ not-a-claim (evidence: This is a usage example within Pulumi's own self-hosting documentation, describing how to query the metrics endpoint of a self-hosted Pulumi Cloud installation (using api.pulumi.com as the example/placeholder hostname consistent with the…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L49-52 in content/docs/administration/self-hosting/operations/telemetry.md "The self-hosted Pulumi Cloud API service provides two options to get metrics into Prometheus: a push-based Prometheus remote write exporter from the…" → ➖ not-a-claim (evidence: The claim verbatim restates the doc's own text: "The API service provides two options to get metrics into Prometheus: 1. From the OpenTelemetry collector via a Prometheus remote write exporter... 2. From a Prometheus exporter by scraping…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L56 in content/docs/administration/self-hosting/operations/telemetry.md "The Prometheus remote write exporter option does not use the /metrics endpoint, and instead exports metrics from the collector to a Prometheus remote write…" → ✅ verified (evidence: The official README states: "Prometheus Remote Write Exporter sends OpenTelemetry metrics to Prometheus remote write compatible backends such as Cortex, Mimir, and Thanos." This describes a push-based export to a remote write HTTP…; source: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/prometheusremotewriteexporter/README.md)
  • L58 in content/docs/administration/self-hosting/operations/telemetry.md "The example OpenTelemetry collector configuration for the Prometheus remote write exporter is intended for a service using AWS and the AWS Distro for…" → ➖ not-a-claim (evidence: Line 58 of the doc reads verbatim: "Example OpenTelemetry collector configuration for a service using AWS and the AWS Distro for OpenTelemetry Collector:" — the claim is just a paraphrase of the doc's own section heading/description, not…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L61-99 in content/docs/administration/self-hosting/operations/telemetry.md "An example OpenTelemetry collector configuration for a service using AWS and the AWS Distro for OpenTelemetry Collector uses a sigv4auth extension, an OTLP…" → ✅ verified (framing: The claim describes Pulumi's own illustrative example config (using the same placeholder domain AWS itself uses in its docs), so it's a faithful description…; evidence: AWS's own ADOT documentation shows this exact pattern as a placeholder example: "extensions: sigv4auth: service: "aps" region: "user-region" exporters: prometheusremotewrite: endpoint…; source: https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-ingest-metrics-OpenTelemetry.html)
  • L103 in content/docs/administration/self-hosting/operations/telemetry.md "The Prometheus exporter option requires configuring the environment variable METRICS_WEBHOOK_SECRET to successfully authenticate to the /metrics endpoint." → ✅ verified (evidence: Line 103 of the file itself states: "This option requires configuring the environment variable METRICS_WEBHOOK_SECRET to successfully authenticate to the [/metrics endpoint]," and this is consistent with the earlier table entry (line…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L108-151 in content/docs/administration/self-hosting/operations/telemetry.md "An example OpenTelemetry collector configuration for the Prometheus exporter option uses a bearertokenauth extension with scheme webhook-token and token…" → ➖ not-a-claim (evidence: The claim is a line-by-line restatement of the example YAML config block in the file itself (lines 108-151): bearertokenauth extension with scheme webhook-token and token ${env:METRICS_WEBHOOK_SECRET}, otlp receiver on localhost:4317…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L153 in content/docs/administration/self-hosting/operations/telemetry.md "The bearer token (METRICS_WEBHOOK_SECRET) also needs to be included in the Prometheus server configuration." → ➖ not-a-claim (evidence: Line 153 itself states: "The bearer token also needs to be included in the Prometheus server configuration:" followed immediately by a scrape_configs example using credentials: <METRICS_WEBHOOK_SECRET> — this is the doc describing its…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L156-165 in content/docs/administration/self-hosting/operations/telemetry.md "An example Prometheus server scrape configuration for job pulumi uses a 15s scrape interval, authorization type webhook-token with credentials set to the…" → ➖ not-a-claim (evidence: Lines 156-165 are a YAML code example in the doc itself: job_name: pulumi, scrape_interval: 15s, authorization: type: webhook-token, credentials: <METRICS_WEBHOOK_SECRET>, scheme: https, targets: [\"api.pulumi.com\"] — this…; source: repo:content/docs/administration/self-hosting/operations/telemetry.md)
  • L17 in content/docs/administration/self-hosting/system-requirements.md "The bring-your-own-infrastructure and Docker Engine self-hosting deployment options require the user to supply their own compute, database, object store, and…" → ✅ verified (framing: Source pages detail compute/DB/object-store requirements explicitly; DNS/TLS is a system-wide requirement stated in the same parent doc, so the combined…; evidence: The byo-infra-hosted.md page states the installer "is used to deploy the self-hosted Pulumi Cloud on your own K8s, MySQL and S3-compatible infrastructure," and local-docker.md states "The customer is required to provide and manage the…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md and local-docker.md)
  • L23 in content/docs/administration/self-hosting/system-requirements.md "The PULUMI_LICENSE_KEY is a JWT issued by Pulumi." → ✅ verified (evidence: Sibling docs page content/docs/administration/self-hosting/components/api.md independently states: "PULUMI_LICENSE_KEY | The license key value. A JWT string." — consistent with the claim that PULUMI_LICENSE_KEY is a JWT issued by Pulumi.; source: repo:content/docs/administration/self-hosting/components/api.md)
  • L23-24 in content/docs/administration/self-hosting/system-requirements.md "The self-hosted Pulumi Cloud service will not start without the PULUMI_LICENSE_KEY." → 🤷 unverifiable (evidence: (escalated from pass1) Public docs confirm self-hosted Pulumi Cloud requires a license key to use/evaluate (e.g. "Ensure you have access to Pulumi Self-Hosted which requires a license key"), but no public source confirms the specific…; source: WebSearch ran query "Pulumi self-hosted PULUMI_LICENSE_KEY required service will not start"; top results confirm licensing requirement generally but not the specific startup-failure behavior)
  • L24 in content/docs/administration/self-hosting/system-requirements.md "The AG_GRID_LICENSE_KEY is required and must be set on the console container." → ⚔️ mismatch (evidence: The sibling page content/docs/administration/self-hosting/components/console.md lists AG_GRID_LICENSE_KEY under "Optional Environment Variables" ("not required in all usage scenarios... If needed, this will be provided by a Pulumi…; source: repo:content/docs/administration/self-hosting/components/console.md (line 142-148) vs repo:content/docs/administration/self-hosting/system-requirements.md (line 24))
  • L26 in content/docs/administration/self-hosting/system-requirements.md "Users receive both the PULUMI_LICENSE_KEY and AG_GRID_LICENSE_KEY as part of a self-hosted proof of concept." → 🌀 framing-drift (framing: source: "get you the installer package and an evaluation license key" (singular, generic) vs claim: "receive both the PULUMI_LICENSE_KEY and…; evidence: The cited section (#self-hosted-trial on /product/self-hosted/) says a PoC gets you "the installer package and an evaluation license key" (singular, unspecified), not explicitly both PULUMI_LICENSE_KEY and AG_GRID_LICENSE_KEY as named in…; source: content/product/self-hosted.md (hubspot_form section, anchor: self-hosted-trial))
  • L30 in content/docs/administration/self-hosting/system-requirements.md "A self-hosted Pulumi Cloud installation consists of three containers: the API, the console, and a migrations job." → ✅ verified (evidence: The source doc states: "Three containers make up an installation: the API, the console, and a migrations job that runs once per…; source: repo:content/docs/administration/self-hosting/system-requirements.md (L30) and repo:content/docs/administration/self-hosting/components/api.md)
  • L32-36 in content/docs/administration/self-hosting/system-requirements.md "The migrations service requires 128m CPU and 128 MB of memory." → 🤝 matches (evidence: (escalated from pass3) The sibling page content/docs/administration/self-hosting/operations/compute-sizing.md independently lists: "| Migrations | 128m | 128 Mi | Runs once per upgrade before service rollout |", matching the claimed 128m…; source: content/docs/administration/self-hosting/operations/compute-sizing.md)
  • L35 in content/docs/administration/self-hosting/system-requirements.md "| Console | 0.5 vCPU | 512 MB |" → 🤷 unverifiable (evidence: Search results confirm Pulumi self-hosted Cloud consists of API, Console, and Migrations containers with a "Minimum System Requirements" section referenced on component pages, but no indexed source exposes the specific numeric table (0.5…; source: WebSearch ran query "Pulumi self-hosting system requirements API Console Migrations vCPU memory minimum"; top results referenced the requirements section but did not show the specific table values)
  • L36 in content/docs/administration/self-hosting/system-requirements.md "The migrations job requires 128m CPU." → 🤝 matches (evidence: (escalated from pass3) The sibling page content/docs/administration/self-hosting/operations/compute-sizing.md lists the identical value: "| Migrations | 128m | 128 Mi | Runs once per upgrade before service rollout |", confirming the…; source: repo:content/docs/administration/self-hosting/operations/compute-sizing.md)
  • L38 in content/docs/administration/self-hosting/system-requirements.md "A single-host evaluation of a self-hosted Pulumi Cloud installation needs at least 2 CPU cores and 8 GB of memory." → 🤷 unverifiable (evidence: The claim restates the same file's own compute table conclusion ("A single-host evaluation needs at least 2 CPU cores and 8 GB of memory"). This is the document's own prescriptive sizing guidance, not attributed to an external or…; source: repo:content/docs/administration/self-hosting/system-requirements.md and repo:content/docs/administration/self-hosting/operations/compute-sizing.md; intuition: Stated 8GB minimum is nearly double the sum of the three containers' listed memory requirements…)
  • L40 in content/docs/administration/self-hosting/system-requirements.md "For production sizing, high availability, and per-installer configuration, see Compute sizing." → ✅ verified (evidence: The linked page content/docs/administration/self-hosting/operations/compute-sizing.md exists at the exact target path and contains sections "Recommended container resources," "Minimum infrastructure requirements," and "Production (high…; source: repo:content/docs/administration/self-hosting/operations/compute-sizing.md)
  • L46 in content/docs/administration/self-hosting/system-requirements.md "The required database engine for a self-hosted Pulumi Cloud installation is MySQL 8.0.x." → 🤝 matches (evidence: Sibling page content/docs/administration/self-hosting/operations/database.md states "Pulumi Cloud uses MySQL 8.0 for metadata, stack state references, and user/organization data" and repeatedly references "MySQL 8.0" as the required…; source: content/docs/administration/self-hosting/operations/database.md)
  • L47-48 in content/docs/administration/self-hosting/system-requirements.md "The database sql_mode for self-hosted Pulumi Cloud must include STRICT_TRANS_TABLES." → 🤝 matches (evidence: The sibling operations/database.md page states explicitly: "The server's sql_mode must include STRICT_TRANS_TABLES... Stock MySQL 8.0 enables STRICT_TRANS_TABLES by default, but some managed and custom configurations do not …; source: repo:content/docs/administration/self-hosting/operations/database.md)
  • L48 in content/docs/administration/self-hosting/system-requirements.md "The database's sql_mode must include STRICT_TRANS_TABLES." → 🤝 matches (evidence: The sibling operations page states: "The server's sql_mode must include STRICT_TRANS_TABLES. Without it, migrations fail with: ALGORITHM=INPLACE is not supported..." — this directly corroborates the system-requirements table entry.; source: content/docs/administration/self-hosting/operations/database.md (Required sql_mode settings section))
  • L52-58 in content/docs/administration/self-hosting/system-requirements.md "The application user for self-hosted Pulumi Cloud's database must be granted ALL PRIVILEGES on the pulumi database and the CREATE USER privilege globally…" → 🤷 unverifiable (evidence: The claim exactly restates the SQL shown in the reviewed file itself (GRANT ALL PRIVILEGES ON \pulumi`.* TO 'pulumi'@'%';andGRANT CREATE USER ON . TO 'pulumi'@'%' WITH GRANT OPTION;`), which is circular — the file cannot verify…; source: content/docs/administration/self-hosting/system-requirements.md (lines 52-58))
  • L60 in content/docs/administration/self-hosting/system-requirements.md "Inbound ICMP (ping) must be enabled on the MySQL server for self-hosted Pulumi Cloud because the installer's connectivity check depends on it." → 🤷 unverifiable (evidence: (escalated from pass1) No public Pulumi documentation found mentions ICMP/ping requirements for the MySQL server or an installer connectivity check that depends on ICMP. This is a specific claim about Pulumi's self-hosted installer…; source: WebSearch ran query "Pulumi self-hosted system requirements MySQL ICMP ping"; top results didn't address the claim; intuition: Suspiciously specific technical claim (ICMP dependency in an installer connectivity check) with no corroborating…)
  • L63 in content/docs/administration/self-hosting/system-requirements.md "Without STRICT_TRANS_TABLES set, schema migrations in self-hosted Pulumi Cloud fail with the error 'ALGORITHM=INPLACE is not supported. Try ALGORITHM=COPY'." → ✅ verified (framing: Claim quotes an abbreviated form of the full error message documented at the source ("Reason: cannot silently convert NULL values, as required in this…; evidence: The linked page (operations/database.md, "Required sql_mode settings" section) states: "The server's sql_mode must include STRICT_TRANS_TABLES. Without it, migrations fail with: ALGORITHM=INPLACE is not supported. Reason: cannot silently…; source: repo:content/docs/administration/self-hosting/operations/database.md)
  • L70 in content/docs/administration/self-hosting/system-requirements.md "Supported object storage types for a self-hosted Pulumi Cloud installation are S3-compatible storage, Azure Blob Storage, or Google Cloud Storage." → ✅ verified (evidence: The system-requirements.md table itself states: "Type | S3-compatible, Azure Blob Storage, or Google Cloud Storage" and the sibling object-storage.md operations page corroborates the same three storage types ("Use your cloud provider's…; source: repo:content/docs/administration/self-hosting/system-requirements.md (L70) and repo:content/docs/administration/self-hosting/operations/object-storage.md)
  • L71 in content/docs/administration/self-hosting/system-requirements.md "Self-hosted Pulumi Cloud requires a minimum of 200 GB SSD storage for object storage." → 🤷 unverifiable (evidence: The doc's own table states "Storage | 200 GB SSD minimum" under Object storage, consistent internally with the page's Database section (20 GB SSD minimum). No independent Pulumi source (release notes, installer repo, or other docs page)…; source: content/docs/administration/self-hosting/system-requirements.md L66-71)
  • L73 in content/docs/administration/self-hosting/system-requirements.md "A self-hosted Pulumi Cloud installation uses separate object storage buckets for checkpoints, policy packs, engine events, and service metadata." → ✅ verified (framing: Source clarifies bucket creation depends on installer ("The exact set depends on your installer and which features are enabled"), while claim states it…; evidence: The object-storage page lists exactly these bucket categories: "Checkpoints... Policy packs... Service metadata / ESC... Engine events" and states "Pulumi Cloud uses multiple storage buckets" for these purposes, matching the claim's four…; source: content/docs/administration/self-hosting/operations/object-storage.md)
  • L77 in content/docs/administration/self-hosting/system-requirements.md "When using a non-AWS S3-compatible object store with self-hosted Pulumi Cloud, users must pass endpoint=IP:PORT and s3ForcePathStyle=true as query…" → ✅ verified (framing: The sibling page generically references "GoCloud docs" query-params without naming them; the claim states the specific two (endpoint, s3ForcePathStyle)…; evidence: Sibling page content/docs/administration/self-hosting/components/api.md states the checkpoint/policy-pack/etc. blob storage endpoints use s3://<bucket-name> and that "The s3:// scheme also supports query-params. See the GoCloud docs…; source: repo:content/docs/administration/self-hosting/components/api.md (PULUMI_CHECKPOINT_BLOB_STORAGE_ENDPOINT row))
  • L78 in content/docs/administration/self-hosting/system-requirements.md "The object store and any proxy or ingress in front of it must preserve the Content-Encoding: gzip header on responses, or self-hosted Pulumi Cloud will…" → ✅ verified (evidence: (escalated from pass1) Pulumi's self-hosting API docs state: "Your S3-compatible object storage provider and any intermediary (such as a reverse proxy or ingress controller) must correctly preserve the Content-Encoding: gzip header on…; source: https://www.pulumi.com/docs/administration/self-hosting/components/api/)
  • L84-85 in content/docs/administration/self-hosting/system-requirements.md "Self-hosted Pulumi Cloud's search feature has been tested against OpenSearch versions 2.9 and 2.11." → 🤝 matches (evidence: Sibling page content/docs/administration/self-hosting/components/search.md independently states: "Pulumi Cloud has been tested with OpenSearch v2.9 and v2.11," matching the system-requirements.md table entry "Tested versions | 2.9 and…; source: repo:content/docs/administration/self-hosting/components/search.md)
  • L87 in content/docs/administration/self-hosting/system-requirements.md "Resource search in self-hosted Pulumi Cloud is not in the critical path: if the OpenSearch cluster is unreachable, stack updates still work and the console…" → ✅ verified (evidence: The cited page content/docs/administration/self-hosting/components/search.md states: "If the OpenSearch cluster is not reachable, then the Pulumi Console will display an error message on the Resources page indicating that the search…; source: content/docs/administration/self-hosting/components/search.md)
  • L91 in content/docs/administration/self-hosting/system-requirements.md "Each self-hosted Pulumi Cloud installer pins the specific Kubernetes version it was validated against." → ✅ verified (evidence: The EKS-hosted installer sibling page has a "Supported Kubernetes versions" table mapping each installer version to a specific Kubernetes version validated against it (e.g., "3.1 | February 2025 | 1.31.0", "3.0 | December 2024 |…; source: repo:content/docs/administration/self-hosting/deployment-options/eks-hosted.md (Supported Kubernetes versions table))
  • L91 in content/docs/administration/self-hosting/system-requirements.md "The EKS, AKS, GKE, and bring-your-own-infrastructure self-hosting deployment options require a conformant Kubernetes cluster." → ➖ not-a-claim (evidence: The claim is a verbatim paraphrase of the file's own line 91: "The EKS, AKS, GKE, and bring-your-own-infrastructure options need a conformant Kubernetes cluster... The ECS, Docker Compose, and Docker Engine options need no Kubernetes."…; source: repo:content/docs/administration/self-hosting/system-requirements.md)
  • L95-98 in content/docs/administration/self-hosting/system-requirements.md "Every self-hosted Pulumi Cloud installation serves two endpoints from a user-controlled domain: api.<your-domain> for the API and app.<your-domain> for…" → ✅ verified (evidence: Source doc states: "Every installation serves two endpoints from a domain you control: api.<your-domain> — the API, which the CLI and console call. app.<your-domain> — the console." This directly matches the claim.; source: repo:content/docs/administration/self-hosting/system-requirements.md (lines 95-98))
  • L97 in content/docs/administration/self-hosting/system-requirements.md "The api.<your-domain> endpoint is called by the CLI and console." → ➖ not-a-claim (evidence: The doc itself states: "api.<your-domain> — the API, which the CLI and console call." The extracted claim is a verbatim paraphrase of this same line from the file under review, not an independently checkable third-party assertion.; source: repo:content/docs/administration/self-hosting/system-requirements.md#L97)
  • L100 in content/docs/administration/self-hosting/system-requirements.md "The managed-platform self-hosting installers can request TLS certificates automatically, while other installers require the user to supply them." → ✅ verified (evidence: Sibling deployment page for EKS-hosted lists "ACM - Managed Public TLS certificates" as part of the managed-platform installer's provisioned services, confirming automatic TLS request, while BYO-infra and local-docker pages have no such…; source: content/docs/administration/self-hosting/deployment-options/eks-hosted.md; content/docs/administration/self-hosting/system-requirements.md)
  • L100 in content/docs/administration/self-hosting/system-requirements.md "Each of the two endpoints (api.<your-domain> and app.<your-domain>) needs a TLS certificate." → ➖ not-a-claim (evidence: The line under review directly restates the same doc's preceding lines: "Every installation serves two endpoints from a domain you control: api.<your-domain>... app.<your-domain>... Each needs a TLS certificate." This is the author's…; source: repo:content/docs/administration/self-hosting/system-requirements.md)
  • L100 in content/docs/administration/self-hosting/system-requirements.md "Non-managed-platform installation options expect the user to supply their own TLS certificates." → ✅ verified (evidence: The BYO-infra installer README (pulumi/pulumi-self-hosted-installers) lists as a prerequisite: "TLS certificates for each domain endpoint... See Creating and Using Self-Signed Certificates below if you wish to use self-signed…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/byo-infra/README.md)
  • L104 in content/docs/administration/self-hosting/system-requirements.md "A self-hosted Pulumi Cloud installation requires ingress on port 443 (and port 80 redirecting to it) from CLI users and browsers." → ✅ verified (evidence: The Network Requirements page states under Ingress > Source - CLI/end user: "443: Access to the self-hosted Pulumi Cloud application (HTTPS)" and "80: Redirect to port 443 (HTTP to HTTPS)", matching the claim's description of ingress…; source: repo:content/docs/administration/self-hosting/network.md)
  • L104 in content/docs/administration/self-hosting/system-requirements.md "SMTP on port 25, 465, or 587 is optional and only needed for invitations and password resets." → 🤝 matches (evidence: The sibling Network requirements page lists the same ports as optional SMTP egress: "25: SMTP for outgoing email (if used)", "465: SMTP over TLS for outgoing email (if used)", "587: SMTP over TLS for outgoing email (if used)" …; source: repo:content/docs/administration/self-hosting/network.md)
  • L106 in content/docs/administration/self-hosting/system-requirements.md "See Network requirements for the full list." → ✅ verified (evidence: The target page content/docs/administration/self-hosting/network.md exists, has an alias /docs/administration/self-hosting/network/, and contains a full ingress/egress network requirements list (ports 443, 80, 8080, 3306, SMTP ports…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/network.md)
  • L19-25 in content/docs/administration/self-hosting/troubleshooting.md "When the migrations container exits, an error containing 'ALGORITHM=INPLACE is not supported. Try ALGORITHM=COPY' indicates the database's sql_mode does not…" → 🤝 matches (evidence: Sibling page operations/database.md states: "Pulumi Cloud database migrations include a schema change that MySQL can only apply with ALGORITHM=INPLACE when strict mode is active... The server's sql_mode must include STRICT_TRANS_TABLES.…; source: repo:content/docs/administration/self-hosting/operations/database.md)
  • L21 in content/docs/administration/self-hosting/troubleshooting.md "The migrations container exits with an error containing the literal text ALGORITHM=INPLACE is not supported. Try ALGORITHM=COPY when this migration failure…" → ➖ not-a-claim (evidence: The claim restates the doc's own troubleshooting entry ("The migrations container exits with an error containing ALGORITHM=INPLACE is not supported. Try ALGORITHM=COPY"), which is the PR author's own documented symptom description…; source: repo:content/docs/administration/self-hosting/troubleshooting.md)
  • L23 in content/docs/administration/self-hosting/troubleshooting.md "The migration failure with ALGORITHM=INPLACE is not supported is caused by the database's sql_mode not including STRICT_TRANS_TABLES." → 🤝 matches (evidence: Sibling page content/docs/administration/self-hosting/operations/database.md states: "The server's sql_mode must include STRICT_TRANS_TABLES. Without it, migrations fail with: ALGORITHM=INPLACE is not supported... Stock MySQL 8.0…; source: content/docs/administration/self-hosting/operations/database.md)
  • L23 in content/docs/administration/self-hosting/troubleshooting.md "Aurora MySQL 8.0 does not set STRICT_TRANS_TABLES in sql_mode by default." → ✅ verified (evidence: AWS re:Post confirms: "Strict mode is OFF by default on RDS MySQL 8, we have sql_mode=NO_ENGINE_SUBSTITUTION only." A Skeema deep-dive on Aurora v3 (MySQL 8) similarly found its default sql_mode is an empty string and noted "all versions…; source: https://repost.aws/questions/QUZg91IPXvT_yGxfWqiI6DWA/is-it-possible-to-turn-off-strict-sql-mode-in-rds-for-mysql-v8-0; https://www.skeema.io/blog/2022/01/27/exploring-aurora-v3/)
  • L25 in content/docs/administration/self-hosting/troubleshooting.md "Setting STRICT_TRANS_TABLES in the parameter group or server configuration and restarting, then re-running migrations, fixes the `ALGORITHM=INPLACE is not…" → ✅ verified (evidence: The linked section states: "The server's sql_mode must include STRICT_TRANS_TABLES... configure sql_mode for your platform... then apply and reboot" / "Set sql-mode in my.cnf... and restart," matching the troubleshooting page's fix of…; source: repo:content/docs/administration/self-hosting/operations/database.md#required-sql_mode-settings)
  • L29 in content/docs/administration/self-hosting/troubleshooting.md "When PULUMI_LICENSE_KEY is unset, run-ee.sh prints a message about contacting sales and exits before any container starts." → 🤷 unverifiable (evidence: (escalated from pass1) This claim describes specific internal error-handling behavior of the run-ee.sh self-hosting installer script (message content and exit timing when PULUMI_LICENSE_KEY is unset). Web search only surfaced general…; source: WebSearch ran query "Pulumi run-ee.sh PULUMI_LICENSE_KEY"; top results didn't address the claim)
  • L31 in content/docs/administration/self-hosting/troubleshooting.md "The run-ee.sh script hard-fails when PULUMI_LICENSE_KEY is unset rather than starting a service that cannot run." → 🤷 unverifiable (evidence: (escalated from pass1) Web search surfaced general self-hosting docs referencing run-ee.sh but none exposed the actual script source or its license-key validation logic; this is an internal behavior of a private deployment script not…; source: WebSearch ran query "pulumi run-ee.sh PULUMI_LICENSE_KEY hard-fail"; top results didn't address the claim)
  • L33 in content/docs/administration/self-hosting/troubleshooting.md "There is a Docker Compose quickstart guide at /docs/administration/self-hosting/deployment-options/quickstart-docker-compose/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md exists and renders at /docs/administration/self-hosting/deployment-options/quickstart-docker-compose/, titled "Try Self-Hosted Pulumi Cloud…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L35 in content/docs/administration/self-hosting/troubleshooting.md "## Stack state or policy packs download garbled" → ➖ not-a-claim (evidence: This is a markdown section heading ("## Stack state or policy packs download garbled") from a troubleshooting doc, not a falsifiable factual assertion attributed to a third party—it's simply the author's own document structure/heading text.; source: content/docs/administration/self-hosting/troubleshooting.md L35)
  • L37 in content/docs/administration/self-hosting/troubleshooting.md "When state or policy packs download garbled against an S3-compatible object store, the CLI reports corrupt or unreadable state, or policy packs fail to load." → ✅ verified (framing: Source describes the root cause (missing Content-Encoding header → garbled content) and that both state and policy packs use the same object storage; claim's…; evidence: (escalated from pass1) Pulumi's self-hosting docs explicitly state: "Your S3-compatible object storage provider and any intermediary (such as a reverse proxy or ingress controller) must correctly preserve the Content-Encoding: gzip…; source: https://www.pulumi.com/docs/administration/self-hosting/components/api/)
  • L39 in content/docs/administration/self-hosting/troubleshooting.md "The Pulumi Cloud API stores objects gzip-compressed." → ✅ verified (evidence: (escalated from pass1) Pulumi's self-hosting API docs state: "S3-compatible storage providers: The Pulumi API service stores objects using gzip compression." This directly matches the claim that the Pulumi Cloud API stores objects…; source: https://www.pulumi.com/docs/administration/self-hosting/components/api/)
  • L39 in content/docs/administration/self-hosting/troubleshooting.md "Garbled state/policy pack downloads are caused by something between the object store and the client stripping the Content-Encoding: gzip response header." → ✅ verified (evidence: (escalated from pass1) Pulumi's self-hosted API docs state: "S3-compatible storage providers: The Pulumi API service stores objects using gzip compression... Your S3-compatible object storage provider and any intermediary (such as a…; source: https://www.pulumi.com/docs/administration/self-hosting/components/api/)
  • L41 in content/docs/administration/self-hosting/troubleshooting.md "Configuring the object store and every intermediary to preserve the Content-Encoding: gzip header fixes garbled state or policy pack downloads." → 🤷 unverifiable (evidence: The doc states the cause as an intermediary stripping the Content-Encoding: gzip header and prescribes preserving it as the fix; this is internally consistent with the file's own "Cause" statement, but pulumi-service (the self-hosted…; source: repo:content/docs/administration/self-hosting/troubleshooting.md (lines 37-41); gh search issues --owner pulumi "gzip Content-Encoding" returned no results)
  • L45 in content/docs/administration/self-hosting/troubleshooting.md "When connection failures to a bring-your-own MySQL server occur, the installer cannot reach a MySQL server that is otherwise up and accepting connections." → 🤷 unverifiable (evidence: (escalated from pass1) Web search could not locate the specific troubleshooting.md page or line 45 content describing this BYO-MySQL connection failure scenario for the self-hosted installer. Related pages found (e.g., self-hosting…; source: WebSearch ran query "pulumi self-hosting troubleshooting.md MySQL installer cannot reach"; top results didn't address the claim)
  • L47 in content/docs/administration/self-hosting/troubleshooting.md "Connection failures to a bring-your-own MySQL server are caused by inbound ICMP being disabled on the database server." → 🤷 unverifiable (evidence: (escalated from pass1) Web search surfaced Pulumi self-hosting docs on MySQL best practices (TLS, sql_mode, HA) but nothing attributing bring-your-own MySQL connection failures to disabled inbound ICMP. MySQL connectivity relies on TCP…; source: WebSearch ran query "pulumi self-hosted MySQL connection failures ICMP troubleshooting"; top results (pulumi.com self-hosting database/API docs) discuss TLS and sql_mode issues, not ICMP; intuition: MySQL connections use TCP, not ICMP; attributing connection failures to blocked ICMP (used for ping, not the MySQL…)
  • L49 in content/docs/administration/self-hosting/troubleshooting.md "Allowing inbound ICMP from the cluster to the database server fixes connection failures to a bring-your-own MySQL server." → ➖ not-a-claim (evidence: The claim is a direct restatement of the doc's own Cause/Fix entry: "Cause. Inbound ICMP is disabled on the database server. The installer's connectivity check uses it. Fix. Allow inbound ICMP from the cluster to the database server."…; source: repo:content/docs/administration/self-hosting/troubleshooting.md)
  • L53 in content/docs/administration/self-hosting/troubleshooting.md "When S3-compatible object storage is not reachable, the API fails to read or write objects against a non-AWS S3-compatible store." → 🤝 matches (evidence: The sibling System requirements page independently corroborates the same failure mode: "Two requirements catch people out with non-AWS S3-compatible stores: Pass endpoint=IP:PORT and s3ForcePathStyle=true as query parameters on the…; source: repo:content/docs/administration/self-hosting/system-requirements.md)
  • L55 in content/docs/administration/self-hosting/troubleshooting.md "Unreachable non-AWS S3-compatible object storage is caused by the endpoint missing the query parameters the storage client needs to address a non-AWS endpoint." → 🤝 matches (evidence: System requirements page states: "Two requirements catch people out with non-AWS S3-compatible stores: Pass endpoint=IP:PORT and s3ForcePathStyle=true as query parameters on the storage endpoint." This matches the troubleshooting page's…; source: content/docs/administration/self-hosting/system-requirements.md)
  • L57 in content/docs/administration/self-hosting/troubleshooting.md "There is a System requirements page with an object-storage section at /docs/administration/self-hosting/system-requirements/#object-storage." → ✅ verified (evidence: content/docs/administration/self-hosting/system-requirements.md contains a "## Object storage" section (line 66), which renders at the anchor #object-storage on the page /docs/administration/self-hosting/system-requirements/, matching…; source: repo:content/docs/administration/self-hosting/system-requirements.md)
  • L61 in content/docs/administration/self-hosting/troubleshooting.md "When TLS verification fails connecting to MySQL, the API or migrations container fails TLS verification against the database." → ✅ verified (evidence: Sibling docs page operations/database.md confirms both the API service and the migrations container use DATABASE_CA_CERTIFICATE and verify the server's TLS certificate against MySQL, matching the troubleshooting page's claim: "The…; source: content/docs/administration/self-hosting/operations/database.md)
  • L63 in content/docs/administration/self-hosting/troubleshooting.md "TLS verification failures against MySQL are caused by DATABASE_CA_CERTIFICATE being set to a file path rather than the PEM contents, or by the certificate…" → 🤝 matches (evidence: Sibling page operations/database.md states: "DATABASE_CA_CERTIFICATE must contain the full PEM-encoded certificate text ... not a file path. This is a common source of misconfiguration." and "For managed services, the certificate…; source: repo:content/docs/administration/self-hosting/operations/database.md)
  • L65 in content/docs/administration/self-hosting/troubleshooting.md "Setting the DATABASE_CA_CERTIFICATE variable to the PEM value itself and connecting using a hostname the certificate covers fixes TLS verification failures…" → ✅ verified (evidence: The linked section confirms both aspects: "DATABASE_CA_CERTIFICATE — The PEM-encoded CA certificate... Must be the certificate value, not a file path" and hostname verification requires "the hostname in PULUMI_DATABASE_ENDPOINT matches…; source: content/docs/administration/self-hosting/operations/database.md (#encrypting-connections-with-tls))
  • L69 in content/docs/administration/self-hosting/troubleshooting.md "Running the containers on more than one Docker host produces migration errors or repeated migration attempts." → 🤷 unverifiable (evidence: (escalated from pass1) Web search did not surface the specific troubleshooting.md content about multi-host Docker deployments causing migration errors; this is a product-behavior claim about Pulumi's self-hosted Docker Compose…; source: WebSearch ran query "Pulumi self-hosted troubleshooting Docker host migration errors"; top results didn't address the claim)
  • L71 in content/docs/administration/self-hosting/troubleshooting.md "Duplicate or failed migrations across multiple Docker hosts are caused by every host trying to run migrations against the shared database." → ➖ not-a-claim (evidence: The line is a verbatim restatement of the doc's own "Cause" bullet in the same file ("Every host is trying to run migrations against the shared database"), describing the author's own product/troubleshooting content rather than citing an…; source: repo:content/docs/administration/self-hosting/troubleshooting.md (line 71))
  • L73 in content/docs/administration/self-hosting/troubleshooting.md "Setting disableDbMigrations on every host except the one that owns migrations fixes duplicate or failed migrations across multiple Docker hosts." → 🤷 unverifiable (evidence: (escalated from pass1) Web search surfaced general self-hosted Docker/migrations docs (e.g., the Database Best Practices page and local-docker install page) but no page or source mentioning a disableDbMigrations setting or its specific…; source: WebSearch ran query "local-docker self-hosted pulumi disableDbMigrations duplicate migrations"; top results didn't address the claim)
  • L77 in content/docs/administration/self-hosting/troubleshooting.md "After enabling SAML SSO, an unexpected account can end up owning SAML administration." → 🤷 unverifiable (evidence: (escalated from pass1) Web search surfaced Pulumi's general SAML SSO troubleshooting page (docs/administration/access-identity/saml/troubleshooting/), which states: "If your organization does not have a SAML admin configured, contact…; source: WebSearch ran query "Pulumi self-hosted SAML admin role who becomes SAML admin first user"; top results didn't address the specific claim about an unexpected account owning SAML administration)
  • L79 in content/docs/administration/self-hosting/troubleshooting.md "Setting samlEnabled: true does not by itself block email and password signup." → 🤷 unverifiable (evidence: (escalated from pass1) Web search surfaced Pulumi's SAML SSO self-hosting docs, which describe a SAML_SSO_ENABLED environment variable controlling whether the SSO option is displayed, but none of the public pages address a `samlEnabled…; source: WebSearch ran query "Pulumi self-hosted samlEnabled email password signup"; top results didn't address the claim)
  • L81 in content/docs/administration/self-hosting/troubleshooting.md "Setting PULUMI_DISABLE_EMAIL_SIGNUP on the API container stops further email signups." → ✅ verified (evidence: (escalated from pass1) Pulumi's own release notes confirm this variable's function: "Now, you can by setting the PULUMI_DISABLE_EMAIL_LOGIN and PULUMI_DISABLE_EMAIL_SIGNUP environment variables to true" to remove the ability for users to…; source: https://www.pulumi.com/blog/pulumi-release-notes-m65/)
  • L81 in content/docs/administration/self-hosting/troubleshooting.md "Setting PULUMI_HIDE_EMAIL_SIGNUP hides the email signup option on the console but does not disable the underlying signup handler." → 🤷 unverifiable (evidence: (escalated from pass1) Web search found no documentation or product source referencing a "PULUMI_HIDE_EMAIL_SIGNUP" environment variable or its behavior regarding the signup handler; this describes internal self-hosted console/API…; source: WebSearch ran query "PULUMI_HIDE_EMAIL_SIGNUP"; top results didn't address the claim; intuition: Claim asserts a specific security-relevant gap (UI hides option but backend endpoint remains active) that is exactly…)
  • L81 in content/docs/administration/self-hosting/troubleshooting.md "Creating the intended administrator account first, before sharing the console URL, fixes the unexpected-account-owns-SAML-administration problem." → 🤷 unverifiable (evidence: (escalated from pass1) This claim describes Pulumi's own self-hosted product behavior (account creation order and SAML administration assignment), which cannot be verified via public web search. It requires checking Pulumi's self-hosting…; source: N/A - product behavior claim requiring pulumi documentation/source access (WebSearch dispatched but verification did not converge within the turn budget))
  • L85 in content/docs/administration/self-hosting/troubleshooting.md "When stacks are missing from the Resources page, resource search returns nothing or is missing recently updated stacks." → ➖ not-a-claim (evidence: This is the doc's own "Symptom" description under its "Stacks are missing from the Resources page" troubleshooting heading, restated verbatim: "Resource search returns nothing, or is missing recently updated stacks." It's a description…; source: repo:content/docs/administration/self-hosting/troubleshooting.md)
  • L87 in content/docs/administration/self-hosting/troubleshooting.md "Missing stacks on the Resources page are caused by the OpenSearch index being stale or having been built while the cluster was unavailable." → ✅ verified (evidence: The sibling "OpenSearch cluster" component page independently corroborates the mechanism: "It can be useful to run a manual backfill when an OpenSearch cluster is first added... or to bring things back in sync in case of operational…; source: content/docs/administration/self-hosting/components/search.md)
  • L89 in content/docs/administration/self-hosting/troubleshooting.md "Reindexing from Settings → Self-hosted in the console fixes stacks missing from the Resources page." → ✅ verified (evidence: The sibling OpenSearch cluster docs page confirms: "users with an admin role in a self-hosted organization have access to a menu under Settings -> Self-hosted. This menu contains a Reindex search cluster button to manually trigger a…; source: content/docs/administration/self-hosting/components/search.md)
  • L89 in content/docs/administration/self-hosting/troubleshooting.md "There is a Search page at /docs/administration/self-hosting/components/search/." → ✅ verified (evidence: The repo contains content/docs/administration/self-hosting/components/search.md, confirming the Search page exists at the referenced path.; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/components)
  • L93 in content/docs/administration/self-hosting/troubleshooting.md "Contacting Pulumi support requires providing the installer, its version, and the failing container's logs." → 🤷 unverifiable (evidence: Web search surfaced general Pulumi support guidance (e.g., filing-issues page saying to "Include version information - run pulumi version and include the output" and enable verbose logging) but did not surface the specific self-hosting…; source: WebSearch ran query "pulumi.com self-hosting troubleshooting contacting support installer version logs"; top results didn't address the specific claim)
  • L55 in content/docs/iac/comparisons/terraform/_index.md "Terraform Enterprise is HashiCorp's self-managed offering, and Sentinel policy, run tasks, and no-code provisioning are gated to HCP Terraform and Enterprise…" → 🌀 framing-drift (framing: Claim collapses distinct per-feature tier gating (run tasks on Free; Sentinel/no-code on Standard+) into a single "gated to HCP Terraform and Enterprise…; evidence: (escalated from pass1) Current HashiCorp/third-party pricing data shows run tasks and OPA are available even on the Free HCP Terraform tier, and Sentinel/no-code provisioning are gated to specific SaaS sub-tiers (Standard/Premium) rather…; source: WebSearch ran query "HashiCorp Terraform pricing page Sentinel Standard tier no-code provisioning Plus Premium 2026"; intuition: Claim treats "HCP Terraform" as if it's a single tier alongside "Enterprise," when HCP Terraform itself has multiple…)
  • L55 in content/docs/iac/comparisons/terraform/_index.md "Self-hosted Pulumi Cloud runs the entire platform — state, secrets, RBAC, policy, and deployments — in the customer's own cloud account or data center…" → ✅ verified (evidence: The /product/self-hosted/ page states: "Install the Pulumi Cloud API and console into your own AWS, Azure, Google Cloud, or on-premises environment. State, secrets, and audit history live in a database and object store you own, and the…; source: content/product/self-hosted.md; content/docs/administration/self-hosting/_index.md)
  • L57 in content/docs/iac/comparisons/terraform/_index.md "HCP Terraform is offered as SaaS and Terraform Enterprise is offered as a self-managed commercial option." → ✅ verified (evidence: The same table row cites developer.hashicorp.com/terraform/enterprise, which HashiCorp describes as its self-managed offering, while HCP Terraform (developer.hashicorp.com/terraform/cloud-docs) is HashiCorp's SaaS product; the doc's own…; source: content/docs/iac/comparisons/terraform/_index.md (line 55: "Terraform Enterprise is HashiCorp's self-managed offering"); developer.hashicorp.com/terraform/enterprise)
  • L61 in content/docs/iac/comparisons/terraform/_index.md "The real-world results figures in this comparison come from Pulumi's own published customer case studies, not independent third-party benchmarks." → ✅ verified (evidence: The live page at content/docs/iac/comparisons/terraform/ states verbatim: "These figures come from Pulumi's own published customer case studies, not independent third-party benchmarks."; source: https://www.pulumi.com/docs/iac/comparisons/terraform/)
  • L61 in content/docs/iac/comparisons/terraform/_index.md "Terraform has a comparably large base of production users compared to Pulumi." → ✅ verified (framing: Claim text is a verbatim quote of the published page; this is an editorial/qualitative comparative assertion by Pulumi about Terraform's user base, not a…; evidence: The live Pulumi docs page at this exact URL states verbatim: "Terraform has a comparably large base of production users, and its longer incumbency in the IaC market means a larger catalog of community modules and provider maturity exists…; source: https://www.pulumi.com/docs/iac/comparisons/terraform/)
  • L61 in content/docs/iac/comparisons/terraform/_index.md "Terraform's longer incumbency in the IaC market means a larger catalog of community modules and provider maturity exists today for Terraform than for any…" → ✅ verified (evidence: The live Pulumi docs page for this exact comparison states: "Terraform has a comparably large base of production users, and its longer incumbency in the IaC market means a larger catalog of community modules and provider maturity exists…; source: https://www.pulumi.com/docs/iac/comparisons/terraform/)
  • L63 in content/docs/iac/comparisons/terraform/_index.md "Starburst replaced Terraform with Pulumi for its multi-region Kubernetes deployments." → ✅ verified (evidence: The Pulumi docs page itself states: "Starburst replaced Terraform with Pulumi for its multi-region Kubernetes deployments and cut deployment time from two weeks to about three hours — a 112x improvement." This is corroborated by Pulumi's…; source: https://www.pulumi.com/docs/iac/comparisons/terraform/)
  • L63 in content/docs/iac/comparisons/terraform/_index.md "Starburst cut deployment time from two weeks to about three hours, a 112x improvement, by replacing hand-maintained HCL glue scripts with Automation…" → ✅ verified (evidence: The Pulumi case study states: "Galaxy's multi-region blue/green deployments, which previously took two weeks with Terraform, now take only three hours with Pulumi, a 112x improvement in speed," and describes orchestration workflows…; source: https://www.pulumi.com/case-studies/starburst/)
  • L64 in content/docs/iac/comparisons/terraform/_index.md "Wiz uses Pulumi's Automation API to manage over one million cloud resources across thousands of Kubernetes clusters worldwide." → ✅ verified (evidence: Pulumi's Wiz case study states: "Using Pulumi's Automation API and Go SDK, Wiz built a system that now manages thousands of Kubernetes clusters across hundreds of data centers worldwide... while maintaining over a million cloud resources…; source: https://www.pulumi.com/case-studies/wiz/)
  • L65 in content/docs/iac/comparisons/terraform/_index.md "BMW's Software Factory manages 20,000+ cloud resources with Python-based infrastructure code integrated into its existing CI/CD workflows." → ✅ verified (evidence: The Pulumi case study confirms: "Software Factory manages over 20,000 cloud resources using Python-based infrastructure code integrated with existing CI/CD workflows," matching the claim's figure and framing exactly.; source: https://www.pulumi.com/case-studies/bmw/)
  • L87-89 in content/docs/iac/comparisons/terraform/_index.md "The self-hosted edition of Pulumi Cloud tracks the same capabilities as the SaaS edition." → 🤷 unverifiable (framing: Claim implies unqualified parity with "the SaaS edition" broadly; pricing docs gate self-hosted to only the Business Critical SaaS tier, a narrower/different…; evidence: The comparison page itself asserts self-hosted "tracks the same capabilities as the SaaS," but the pricing FAQ page states self-hosted Pulumi Cloud "is available in Business Critical Edition" only, implying self-hosted maps to the top…; source: content/pricing/_index.md (FAQ: "Can I host Pulumi Cloud in my cloud or datacenter?") vs content/docs/iac/comparisons/terraform/_index.md L89; intuition: "Same capabilities as the SaaS" is a strong blanket parity claim across all tiers; self-hosted being tied to a single…)
  • L87-89 in content/docs/iac/comparisons/terraform/_index.md "Self-hosted Pulumi Cloud lets customers integrate their own identity provider, including GitHub Enterprise, GitLab, and SAML SSO." → ✅ verified (evidence: The self-hosting docs page states: "Pulumi can be deployed in any on-premise or cloud environment and integrated with your preferred identity provider: GitHub Enterprise, GitLab Enterprise, SAML SSO, or email/password authentication,"…; source: repo:content/docs/administration/self-hosting/_index.md)
  • L87-89 in content/docs/iac/comparisons/terraform/_index.md "Self-hosted Pulumi Cloud runs the complete platform — state, secrets, RBAC, policy enforcement, and deployments — inside the customer's own cloud account or…" → ✅ verified (evidence: The /product/self-hosted/ page states: "Install the Pulumi Cloud API and console into your own AWS, Azure, Google Cloud, or on-premises environment. State, secrets, and audit history live in a database and object store you own, and the…; source: repo:content/product/self-hosted.md)
  • L89 in content/docs/iac/comparisons/terraform/_index.md "The self-hosting documentation covers deployment options for self-hosted Pulumi Cloud across AWS, Azure, Google Cloud, Kubernetes, and Docker." → ✅ verified (evidence: The live self-hosting docs page (content/docs/administration/self-hosting/_index.md) lists a "Deployment options" section with cards for ECS-Hosted (AWS), EKS-Hosted (AWS/Kubernetes), AKS-Hosted (Azure/Kubernetes), GKE-Hosted (Google…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/_index.md)
  • L174-176 in content/docs/iac/comparisons/terraform/_index.md "Self-hosted Pulumi Cloud runs the full platform in the customer's own cloud account or data center, including air-gapped environments, with the same state…" → ✅ verified (evidence: The /product/self-hosted/ page states: "Install the Pulumi Cloud API and console into your own AWS, Azure, Google Cloud, or on-premises environment. State, secrets, and audit history live in a database and object store you own, and the…; source: content/product/self-hosted.md)
  • L181 in content/docs/iac/comparisons/terraform/_index.md "There is a Pulumi documentation page for migrating from Terraform Enterprise to self-hosted Pulumi Cloud, located at /docs/iac/comparisons/terraform/from-terra…" → ❌ contradicted (evidence: Directory listing of pulumi/docs at content/docs/iac/comparisons/terraform/ contains only _index.md, opentofu.md, and terminology.md — no from-terraform-enterprise page or subdirectory exists at that path, so the linked URL…; source: gh api repos/pulumi/docs/contents/content/docs/iac/comparisons/terraform)

  • 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

Copy link
Copy Markdown
Contributor
continued from previous comment
  • L12 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "- /docs/iac/comparisons/terraform/migrating-from-terraform-enterprise/" → ➖ not-a-claim (evidence: The line is an aliases: entry in the page frontmatter (aliases: - /docs/iac/comparisons/terraform/migrating-from-terraform-enterprise/), meaning this URL redirects to the current page — it's redirect metadata, not a falsifiable…; source: content/docs/iac/comparisons/terraform/from-terraform-enterprise.md (frontmatter, line 12))
  • L15 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Self-hosted Pulumi Cloud offers the same operating model as Terraform Enterprise: the complete Pulumi Cloud platform (state, secrets, RBAC, policy, and…" → ✅ verified (evidence: The /product/self-hosted/ page confirms self-hosted Pulumi Cloud is "the whole platform, not a state backend" including Pulumi IaC (state, RBAC, audit logs), Pulumi ESC (secrets), Discovery and Policies, and deployments, running "in your…; source: content/product/self-hosted.md)
  • L19 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Self-hosted Pulumi Cloud runs the same platform as the SaaS product at https://app.pulumi.com/." → ✅ verified (evidence: The self-hosting overview doc states: "The self-hosted version provides all the same capabilities as the SaaS offering at app.pulumi.com." This directly corroborates the claim that self-hosted Pulumi…; source: content/docs/administration/self-hosting/_index.md)
  • L21 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Self-hosted Pulumi Cloud provides secrets management running on infrastructure the customer operates." → ✅ verified (evidence: The same page states: "the complete Pulumi Cloud platform — state, secrets, RBAC, policy, and deployments — running in your own cloud account or data center" and "State and secrets live in a MySQL database and an object store within your…; source: repo:content/docs/iac/comparisons/terraform/from-terraform-enterprise.md)
  • L21-24 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Self-hosted Pulumi Cloud provides state management, secrets management, role-based access control, policy enforcement, and deployments, all running on…" → ✅ verified (evidence: The doc itself states: "State management, secrets management, role-based access control, policy enforcement, and deployments all run on infrastructure you operate" — and the linked…; source: content/docs/iac/comparisons/terraform/from-terraform-enterprise.md; content/docs/insights/policy/_index.md)
  • L26 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "The page at /docs/iac/comparisons/terraform/ provides a feature-by-feature comparison of Pulumi and Terraform." → ✅ verified (evidence: content/docs/iac/comparisons/terraform/_index.md (served at /docs/iac/comparisons/terraform/) includes a "## Detailed comparison" section with a table titled "Feature | Pulumi | Terraform" covering language support, state management…; source: repo:content/docs/iac/comparisons/terraform/_index.md)
  • L30 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Pulumi is designed to be adopted incrementally." → ✅ verified (framing: Source describes concrete incremental-adoption tooling (import, conversion, migration hub) which entails the broader design-philosophy claim that Pulumi is…; evidence: Multiple Pulumi sources corroborate this positioning: "Pulumi supports incremental adoption with pulumi import, generated code, and Terraform interoperability paths" and a case study notes "Incremental Adoption: Organizations can adopt…; source: https://www.pulumi.com/blog/why-choose-pulumi-over-terraform/ ; https://www.pulumi.com/case-studies/bmw/)
  • L32-35 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "The page at /docs/iac/guides/migration/migrating-to-pulumi/from-terraform/#converting-terraform-hcl-to-pulumi documents converting Terraform HCL to Pulumi…" → ✅ verified (evidence: The target page content/docs/iac/guides/migration/migrating-to-pulumi/from-terraform.md has a section "### Converting Terraform HCL to Pulumi" (line 207) stating "The Pulumi CLI can convert existing Terraform source code written in the…; source: repo:content/docs/iac/guides/migration/migrating-to-pulumi/from-terraform.md)
  • L37 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "The page at /docs/iac/guides/migration/migrating-to-pulumi/from-terraform/ provides a complete walkthrough including bulk conversion and state migration for…" → ✅ verified (framing: Source page covers a broad set of migration paths (Neo, state backend, HCL, state-first migration, import, convert) of which "bulk conversion and state…; evidence: The linked page content/docs/iac/guides/migration/migrating-to-pulumi/from-terraform.md exists at that exact path and covers state migration (Pulumi Cloud as Terraform state backend, pulumi-terraform-migrate, `pulumi import --from…; source: repo:content/docs/iac/guides/migration/migrating-to-pulumi/from-terraform.md)
  • L41 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "The page at /pricing/ describes what each Pulumi pricing edition includes." → ✅ verified (evidence: The pulumi.com/pricing/ page describes multiple editions with their features, e.g. "The Individual Edition is great for single users with private projects" and "The Team Edition is designed for teams to collaborate on shared…; source: https://www.pulumi.com/pricing/)
  • L45 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "Requesting a Proof of Concept (PoC) via /product/self-hosted/#self-hosted-trial provides an evaluation license key and a solutions architect to size the…" → ✅ verified (evidence: The self-hosted-trial anchor on content/product/self-hosted.md is a hubspot_form section titled "Request a proof of concept" with description: "A solutions architect will walk through your target environment, size the installation, and…; source: repo:content/product/self-hosted.md)
  • L46 in content/docs/iac/comparisons/terraform/from-terraform-enterprise.md "The self-hosted Pulumi install guide allows evaluation on a single host using Docker Compose, then deployment to production on AWS, Azure, Google Cloud, or…" → ✅ verified (evidence: The install page states: "Run the full Pulumi Cloud platform in your own cloud account or data center. Start with the all-in-one Docker Compose stack to evaluate on a single host, then choose a production deployment for your platform,"…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L41 in content/docs/install/_index.md "Organizations that need to keep everything in their own environment can run the full Pulumi Cloud platform self-hosted — the same managed experience as the…" → ✅ verified (evidence: The self-hosting docs page (content/docs/administration/self-hosting/_index.md) states: "The self-hosted version provides all the same capabilities as the SaaS offering at app.pulumi.com... Pulumi can be deployed in any on-premise or…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/_index.md)
  • L146 in content/enterprise/_index.md "Enterprises that require specific data controls can run self-hosted Pulumi Cloud in their own cloud account or data center and…" → ✅ verified (evidence: The linked page /product/self-hosted/ lists supported installations matching the claim exactly: "AWS ECS", "AWS EKS", "Azure AKS", "Google GKE", "Bring your own Kubernetes ... Any conformant cluster", and "Docker on your own hosts ...…; source: content/product/self-hosted.md)
  • L168 in content/enterprise/_index.md "Pulumi works with the leading cloud providers including AWS, Google Cloud, and Microsoft Azure to ensure best-in-class support of the Pulumi platform across…" → ✅ verified (framing: Claim text mirrors the established Pulumi Native Providers / AWS Marketplace messaging verbatim, and the AWS Marketplace URL is a live, matching listing.; evidence: Pulumi's own enterprise page states the identical claim: "Pulumi provides Native Providers which enables same-day support of all new products and features in each cloud. Pulumi is also available for purchase through AWS Marketplace." The…; source: https://www.pulumi.com/enterprise/ and https://aws.amazon.com/marketplace/pp/prodview-dwn22batkhsyg)
  • L141 in content/pricing/_index.md "answer: Yes, we offer a self-hosted Pulumi Cloud for companies that have specific data control requirements and want to maintain complete control over…" → ✅ verified (evidence: The linked page /docs/administration/self-hosting/install/ exists and states: "Run the full Pulumi Cloud platform in your own cloud account or data center. Start with the all-in-one Docker Compose stack to evaluate on a single host, then…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L155-156 in content/product/_index.md "Pulumi Cloud can be self-hosted, running the same platform in a customer's own cloud account or data center." → ✅ verified (evidence: Same file, lines 154-159, states: "Run Pulumi Cloud anywhere ... Use Pulumi Cloud as a fully managed SaaS, or run the same platform yourself in your own cloud account or data center. Self-hosted Pulumi Cloud gives you complete control…; source: repo:content/product/_index.md (lines 152-159))
  • L155-156 in content/product/_index.md "Pulumi Cloud can be self-hosted, running the same platform in a customer's own cloud account or data center." → ✅ verified (evidence: The same page states: "Use Pulumi Cloud as a fully managed SaaS, or run the same platform yourself in your own cloud account or data center. Self-hosted Pulumi Cloud gives you complete control over data, identity, and network isolation…; source: repo:content/product/_index.md (lines 152-159))
  • L155-156 in content/product/_index.md "Self-hosted Pulumi Cloud gives customers complete control over network isolation." → ✅ verified (framing: Source says "complete control over data, identity, and network isolation"; claim isolates just "network isolation" as one facet of that control — entailed by…; evidence: The source page states: "Self-hosted Pulumi Cloud gives you complete control over data, identity, and network isolation, including air-gapped environments, with the same IaC, secrets, insights, and governance capabilities." The claim's…; source: repo:content/product/_index.md (L155-156))
  • L158 in content/product/_index.md "A page describing self-hosted Pulumi Cloud exists at the path /product/self-hosted/." → ✅ verified (evidence: Found content/product/self-hosted.md (title: "Self-Hosted Pulumi Cloud"), a Hugo page that renders at the URL path /product/self-hosted/, matching the CTA link in content/product/_index.md line 158 (cta_link: /product/self-hosted/).; source: repo:content/product/self-hosted.md)
  • L147 in content/product/infrastructure-as-code.md "Get started with Pulumi Cloud for free, state management and secrets included. Our open source engine powers everything…" → ✅ verified (evidence: github.com/pulumi/pulumi is a public repository licensed Apache-2.0, described as "Pulumi - Infrastructure as Code in any programming language" — confirming it is Pulumi's open source engine that the claim links to.; source: gh api repos/pulumi/pulumi)
  • L403 in content/product/infrastructure-as-code.md "Run all of Pulumi Cloud in your own cloud account or data center. Full control over data, identity, and network, including air-gapped deployments. [Learn…" → ✅ verified (evidence: The self-hosted page describes exactly this: "Install the Pulumi Cloud API and console into your own AWS, Azure, Google Cloud, or on-premises environment. State, secrets, and audit history live in a database and object store you own, and…; source: content/product/self-hosted.md)
  • L3 in content/product/self-hosted.md "The self-hosted Pulumi Cloud platform can run in a customer's own AWS, Azure, Google Cloud, or on-premises environment." → ✅ verified (evidence: The page itself lists supported self-hosted installations including "AWS ECS", "AWS EKS", "Azure AKS", "Google GKE", and "Bring your own Kubernetes" / "Docker on your own hosts" (explicitly "the path for on-premises clusters and…; source: repo:content/product/self-hosted.md; gh api repos/pulumi/pulumi-self-hosted-installers)
  • L14 in content/product/self-hosted.md "Installing the Pulumi Cloud API and console into your own environment stores state, secrets, and audit history in a database and object store you own." → ✅ verified (framing: This describes Pulumi's own self-hosted product design/architecture rather than citing a third-party source; treated as a product feature description…; evidence: The same page's hero description states "State, secrets, and audit history live in a database and object store you own," and a later section reiterates "Encrypted state, stack history, role-based access control, and audit logs, stored in…; source: repo:content/product/self-hosted.md)
  • L14 in content/product/self-hosted.md "A self-hosted Pulumi Cloud installation can run with no route to the public internet." → ✅ verified (evidence: Pulumi's own air-gapped self-hosting guide confirms this exact capability: "Air-gapped environments are completely isolated from the public internet... Pulumi Self-Hosted offers a robust solution for these environments, enabling…; source: content/docs/administration/self-hosting/airgapped.md)
  • L18 in content/product/self-hosted.md "There exists an install guide for self-hosted Pulumi at /docs/administration/self-hosting/install/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/install/_index.md exists with title_tag "Install Self-Hosted Pulumi Cloud" and h1 "Install Self-Hosted Pulumi Cloud", confirming /docs/administration/self-hosting/install/ is a real, live…; source: repo:content/docs/administration/self-hosting/install/_index.md)
  • L24 in content/product/self-hosted.md "Most Pulumi customers run on the hosted service at app.pulumi.com." → 🤷 unverifiable (evidence: No public source quantifies the proportion of Pulumi customers using the hosted SaaS (app.pulumi.com) versus self-hosted. Search results describe self-hosting as an option/edition (Business Critical) but provide no statistic on customer…; source: WebSearch ran query "Pulumi self-hosted vs cloud most customers hosted service"; top results didn't address the claim; intuition: Plausible directionally (SaaS is typically the default/most common choice) but the specific "most customers" framing…)
  • L26 in content/product/self-hosted.md "There exists a page comparing hosted and self-hosted editions at /docs/administration/onboarding-guide/choose-edition/." → ✅ verified (evidence: The page content/docs/administration/onboarding-guide/choose-edition.md exists at that exact path and contains a "Choose your deployment model" section comparing "SaaS (Recommended for most organizations)" vs "Self-hosted (For regulated…; source: repo:content/docs/administration/onboarding-guide/choose-edition.md)
  • L35 in content/product/self-hosted.md "For air-gapped installations with no egress, customers can mirror container images and provider plugins into their environment and run from there." → ✅ verified (evidence: The linked airgapped guide (content/docs/administration/self-hosting/airgapped.md, aliased at /docs/administration/self-hosting/airgapped/) states: "Since the environment lacks internet access, you must provide local mirrors for certain…; source: repo:content/docs/administration/self-hosting/airgapped.md)
  • L39 in content/product/self-hosted.md "Self-hosted Pulumi can keep stack state, secrets, and audit logs from ever leaving a named region or cloud account, to satisfy statutory or contractual data…" → ➖ not-a-claim (evidence: Line 39 is a near-verbatim restatement of the page's own "Data sovereignty" card: "Statutory or contractual requirements that stack state, secrets, and audit logs never leave a named region or cloud account." This is the author's own…; source: repo:content/product/self-hosted.md)
  • L43-47 in content/product/self-hosted.md "Michael Hunter, CEO of Spear AI, is quoted stating that Spear AI gave auditors access to their Pulumi policy packs because it is easier to understand and…" → ✅ verified (evidence: (escalated from pass1) Multiple Pulumi sources confirm this quote. Per Pulumi's case study and press release: "We gave our auditors access to our policy packs because it's far easier to understand and prove controls in code than in a…; source: https://www.pulumi.com/case-studies/spear-ai/)
  • L53 in content/product/self-hosted.md "A self-hosted Pulumi installation runs the Pulumi Cloud API and console as container images backed by a MySQL 8.0 database, object storage, and an OpenSearch…" → ✅ verified (evidence: The independent sibling doc content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md confirms the same architecture: "It runs the API, the web Console, a migrated MySQL database, and OpenSearch on a single…; source: repo:content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L59 in content/product/self-hosted.md "The self-hosted Pulumi IaC component stores encrypted state, stack history, role-based access control data, and audit logs in the customer's own database and…" → ✅ verified (framing: Source broadly states "all data" including state, RBAC, and policy/compliance data is stored in customer's MySQL DB and encrypted object store; claim's…; evidence: Pulumi's self-hosted product page states: "All the capabilities of Pulumi Cloud: state management, role-based access controls, policy and compliance guardrails" and "All data in Self-Hosted Pulumi is stored in a MySQL database and an…; source: https://www.pulumi.com/product/self-hosted/)
  • L63 in content/product/self-hosted.md "Pulumi ESC (environments, secrets, and configuration) ships as part of the self-hosted install with no separate deployment required." → ✅ verified (framing: Sibling docs describe self-hosted as offering full SaaS capability parity without listing ESC as a separately deployed component, which entails the claim's…; evidence: The self-hosting components page lists only API, Web console, Migrations, Search, and Deployments as separately-deployed components — no distinct "ESC service" — and the self-hosting overview states "The self-hosted version provides all…; source: repo:content/docs/administration/self-hosting/components/_index.md and repo:content/docs/administration/self-hosting/_index.md)
  • L67 in content/product/self-hosted.md "Self-hosted Pulumi supports running Discovery scans and policy evaluations on customer-managed runners inside the customer's own network, so cloud…" → ✅ verified (evidence: The linked docs page /docs/insights/self-hosted/ states: "Pulumi Insights supports self-hosted operation through customer-managed workflow runners. This allows you to run Discovery scans and policy evaluations within your own…; source: content/docs/insights/self-hosted.md)
  • L71 in content/product/self-hosted.md "Pulumi Neo, Pulumi's infrastructure agent, works against a self-hosted Pulumi installation." → ✅ verified (evidence: The onboarding guide's "Getting started with your chosen model" section applies to both SaaS and self-hosted deployments and explicitly walks through accessing "Pulumi Neo, your AI agent" from the console, noting only that self-hosted…; source: repo:content/docs/administration/onboarding-guide/choose-edition.md)
  • L75 in content/product/self-hosted.md "Self-hosted Pulumi uses SCIM to keep users and groups in sync." → ✅ verified (evidence: (escalated from pass1) Pulumi's SCIM docs confirm: "SCIM enables you to manage your users and groups centrally in your Identity Provider (IdP) and then synchronize those users and groups to the Pulumi Cloud," and this "requires Pulumi…; source: https://www.pulumi.com/docs/administration/access-identity/scim/)
  • L75 in content/product/self-hosted.md "Self-hosted Pulumi supports SAML 2.0 SSO against any identity provider, including Okta, Microsoft Entra ID, and Ping." → ✅ verified (framing: Pricing FAQ broadly states "supports SAML SSO"; self-hosted page narrows this to naming specific compatible IdPs, which is entailed by generic SAML 2.0…; evidence: The self-hosted product page states "SAML 2.0 SSO against any IdP — Okta, Microsoft Entra ID, Ping — plus GitHub, GitLab, and Bitbucket OAuth, or email and password," and this is consistent with the pricing FAQ which independently…; source: repo:content/product/self-hosted.md L75; repo:content/pricing/_index.md L117)
  • L79 in content/product/self-hosted.md "In self-hosted Pulumi, pointing the API at a customer-run OpenSearch cluster enables resource search indexing across every stack in the installation." → ✅ verified (evidence: Independent self-hosting network requirements doc confirms: "Destination - OpenSearch / Elasticsearch ... 9200: OpenSearch or Elasticsearch HTTP API (used for resource search)", corroborating that self-hosted Pulumi requires a…; source: content/docs/administration/self-hosting/network.md)
  • L83-85 in content/product/self-hosted.md "Every self-hosted Pulumi installation option ships as a Pulumi program in the pulumi-self-hosted-installers GitHub repository." → ❌ contradicted (framing: Claim says "every option" ships as a Pulumi program; the repo's own Docker Compose quickstart option (listed by the same page as one of the "seven supported…; evidence: The pulumi-self-hosted-installers repo's quickstart-docker-compose/all-in-one directory (the "Docker Compose" option listed as one of the page's own "seven supported installations") contains only docker-compose.yml…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/all-in-one)
  • L91 in content/product/self-hosted.md "The Docker Compose deployment option is intended for evaluation only and brings up the API, console, database, and search on one host." → ✅ verified (evidence: The linked quickstart doc states: "It runs the API, the web Console, a migrated MySQL database, and OpenSearch on a single host with working defaults, so you can evaluate the full platform... Use it for evaluation and testing; for…; source: content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md)
  • L93 in content/product/self-hosted.md "There exists a Docker Compose guide at /docs/administration/self-hosting/deployment-options/quickstart-docker-compose/." → ✅ verified (evidence: Confirmed via GitHub API that content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md exists in pulumi/docs at that exact path, which maps to the URL…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options)
  • L97 in content/product/self-hosted.md "The AWS ECS self-hosted deployment option uses Fargate services behind a load balancer with Aurora MySQL, S3, ACM, and Route 53, and provides TypeScript and…" → ✅ verified (framing: All named components (Fargate/ECS, Aurora MySQL, S3, ACM, Route53, load balancer, TypeScript/Go installers) match the official ECS-hosted deployment docs.; evidence: Pulumi's ECS-Hosted Install docs state the installer deploys RDS Aurora (MySQL), S3, CloudWatch Logs, Route53, an NLB, and ACM, and confirm: "You can choose between using a TypeScript or Golang installer."; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/ecs-hosted/)
  • L99 in content/product/self-hosted.md "There exists an ECS guide at /docs/administration/self-hosting/deployment-options/ecs-hosted/." → ✅ verified (evidence: The pulumi/docs repo contains content/docs/administration/self-hosting/deployment-options/ecs-hosted.md, which maps to the URL /docs/administration/self-hosting/deployment-options/ecs-hosted/ referenced in the claim.; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options (file: ecs-hosted.md))
  • L103 in content/product/self-hosted.md "The AWS EKS self-hosted deployment option allows customers to bring their own IAM, VPC, or state buckets when another team owns them." → ✅ verified (evidence: The pulumi-self-hosted-installers eks-hosted README explicitly states the architecture goal: "Allow users to bring their own infrastructure for sections of the solution. For example IAM is managed as a separate stack since some customers…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/eks-hosted/README.md)
  • L105 in content/product/self-hosted.md "There exists an EKS guide at /docs/administration/self-hosting/deployment-options/eks-hosted/." → ✅ verified (evidence: The parent deployment-options index page lists "* EKS" as a sibling entry alongside ECS, AKS, and GKE guides, confirming the eks-hosted page exists at that path under /docs/administration/self-hosting/deployment-options/.; source: repo:content/docs/administration/self-hosting/deployment-options/_index.md)
  • L109 in content/product/self-hosted.md "The Azure AKS self-hosted deployment option uses Azure Kubernetes Service with Azure Database for MySQL and Blob Storage, behind an NGINX ingress." → ✅ verified (framing: Sibling docs page confirms AKS + Managed MySQL + Blob storage; NGINX ingress detail unconfirmed directly but plausible and not contradicted by any source found.; evidence: The AKS-hosted docs page confirms: "deploys the following services: ... Managed MySQL Server and DB for persistent state ... Blob storage for checkpoints and policy packs" in Azure Kubernetes Service (AKS), matching the AKS/MySQL/Blob…; source: content/docs/administration/self-hosting/deployment-options/aks-hosted.md)
  • L111 in content/product/self-hosted.md "There exists an AKS guide at /docs/administration/self-hosting/deployment-options/aks-hosted/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/aks-hosted.md exists in the pulumi/docs repo at the master branch, confirming the URL /docs/administration/self-hosting/deployment-options/aks-hosted/ resolves to a…; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options)
  • L115 in content/product/self-hosted.md "The Google GKE self-hosted deployment option uses Google Kubernetes Engine with Cloud SQL for MySQL and Cloud Storage buckets." → ✅ verified (evidence: The pulumi-self-hosted-installers GKE README describes the installer deploying "GKE Cluster", a "MySQL server and database" (with config for GCP SQL DB instance type, i.e. Cloud SQL), and "Buckets for state and policy storage" — matching…; source: gh api repos/pulumi/pulumi-self-hosted-installers/contents/gke-hosted/README.md)
  • L117 in content/product/self-hosted.md "There exists a GKE guide at /docs/administration/self-hosting/deployment-options/gke-hosted/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/gke-hosted.md exists with title "GKE" and h1 "Pulumi Cloud self-hosted GKE install", matching the linked path /docs/administration/self-hosting/deployment-options/gke-hos…; source: repo:content/docs/administration/self-hosting/deployment-options/gke-hosted.md)
  • L121 in content/product/self-hosted.md "The 'Bring your own Kubernetes' self-hosted deployment option requires any conformant Kubernetes cluster plus MySQL 8.0 and S3-compatible object storage." → ✅ verified (evidence: Pulumi's official BYO-Infrastructure docs state: "The BYO-Infrastructure Installer installer is used to deploy the self-hosted Pulumi Cloud on your own K8s, MySQL and S3-compatible infrastructure," and the architecture overview page…; source: https://www.pulumi.com/docs/administration/self-hosting/deployment-options/byo-infra-hosted/ and https://www.pulumi.com/docs/administration/self-hosting/operations/architecture/)
  • L123 in content/product/self-hosted.md "There exists a BYO infrastructure guide at /docs/administration/self-hosting/deployment-options/byo-infra-hosted/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md exists with title "Bring-your-own infra" and identifier administration-self-hosting-deployment-options-byo-infra-hosted, matching the linked path…; source: repo:content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md)
  • L127 in content/product/self-hosted.md "The 'Docker on your own hosts' self-hosted deployment option runs the container images directly against an external MySQL and object store, for data centers…" → ✅ verified (evidence: The linked local-docker.md doc confirms this: it requires the customer to provide "MySQL 8.0 database" and "Object storage (e.g. Minio)" and states the installer "is generally meant to be used where an on-premise solution is needed or…; source: content/docs/administration/self-hosting/deployment-options/local-docker.md)
  • L129 in content/product/self-hosted.md "There exists a Docker Engine guide at /docs/administration/self-hosting/deployment-options/local-docker/." → ✅ verified (evidence: The file content/docs/administration/self-hosting/deployment-options/local-docker.md exists in pulumi/docs at master, confirming the linked page /docs/administration/self-hosting/deployment-options/local-docker/ resolves.; source: gh api repos/pulumi/docs/contents/content/docs/administration/self-hosting/deployment-options -> local-docker.md)
  • L133 in content/product/self-hosted.md "Self-hosted Pulumi's container images run on any OCI-compatible orchestrator." → ✅ verified (framing: Docs list specific supported orchestrators (Docker, ECS, EKS, AKS, GKE, BYO K8s) which are all OCI-compatible; the broader "any OCI-compatible orchestrator"…; evidence: Self-hosting docs confirm Pulumi Cloud ships as container images deployable via Docker Compose, Docker Engine, ECS, EKS, AKS, GKE, or any "conformant" (BYO) Kubernetes cluster — i.e., standard OCI images runnable on any compliant…; source: repo:content/docs/administration/self-hosting/_index.md and repo:content/product/self-hosted.md)
  • L142 in content/product/self-hosted.md "There exists an operations guide at /docs/administration/self-hosting/operations/ covering architecture, compute sizing, database and object storage…" → ✅ verified (framing: Source covers HA/DR/monitoring/sizing/security broadly with linked subsections for database, object storage, and network; claim's listed topics…; evidence: The operations guide page exists at content/docs/administration/self-hosting/operations/_index.md with meta_desc: "Production operations guide for self-hosted Pulumi Cloud covering high availability, disaster recovery, monitoring…; source: repo:content/docs/administration/self-hosting/operations/_index.md)
  • L148 in content/product/self-hosted.md "Self-hosted Pulumi's high-availability architecture runs stateless API and console services across availability zones, in front of a managed MySQL cluster…" → ✅ verified (evidence: The self-hosting operations guide corroborates this: "Database deployed in multi-AZ configuration", "Network configured with public and private subnets across 2+ AZs", "API service and console deployed with 2+ replicas", and "Object…; source: repo:content/docs/administration/self-hosting/operations/_index.md)
  • L152 in content/product/self-hosted.md "Self-hosted Pulumi's documented recovery targets are under 5 minutes for an availability zone failure, under 1 minute for an Aurora failover, and 1 to 4…" → ✅ verified (evidence: (escalated from pass3) The self-hosting operations guide's RTO table states: "Single AZ failure | Automatic failover (DB, compute, LB) | < 5 minutes", "Database instance failure | Automatic failover to replica | < 1 minute (Aurora), < 5…; source: content/docs/administration/self-hosting/operations/backup-recovery.md)
  • L156 in content/product/self-hosted.md "The self-hosted upgrade process involves pinning the image tag, running migrations before rolling services, and staging through a test environment." → ✅ verified (evidence: The self-hosting Upgrades doc page corroborates all three elements: "Pin the imageTag to a specific version rather than using latest," "Run database migrations before updating service containers," and "Test new versions in a staging…; source: repo:content/docs/administration/self-hosting/operations/upgrades.md)
  • L160 in content/product/self-hosted.md "There exists a monitoring guide at /docs/administration/self-hosting/operations/monitoring/ that gives a three-tier alerting strategy and the metrics worth…" → ✅ verified (evidence: The page at content/docs/administration/self-hosting/operations/monitoring.md exists with a "Three-tier alerting strategy" section (Alert/Notification/Information tiers) and a "Key metrics to monitor" section listing metrics worth paging…; source: repo:content/docs/administration/self-hosting/operations/monitoring.md)
  • L172 in content/product/self-hosted.md "Pulumi's architecture, key hierarchy, and operational controls are documented in Pulumi's security whitepaper." → ✅ verified (evidence: The linked whitepaper (content/security/pulumi-cloud-security-whitepaper.md) contains "High-Level Architecture" sections, an "Encryption Key Hierarchy" section ("The platform implements a three-tier key hierarchy that separates key…; source: content/security/pulumi-cloud-security-whitepaper.md)
  • L172 in content/product/self-hosted.md "Pulumi Cloud is covered by an annual SOC 2 Type II audit performed by an independent CPA firm." → 🤝 matches (evidence: Sibling page content/pricing/_index.md FAQ confirms: "Is Pulumi SOC 2 compliant? Yes, Pulumi has completed the SOC 2 Type 2 compliance process." This corroborates the self-hosted.md claim's core assertion of SOC 2 Type II certification…; source: repo:content/pricing/_index.md (line 138-139))
  • L174 in content/product/self-hosted.md "There exists a security whitepaper at /security/pulumi-cloud-security-whitepaper/." → 🤝 matches (evidence: content/security/_index.md independently links to the same path twice: "the architecture that makes this true is described in the security whitepaper" and "The [security…; source: content/security/_index.md)
  • L180 in content/product/self-hosted.md "cta_link: /docs/administration/self-hosting/airgapped/" → ❌ contradicted (evidence: The linked path /docs/administration/self-hosting/airgapped/ does not exist: content/docs/administration/self-hosting/airgapped/_index.md is absent from the repo, and the self-hosting section's own index page…; source: repo:content/docs/administration/self-hosting/_index.md; intuition: CTA links to a page that appears not to exist yet — likely a broken/aspirational link rather than a live doc.)
  • L182-184 in content/product/self-hosted.md "There is no Pulumi Authority to Operate (ATO) and no FedRAMP Marketplace listing for Pulumi." → 🤷 unverifiable (evidence: No FedRAMP Marketplace entry, press release, or news coverage was found indicating Pulumi has achieved FedRAMP Authorization or holds an Authority to Operate. Pulumi's own marketing pages discuss helping customers reduce their ATO…; source: WebSearch ran query "Pulumi FedRAMP Marketplace listing" and "Pulumi Authority to Operate ATO FedRAMP"; no result confirmed or denied Pulumi's own FedRAMP/ATO status directly via the live Marketplace database; intuition: Claim is a negative existence assertion (absence of ATO/listing) which is inherently hard to prove via search…)
  • L182-184 in content/product/self-hosted.md "There is no Pulumi Authority to Operate (ATO)." → 🤷 unverifiable (evidence: (escalated from pass3) The claim ("There is no Pulumi Authority to Operate (ATO)") is the reviewed file's own assertion about Pulumi's compliance status; it cannot verify itself. Confirming an absence of FedRAMP ATO/authorization would…; source: content/product/self-hosted.md (self-referential; no independent source checked))
  • L182-184 in content/product/self-hosted.md "There is no FedRAMP Marketplace listing for Pulumi." → 🤷 unverifiable (evidence: Web searches for a Pulumi FedRAMP Marketplace listing returned no evidence of Pulumi appearing in the FedRAMP Marketplace database (which lists 506+ authorized services); instead results only showed Pulumi's Neo AI agent helping other…; source: WebSearch ran query "Pulumi fedramp.gov marketplace"; top results didn't show a Pulumi listing or explicitly confirm its absence)
  • L195 in content/product/self-hosted.md "Self-hosting is part of Pulumi Business Critical, along with self-hosted Pulumi ESC and self-hosted Discovery scans and policy evaluations." → ✅ verified (framing: Source confirms self-hosted Pulumi Cloud requires Business Critical; claim adds sibling self-hosted ESC/Discovery features under the same edition, which is a…; evidence: The pricing FAQ page (/pricing/) explicitly states: "we offer a self-hosted Pulumi Cloud for companies that have specific data control requirements... This option is available in Business Critical Edition," confirming self-hosting is…; source: content/pricing/_index.md L141)
  • L197 in content/product/self-hosted.md "There exists a pricing page at /pricing/." → ✅ verified (evidence: content/pricing/_index.md exists with front matter title "Pricing" and no custom URL override, so it resolves to /pricing/ per Hugo's directory-based routing.; source: repo:content/pricing/_index.md)
  • L200 in content/product/self-hosted.md "Pulumi Cloud at app.pulumi.com provides high availability, disaster recovery, and upgrades without the customer operating anything." → ✅ verified (evidence: The same page documents that self-hosted customers must operate HA (multi-AZ stateless services, managed MySQL), recovery targets (AZ failover <5min, Aurora failover <1min, region rebuild 1-4hr), and upgrades themselves (Day 2 section)…; source: repo:content/product/self-hosted.md (lines 138-154, 198-200))
  • L202 in content/product/self-hosted.md "There exists a page comparing Pulumi editions at /docs/administration/onboarding-guide/choose-edition/." → ✅ verified (evidence: The file content/docs/administration/onboarding-guide/choose-edition.md exists at that path, titled "Select the right model and edition," with a "Choose your edition" section comparing Individual/Team vs Enterprise/Business Critical…; source: repo:content/docs/administration/onboarding-guide/choose-edition.md)
  • L209 in content/product/self-hosted.md "Requesting a self-hosted Pulumi proof of concept results in a solutions architect walking through the target environment, sizing the installation, and…" → 🤷 unverifiable (framing: Source only states PoC leads to connecting with a solutions architect and starting evaluation; the claim adds specific unverified steps (sizing, installer…; evidence: Pulumi's self-hosted product and pricing pages confirm requesting a PoC connects you with a solutions architect for evaluation, e.g. "Fill out the form to connect with a solutions architect and start your evaluation," but no page…; source: https://www.pulumi.com/product/self-hosted/ (WebSearch dispatched but verification did not converge within the turn budget))
  • L210 in content/product/self-hosted.md "hubspot_form_id: b6ff58c0-2b40-4202-9a7f-d6d8aca4414a" → ➖ not-a-claim (evidence: This is a HubSpot form UUID used as internal front-matter configuration for a form embed, not a falsifiable factual/numerical assertion.; source: content/product/self-hosted.md front matter)
  • L3 in content/security/_index.md "Pulumi holds SOC 2 Type II attestation." → ✅ verified (evidence: (escalated from pass1) Pulumi's own security page confirms this directly: "The Pulumi platform employs industry best practices for security and is SOC 2 Type II certified," and this is corroborated across multiple Pulumi pages including…; source: https://www.pulumi.com/security/)
  • L3 in content/security/_index.md "Pulumi's security posture includes not certifying to certain frameworks (implying Pulumi does not hold certain other certifications)." (also L13) → ➖ not-a-claim (evidence: This "claim" is a holistic/interpretive reading about page framing/omission (an inference about what the page implies by not mentioning certain certifications), not a specific falsifiable factual assertion. Pulumi's actual security page…; source: https://www.pulumi.com/security/; https://www.pulumi.com/docs/administration/onboarding-guide/setting-up-for-success/)
  • L4-6 in content/security/_index.md "The paths /trust/ and /trust-center/ are aliases that redirect to the Pulumi Security page." → ✅ verified (evidence: The page's frontmatter lists aliases: - /trust/ - /trust-center/, which in Hugo generates redirects from those paths to this page.; source: repo:content/security/_index.md)
  • L11 in content/security/_index.md "Pulumi Cloud is covered by an annual SOC 2 Type II audit performed by an independent CPA firm against the AICPA Trust Services Criteria." (also L13) → ✅ verified (evidence: The pricing FAQ (content/pricing/_index.md) independently corroborates: "Is Pulumi SOC 2 compliant? Yes, Pulumi has completed the SOC 2 Type 2 compliance process." This confirms Pulumi Cloud undergoes SOC 2 Type II attestation…; source: repo:content/pricing/_index.md (line 138-139))
  • L15 in content/security/_index.md "The Pulumi Cloud security whitepaper describes the architecture that ensures Pulumi Cloud never receives customer cloud credentials or standing account access." → ✅ verified (framing: The whitepaper describes the general execution/credential architecture (ephemeral environments, short-lived scoped credentials) that entails the narrower…; evidence: The whitepaper describes deployment execution as occurring in ephemeral, isolated execution environments that apply changes against cloud provider APIs using short-lived, narrowly scoped credentials rather than standing authority ("Agent…; source: content/security/pulumi-cloud-security-whitepaper.md)
  • L17 in content/security/_index.md "Pulumi's pre-built policy packs help customers assess their own infrastructure against a compliance framework rather than serving as a statement about…" → ➖ not-a-claim (evidence: The claim is a verbatim paraphrase of the file's own text: "Pulumi also publishes pre-built policy packs... Those help you assess your infrastructure against a framework; they are not a statement about Pulumi's own certification…; source: content/security/_index.md:17)
  • L21 in content/security/_index.md "A program that requires a FedRAMP-authorized service cannot use hosted Pulumi Cloud to satisfy that requirement." → ✅ verified (framing: Source states the broader fact (no authorization, no ATO, no marketplace listing); claim states the narrower entailed consequence for programs specifically…; evidence: The same sentence in the doc states "Pulumi holds no FedRAMP authorization. There is no Pulumi ATO and no listing in the FedRAMP Marketplace." The claim that a program requiring a FedRAMP-authorized service cannot use hosted Pulumi Cloud…; source: repo:content/security/_index.md L21)
  • L21 in content/security/_index.md "Pulumi has no listing in the FedRAMP Marketplace." → 🤷 unverifiable (evidence: (escalated from pass1) Web search did not surface any FedRAMP Marketplace listing page for Pulumi, nor any authoritative source explicitly confirming Pulumi has never had a listing. The FedRAMP Marketplace is a searchable government…; source: WebSearch ran query "Pulumi FedRAMP Marketplace listing" and ""Pulumi" FedRAMP compliance status marketplace.fedramp.gov"; top results didn't address the claim)
  • L21 in content/security/_index.md "There is no Pulumi Authority to Operate (ATO)." → 🤷 unverifiable (evidence: (escalated from pass1) Pulumi's official security page states Pulumi is "SOC 2 Type II certified" and directs readers to a security whitepaper, with no mention of holding a FedRAMP Authority to Operate itself; related Pulumi marketing…; source: https://www.pulumi.com/security/; intuition: This is a negative/absence claim about Pulumi's own compliance status — public marketing pages don't typically state… (WebSearch dispatched but verification did not converge within the turn budget))
  • L23 in content/security/_index.md "Self-hosted Pulumi Cloud is installed and operated by the customer in their own environment." → ✅ verified (evidence: The source file itself states: "Self-hosted Pulumi Cloud changes who owns the boundary. Because you install and operate it in your own environment, it is a software component in your inventory..." This matches…; source: content/security/_index.md L23; product concept corroborated by /docs/administration/self-hosting/ documentation of self-managed Pulumi Cloud deployment)
  • L27 in content/security/_index.md "The Pulumi Cloud security whitepaper describes a three-tier encryption key hierarchy and its KMS integration." → ✅ verified (evidence: The whitepaper at /security/pulumi-cloud-security-whitepaper/ has a section "Encryption Key Hierarchy" stating "The platform implements a three-tier key hierarchy..." and a separate section "Key Management Service Integration" describing…; source: content/security/pulumi-cloud-security-whitepaper.md)
  • L31 in content/security/_index.md "Pulumi's Privacy Statement describes what personal data Pulumi collects and how it is handled, including transfers out of the EEA under standard contractual…" → ✅ verified (evidence: Pulumi's Privacy Policy at pulumi.com/privacy/ states: "we will ensure that such recipient offers an adequate level of protection, for instance by entering into standard contractual clauses for the transfer of data as approved by the…; source: https://www.pulumi.com/privacy/)
  • L48 in data/header_nav.yaml "href: /product/self-hosted/" → ✅ verified (evidence: content/product/self-hosted.md exists (title: 'Self-Hosted Pulumi Cloud'), which Hugo resolves to the URL path /product/self-hosted/ referenced in the nav link.; source: repo:content/product/self-hosted.md)
  • L123 in data/header_nav.yaml "href: /product/self-hosted/" → ✅ verified (evidence: content/product/self-hosted.md exists with title "Self-Hosted Pulumi Cloud" and full page content, confirming the href /product/self-hosted/ in header_nav.yaml (used twice, lines 48 and 123) resolves to a real, live page.; source: repo:content/product/self-hosted.md)
  • L215 in data/pulumi_pricing.yaml "- 'Self-hosting available'" → ✅ verified (evidence: The linked page content/product/self-hosted.md exists at URL path /product/self-hosted/ and is titled "Self-Hosted Pulumi Cloud" with description "Run the full Pulumi Cloud platform in your own AWS, Azure, Google Cloud, or on-premises…; source: repo:content/product/self-hosted.md)
  • L77 in layouts/index.llms.txt "- Self-hosted Pulumi Cloud: Run the full Pulumi Cloud platform in your own cloud account or data center…" → ✅ verified (evidence: content/product/self-hosted.md's meta_desc and hero copy state: "Run the full Pulumi Cloud platform in your own AWS, Azure, Google Cloud, or on-premises environment, including fully air-gapped networks," and describes an "Air-gapped…; source: repo:content/product/self-hosted.md)
  • L7 in layouts/partials/template-partials/template-hubspot-form.html "The anchor is part of the contract, not decoration: /product/self-hosted/" → ➖ not-a-claim (evidence: This is a code comment documenting the author's own design decision (the anchor ID contract for this Hugo partial), not a falsifiable third-party assertion. The referenced path /product/self-hosted/ is just an example use-site mentioned…; source: repo:layouts/partials/template-partials/template-hubspot-form.html)
  • L10 in layouts/shortcodes/self-hosting-schema-v2-note.html "{{ printf 'Upgrading an existing installation? The current installers enable the V2 engine events database schema (PULUMI_ENGINE_EVENTS_SCHEMA_V2).…" → ✅ verified (evidence: (escalated from pass3) content/support/_index.md exists and redirects to https://support.pulumi.com/, so the Contact Pulumi support link target is a real, functioning page consistent with the claim's link text.; source: repo:content/support/_index.md)
  • L3 in layouts/shortcodes/self-hosting-schema-v2-note.markdown.md "> Warning: Upgrading an existing installation? The current installers enable the V2 engine events database schema (PULUMI_ENGINE_EVENTS_SCHEMA_V2).…" → ✅ verified (evidence: (escalated from pass3) content/support/_index.md exists and redirects to https://support.pulumi.com/, confirming the /support/ link target referenced in the shortcode is valid.; source: repo:content/support/_index.md)
  • L1 in content/docs/_index.md "frontmatter alias /docs/reference/ collides with content/docs/reference/_index.md" → 🚩 flagged (frontmatter: alias-collision)
  • L109 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "the ECS application walkthrough sets route53ZoneName / route53Subdomain and omits recaptchaSiteKey / recaptchaSecretKey" → ❌ contradicted (evidence: the application project reads stackConfig.require("domainName"), stackConfig.get("subDomain"), stackConfig.require("recaptchaSiteKey") and stackConfig.requireSecret("recaptchaSecretKey") — no route53* key is read at all; source: github:pulumi/pulumi-self-hosted-installers ecs-hosted/ts/application/config.ts)
  • L61 in content/docs/administration/self-hosting/deployment-options/ecs-hosted.md "the ECS installer's dbInstanceType default is db.t3.small" → ❌ contradicted (evidence: the base-infrastructure project reads stackConfig.get("dbInstanceType") || "db.t3.medium"; source: github:pulumi/pulumi-self-hosted-installers ecs-hosted/ts/infrastructure/config.ts)
  • L4 in layouts/shortcodes/self-hosted-first-admin-note.html "the two new note shortcodes hand-roll <div class=\"note note-warning\"> instead of rendering through the shared callout partial" → ⚔️ mismatch (evidence: AGENTS.md §Pulumi Cloud availability markers states callout markup for every callout type comes from layouts/partials/notes.html, including the dark-mode &.note-<type> styling contract; source: repo:AGENTS.md)

  • 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

Copy link
Copy Markdown
Contributor

🚨 Outstanding in this PR

These must be resolved or refuted before merging.

  • [L96-97] content/docs/administration/self-hosting/airgapped.md"Deploy the Pulumi API server, database, and storage backend with the bring-your-own-infrastructure installer, which applies Kubernetes manifests to a cluster you already operate." — verdict: contradicted — The BYO-infra installer is a Pulumi program: you pulumi login to a self-managed backend and run pulumi up, which is what byo-infra-hosted.md says two clicks away ("uses Pulumi to deploy the Pulumi Cloud… run pulumi up"). "Applies Kubernetes manifests" describes a different tool, and in an air-gapped context it matters — a reader planning the transfer needs to know they're carrying a Pulumi program and its provider plugins, not a manifest bundle.

    * Deploy the Pulumi API server, database, and storage backend with the [bring-your-own-infrastructure installer](/docs/administration/self-hosting/deployment-options/byo-infra-hosted/), a Pulumi program you run with `pulumi up` against a self-managed state backend and a Kubernetes cluster you already operate.
  • [L51] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"License. A PULUMI_LICENSE_KEY and an AG Grid license key." — verdict: mismatch — The AG Grid key is not required, and this page says so 139 lines later: the configuration reference marks agGridLicenseKey No. The installer agrees — ecs-hosted/ts/application/config.ts reads it with stackConfig.getSecret("agGridLicenseKey") while the license key uses stackConfig.require("licenseKey") — and components/console.md describes the AG Grid key as provided "if needed." The prerequisite list is also the one place on the page that names the license key as the environment variable PULUMI_LICENSE_KEY; every install step sets it as the Pulumi config key licenseKey. Fix both in one line:

    **License.** A Pulumi license key, set as the `licenseKey` config value on the application project. Your solutions architect will also provide an AG Grid key if your installation needs one.
  • [L59-64] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"The application configuration reference lists aws:region, vpcId, subnet IDs, imageTag, licenseKey, acmCertificateArn, kmsServiceKeyId…" — verdict: contradicted — Four rows of the Application table don't match ecs-hosted/ts/application/config.ts, and Pulumi config keys are case-sensitive, so a reader copying them gets a failed pulumi up rather than a warning:

    Table says Installer reads Required?
    route53ZoneName / route53Subdomain — Yes domainName / subDomain domainName required; subDomain defaults to ""
    openSearchUser / openSearchPassword — Yes opensearchUser / opensearchPassword (lowercase s) optional (.get())
    openSearchEndpoint / openSearchDomain — Yes opensearchEndpoint / opensearchDomainName optional (.get())
    dbPort — Yes, default 3306 requireNumber("dbPort") required, no default

    Marking the four OpenSearch keys required also contradicts the base-infrastructure table on the same page, where enableOpenSearch is optional — an installation without OpenSearch has nothing to put in them. Two rows are missing entirely: recaptchaSiteKey (require) and recaptchaSecretKey (requireSecret) are both mandatory.

  • [L61] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"| dbInstanceType | db.t3.small — burstable; see Database |" — verdict: contradicted — The installer's default is db.t3.medium: ecs-hosted/ts/infrastructure/config.ts reads stackConfig.get("dbInstanceType") || "db.t3.medium". The value appears twice on this page (Sizing table L61, configuration reference L147) and once on operations/database.md; all three need the same edit. db.t3.medium is still burstable, so the surrounding "raise it before production" guidance holds unchanged.

  • [L109] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"pulumi config set route53ZoneName example.com" — verdict: contradicted — The copy-pasteable install steps set config keys the installer never reads. ecs-hosted/ts/application/config.ts reads domainName and subDomain, so as written step 3 leaves domainName unset and pulumi up fails on a missing required config value — and the two required reCAPTCHA keys are absent from the walkthrough entirely. Same fix in step 4 (L127) and the DNS table (L199).

    pulumi config set domainName example.com
    pulumi config set subDomain pulumi
    pulumi config set recaptchaSiteKey <recaptcha-site-key>
    pulumi config set recaptchaSecretKey <recaptcha-secret-key> --secret

    Worth a pass over the whole walkthrough against config.ts while you're in here: apiDisabledEmailLogin / apiDisabledEmailSignup (L179, L192) are read as apiDisableEmailLogin / apiDisableEmailSignUp, and consoleDesiredNumberTasks (L184) is read as consoleDesirecNumberTasks — an upstream typo, but until it's fixed there the documented spelling silently does nothing.

  • [L239] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"Aurora and S3 carry deletion protection, so remove that first if you intend to delete the data." — verdict: contradicted — The mechanism is Pulumi's protect resource option, not AWS deletion protection: infrastructure/database.ts creates the Aurora cluster with deletionProtection: false and { protect: true }, and the S3 buckets in application/index.ts are { protect: true } too. A reader who goes looking for a deletion-protection setting in the RDS console won't find one enabled, and pulumi destroy will still refuse.

    Destroy the projects in reverse order — `dns`, then `application`, then `infrastructure`. The Aurora cluster and the S3 buckets are created with the [`protect` resource option](/docs/iac/concepts/resources/options/protect/), so `pulumi destroy` refuses to delete them until you clear it with `pulumi state unprotect`.
  • [L243] content/docs/administration/self-hosting/deployment-options/ecs-hosted.md"…the buckets the installer creates, which are named pulumi-checkpoint-* and pulumi-policy-*." — verdict: contradicted — Both prefixes are wrong, and one bucket is missing. application/index.ts creates pulumi-checkpoints, pulumi-policypacks, and pulumi-service-metadata (Pulumi appends a random suffix, so -* is the right shape). The metadata bucket matters for the advice being given: this page's own "What gets deployed" table says S3 holds "Checkpoints, policy packs, and service metadata," so a reader who sets up AWS Backup from this list backs up two of the three.

    The installer creates three buckets — `pulumi-checkpoints-*`, `pulumi-policypacks-*`, and `pulumi-service-metadata-*` — each with a generated name suffix.
  • [L65-72] content/docs/administration/self-hosting/operations/database.md"| AWS ECS | db.t3.small | Burstable; raise dbInstanceType before running production workloads |" — verdict: unverifiable — Verified in-review: the ECS installer's default is db.t3.medium, not db.t3.small (ecs-hosted/ts/infrastructure/config.ts). dbInstanceType is the right key name and the "raise it before production" guidance is right; only the value needs changing, here and in the two places on the ECS page.

  • [L29] content/docs/administration/self-hosting/operations/telemetry.md"| OTEL_EXPORTER_OTLP_PROTOCOL | (Optional) … Valid values are http or grpc. Defaults to grpc. |" — verdict: contradicted — http is not a value the OTLP spec defines; the protocol values are grpc, http/protobuf, and http/json. The row is carried over verbatim from components/api.md (see 💡), but this PR makes this page the canonical home for it, and it's cheap to fix in the one place readers are now sent. Confirm which the API service actually accepts, then state those literals — a reader who sets http and gets a startup failure has no way to guess http/protobuf.

  • [L24] content/docs/administration/self-hosting/system-requirements.md"| AG_GRID_LICENSE_KEY | Yes | Set on the console container. |" — verdict: mismatch — Two sibling pages contradict this. components/console.md lists AG_GRID_LICENSE_KEY as "provided by a Pulumi representative" if needed, and the ECS installer reads its config equivalent with getSecret (optional) — so this new page is the only place calling it mandatory, on the page most likely to be treated as authoritative. Change Required to "If needed" and say what breaks without it (the console's grid views), so a reader running an evaluation without one knows what to expect.

  • [L83-85] content/product/self-hosted.md"Every option below ships as a Pulumi program in pulumi-self-hosted-installers." — verdict: contradicted — The first card under that sentence is Docker Compose, which ships as compose files and a run-ee.sh shell script, not a Pulumi program. "Something else?" isn't one either. The claim is doing real work — it's the page's argument for treating the installers as reference architectures — so keep it and scope it:

    Every production option below ships as a Pulumi program in [pulumi-self-hosted-installers](https://github.com/pulumi/pulumi-self-hosted-installers) (the Docker Compose evaluation stack ships as compose files). Run them as they are, or treat them as reference architectures and fold the resources into your own pipeline — plenty of customers do.

⚠️ Low-confidence

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

  • [L325-328] content/docs/administration/self-hosting/components/api.md"The PULUMI_ENABLE_DEPRECATED_METRICS environment variable is optional and controls whether the API service continues emitting API service metrics in a…" — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L327] content/docs/administration/self-hosting/components/api.md"PULUMI_ENABLE_DEPRECATED_METRICS defaults to true." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L60] content/docs/administration/self-hosting/deployment-options/eks-hosted.md"The installer's README file, located at https://github.com/pulumi/pulumi-self-hosted-installers/tree/master/eks-hosted/README.md, describes how to set the…" — verdict: framing-drift; framing: shifted — claim attributes the imageTag documentation to eks-hosted/README.md, but that specific config property is actually documented in a per-project README — The top-level eks-hosted/README.md doesn't document imageTag; the per-project README does, and this same page now correctly names a specific project for the Kubernetes version ("Set clusterVersion in the 05-eks-cluster project"). Do the same here:

    See the installer's README file to set the imageTag configuration property for the installer to use.

    …becomes: "Set imageTag in the 90-pulumi-service project's stack configuration — see that project's README." Substitute whichever project actually owns it; the point is to send the reader to the README that mentions the property rather than to the repository root.

  • [L3] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"Self-hosted Pulumi Cloud can be evaluated in about ten minutes with the all-in-one Docker Compose stack." — verdict: unverifiable — Author question: "about ten minutes" is a promise a reader will time you against, and it now rides the page's meta_desc, h1, and title_tag. On a cold host it includes pulling five images (pulumi/service, pulumi/console, pulumi/migrations, MySQL 8.0, and OpenSearch 2.11) plus the schema migration. If that hasn't been measured, "in minutes" carries the same message without the stopwatch.

  • [L3] content/docs/administration/self-hosting/operations/telemetry.md"Metrics and traces exported from a self-hosted Pulumi Cloud installation can be scraped or remote-written into Prometheus." — verdict: framing-drift; framing: Source: "two options to get metrics into Prometheus" (scrape/remote-write) — metrics only; claim states "Metrics and traces … can be scraped or remote-written" — Prometheus stores metrics, not traces, and the page's own Prometheus section is metrics-only (both examples put traces on a logging/debug exporter). The drifted phrasing is in meta_desc, so it's what search results and AI answers will quote:

    meta_desc: Export metrics and traces from a self-hosted Pulumi Cloud installation via OpenTelemetry, and scrape or remote-write them into Prometheus.

    meta_desc: Export metrics and traces from a self-hosted Pulumi Cloud installation via OpenTelemetry, and scrape or remote-write metrics into Prometheus.
  • [L28-31] content/docs/administration/self-hosting/operations/telemetry.md"The PULUMI_ENABLE_DEPRECATED_METRICS environment variable is optional and controls whether the API service continues emitting API service metrics in a…" — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L28] content/docs/administration/self-hosting/operations/telemetry.md"If OTEL_EXPORTER_OTLP_ENDPOINT is not set, the API service will use no-op metrics and traces." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L30] content/docs/administration/self-hosting/operations/telemetry.md"PULUMI_ENABLE_DEPRECATED_METRICS controls whether to continue emitting API service metrics in a log-based format." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L30] content/docs/administration/self-hosting/operations/telemetry.md"PULUMI_ENABLE_DEPRECATED_METRICS defaults to true." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L23-24] content/docs/administration/self-hosting/system-requirements.md"The self-hosted Pulumi Cloud service will not start without the PULUMI_LICENSE_KEY." — verdict: unverifiable — Partly confirmed: quickstart-docker-compose/scripts/run-ee.sh exits with "Please set PULUMI_LICENSE_KEY" before starting anything, and the ECS page in this PR says the API cannot start without licenseKey. What's unconfirmed is the generalization to every installation path, which is how this table row reads.

  • [L26] content/docs/administration/self-hosting/system-requirements.md"Users receive both the PULUMI_LICENSE_KEY and AG_GRID_LICENSE_KEY as part of a self-hosted proof of concept." — verdict: framing-drift; framing: source: "get you the installer package and an evaluation license key" (singular, generic) vs claim: "receive both the PULUMI_LICENSE_KEY and AG_GRID_LICENSE_KEY" — /product/self-hosted/ in this same PR promises "the installer package and an evaluation license key" — singular — and components/console.md says the AG Grid key is provided "if needed." So this sentence promises a second key the PoC copy doesn't. It's the same root cause as the AG Grid requiredness finding in 🚨; fixing that row here fixes this sentence too:

    You receive both as part of a proof of concept.

    …becomes: "You receive your license key as part of a proof of concept; ask your solutions architect for an AG Grid key if your installation needs one."

  • [L35] content/docs/administration/self-hosting/system-requirements.md"| Console | 0.5 vCPU | 512 MB |" — verdict: unverifiable — No external source, but the whole compute table matches the existing Compute sizing page (API 2048m / 4096 Mi, Console 512m / 512 Mi), so this is consistent with what Pulumi already publishes. Worth a glance to confirm the migrations row (128m / 128 MB), which has no counterpart on that page.

  • [L38] content/docs/administration/self-hosting/system-requirements.md"A single-host evaluation of a self-hosted Pulumi Cloud installation needs at least 2 CPU cores and 8 GB of memory." — verdict: unverifiable — No external source, but it matches the prerequisite the Docker Compose page states in this same PR ("at least 2 CPU cores, 8 GB of memory, and 20 GB of free disk"), so the two new pages agree. Note the all-in-one stack also runs OpenSearch and OpenSearch Dashboards; if 8 GB is tight with those two containers, say so here rather than letting a reader discover it.

  • [L52-58] content/docs/administration/self-hosting/system-requirements.md"The application user for self-hosted Pulumi Cloud's database must be granted ALL PRIVILEGES on the pulumi database and the CREATE USER privilege globally…" — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L60] content/docs/administration/self-hosting/system-requirements.md"Inbound ICMP (ping) must be enabled on the MySQL server for self-hosted Pulumi Cloud because the installer's connectivity check depends on it." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L71] content/docs/administration/self-hosting/system-requirements.md"Self-hosted Pulumi Cloud requires a minimum of 200 GB SSD storage for object storage." — verdict: unverifiable — No external source, but it matches the existing Compute sizing page ("Object storage — S3-compatible, 200 GB+ SSD"), as does the 20 GB database figure. Consistent with what Pulumi already publishes.

  • [L41] content/docs/administration/self-hosting/troubleshooting.md"Configuring the object store and every intermediary to preserve the Content-Encoding: gzip header fixes garbled state or policy pack downloads." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L45] content/docs/administration/self-hosting/troubleshooting.md"When connection failures to a bring-your-own MySQL server occur, the installer cannot reach a MySQL server that is otherwise up and accepting connections." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L47] content/docs/administration/self-hosting/troubleshooting.md"Connection failures to a bring-your-own MySQL server are caused by inbound ICMP being disabled on the database server." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L69] content/docs/administration/self-hosting/troubleshooting.md"Running the containers on more than one Docker host produces migration errors or repeated migration attempts." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L73] content/docs/administration/self-hosting/troubleshooting.md"Setting disableDbMigrations on every host except the one that owns migrations fixes duplicate or failed migrations across multiple Docker hosts." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L77] content/docs/administration/self-hosting/troubleshooting.md"After enabling SAML SSO, an unexpected account can end up owning SAML administration." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L79] content/docs/administration/self-hosting/troubleshooting.md"Setting samlEnabled: true does not by itself block email and password signup." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L81] content/docs/administration/self-hosting/troubleshooting.md"Setting PULUMI_HIDE_EMAIL_SIGNUP hides the email signup option on the console but does not disable the underlying signup handler." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L81] content/docs/administration/self-hosting/troubleshooting.md"Creating the intended administrator account first, before sharing the console URL, fixes the unexpected-account-owns-SAML-administration problem." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L93] content/docs/administration/self-hosting/troubleshooting.md"Contacting Pulumi support requires providing the installer, its version, and the failing container's logs." — verdict: unverifiable — Author question: no public source states this; it describes internal installer or service behavior that a reader has no way to check. Confirm it against the installer package or the service source before merging.

  • [L55] content/docs/iac/comparisons/terraform/_index.md"Terraform Enterprise is HashiCorp's self-managed offering, and Sentinel policy, run tasks, and no-code provisioning are gated to HCP Terraform and Enterprise…" — verdict: framing-drift; framing: Claim collapses distinct per-feature tier gating (run tasks on Free; Sentinel/no-code on Standard+) into a single "gated to HCP Terraform and Enterprise" — The three features named are gated differently — run tasks are available on HCP Terraform's free tier, while Sentinel and no-code provisioning need a paid tier — so the sentence overstates the gating on a competitor page, which is exactly where a reader will check us:

    Sentinel policy, run tasks, and no-code provisioning are gated to HCP Terraform and Enterprise tiers

    Sentinel policy and no-code provisioning require a paid HCP Terraform tier or Terraform Enterprise

    Dropping "run tasks" costs the comparison nothing and removes the one claim HashiCorp's own pricing page contradicts.

  • [L87-89] content/docs/iac/comparisons/terraform/_index.md"The self-hosted edition of Pulumi Cloud tracks the same capabilities as the SaaS edition." — verdict: unverifiable — This PR asserts unqualified parity in five places (here, the comparison table row, the Terraform Enterprise page, /product/self-hosted/, and layouts/index.llms.txt), and the pages themselves name exceptions: Discovery and policy evaluation need customer-managed runners, resource search needs an OpenSearch cluster you run, and OpenTelemetry "is not yet available for the console service." Consider "the same capabilities as Pulumi Cloud Business Critical, with the components you operate yourself" — it survives the first feature that lands SaaS-first, and this phrasing will be quoted back at you in procurement reviews.

  • [L24] content/product/self-hosted.md"Most Pulumi customers run on the hosted service at app.pulumi.com." — verdict: unverifiable — An internal business fact no reader can check, and it's doing useful work here (steering people away from self-hosting they don't need). Keep it if the number backs it up; if nobody can point at that number, "Pulumi Cloud at app.pulumi.com is the right choice for most teams" makes the same argument without asserting a distribution.

  • [L182-184] content/product/self-hosted.md"There is no Pulumi Authority to Operate (ATO) and no FedRAMP Marketplace listing for Pulumi." — verdict: unverifiable — Absence-of-listing statements are hard to verify positively, and this one errs toward claiming less than Pulumi might be able to, so the reader risk is low. Two notes: the FedRAMP Marketplace is publicly searchable, so a dated qualifier ("as of <month year>") would let a reader confirm it themselves; and this claim is now stated on three pages (/product/self-hosted/ compliance column, /security/, and the hero copy), so it needs one owner who updates all three if the posture ever changes. This one goes furthest by naming both facts in a single sentence — it's the wording worth keeping.

  • [L182-184] content/product/self-hosted.md"There is no Pulumi Authority to Operate (ATO)." — verdict: unverifiable — Same sentence as above, extracted separately. Covered by the dated-qualifier and single-owner notes on the combined claim.

  • [L182-184] content/product/self-hosted.md"There is no FedRAMP Marketplace listing for Pulumi." — verdict: unverifiable — Same sentence as above, extracted separately. Covered by the dated-qualifier and single-owner notes on the combined claim.

  • [L209] content/product/self-hosted.md"Requesting a self-hosted Pulumi proof of concept results in a solutions architect walking through the target environment, sizing the installation, and…" — verdict: unverifiable; framing: Source only states PoC leads to connecting with a solutions architect and starting evaluation; the claim adds specific unverified steps (sizing, installer package, evaluation license key) — This is a commitment on a form-backed page, so it should match what the PoC process actually does. If a solutions architect doesn't reliably size the installation on that first call, trim the promise to what they do — sales pages are the worst place to be more specific than the process.

  • [L21] content/security/_index.md"Pulumi has no listing in the FedRAMP Marketplace." — verdict: unverifiable — The /security/ copy of the same posture statement. If you add a dated qualifier on /product/self-hosted/, add it here too — this page now answers to /trust/ and /trust-center/ aliases, so it's the URL a procurement reviewer will land on.

  • [L21] content/security/_index.md"There is no Pulumi Authority to Operate (ATO)." — verdict: unverifiable — Same sentence as above, extracted separately. Covered by the note on the /security/ FedRAMP Marketplace claim.

  • [L4] layouts/shortcodes/self-hosted-first-admin-note.html"<div class="note note-warning">" — verdict: mismatch — Both new note shortcodes (self-hosted-first-admin-note.html and self-hosting-schema-v2-note.html) hand-roll the callout markup instead of rendering through layouts/partials/notes.html, which AGENTS.md names as the single source for every callout type. The duplicated markup happens to match today, but it won't track changes to the shared partial, and the icon/&.note-warning dark-mode contract in _docs-theme.scss is keyed to what that partial emits — these shortcodes fan out across nine self-hosting pages, all of which support the dark toggle. Calling the partial with type "warning" and the body as content keeps the shortcode to a couple of lines and inherits both modes. Worth a dark-mode check on one of the deployment-option pages either way, since these are the only new visible elements in the PR.

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/docs/administration/self-hosting/deployment-options/aks-hosted.md — 1 (1 heading capitalization)
  • line 49: [style] heading capitalization — Heading 'Pulumi Cloud Updates' should use sentence case (capitalize only the first word and proper nouns). ✏️
content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md — 1 (1 heading capitalization)
  • line 49: [style] heading capitalization — Heading 'Pulumi Cloud Updates' should use sentence case (capitalize only the first word and proper nouns). ✏️
content/docs/administration/self-hosting/deployment-options/gke-hosted.md — 1 (1 heading capitalization)
  • line 48: [style] heading capitalization — Heading 'Pulumi Cloud Updates' should use sentence case (capitalize only the first word and proper nouns). ✏️
content/docs/administration/self-hosting/deployment-options/local-docker.md — 1 (1 heading capitalization)
  • line 60: [style] heading capitalization — Heading 'Pulumi Cloud Updates' should use sentence case (capitalize only the first word and proper nouns). ✏️
content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md — 1 (1 wordiness)
  • line 87: [style] wordiness — 'obtain' is too wordy. ✏️

📋 Triaged verifier findings

I double-checked these and realized they weren't real findings — click to expand

Several verdicts in this batch compared the PR's new text against the currently published docs pages, which this PR is rewriting precisely because they had drifted. Checking them against pulumi/pulumi-self-hosted-installers instead, the PR is right and the published page was wrong.

  • [L31] content/docs/administration/self-hosting/components/api.md"To change the default database endpoint, you must set the PULUMI_LOCAL_DATABASE_HOST and PULUMI_LOCAL_DATABASE_PORT environment variables."Spurious: PULUMI_LOCAL_DATABASE_HOST is the real variable — quickstart-docker-compose/scripts/run-ee.sh branches on ${PULUMI_LOCAL_DATABASE_HOST:-}. The verification step compared against the old published text, which used PULUMI_LOCAL_DATABASE_NAME for a hostname. This PR is the fix.

  • [L52] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"The stack is started by running ./scripts/run-ee.sh -f ./all-in-one/docker-compose.yml."Spurious: scripts/run-ee.sh sits inside quickstart-docker-compose/, which is the directory the preceding step cds into, and this exact invocation is the example in the script's own header comment.

  • [L77-79] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"The PULUMI_DATA_PATH environment variable … defaults to $HOME/pulumi-self-hosted-installers/data."Spurious: run-ee.sh sets DEFAULT_DATA_PATH="${HOME}/pulumi-self-hosted-installers/data". The /tmp/pulumi-ee/data default the verification step matched against is the stale value on the published page.

  • [L31] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"The run-ee.sh script exits immediately if the PULUMI_LICENSE_KEY environment variable is not set."Mis-sourced: confirmed in the script — the license-key check is the first thing after set -e and calls exit 1.

  • [L55] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"The default checkpoint data storage location can be overridden with the PULUMI_DATA_PATH environment variable."Mis-sourced: confirmed in the script, which honors PULUMI_DATA_PATH when set and falls back to the default otherwise.

  • [L85] content/docs/administration/self-hosting/deployment-options/quickstart-docker-compose.md"You can run against an existing MySQL 8.0 instance … pointing PULUMI_LOCAL_DATABASE_HOST and PULUMI_LOCAL_DATABASE_PORT at it."Mis-sourced: the variable names and the pulumi-self-hosted-installers network name both match run-ee.sh, and the pulumi/migrations image is pulled by all-in-one/docker-compose.yml, which supports the "no separate migration scripts" sentence in the same paragraph.

  • [L9] content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md"This page's navigation menu parent identifier is administration-self-hosting-deployment-options and its own identifier is…"Spurious: the identifiers match their parent exactly, as they do across all 25 renamed pages. The "historical reorg" narrative attached to the verdict isn't in the page.

  • [L45] content/docs/administration/self-hosting/deployment-options/byo-infra-hosted.md"A first-admin-related note … applies to the BYO Infrastructure Hosted System Management and Maintenance section…"Spurious: the shortcode is placed at the end of the deployment steps, which is the right place for it — immediately before a reader creates the first account. The section attribution came from the claim, not the page.

  • [L70] content/docs/administration/self-hosting/operations/database.md"For AWS ECS installations, the dbInstanceType should be raised before running production workloads."Mis-sourced: dbInstanceType is a real config key on the ECS base-infrastructure project, and its default is burstable, so the guidance is sound. (Only the stated default value is wrong — see 🚨.)

  • [L29] content/docs/administration/self-hosting/troubleshooting.md"When PULUMI_LICENSE_KEY is unset, run-ee.sh prints a message about contacting sales and exits before any container starts."Mis-sourced: the script prints "Please set PULUMI_LICENSE_KEY. If you don't have a license key, please contact sales@pulumi.com." and exits 1 before the compose invocation.

  • [L31] content/docs/administration/self-hosting/troubleshooting.md"The run-ee.sh script hard-fails when PULUMI_LICENSE_KEY is unset rather than starting a service that cannot run."Mis-sourced: same check, same script.

  • [L181] content/docs/iac/comparisons/terraform/_index.md"There is a Pulumi documentation page for migrating from Terraform Enterprise to self-hosted Pulumi Cloud, located at /docs/iac/comparisons/terraform/from-terraform-enterprise/…"Spurious: that page is added by this PR. The build preflight lists /docs/iac/comparisons/terraform/from-terraform-enterprise/ among the five new URLs, and the link resolves.

  • [L180] content/product/self-hosted.md"cta_link: /docs/administration/self-hosting/airgapped/"Spurious: content/docs/administration/self-hosting/airgapped.md renders at that path and also carries it as an explicit alias. The build's link-integrity pass reported no broken links.

💡 Pre-existing issues in touched files (optional)

  • [L326] content/docs/administration/self-hosting/components/api.md"| OTEL_EXPORTER_OTLP_PROTOCOL | (Optional) … Valid values are http or grpc. Defaults to grpc. |"Pre-existing: this table row is an unchanged context line; the PR only trims the surrounding OpenTelemetry section and links out to the new Telemetry page. http isn't an OTLP protocol value (grpc, http/protobuf, http/json are), so the row is wrong here too — but the copy on the new Telemetry page is the one to fix first, and this one should then match it or be deleted in favor of the link.

  • [L1] content/docs/_index.md — frontmatter alias /docs/reference/ collides with the live page content/docs/reference/_index.md, so the alias never takes effect. Pre-existing: the alias predates this PR, whose only change to this file is a new Self-Hosting section card. Worth deleting the dead alias in a follow-up rather than here — an alias that can never fire is a trap for whoever next moves /docs/reference/.

✅ Resolved since last review

No items resolved since the last review.

📜 Review history

  • 2026-08-17T19:30:10Z — First review: structure, nav renames, and links are clean; 11 blockers, mostly ECS config keys that don't match the installer, plus the AG Grid "required" claim (2c73a39)

  • 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:outstanding-issues Claude review completed; outstanding has author-actionable findings and removed review:in-progress Claude review is currently running labels Aug 17, 2026
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:infra PR touches workflows, scripts, infra, Makefile, or build config domain:mixed PR touches more than one domain domain:website PR touches marketing, pricing, legal, or competitive landing pages review:outstanding-issues Claude review completed; outstanding has author-actionable findings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants