{"id":"ops/go-live-checklist","relativePath":"ops/go-live-checklist.md","title":"Go-Live & Evidence-Pipeline Checklist","markdown":"# Go-Live & Evidence-Pipeline Checklist\n\nOperationalize the live Vercel deploy: finish auth, deploy the validation\nservice, and **start the 30-day evidence clock**. Companion to\n[deployment.md](../deployment.md).\n\nProduction URL: `https://www.metamuseum.org` (no trailing slash). Use this\ncanonical URL for Vercel, GitHub OAuth, GitHub Actions evidence variables, and\nlocal launch checks.\n\nVerified IIIF evidence tile: `https://iiif.micr.io/RFwqO/full/max/0/default.jpg`.\n\n---\n\n## 1. Vercel — finish the app config\n\nProject → Settings → Environment Variables (Production), then redeploy:\n\n| Var | Value | Why |\n|---|---|---|\n| `DATABASE_URL` | Neon pooled string with `sslmode=verify-full` | required for Postgres DR proof |\n| `METAMUSEUM_STORAGE_MODE` | `postgres` | already set |\n| `AUTH_SECRET` | (already set) | — |\n| `BASE_URL` | `https://www.metamuseum.org` | canonical URL, SLO target |\n| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `https://www.metamuseum.org` | uptime/probe target and Open Graph metadata base; must exactly match `BASE_URL` |\n| `AUTH_GITHUB_ID` | GitHub OAuth app client ID | enables sign-in |\n| `AUTH_GITHUB_SECRET` | GitHub OAuth app secret | (pair for the above) |\n| `VALIDATION_SERVICE_URL` | `https://metamuseum-validation.onrender.com/validate` | after step 2 |\n| `RECONCILIATION_SERVICE_URL` | `https://metamuseum-reconciliation.onrender.com` | optional service probe/evidence |\n| `METAMUSEUM_EXTERNAL_SERVICE_PROBE_TIMEOUT_MS` | `45000` | external service cold-start window |\n\nAlso: **Settings → Deployment Protection → Vercel Authentication → Disabled**\n(so the public can reach the read-only demo). `pnpm launch:preflight:production`\nnow probes `/`, `/api/health`, `/api/auth/signin`, and `/api/auth/session`\non the configured public URL and fails if Vercel Authentication or another\nprotection wall blocks public reads or auth routes.\nIt also fetches `IIIF_TILE_URL`, so k6 tile-serving evidence cannot quietly\npoint at a broken, private, or non-HTTP image target.\nIt also fails production when `BASE_URL` and\n`METAMUSEUM_PUBLIC_READ_BASE_URL` are missing or not the same shareable URL,\nbecause crawlers resolve absolute Open Graph images from that base.\n\nAfter every domain change: redeploy, run\n`BASE_URL=https://www.metamuseum.org METAMUSEUM_PUBLIC_READ_BASE_URL=https://www.metamuseum.org IIIF_TILE_URL=https://iiif.micr.io/RFwqO/full/max/0/default.jpg VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com pnpm launch:preflight:production`,\nthen run `BASE_URL=https://www.metamuseum.org pnpm smoke:crawler-preview`.\nThe smoke writes `artifacts/launch/crawler-preview-latest.json` and checks\nFacebook, Slack, Googlebot, LinkedIn, and X/Twitter-facing\nOpen Graph/Twitter/canonical metadata plus preview image fetchability. Refresh\nthe homepage in Facebook Sharing Debugger and the equivalent LinkedIn/X preview\ntools before sharing public links.\nFor a full evidence refresh, prefer\n`pnpm launch:evidence:production -- --base-url=https://www.metamuseum.org --public-read-base-url=https://www.metamuseum.org --iiif-tile-url=https://iiif.micr.io/RFwqO/full/max/0/default.jpg --validation-service-url=https://metamuseum-validation.onrender.com/validate --reconciliation-service-url=https://metamuseum-reconciliation.onrender.com`;\nit runs hardening security/DR evidence, the preflight, public trust, crawler\npreview, a11y, explore, k6, Era C exit-gate, and launch-review steps while writing\n`artifacts/launch/launch-evidence-latest.json`.\n\nIf `VALIDATION_SERVICE_URL` or `RECONCILIATION_SERVICE_URL` is configured,\n`pnpm launch:preflight:production` also probes the matching Render `/health`\nendpoint and records status plus duration. The Render probe timeout can be long\nenough to observe cold starts, but user-facing strict validation is stricter:\nproduction preflight fails a Render-hosted `VALIDATION_SERVICE_URL` unless\n`METAMUSEUM_VALIDATION_SERVICE_CAPACITY=paid` proves no-sleep capacity and the\nhealth duration is within `METAMUSEUM_VALIDATION_SERVICE_MAX_HEALTH_MS`.\nLeave the URLs unset only when the local fallback mode is intentional:\nnon-strict validation uses the local Linked Art profile fallback, strict\n`/api/validate` still needs a running validation service, and reconciliation\nstays in-process.\n\nWorker-dependent features are scheduled drains, not persistent Vercel\nprocesses. After any `METAMUSEUM_OUTBOX_CRON_ENABLED`,\n`OUTBOX_PROJECT_TO_SOLR`, `OUTBOX_PROJECT_TO_GRAPHDB`, or\n`METAMUSEUM_PUBLISH_QUEUE_CRON_ENABLED` change, open `/workers` and verify\nworker lag, next cron wakeup, effective next drain, and disabled modes before\nclaiming projection or publishing progress. Production preflight fails when\nprojection targets are enabled without `CRON_SECRET` plus\n`METAMUSEUM_OUTBOX_CRON_ENABLED=1`, or when live MediaWiki/Wikibase endpoints\nor bot tokens are configured without `CRON_SECRET` plus\n`METAMUSEUM_PUBLISH_QUEUE_CRON_ENABLED=1`.\n\nBefore setting `OUTBOX_PROJECT_TO_SOLR=1` or `OUTBOX_PROJECT_TO_GRAPHDB=1`, run\n`pnpm projection:readiness` with current discovery/search/graph metrics. Treat\n`portable` as keep-disabled, `watch` as prepare credentials/backfill, `enable`\nas the point where Solr/GraphDB target flags may be turned on after the\nscheduled outbox drain is ready, and `enabled` as the monitoring state after\nthe scale path is active.\n\nGitHub OAuth app: https://github.com/settings/developers → New OAuth App →\nHomepage `https://www.metamuseum.org`, callback\n`https://www.metamuseum.org/api/auth/callback/github`.\n\n---\n\n## 2. Render — validation and reconciliation services\n\nThe data-quality report (validation) is the literal pilot deliverable, and the\nreconciliation service backs authority lookup evidence. Both Render services\nare deployed from `render.yaml`; the AG2 worker is intentionally excluded.\n\n1. Validation: `https://metamuseum-validation.onrender.com/health`.\n2. Reconciliation: `https://metamuseum-reconciliation.onrender.com/health`.\n3. Set `VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate`\n   on Vercel.\n4. Upgrade the validation service off sleeping/free-tier capacity before public\n   strict validation, then set `METAMUSEUM_VALIDATION_SERVICE_CAPACITY=paid`.\n5. Set `RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com`\n   on Vercel so preflight records its `/health` probe too.\n\n> Free Render web services cold-start in ~30–60s. Fine for demos and rehearsal\n> evidence, but public strict `/api/validate` should stay off sleeping capacity.\n\n---\n\n## 3. GitHub Actions — start the evidence clock\n\nThe nightly `era-c-exit-gate-evidence.yml` workflow reads these. Set under\n**Settings → Secrets and variables → Actions**.\n\n### Variables (Repository variables) — minimum to start k6 + AI evidence\n| Variable | Value | Unlocks |\n|---|---|---|\n| `METAMUSEUM_EVIDENCE_BASE_URL` | `https://www.metamuseum.org` | k6 SLO + AI-query evidence |\n| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `https://www.metamuseum.org` | uptime probe target |\n| `METAMUSEUM_EVIDENCE_IIIF_TILE_URL` | `https://iiif.micr.io/RFwqO/full/max/0/default.jpg` | required gate for the k6 step |\n\nWith just those three, the nightly run begins retaining k6 p95 samples and AI\ncost telemetry. `SPARQL_URL` defaults to\n`https://www.metamuseum.org/api/getty/sparql`.\n\nCLI:\n```bash\ngh variable set METAMUSEUM_EVIDENCE_BASE_URL --body \"https://www.metamuseum.org\"\ngh variable set METAMUSEUM_PUBLIC_READ_BASE_URL --body \"https://www.metamuseum.org\"\ngh variable set METAMUSEUM_EVIDENCE_IIIF_TILE_URL --body \"https://iiif.micr.io/RFwqO/full/max/0/default.jpg\"\n```\n\n### Still gated (separate workstreams, not just config)\n| Evidence | Needs | Note |\n|---|---|---|\n| Public-read uptime (99.9% / 30d) | `METAMUSEUM_UPTIME_PROMETHEUS_URL` (secret) + `METAMUSEUM_UPTIME_PROMQL_*` vars | requires a Prometheus/monitoring backend scraping the app — infra decision |\n| Activity-feed adoption (3/3) | `METAMUSEUM_ACTIVITY_CONSUMER_IDS` | requires 3 real external consumers sending `x-linked-art-consumer-id` — partnerships, not config |\n| SOTA §26 KPIs | production export to `monitoring/kpi-evidence.json` | record-enrichment + reconciliation review counts |\n\n---\n\n## Sequence\n\n1. Verify Vercel env vars + GitHub OAuth + Deployment Protection state + social\n   preview base URL parity plus Auth.js route reachability → run\n   `pnpm launch:evidence:production -- --base-url=https://www.metamuseum.org --public-read-base-url=https://www.metamuseum.org --iiif-tile-url=https://iiif.micr.io/RFwqO/full/max/0/default.jpg --validation-service-url=https://metamuseum-validation.onrender.com/validate --reconciliation-service-url=https://metamuseum-reconciliation.onrender.com`\n   to refresh the full blocker-preserving evidence packet.\n2. If running commands manually, verify Vercel env vars + GitHub OAuth +\n   Deployment Protection state + social\n   preview base URL parity + fetchable IIIF tile target → rerun\n   `BASE_URL=https://www.metamuseum.org METAMUSEUM_PUBLIC_READ_BASE_URL=https://www.metamuseum.org IIIF_TILE_URL=https://iiif.micr.io/RFwqO/full/max/0/default.jpg VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com pnpm launch:preflight:production`\n   and `BASE_URL=https://www.metamuseum.org pnpm smoke:crawler-preview`\n   before launch review. Treat `pnpm review:goals:check` as the authority for\n   whether the current launch evidence is green; a stale preflight note cannot\n   override unresolved deployment-environment or real-world blockers.\n   Refresh crawler previews after every domain change.\n3. Keep the deployed validation/reconciliation service URLs set on Vercel and\n   rerun preflight after any Render redeploy so the external service probes are\n   in evidence.\n4. Set the 3 GitHub evidence variables → the nightly clock starts.\n5. For any enabled projection or publishing feature, verify `/workers` shows an\n   effective next drain time and no blocked/dead-letter status.\n6. Decide the uptime-monitoring approach (Prometheus stack) and begin partner\n   outreach for the 3 activity consumers — these are the long-pole 30-day gates.\n","sections":[{"level":2,"heading":"1. Vercel — finish the app config","anchor":"1-vercel-finish-the-app-config"},{"level":2,"heading":"2. Render — validation and reconciliation services","anchor":"2-render-validation-and-reconciliation-services"},{"level":2,"heading":"3. GitHub Actions — start the evidence clock","anchor":"3-github-actions-start-the-evidence-clock"},{"level":3,"heading":"Variables (Repository variables) — minimum to start k6 + AI evidence","anchor":"variables-repository-variables-minimum-to-start-k6-ai-evidence"},{"level":3,"heading":"Still gated (separate workstreams, not just config)","anchor":"still-gated-separate-workstreams-not-just-config"},{"level":2,"heading":"Sequence","anchor":"sequence"}],"html":"<h1 id=\"go-live-evidence-pipeline-checklist\">Go-Live &amp; Evidence-Pipeline Checklist</h1>\n<p>Operationalize the live Vercel deploy: finish auth, deploy the validation</p>\n<p>service, and <strong>start the 30-day evidence clock</strong>. Companion to</p>\n<p>deployment.md(../deployment.md).</p>\n<p>Production URL: `https://www.metamuseum.org` (no trailing slash). Use this</p>\n<p>canonical URL for Vercel, GitHub OAuth, GitHub Actions evidence variables, and</p>\n<p>local launch checks.</p>\n<p>Verified IIIF evidence tile: `https://iiif.micr.io/RFwqO/full/max/0/default.jpg`.</p>\n<p>---</p>\n<h2 id=\"1-vercel-finish-the-app-config\">1. Vercel — finish the app config</h2>\n<p>Project → Settings → Environment Variables (Production), then redeploy:</p>\n<p>| Var | Value | Why |</p>\n<p>|---|---|---|</p>\n<p>| `DATABASE_URL` | Neon pooled string with `sslmode=verify-full` | required for Postgres DR proof |</p>\n<p>| `METAMUSEUM_STORAGE_MODE` | `postgres` | already set |</p>\n<p>| `AUTH_SECRET` | (already set) | — |</p>\n<p>| `BASE_URL` | `https://www.metamuseum.org` | canonical URL, SLO target |</p>\n<p>| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `https://www.metamuseum.org` | uptime/probe target and Open Graph metadata base; must exactly match `BASE_URL` |</p>\n<p>| `AUTH_GITHUB_ID` | GitHub OAuth app client ID | enables sign-in |</p>\n<p>| `AUTH_GITHUB_SECRET` | GitHub OAuth app secret | (pair for the above) |</p>\n<p>| `VALIDATION_SERVICE_URL` | `https://metamuseum-validation.onrender.com/validate` | after step 2 |</p>\n<p>| `RECONCILIATION_SERVICE_URL` | `https://metamuseum-reconciliation.onrender.com` | optional service probe/evidence |</p>\n<p>| `METAMUSEUM_EXTERNAL_SERVICE_PROBE_TIMEOUT_MS` | `45000` | external service cold-start window |</p>\n<p>Also: <strong>Settings → Deployment Protection → Vercel Authentication → Disabled</strong></p>\n<p>(so the public can reach the read-only demo). `pnpm launch:preflight:production`</p>\n<p>now probes `/`, `/api/health`, `/api/auth/signin`, and `/api/auth/session`</p>\n<p>on the configured public URL and fails if Vercel Authentication or another</p>\n<p>protection wall blocks public reads or auth routes.</p>\n<p>It also fetches `IIIF_TILE_URL`, so k6 tile-serving evidence cannot quietly</p>\n<p>point at a broken, private, or non-HTTP image target.</p>\n<p>It also fails production when `BASE_URL` and</p>\n<p>`METAMUSEUM_PUBLIC_READ_BASE_URL` are missing or not the same shareable URL,</p>\n<p>because crawlers resolve absolute Open Graph images from that base.</p>\n<p>After every domain change: redeploy, run</p>\n<p>`BASE_URL=https://www.metamuseum.org METAMUSEUM_PUBLIC_READ_BASE_URL=https://www.metamuseum.org IIIF_TILE_URL=https://iiif.micr.io/RFwqO/full/max/0/default.jpg VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com pnpm launch:preflight:production`,</p>\n<p>then run `BASE_URL=https://www.metamuseum.org pnpm smoke:crawler-preview`.</p>\n<p>The smoke writes `artifacts/launch/crawler-preview-latest.json` and checks</p>\n<p>Facebook, Slack, Googlebot, LinkedIn, and X/Twitter-facing</p>\n<p>Open Graph/Twitter/canonical metadata plus preview image fetchability. Refresh</p>\n<p>the homepage in Facebook Sharing Debugger and the equivalent LinkedIn/X preview</p>\n<p>tools before sharing public links.</p>\n<p>For a full evidence refresh, prefer</p>\n<p>`pnpm launch:evidence:production -- --base-url=https://www.metamuseum.org --public-read-base-url=https://www.metamuseum.org --iiif-tile-url=https://iiif.micr.io/RFwqO/full/max/0/default.jpg --validation-service-url=https://metamuseum-validation.onrender.com/validate --reconciliation-service-url=https://metamuseum-reconciliation.onrender.com`;</p>\n<p>it runs hardening security/DR evidence, the preflight, public trust, crawler</p>\n<p>preview, a11y, explore, k6, Era C exit-gate, and launch-review steps while writing</p>\n<p>`artifacts/launch/launch-evidence-latest.json`.</p>\n<p>If `VALIDATION_SERVICE_URL` or `RECONCILIATION_SERVICE_URL` is configured,</p>\n<p>`pnpm launch:preflight:production` also probes the matching Render `/health`</p>\n<p>endpoint and records status plus duration. The Render probe timeout can be long</p>\n<p>enough to observe cold starts, but user-facing strict validation is stricter:</p>\n<p>production preflight fails a Render-hosted `VALIDATION_SERVICE_URL` unless</p>\n<p>`METAMUSEUM_VALIDATION_SERVICE_CAPACITY=paid` proves no-sleep capacity and the</p>\n<p>health duration is within `METAMUSEUM_VALIDATION_SERVICE_MAX_HEALTH_MS`.</p>\n<p>Leave the URLs unset only when the local fallback mode is intentional:</p>\n<p>non-strict validation uses the local Linked Art profile fallback, strict</p>\n<p>`/api/validate` still needs a running validation service, and reconciliation</p>\n<p>stays in-process.</p>\n<p>Worker-dependent features are scheduled drains, not persistent Vercel</p>\n<p>processes. After any `METAMUSEUM_OUTBOX_CRON_ENABLED`,</p>\n<p>`OUTBOX_PROJECT_TO_SOLR`, `OUTBOX_PROJECT_TO_GRAPHDB`, or</p>\n<p>`METAMUSEUM_PUBLISH_QUEUE_CRON_ENABLED` change, open `/workers` and verify</p>\n<p>worker lag, next cron wakeup, effective next drain, and disabled modes before</p>\n<p>claiming projection or publishing progress. Production preflight fails when</p>\n<p>projection targets are enabled without `CRON_SECRET` plus</p>\n<p>`METAMUSEUM_OUTBOX_CRON_ENABLED=1`, or when live MediaWiki/Wikibase endpoints</p>\n<p>or bot tokens are configured without `CRON_SECRET` plus</p>\n<p>`METAMUSEUM_PUBLISH_QUEUE_CRON_ENABLED=1`.</p>\n<p>Before setting `OUTBOX_PROJECT_TO_SOLR=1` or `OUTBOX_PROJECT_TO_GRAPHDB=1`, run</p>\n<p>`pnpm projection:readiness` with current discovery/search/graph metrics. Treat</p>\n<p>`portable` as keep-disabled, `watch` as prepare credentials/backfill, `enable`</p>\n<p>as the point where Solr/GraphDB target flags may be turned on after the</p>\n<p>scheduled outbox drain is ready, and `enabled` as the monitoring state after</p>\n<p>the scale path is active.</p>\n<p>GitHub OAuth app: https://github.com/settings/developers → New OAuth App →</p>\n<p>Homepage `https://www.metamuseum.org`, callback</p>\n<p>`https://www.metamuseum.org/api/auth/callback/github`.</p>\n<p>---</p>\n<h2 id=\"2-render-validation-and-reconciliation-services\">2. Render — validation and reconciliation services</h2>\n<p>The data-quality report (validation) is the literal pilot deliverable, and the</p>\n<p>reconciliation service backs authority lookup evidence. Both Render services</p>\n<p>are deployed from `render.yaml`; the AG2 worker is intentionally excluded.</p>\n<ol><li>Validation: `https://metamuseum-validation.onrender.com/health`.</li></ol>\n<ol><li>Reconciliation: `https://metamuseum-reconciliation.onrender.com/health`.</li></ol>\n<ol><li>Set `VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate`</li></ol>\n<p>   on Vercel.</p>\n<ol><li>Upgrade the validation service off sleeping/free-tier capacity before public</li></ol>\n<p>   strict validation, then set `METAMUSEUM_VALIDATION_SERVICE_CAPACITY=paid`.</p>\n<ol><li>Set `RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com`</li></ol>\n<p>   on Vercel so preflight records its `/health` probe too.</p>\n<blockquote>Free Render web services cold-start in ~30–60s. Fine for demos and rehearsal</blockquote>\n<blockquote>evidence, but public strict `/api/validate` should stay off sleeping capacity.</blockquote>\n<p>---</p>\n<h2 id=\"3-github-actions-start-the-evidence-clock\">3. GitHub Actions — start the evidence clock</h2>\n<p>The nightly `era-c-exit-gate-evidence.yml` workflow reads these. Set under</p>\n<p><strong>Settings → Secrets and variables → Actions</strong>.</p>\n<h3 id=\"variables-repository-variables-minimum-to-start-k6-ai-evidence\">Variables (Repository variables) — minimum to start k6 + AI evidence</h3>\n<p>| Variable | Value | Unlocks |</p>\n<p>|---|---|---|</p>\n<p>| `METAMUSEUM_EVIDENCE_BASE_URL` | `https://www.metamuseum.org` | k6 SLO + AI-query evidence |</p>\n<p>| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `https://www.metamuseum.org` | uptime probe target |</p>\n<p>| `METAMUSEUM_EVIDENCE_IIIF_TILE_URL` | `https://iiif.micr.io/RFwqO/full/max/0/default.jpg` | required gate for the k6 step |</p>\n<p>With just those three, the nightly run begins retaining k6 p95 samples and AI</p>\n<p>cost telemetry. `SPARQL_URL` defaults to</p>\n<p>`https://www.metamuseum.org/api/getty/sparql`.</p>\n<p>CLI:</p>\n<pre><code>\ngh variable set METAMUSEUM_EVIDENCE_BASE_URL --body &quot;https://www.metamuseum.org&quot;\ngh variable set METAMUSEUM_PUBLIC_READ_BASE_URL --body &quot;https://www.metamuseum.org&quot;\ngh variable set METAMUSEUM_EVIDENCE_IIIF_TILE_URL --body &quot;https://iiif.micr.io/RFwqO/full/max/0/default.jpg&quot;\n</code></pre>\n<h3 id=\"still-gated-separate-workstreams-not-just-config\">Still gated (separate workstreams, not just config)</h3>\n<p>| Evidence | Needs | Note |</p>\n<p>|---|---|---|</p>\n<p>| Public-read uptime (99.9% / 30d) | `METAMUSEUM_UPTIME_PROMETHEUS_URL` (secret) + `METAMUSEUM_UPTIME_PROMQL_*` vars | requires a Prometheus/monitoring backend scraping the app — infra decision |</p>\n<p>| Activity-feed adoption (3/3) | `METAMUSEUM_ACTIVITY_CONSUMER_IDS` | requires 3 real external consumers sending `x-linked-art-consumer-id` — partnerships, not config |</p>\n<p>| SOTA §26 KPIs | production export to `monitoring/kpi-evidence.json` | record-enrichment + reconciliation review counts |</p>\n<p>---</p>\n<h2 id=\"sequence\">Sequence</h2>\n<ol><li>Verify Vercel env vars + GitHub OAuth + Deployment Protection state + social</li></ol>\n<p>   preview base URL parity plus Auth.js route reachability → run</p>\n<p>   `pnpm launch:evidence:production -- --base-url=https://www.metamuseum.org --public-read-base-url=https://www.metamuseum.org --iiif-tile-url=https://iiif.micr.io/RFwqO/full/max/0/default.jpg --validation-service-url=https://metamuseum-validation.onrender.com/validate --reconciliation-service-url=https://metamuseum-reconciliation.onrender.com`</p>\n<p>   to refresh the full blocker-preserving evidence packet.</p>\n<ol><li>If running commands manually, verify Vercel env vars + GitHub OAuth +</li></ol>\n<p>   Deployment Protection state + social</p>\n<p>   preview base URL parity + fetchable IIIF tile target → rerun</p>\n<p>   `BASE_URL=https://www.metamuseum.org METAMUSEUM_PUBLIC_READ_BASE_URL=https://www.metamuseum.org IIIF_TILE_URL=https://iiif.micr.io/RFwqO/full/max/0/default.jpg VALIDATION_SERVICE_URL=https://metamuseum-validation.onrender.com/validate RECONCILIATION_SERVICE_URL=https://metamuseum-reconciliation.onrender.com pnpm launch:preflight:production`</p>\n<p>   and `BASE_URL=https://www.metamuseum.org pnpm smoke:crawler-preview`</p>\n<p>   before launch review. Treat `pnpm review:goals:check` as the authority for</p>\n<p>   whether the current launch evidence is green; a stale preflight note cannot</p>\n<p>   override unresolved deployment-environment or real-world blockers.</p>\n<p>   Refresh crawler previews after every domain change.</p>\n<ol><li>Keep the deployed validation/reconciliation service URLs set on Vercel and</li></ol>\n<p>   rerun preflight after any Render redeploy so the external service probes are</p>\n<p>   in evidence.</p>\n<ol><li>Set the 3 GitHub evidence variables → the nightly clock starts.</li></ol>\n<ol><li>For any enabled projection or publishing feature, verify `/workers` shows an</li></ol>\n<p>   effective next drain time and no blocked/dead-letter status.</p>\n<ol><li>Decide the uptime-monitoring approach (Prometheus stack) and begin partner</li></ol>\n<p>   outreach for the 3 activity consumers — these are the long-pole 30-day gates.</p>","updatedAt":"2018-10-20T01:46:40.000Z","checksum":"621cddad10fb341b46418a400925be0654411d0608372eb745380bbdb69ef1bb","checksumPrefix":"621cddad10fb","anchorCount":6,"lineCount":168,"rawUrl":"/api/docs/content?path=ops%2Fgo-live-checklist.md","htmlUrl":"/docs?doc=ops%2Fgo-live-checklist.md","apiUrl":"/api/docs/content?path=ops%2Fgo-live-checklist.md"}