Skip to content

Content review: content/docs/administration/self-hosting/components/api.md - #22195

Merged
CamSoper merged 1 commit into
masterfrom
content-review/docs-administration-self-hosting-components-api
Oct 8, 2026
Merged

CamSoper merged 1 commit into
masterfrom
content-review/docs-administration-self-hosting-components-api

Conversation

@pulumi-bot

@pulumi-bot pulumi-bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Important

This PR requires a human review decision — auto-merge is NOT armed. Its fixes include judgment-class changes (claim corrections, structural repairs), so approving does not merge it by itself: the PR-review sweep arms auto-merge only after its own gates pass, or a human merges manually.

Why this page

  • Page: content/docs/administration/self-hosting/components/api.md → /docs/administration/self-hosting/components/api/
  • Lane: priority
  • Strategic tier: 2 (no_retire: false)
  • Traffic: 259 monthly visits (period 2026-04-05 to 2026-10-05; source CLICKSTREAM.FCT_PAGEVIEWS)
  • Search: 816 impressions, 0.00% CTR, corpus median 0.72%, period 2026-04-05 to 2026-10-05
  • Last reviewed: never (attempts: 0)
  • Selection score: 0.9019

This section is composed deterministically from the selection queue; do not edit it.

Fixes applied

Claim / finding Authoritative source Correction
Claim (c6, L31): The default database endpoint for the self-hosted Pulumi API is pulumi-db:3306, and it can be changed by setting PULUMI_LOCAL_DATABASE_NAME and `PULUMI_LOC… gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh Changed PULUMI_LOCAL_DATABASE_NAME to PULUMI_LOCAL_DATABASE_HOST (L31). run-ee.sh builds PULUMI_DATABASE_ENDPOINT from PULUMI_LOCAL_DATABASE_HOST (default pulumi-db) and PULUMI_LOCAL_DATABASE_PORT (default 3306) and never reads PULUMI_LOCAL_DATABASE_NAME; confirmed against the script this run.
Claim (c30, L132): PULUMI_LOCAL_KEYS is a folder path that contains a random 32-byte key. gh api repos/pulumi/pulumi-self-hosted-installers/contents/quickstart-docker-compose/scripts/run-ee.sh Changed "Folder path that contains" to "Path to a file that contains" (L132). The installer sets PULUMI_LOCAL_KEYS=${PULUMI_DATA_PATH}/localkeys, tests it with [ -f "$PULUMI_LOCAL_KEYS" ], and writes the key with head -c 32 /dev/random >$PULUMI_LOCAL_KEYS — a file, not a folder; confirmed against the script this run.

Findings not applied

  • Vale inclusive language (L125): Avoid 'master'. — Not a deterministic_fix; "master key" is generic key-management terminology here, and picking a replacement ("root key", "encryption key") is a wording judgment.
  • Vale inclusive language (L148): Avoid 'master'. — Not a deterministic_fix; "customer master key" is AWS's former official name for a KMS key (now "KMS key"), so rewording it is a terminology judgment, not a mechanical swap.
  • Claim (c11): The Pulumi API service is a Go-based application delivered as a single binary with all dependencies needed to run. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only statement of this is in the file under review (L47: "The API service is a Go-based application. This is a single binary application that has all of th…)
  • Claim (c13): The env variable PULUMI_API_CONTAINER_MODE determines the server function mode with options FULL (API and Background Jobs), API (only API), and JOBS (only Ba… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: Only the reviewed file states this ("defaults to FULL", modes FULL/API/JOBS), and it can't serve as its own evidence. The API service is closed-source, and m…)
  • Claim (c14): PULUMI_API_CONTAINER_MODE values are FULL (Pulumi API & Background Jobs), API (only Pulumi API), and JOBS (only Background Jobs). — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found the FULL/API/JOBS values was the reviewed page itself (L55-61), which can't serve as its own evidence. The self-hosted API service sourc…)
  • Claim (c15): The Pulumi API supports exporting OpenTelemetry metrics and traces via the OpenTelemetry collector. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only support I found is the same file under review, which says at L357: "The API service is configured to export OpenTelemetry metrics and traces to the ve…)
  • Claim (c16): PULUMI_LICENSE_KEY is a JWT string whose value should be enclosed in single-quotes. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The Pulumi Cloud API service that parses PULUMI_LICENSE_KEY is closed-source, so nothing public confirms the JWT format. The public installers pass the key str…)
  • Claim (c20): The self-hosted service saves stack state to object storage, uploads published policy packs to the same object storage service, and the checkpoint and policy p… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this against an independent source. The only support is the page under review, which can't verify itself. That page does list separate env var…)
  • Claim (c21): The Pulumi API service stores objects using gzip compression, and S3-compatible storage providers and intermediaries must preserve the Content-Encoding: gzip… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this. The Pulumi Cloud API service code is closed source, and searches of pulumi/* issues and PRs for "Content-Encoding gzip", S3, MinIO and "…)
  • Claim (c23): When using S3-compatible storage such as Minio, AWS credentials must be configured and AWS_REGION should be set to any valid AWS region (e.g. us-west-2) ev… — unverifiable — Unverifiable: the claim restates the page itself and the API service source is private, so no independent source confirms or contradicts it; needs a reviewer with product-source access. (context: The claim accurately restates api.md L99-102 ("If your Minio configuration doesn't require a region, you should still specify the AWS_REGION with any valid A…)
  • Claim (c24): For AWS S3, the blob storage endpoint variables PULUMI_CHECKPOINT_BLOB_STORAGE_ENDPOINT, PULUMI_POLICY_PACK_BLOB_STORAGE_ENDPOINT, `PULUMI_ENGINE_EVENTS_BL… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The fetched GoCloud page (HTTP 200) is truncated before its S3 section. The visible text only covers general URL-based bucket opening and query parameters such…)
  • Claim (c25): PULUMI_ENGINE_EVENTS_BLOB_STORAGE_ENDPOINT persists large engine events, and configuring it is recommended to improve performance and reduce MySQL database s… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found this wording is the reviewed page itself (L109/L118: "The storage endpoint for persisting large engine events. We recommend configuring …)
  • Claim (c26): PULUMI_SERVICE_METADATA_BLOB_STORAGE_ENDPOINT persists authorization policies and large config values, and is recommended to enable OIDC trust or if programs… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The env var exists: pulumi/pulumi-self-hosted-installers sets it (e.g. ecs-hosted/go/application/service/apiService.go: `CreateEnvVar("PULUMI_SERVICE_METADATA…)_
  • Claim (c31): The AWS KMS key policy must define the actions kms:Encrypt, kms:Decrypt, kms:GenerateDataKey, and kms:GenerateDataKeyWithoutPlaintext, otherwise the se… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The Pulumi service code that would define which KMS actions it needs is private, so I couldn't check this list. The official ECS installer, pulumi-self-hosted-…)
  • Claim (c32): PULUMI_KMS_KEY is the ARN for the AWS KMS customer master key resource. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The doc table (L148) says "PULUMI_KMS_KEY | ARN for the AWS KMS customer master key resource." I couldn't confirm this against independent product source. The …)
  • Claim (c33): For Azure KeyVault, all versions of the key must remain active when creating a new version; the API service never has access to private key material, only uses… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The doc note (L153-155) says: "All versions of the key must remain active. The API service never has access to the private key material... It only uses the pub…)
  • Claim (c34): For Azure KeyVault, all versions of the key must remain active, the API service never has access to the private key material, and it uses only the public key f… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. It describes how the Pulumi Cloud API service uses Azure KeyVault (it encrypts with only the public key, asks KeyVault to decrypt,…)
  • Claim (c35): The Azure KeyVault key must allow the operations Encrypt, Decrypt, Sign and Verify, otherwise the service will fail to start or fail crypto operations. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The doc (L160-166) lists Encrypt, Decrypt, Sign and Verify as required key operations, but the Pulumi Cloud API service source is private. Searching pulumi/pul…)
  • Claim (c36): PULUMI_AZURE_KV_URI is the Azure KeyVault URI and PULUMI_AZURE_KV_KEY_NAME is the key name; the key must be an RSA key type, with a key size of 2048 recomm… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The reviewed file says (L170-171) "PULUMI_AZURE_KV_URI | Azure KeyVault URI" and "PULUMI_AZURE_KV_KEY_NAME | The name of the key in KeyVault. The key must be a…)
  • Claim (c38): The AWS SDK documentation for PHP at docs.aws.amazon.com/sdk-for-php/v3 describes authenticating with AWS services via environment credentials. — unverifiable — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. (context: The cited URL returned HTTP 200, so the link works, but the fetched body was only the page title "AWS SDK for PHP" with no content about environment credential…)
  • Claim (c39): AWS authentication variables AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_PROFILE and AWS_ROLE_ARN are supported by the API service; the… — unverifiable — Unverifiable: the claim restates the page itself and the API service source is private, so no independent source confirms or contradicts it; needs a reviewer with product-source access. (context: The claim accurately restates the env-var table in api.md (L183-187: "the KMS key must exist in this region... there must be a writable cluster in this region"…)
  • Claim (c40): Pulumi Cloud can be configured to use Azure Managed System Identity to connect to all dependent Azure services, but with a self-managed Service Principal the A… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place this appears is the reviewed page (L192-195: "if you would like to use a self-managed Service Principal ... you must specify the Azure Storage a…)
  • Claim (c41): The Azure MSI or Service Principal used via AZURE_CLIENT_ID must have access to Key Management operations Get, Encrypt and Decrypt of the KeyVault. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The Azure KeyVault permission requirements belong to the closed-source Pulumi Cloud service, and the code search came back rate-limited (HTTP 429). The same pa…)
  • Claim (c42): If AZURE_STORAGE_DOMAIN is not provided, the default Azure public domain blob.core.windows.net is used. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: (escalated from pass1) This claim is about how Pulumi's self-hosted API service behaves by default when AZURE_STORAGE_DOMAIN is unset. Only the product source …)
  • Claim (c43): GITLAB_OAUTH_ENDPOINT defaults to https://gitlab.com; GITLAB_OAUTH_ID and GITLAB_OAUTH_SECRET configure GitLab OAuth sign in. — unverifiable — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. (context: The pre-fetched page is the GitLab homepage (https://gitlab.com, HTTP 200, title "GitLab - Speed with control for agentic software engineering"). It says nothi…)
  • Claim (c46): PULUMI_CORS_ALLOWED_ORIGINS is a comma-separated list of origins in <scheme>://<host>[:<port>] form with no path and no default port, accepts the keywords … — unverifiable — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. (context: The pre-fetched URL https://pulumiconsole.acmecorp.com did not resolve ("Name or service not known"). It's an acmecorp placeholder used as an example value, no…)
  • **Claim (c47): Requests without an Origin header, such as from the pulumi CLI, are unaffected by PULUMI_CORS_ALLOWED_ORIGINS, and each rejected request is logged as CO… — unverifiable** — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. _(context: The only public hit for cors.origin_mismatchis the reviewed docs file itself ("Each rejected request is logged asCORS origin mismatch` and counted by the …)_
  • **Claim (c48): Requests carrying no Origin header, such as from the pulumi CLI, are unaffected by PULUMI_CORS_ALLOWED_ORIGINS, and each rejected request is logged as C… — unverifiable** — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. _(context: In public pulumi/* code, cors.origin_mismatch` shows up only in the docs file under review (api.md L232). The Pulumi Cloud API service that would implement th…)_
  • Claim (c50): PULUMI_DISABLE_SSRF_PROTECTION takes a comma-separated list of scopes ESC, AGENTS_BYOK, OIDC_ISSUER, VCS, WEBHOOKS; it is unset by default (protect… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The API service that reads PULUMI_DISABLE_SSRF_PROTECTION is closed source (pulumi-service is private), so I couldn't check this against product code. A gh P…)
  • Claim (c52): PULUMI_PASSKEY_CEREMONY_KEY must be the standard-base64 encoding of exactly 32 random bytes (44 characters including padding), the API service fails to boot … — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found this behavior described is the reviewed file itself (api.md L238), and that page can't be used to verify its own claim. The code for the…)
  • Claim (c53): Passkeys are also gated by a platform-level setting, and rotating PULUMI_PASSKEY_CEREMONY_KEY invalidates passkey ceremonies in progress (each with a five-mi… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. The doc at L238 says passkeys are "gated by a platform-level setting outside this variable's control" and that rotating the key "i…)
  • Claim (c54): Passkeys are also gated by a platform-level setting outside PULUMI_PASSKEY_CEREMONY_KEY, so routes may return 404 even once it is set. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only places PULUMI_PASSKEY_CEREMONY_KEY turns up in the pulumi org are docs pages: the reviewed api.md and accounts.md. Neither page mentions any other p…)
  • Claim (c55): RECAPTCHA_SECRET_KEY is used for password reset requests and is generated by creating a Cloudflare Turnstile Widget to obtain the Secret Key. — unverifiable — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. (context: The cited page returned 200, but the fetched body is truncated to its title, "Cloudflare Turnstile - Easy CAPTCHA Alternative". That confirms Turnstile is a CA…)
  • Claim (c56, L240-241): SAML_CERTIFICATE_PUBLIC_KEY is the public key used by the IdP to sign SAML assertions and SAML_CERTIFICATE_PRIVATE_KEY is the private key used by Pulumi to… — Contradicted at medium confidence, but the correct wording needs interpretation: per saml-sso.md both keys are the API service's own (service-provider) key pair used to sign and validate requests/responses, so both table descriptions need rewriting, not a value swap. Needs a human against saml-sso.md. (context: In Pulumi's self-hosted installers, both keys are one self-signed key pair generated for the API service's own domain (`new SsoCertificate("service", { apiDoma…)
  • Claim (c57): The API service refuses outbound requests to user-supplied URLs when the destination resolves to a loopback, private, link-local, carrier-grade NAT (RFC 6598) … — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: This SSRF behavior lives in the self-hosted Pulumi Cloud API service, whose source (pulumi-service) is private, and every code search I ran against the pulumi …)
  • Claim (c58): The SSRF check is performed when the connection is made, so a hostname that later resolves to a private address is still refused. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. Only the reviewed page (api.md L245) states it: "The address is checked when the connection is made, so a hostname that resolves t…)
  • Claim (c59): Names in PULUMI_DISABLE_SSRF_PROTECTION are case-insensitive and unknown names are ignored with a warning in the API service logs. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. The only place it appears is the page under review (L247: "Names are case-insensitive and unknown names are ignored with a warning…)
  • Claim (c61): The ESC SSRF scope covers Pulumi ESC providers and rotators that call a configured URL: Vault, Infisical, Terraform state, GitHub login, and external provide… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The ESC SSRF scope and which providers/rotators it covers are set in the Pulumi Cloud service code, which is private, so I couldn't check them. Public search t…)
  • Claim (c63): The OIDC_ISSUER SSRF scope covers registering an OIDC issuer and fetching its signing keys. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this against product source. The SSRF scopes are implemented in the private Pulumi Cloud service, and GitHub code search hit rate limits. The …)
  • Claim (c64): The API service logs a warning once for each SSRF protection scope that is switched off. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't find a public product source for this. A code search for PULUMI_DISABLE_SSRF_PROTECTION in the pulumi org only returns docs pages (the api.md under …)
  • Claim (c65): Requests covered by SSRF protection honor HTTPS_PROXY, HTTP_PROXY and NO_PROXY; the API service checks the destination before handing the request to the … — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The Pulumi Cloud API service source is private, and code search turned up only pulumi/docs content. The self-hosting changelog partly backs the claim ("support…)
  • Claim (c66): When an outbound proxy is configured, the API service must resolve the destination hostname itself, and the proxy resolves the hostname again after the check, … — unverifiable — Unverifiable: the claim restates the page itself and the API service source is private, so no independent source confirms or contradicts it; needs a reviewer with product-source access. (context: The claim paraphrases api.md L271-272 accurately ("The proxy resolves the hostname again after the API service has checked it. To guard against DNS rebinding b…)
  • Claim (c67): Enabling TLS on the API service requires all of the TLS environment variables to be set, values may be a filepath or the actual value, and then the service ser… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The reviewed page says: "The following environment variables are all required in order to enable TLS... If these variables are set, the service will be serve…)
  • Claim (c68): API_TLS_CERTIFICATE must be X.509 PEM encoded, API_TLS_PRIVATE_KEY must be PEM encoded, and API_MIN_TLS_VERSION takes <major>.<minor> format such as `1… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check the PEM/X.509 format requirements because the Pulumi service source isn't public. The only public product evidence is the self-hosted installe…)
  • Claim (c70): Database TLS connections require all of the TLS variables to be set, otherwise the service connects without TLS, and the same ports are used whether or not TLS… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The claim restates L299 of the page under review: "The following environment variables are all required to connect to the database using TLS... otherwise the…)
  • Claim (c71): DATABASE_CA_CERTIFICATE must be PEM encoded and set to the certificate value itself, not a filepath; DATABASE_MIN_TLS_VERSION takes <major>.<minor> forma… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The doc table (L303-304) says the CA cert "must be PEM encoded… set to the value of the certificate itself and not a filepath", and that the min TLS version …)
  • Claim (c72): DATABASE_MIN_TLS_VERSION is in <major>.<minor> format, e.g. 1.2. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: Line 304 of the page says "(must be in <major>.<minor> format, e.g. 1.2)", the same wording used for API_MIN_TLS_VERSION on L284. The page can't verify its…)
  • Claim (c73): The database migrations container connects without TLS by default; MYSQL_ROOT_USERNAME defaults to root, and variables include MYSQL_ROOT_PASSWORD, `MYSQ… — unverifiable — Unverifiable: the claim restates the page itself and the API service source is private, so no independent source confirms or contradicts it; needs a reviewer with product-source access. (context: The claim matches what the doc's Migrations table says (L308–318), but the doc can't be used to verify itself. The migrations image (pulumi/migrations) is buil…)
  • Claim (c74): MYSQL_ROOT_USERNAME defaults to root. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. The doc's table (L313) says "The root username to log in to the MySQL database. Defaults to root." The default lives in the migr…)
  • Claim (c77): Audit Logs in self-hosted Pulumi Cloud are persisted in MySQL by default, and alternative backends can support a higher volume of writes without scaling out My… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only match for AUDIT_LOGS_DYNAMO in the pulumi org is the docs page under review ("Audit Logs are persisted in MySQL by default. Alternative backends can…)
  • Claim (c78): To persist Audit Logs in AWS DynamoDB via PULUMI_AUDIT_LOGS_DYNAMO_TABLE, the table must have hashKey org_id, rangeKey timestamp_id, and a global seconda… — unverifiable — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. (context: The cited URL loaded (HTTP 200), but it is the general Amazon DynamoDB marketing page ("Fast NoSQL Key-Value Database – Amazon DynamoDB – AWS"). It says nothin…)
  • Claim (c79): The DynamoDB audit log table must have hashKey org_id, rangeKey timestamp_id, and a global secondary index org_user with hashKey org_user_id, rangeKey … — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this independently. The schema (hashKey org_id, rangeKey timestamp_id, GSI org_user on org_user_id/timestamp_id, projection ALL, all attribute…)
  • Claim (c80): The API service exports OpenTelemetry metrics and traces to the vendor of your choice via the OpenTelemetry collector, and users must manage their own collecto… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found this claim is the reviewed page itself (L357: "configured to export OpenTelemetry metrics and traces to the vendor of your choice via th…)
  • **Claim (c81): OTEL_EXPORTER_OTLP_ENDPOINT is required (no-op metrics and traces if unset), OTEL_EXPORTER_OTLP_PROTOCOL accepts http or grpc and defaults to grpc, … — unverifiable** — Unverifiable: the fetched URL didn't contain the relevant content (truncated, generic, or placeholder), and the behavior lives in the private API service; nothing to correct with confidence. _(context: The pre-fetch returned HTTP 404 with an empty body. But https://api.pulumi.com/metrics is the authenticated metrics endpoint the doc describes (it needs Autho…)_
  • Claim (c82): If OTEL_EXPORTER_OTLP_ENDPOINT is not set, the API service uses no-op metrics and traces. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found this is the reviewed page itself (L363): "If not set, the API service will use no-op metrics and traces." That page can't verify its own…)
  • Claim (c83): OTEL_EXPORTER_OTLP_PROTOCOL valid values are http or grpc, defaulting to grpc. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this. The doc (L364) says "Valid values are http or grpc. Defaults to grpc." The env var is parsed by the self-hosted Pulumi Service API…)
  • Claim (c84): PULUMI_ENABLE_DEPRECATED_METRICS controls continued emission of API service metrics in a log-based format and defaults to true. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place I found this is the reviewed page itself (L365: "Whether to continue emitting API service metrics in a log-based format. Defaults to true."), …)
  • Claim (c85): OpenTelemetry is not yet available for the Pulumi self-hosted console service. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The linked console component page (console.md, 148 lines) doesn't mention OpenTelemetry, OTEL, or telemetry anywhere. That fits the claim but doesn't prove it.…)
  • Claim (c86): The metrics endpoint token type is webhook-token, not Bearer. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim against an independent source. The page agrees with itself: L366 says "Authorization: webhook-token <METRICS_WEBHOOK_SECRET>", and …)
  • Claim (c88): The API service provides two options to get metrics into Prometheus: a push-based Prometheus remote write exporter from the OpenTelemetry collector, and a pull… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only source for this is the reviewed page itself (L384-387: "From the OpenTelemetry collector via a Prometheus remote write exporter... push-based" and "Fr…)
  • Claim (c92): The Prometheus exporter option requires configuring METRICS_WEBHOOK_SECRET to authenticate to the /metrics endpoint. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The page says the same thing elsewhere (L366: "METRICS_WEBHOOK_SECRET | Required to successfully authenticate to the /metrics endpoint"; L372: the endpoint "…)
  • Claim (c93): The example collector config using bearertokenauth with scheme webhook-token and the Prometheus scrape config with authorization.type: webhook-token authen… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this against product source. The /metrics auth lives in the private Pulumi service code, and GitHub code search returned HTTP 429 (rate limi…)
  • Claim (c95): Enabling Pulumi Deployments on self-hosted requires PULUMI_SERVICE_METADATA_BLOB_STORAGE_ENDPOINT or PULUMI_LOCAL_OBJECTS object storage, and customer-mana… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I could only partly corroborate the runner requirement, and only from a sibling docs page, not product source. That page says "Self-hosted Pulumi Cloud install…)
  • Claim (c101): Enabling Pulumi ESC on self-hosted requires PULUMI_SERVICE_METADATA_BLOB_STORAGE_ENDPOINT or PULUMI_LOCAL_OBJECTS object storage and one of the encryption … — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only source that states this is the reviewed page itself (L517-521: "In order to enable Pulumi ESC, the following must be configured: `PULUMI_SERVICE_METAD…)
  • Claim (c102): To enable Pulumi ESC in self-hosted Pulumi Cloud, PULUMI_SERVICE_METADATA_BLOB_STORAGE_ENDPOINT or PULUMI_LOCAL_OBJECTS object storage and one of the encry… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. _(context: The /docs/esc link works: content/docs/esc/index.md exists and says "Pulumi ESC (Environments, Secrets, and Configuration) provides centralized secrets mana…)
  • Claim (c103): Enabling the Pulumi IDP Registry on self-hosted requires environment variables for storing public and private artifacts in a remote object store and cloud prov… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The reviewed page (L525-528) says enabling the IDP Registry needs "Environment variables for where to store public and private artifacts in a remote object sto…)
  • Claim (c105): PULUMI_REGISTRY_PUBLIC_BLOB_STORAGE_ENDPOINT and PULUMI_REGISTRY_PRIVATE_BLOB_STORAGE_ENDPOINT persist public and private registry artifacts, using `s3://<… — unverifiable — Unverifiable: the claim restates the page itself and the API service source is private, so no independent source confirms or contradicts it; needs a reviewer with product-source access. (context: The claim restates api.md L534-542 accurately, but GitHub code search across the pulumi org finds these env vars only in this docs file. They don't appear in t…)
  • Claim (c107): Setting PULUMI_TFE_DOMAIN on the API service enables the Terraform-compatible API for use as a Terraform/OpenTofu state backend; when unset, the API is disab… — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only place PULUMI_TFE_DOMAIN appears in public pulumi/* code is the reviewed docs file itself, which can't serve as evidence for its own claim. The Pulum…)
  • Claim (c108): PULUMI_TFE_DOMAIN is the domain serving the Terraform-compatible API; when unset, the Terraform-compatible API is disabled and its routes are not registered. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: The only public mentions of PULUMI_TFE_DOMAIN are pulumi/docs PRs (docs: document PULUMI_TFE_DOMAIN for self-hosted Terraform state backend #21944, Document PULUMI_TFE_DOMAIN for self-hosted operators #18783). The code that implements it is in the private Pulumi Cloud service, so I co…)
  • Claim (c109): PULUMI_TFE_DOMAIN may be set to the same value as PULUMI_API_DOMAIN, and its DNS record should point to the same host that serves PULUMI_API_DOMAIN. — unverifiable — Unverifiable: the behavior lives in the closed-source API service and no public source confirms or contradicts it; no correction to apply, needs a reviewer with product-source access. (context: I couldn't check this claim. The service that implements PULUMI_TFE_DOMAIN is private (pulumi/pulumi-service returns 404), and code search was rate-limited. No…)
  • Vale directional reference (L27): Directional reference ('see Minimum System Requirements below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'… — Needs an authored anchor link to the target section; judgment-level, left for glow-up. (context: Directional reference ('see Minimum System Requirements below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'…)
  • Vale wordiness (L30): 'it is' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'it is' is too wordy.)
  • Vale wordiness (L32): 'prior to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'prior to' is too wordy.)
  • Vale heading capitalization (L35): Heading 'Minimum System Requirements' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Minimum System Requirements' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale units (L40): Put a nonbreaking space between the number and the unit in '20GB'. — Style nag without a deterministic fix; spacing of sizes inside a table cell is a formatting judgment for the glow-up pass. (context: Put a nonbreaking space between the number and the unit in '20GB'.)
  • Vale units (L41): Put a nonbreaking space between the number and the unit in '200GB'. — Style nag without a deterministic fix; spacing of sizes inside a table cell is a formatting judgment for the glow-up pass. (context: Put a nonbreaking space between the number and the unit in '200GB'.)
  • Vale units (L43): Put a nonbreaking space between the number and the unit in '200GB'. — Style nag without a deterministic fix; spacing of sizes inside a table cell is a formatting judgment for the glow-up pass. (context: Put a nonbreaking space between the number and the unit in '200GB'.)
  • Vale heading capitalization (L45): Heading 'What's In The Container?' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'What's In The Container?' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L47): 'all of' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'all of' is too wordy.)
  • Vale wordiness (L47): 'in order to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'in order to' is too wordy.)
  • Vale heading capitalization (L53): Heading 'Function Mode' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Function Mode' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L63): Heading 'Environment Variables for Core Infrastructure' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Environment Variables for Core Infrastructure' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L108): 'Similar to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'Similar to' is too wordy.)
  • Vale wordiness (L109): 'Similar to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'Similar to' is too wordy.)
  • Vale wordiness (L110): 'Similar to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'Similar to' is too wordy.)
  • Vale heading capitalization (L112): Heading 'Azure Storage' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Azure Storage' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale future tense (L138): Future tense ('the service will fail') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will fail') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale future tense (L160): Future tense ('the service will fail') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will fail') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale heading capitalization (L173): Heading 'Cloud Provider Authentication' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Cloud Provider Authentication' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L212): 'It is' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'It is' is too wordy.)
  • Vale directional reference (L213): Directional reference ('See above') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (brand guide: writing… — Needs an authored anchor link to the target section; judgment-level, left for glow-up. (context: Directional reference ('See above') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (brand guide: writing…)
  • Vale heading capitalization (L216): Heading 'Sending Emails' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Sending Emails' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L225): Heading 'Other Environment Variables {#other-env-vars}' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Other Environment Variables {#other-env-vars}' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale future tense (L234): Future tense ('the API will disallow') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the API will disallow') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale future tense (L235): Future tense ('the API will disallow') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the API will disallow') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale misspelling (L235): 'signups' isn't in the dictionary or styles/Pulumi/ignore/tech-vocabulary.txt. Fix the spelling, or add the term if it's genuinely correct. — 'signups' is a common product term; choosing "sign-ups" versus adding it to the vocabulary list is a judgment call. (context: 'signups' isn't in the dictionary or styles/Pulumi/ignore/tech-vocabulary.txt. Fix the spelling, or add the term if it's genuinely correct.)
  • Vale heading capitalization (L243): Heading 'SSRF protection' should use sentence case (capitalize only the first word and proper nouns). — Likely false positive: the heading is already sentence case (SSRF is an acronym, OpenTelemetry a proper noun). No change. (context: Heading 'SSRF protection' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L274): Heading 'TLS Environment Variables' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'TLS Environment Variables' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L276): Heading 'API Service' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'API Service' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L278): 'in order to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'in order to' is too wordy.)
  • Vale future tense (L278): Future tense ('the service will be') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will be') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale future tense (L278): Future tense ('the service will default') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will default') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale heading capitalization (L295): Heading 'Database Connections' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Database Connections' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L297): Heading 'API Service' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'API Service' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale future tense (L299): Future tense ('the service will establish') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will establish') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale future tense (L299): Future tense ('the service will default') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). — Style nag; recasting product behavior into present tense is a prose rewrite beyond fix-lane scope. (context: Future tense ('the service will default') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style).)
  • Vale heading capitalization (L320): Heading 'Audit Logs' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Audit Logs' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale heading capitalization (L355): Heading 'OpenTelemetry' should use sentence case (capitalize only the first word and proper nouns). — Likely false positive: the heading is already sentence case (SSRF is an acronym, OpenTelemetry a proper noun). No change. (context: Heading 'OpenTelemetry' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L517): 'In order to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'In order to' is too wordy.)
  • Vale heading capitalization (L523): Heading 'Pulumi IDP Registry' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Pulumi IDP Registry' should use sentence case (capitalize only the first word and proper nouns).)
  • Vale wordiness (L525): 'In order to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'In order to' is too wordy.)
  • Vale directional reference (L527): Directional reference ('see below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (brand guide: writing… — Needs an authored anchor link to the target section; judgment-level, left for glow-up. (context: Directional reference ('see below') -- link directly to the target (an #anchor or relative path) rather than relying on 'above'/'below' (brand guide: writing…)
  • Vale wordiness (L534): 'Similar to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'Similar to' is too wordy.)
  • Vale wordiness (L535): 'Similar to' is too wordy. — write-good style nag with no deterministic fix; rewording is prose editing beyond fix-lane scope. (context: 'Similar to' is too wordy.)
  • Vale heading capitalization (L537): Heading 'Azure Storage' should use sentence case (capitalize only the first word and proper nouns). — Not a deterministic_fix; re-casing changes the heading's generated #anchor (e.g. L51 links #tls-environment-variables, L120 links #azure), so it needs a coordinated anchor/link update — glow-up work. (context: Heading 'Azure Storage' should use sentence case (capitalize only the first word and proper nouns).)
  • Readthrough orphaned-structure (L306-318): "To use TLS, the following environment variable must be set. The default is to not use TLS." — Readthrough findings are never applied in the fix lane (structural repair needs whole-page review); banked for the glow-up lane. (context: Under 'Migrations', keep only DATABASE_CA_CERTIFICATE (the one variable the prose promises). Move MYSQL_ROOT_USERNAME, MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_P…)
  • Readthrough orphaned-structure (L31): "set PULUMI_LOCAL_DATABASE_NAME and PULUMI_LOCAL_DATABASE_PORT accordingly (see Script Variables…" — Readthrough findings are never applied in the fix lane (structural repair needs whole-page review); banked for the glow-up lane. (context: Replace '(see Script Variables.)' with a link to the page that documents those script variables, or add a short definition of PULUMI_LOCAL_DATABASE_NAME / PULU…)
  • Readthrough prerequisite-inversion (L30-32): "If you do not create this network prior to running run-ee.sh" — Readthrough findings are never applied in the fix lane (structural repair needs whole-page review); banked for the glow-up lane. (context: In the L30 bullet, add a sentence telling the reader to create a named Docker network first. Also say briefly what run-ee.sh is, or link to the installation …)
  • Readthrough orphaned-structure (L173-214): "These settings are required if you are running Pulumi Cloud on one of these clouds or using one of …" — Readthrough findings are never applied in the fix lane (structural repair needs whole-page review); banked for the glow-up lane. (context: Move the 'GitLab OAuth' H3 out of 'Cloud Provider Authentication' into its own 'Identity providers' H2 (matching the 'optional identity services' mentioned at …)

The items above are banked for the automated glow-up lane, which executes a page's accumulated deferrals under human review — or run /glow-up content/docs/administration/self-hosting/components/api.md to work them now.

Screenshot check

No images. The page source references no screenshots, diagrams, or other content images (only the generic shared meta_image card, if any), so there is nothing to verify. (Determined from the source; the screenshot pass was skipped.)

Rendered content

Ran make build and checked public/docs/administration/self-hosting/components/api/index.html and index.md. Render-time residue: the self-hosting-trial-note shortcode text ("If you would like to evaluate the self-hosted Pulumi Cloud, request a Proof of Concept (PoC) or contact us.") and the pulumi_cloud_feature: self-hosting callout ("available in the Enterprise edition"). Both are clean: data/pulumi_pricing.yaml has self-hosting available_from: enterprise, and the shortcode's link targets /product/self-hosted/#self-hosted-trial (anchor present in the built page) and /contact/ both exist. No shared-source fixes applied (the shortcode is used on 18 content pages). Observation for the templating owner, not fixed here: the index.md view flattens the nested bullets under the L30 prerequisite into top-level items.

Verification

  • make lint: ✅ make lint re-verified by the workflow on 91b7a99
  • Pre-step artifacts:
    • .verified-claims.json: 111 verdict(s); 3 contradicted/mismatch, 67 unverifiable
    • .vale-findings.json: 47 finding(s)
    • .readthrough-findings.json: ran=True, 4 finding(s)
    • .frontmatter-validation.json: 1 file(s); 0 alias collision(s)

…pi.md

Automated existing-content review.

Co-Authored-By: Claude <[email protected]>
@pulumi-bot pulumi-bot added the content-review/judgment Content-review PR containing judgment-class fixes (needs a human eye) label Oct 8, 2026
@github-actions github-actions Bot added the review:triaging Claude Triage is currently classifying the PR label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Sentinel — merge gate status (preview)

Warning

⚠️ Preview mode — this check is NOT blocking your merge

The Sentinel is in preview (report-only) mode: its check-run concludes neutral whatever the gates below say, so nothing here gates this PR. The rows are informational and safe to ignore for now. It would have concluded success.

This will be enforced in the near future. Once it is, every row below has to be green before this PR can merge. The rows are the sign-offs a merge needs — some yours, some a reviewer's or a deploy's. Tell us in #docs if one looks wrong.

All gates green — nothing would block this merge.

Gate What it needs
✅ G1 review-ran Nothing to do: review current at 91b7a9926.
✅ G2 findings-answered Nothing to do: every finding answered.
✅ G3 right-approver Nothing to do: approved by CamSoper, who has write access.
➖ G4 infra-evidence Doesn't apply to this PR: no changed path affects the deploy.
➖ G5 oversized-ack Doesn't apply to this PR: not oversized.

Evaluated at head 91b7a9926.

@github-actions github-actions Bot added domain:docs PR touches technical docs review:trivial Tiny prose-only change; skips Claude review labels Oct 8, 2026
@pulumi-bot
pulumi-bot requested a review from a team October 8, 2026 14:45
@github-actions github-actions Bot removed the review:triaging Claude Triage is currently classifying the PR label Oct 8, 2026
@pulumi-bot

Copy link
Copy Markdown
Collaborator Author

@CamSoper

CamSoper commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

@claude no review ran on this PR #new-review


Generated by Claude Code

@github-actions github-actions Bot added the review:in-progress Claude review is currently running label Oct 8, 2026
@CamSoper

CamSoper commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

@claude the last #new-review never published (fixed in #22201) #new-review


Generated by Claude Code

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Reviewer's guide v1 — not for the author

Tip

Check the ⚠️ items, then approve. Your approval covers only those; links, shortcodes, metadata, and verified claims were checked by machine (receipts on the evidence page). Code samples are read, not compiled.

PR author: nothing here is yours. Your to-do list is the "Author action guide" comment.

Review requested from: @pulumi/docs-guild — an approval from anyone with write access satisfies the merge gate.

Note

What this PR changes:

  • api.md Prerequisites: two lines revised by the content-review bot, including the database endpoint and environment-variable guidance.

A wrong default endpoint or variable name would leave a self-hosting operator unable to connect the API service to its database. Claim verification and the frontmatter/link sweep ran; the sibling read was not extended beyond this page.

Review confidence:

Dimension Level Notes
mechanics HIGH
facts HIGH
cross-sibling consistency MEDIUM Sibling self-hosting component pages not re-read for this two-line change

⚠️ Check these before approving

No findings to check — but the editorial stances below still need a human eye.

Editorial stances introduced by this PR

Superlatives and comparisons the diff adds. Framing isn't fact-checkable, so confirm each is a stance the docs should take.

  • L31 content/docs/administration/self-hosting/components/api.md — " The default DB endpoint is pulumi-db:3306. If you wish to change this, set PULUMI_LOCAL_DATABASE_HOST and PULUMI_LOCAL_DATABASE_PORT accordingly (see…"* — positioning (found by regex)

✅ What you can rubber-stamp

  • Facts: 2 factual claims checked — 2 verified clean.
  • Mechanics: frontmatter sweep ran; no internal links added.
  • Style: 0 advisory suggestions left with the author; never blocking.

Pre-existing issues in touched files: 0 — details on the evidence page.

Full evidence: verification trail, investigation log, review history.

Review v1 · updated 2026-10-08T22:15:51Z · head commit 91b7a99


For the reviewer: something look wrong? Comment @claude <your point> #update-review and the review re-checks with your input.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Author action guide v1 — nothing blocks merge

Note

Nothing here needs an answer. Automation opened this PR; a human reviewer still approves the merge.

An automated content-review fix to two lines of the self-hosted API service page; the review checked the edited facts, frontmatter, and links.

Full evidence: verification trail, investigation log, review history.

Review v1 · updated 2026-10-08T22:15:51Z · head commit 91b7a99


Please don't edit or delete this comment; it's the review's record.

@github-actions github-actions Bot added review:no-blockers Claude review completed cleanly; outstanding is empty and removed review:in-progress Claude review is currently running labels Oct 8, 2026

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

Approved.

@CamSoper
CamSoper merged commit 644eb12 into master Oct 8, 2026
15 checks passed
@CamSoper
CamSoper deleted the content-review/docs-administration-self-hosting-components-api branch October 8, 2026 22:42

This branch was successfully deployed

1 active deployment
testing — 91b7a992 Deployed Oct 8, 2026 by CamSoper via Do cleanup #14690
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

content-review/judgment Content-review PR containing judgment-class fixes (needs a human eye) domain:docs PR touches technical docs review:no-blockers Claude review completed cleanly; outstanding is empty review:trivial Tiny prose-only change; skips Claude review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants