{"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\n> Replace `<PROD_URL>` with the production URL (e.g. `https://metamuseum-sundog358s-projects.vercel.app`\n> or a custom domain). No trailing slash.\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 | already set |\n| `METAMUSEUM_STORAGE_MODE` | `postgres` | already set |\n| `AUTH_SECRET` | (already set) | — |\n| `BASE_URL` | `<PROD_URL>` | canonical URL, SLO target |\n| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `<PROD_URL>` | uptime/probe target |\n| `AUTH_GITHUB_ID` | GitHub OAuth app client ID | **last preflight blocker**; 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\nAlso: **Settings → Deployment Protection → Vercel Authentication → Disabled**\n(so the public can reach the read-only demo).\n\nGitHub OAuth app: https://github.com/settings/developers → New OAuth App →\nHomepage `<PROD_URL>`, callback `<PROD_URL>/api/auth/callback/github`.\n\n---\n\n## 2. Render — deploy the validation service\n\nThe data-quality report (validation) is the literal pilot deliverable, so it's\nthe priority Python service. `render.yaml` blueprints validation +\nreconciliation (+ Redis); the AG2 worker is intentionally excluded.\n\n1. Render → **New → Blueprint** → select this repo (reads `render.yaml`).\n2. Confirm `metamuseum-validation` builds (`pip install -r requirements.txt`)\n   and starts (`uvicorn main:APP --host 0.0.0.0 --port $PORT`), health `/health`.\n3. Copy its URL → set `VALIDATION_SERVICE_URL=https://<svc>.onrender.com/validate`\n   on Vercel → redeploy.\n4. (Optional) reconciliation comes up alongside with its Redis cache wired in.\n\n> Free Render web services cold-start in ~30–60s; fine for pilots, upgrade for SLAs.\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` | `<PROD_URL>` | k6 SLO + AI-query evidence |\n| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `<PROD_URL>` | uptime probe target |\n| `METAMUSEUM_EVIDENCE_IIIF_TILE_URL` | `<PROD_URL>/icon.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 `<PROD_URL>/api/getty/sparql`.\n\nCLI (run once `<PROD_URL>` is known):\n```bash\ngh variable set METAMUSEUM_EVIDENCE_BASE_URL --body \"<PROD_URL>\"\ngh variable set METAMUSEUM_PUBLIC_READ_BASE_URL --body \"<PROD_URL>\"\ngh variable set METAMUSEUM_EVIDENCE_IIIF_TILE_URL --body \"<PROD_URL>/icon.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. Set Vercel env vars + GitHub OAuth + disable Deployment Protection → rerun\n   `pnpm launch:preflight:production` until the `AUTH_GITHUB_ID` failure clears.\n2. Deploy validation on Render → set `VALIDATION_SERVICE_URL` → redeploy Vercel.\n3. Set the 3 GitHub evidence variables → the nightly clock starts.\n4. 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 — deploy the validation service","anchor":"2-render-deploy-the-validation-service"},{"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<blockquote>Replace `&lt;PROD_URL&gt;` with the production URL (e.g. `https://metamuseum-sundog358s-projects.vercel.app`</blockquote>\n<blockquote>or a custom domain). No trailing slash.</blockquote>\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 | already set |</p>\n<p>| `METAMUSEUM_STORAGE_MODE` | `postgres` | already set |</p>\n<p>| `AUTH_SECRET` | (already set) | — |</p>\n<p>| `BASE_URL` | `&lt;PROD_URL&gt;` | canonical URL, SLO target |</p>\n<p>| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `&lt;PROD_URL&gt;` | uptime/probe target |</p>\n<p>| `AUTH_GITHUB_ID` | GitHub OAuth app client ID | <strong>last preflight blocker</strong>; 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>Also: <strong>Settings → Deployment Protection → Vercel Authentication → Disabled</strong></p>\n<p>(so the public can reach the read-only demo).</p>\n<p>GitHub OAuth app: https://github.com/settings/developers → New OAuth App →</p>\n<p>Homepage `&lt;PROD_URL&gt;`, callback `&lt;PROD_URL&gt;/api/auth/callback/github`.</p>\n<p>---</p>\n<h2 id=\"2-render-deploy-the-validation-service\">2. Render — deploy the validation service</h2>\n<p>The data-quality report (validation) is the literal pilot deliverable, so it&#39;s</p>\n<p>the priority Python service. `render.yaml` blueprints validation +</p>\n<p>reconciliation (+ Redis); the AG2 worker is intentionally excluded.</p>\n<ol><li>Render → <strong>New → Blueprint</strong> → select this repo (reads `render.yaml`).</li></ol>\n<ol><li>Confirm `metamuseum-validation` builds (`pip install -r requirements.txt`)</li></ol>\n<p>   and starts (`uvicorn main:APP --host 0.0.0.0 --port $PORT`), health `/health`.</p>\n<ol><li>Copy its URL → set `VALIDATION_SERVICE_URL=https://&lt;svc&gt;.onrender.com/validate`</li></ol>\n<p>   on Vercel → redeploy.</p>\n<ol><li>(Optional) reconciliation comes up alongside with its Redis cache wired in.</li></ol>\n<blockquote>Free Render web services cold-start in ~30–60s; fine for pilots, upgrade for SLAs.</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` | `&lt;PROD_URL&gt;` | k6 SLO + AI-query evidence |</p>\n<p>| `METAMUSEUM_PUBLIC_READ_BASE_URL` | `&lt;PROD_URL&gt;` | uptime probe target |</p>\n<p>| `METAMUSEUM_EVIDENCE_IIIF_TILE_URL` | `&lt;PROD_URL&gt;/icon.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 `&lt;PROD_URL&gt;/api/getty/sparql`.</p>\n<p>CLI (run once `&lt;PROD_URL&gt;` is known):</p>\n<pre><code>\ngh variable set METAMUSEUM_EVIDENCE_BASE_URL --body &quot;&lt;PROD_URL&gt;&quot;\ngh variable set METAMUSEUM_PUBLIC_READ_BASE_URL --body &quot;&lt;PROD_URL&gt;&quot;\ngh variable set METAMUSEUM_EVIDENCE_IIIF_TILE_URL --body &quot;&lt;PROD_URL&gt;/icon.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>Set Vercel env vars + GitHub OAuth + disable Deployment Protection → rerun</li></ol>\n<p>   `pnpm launch:preflight:production` until the `AUTH_GITHUB_ID` failure clears.</p>\n<ol><li>Deploy validation on Render → set `VALIDATION_SERVICE_URL` → redeploy Vercel.</li></ol>\n<ol><li>Set the 3 GitHub evidence variables → the nightly clock starts.</li></ol>\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":"ae7f5d71f7dcf62e86737639f05366b32292f5697a167fcc5b1466eba88b78f2","checksumPrefix":"ae7f5d71f7dc","anchorCount":6,"lineCount":91,"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"}