{"ok":true,"meta":{"generatedAt":"2026-06-30T13:18:47.901Z"},"data":{"version":"tzv3-deployment-v1","endpoint":"/api/infrastructure/deployment/policy","ciPolicyEndpoint":"/api/infrastructure/ci-policy","launchChecklistEndpoint":"/api/infrastructure/launch-checklist","ownerInputsEndpoint":"/api/infrastructure/owner-inputs","sourceControlEndpoint":"/api/infrastructure/source-control","vercelLinkEndpoint":"/api/infrastructure/vercel-link","platforms":{"vercel":{"config":"vercel.json","framework":"nextjs","buildCommand":"npm run build","node":">=20.9.0","productionChecks":["npm run vercel:env:plan","npm run secrets:rotation","npm run ci:audit","npm run github-ci:audit","npm run source:audit","npm run vercel:link:audit","npm run owner-inputs","curl -s https://your-domain.example/api/infrastructure/ci-policy","curl -s https://your-domain.example/api/infrastructure/source-control","curl -s https://your-domain.example/api/infrastructure/vercel-link","curl -s https://your-domain.example/api/infrastructure/public-origin-policy","curl -s https://your-domain.example/api/infrastructure/production-evidence","npm run vercel:env:apply-known -- --write --scope <scope> after confirming the linked Artesc website project","npm run env:check:production","npm run origin:audit -- --require-production","npm run evidence:audit -- --require-production","npm run vercel:env:audit","npm run typecheck","npm test","npm run lint","npm run build","npm audit --omit=dev","npm run preflight:production","npm run admin:audit","curl -s https://your-domain.example/api/database/audit-policy","npm run database:seed-payload","npm run database:audit","npm run telegram:handoff","curl -s https://your-domain.example/api/webhooks/telegram/setup-policy","npm run telegram:audit","npm run club:handoff","curl -s https://your-domain.example/api/club/handoff-policy","npm run club:audit","npm run legal:audit","npm run reviews:audit","npm run media:public-urls","npm run schedule:provider-handoff","npm run schedule:provider-import-payload","npm run schedule:provider-reconciliation -- --require-production","npm run schedule:links:audit","npm run schedule:audit","npm run media:audit","npm run pwa-push:audit","npm run search:bulk-payload","npm run search:audit","npm run vitals:audit","npm run cloudflare:audit","TZV3_BASE_URL=https://your-domain.example npm run readiness","TZV3_BASE_URL=https://your-domain.example npm run seo:audit","TZV3_BASE_URL=https://your-domain.example npm run load:smoke"]},"netlify":{"config":"netlify.toml","buildCommand":"npm run build","plugin":"@netlify/plugin-nextjs"}},"scripts":{"envCheck":true,"productionEnvCheck":true,"vercelLinkAudit":true,"vercelEnvAudit":true,"vercelEnvPlan":true,"vercelEnvApplyKnown":true,"adminAudit":true,"ciAudit":true,"githubCiAudit":true,"cloudflareAudit":true,"clubAudit":true,"clubHandoff":true,"databaseAudit":true,"databaseSeedPayload":true,"evidenceAudit":true,"mediaAudit":true,"mediaPublicUrls":true,"originAudit":true,"ownerInputs":true,"legalAudit":true,"pwaPushAudit":true,"preflight":true,"productionPreflight":true,"readiness":true,"reviewsAudit":true,"scheduleAudit":true,"scheduleLinksAudit":true,"scheduleProviderHandoff":true,"scheduleProviderImportPayload":true,"scheduleProviderReconciliation":true,"searchBulkPayload":true,"searchAudit":true,"secretsRotation":true,"seoAudit":true,"sourceAudit":true,"telegramAudit":true,"telegramHandoff":true,"vitalsAudit":true,"loadSmoke":true},"environment":{"required":[{"name":"NEXT_PUBLIC_SITE_URL","purpose":"Canonical public domain for metadata, sitemap, structured data, and readiness checks","requiredForProduction":true,"configured":true,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_URL","purpose":"Public link to the separate scheduling module","requiredForProduction":true,"configured":true,"placeholder":false},{"name":"DATABASE_URL","purpose":"PostgreSQL catalog/admin/status persistence","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"ADMIN_API_TOKEN","purpose":"Protected admin write and seed API access","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"ADMIN_SESSION_SECRET","purpose":"Signed HttpOnly admin UI session cookies","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"TELEGRAM_WEBHOOK_SECRET","purpose":"Telegram live-status webhook authentication","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"VIP_CLUB_WEBHOOK_URL","purpose":"Telegram workflow forwarding for VIP verification","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"VIP_CLUB_WEBHOOK_TOKEN","purpose":"Bearer token and HMAC signing secret for VIP Club workflow forwarding","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"LEGAL_CONTACT_EMAIL","purpose":"Dedicated legal/contact inbox for takedown, deletion, and data-subject requests","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"ELASTICSEARCH_URL","purpose":"Elastic Cloud instant search","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"ELASTICSEARCH_API_KEY","purpose":"Elastic Cloud API key for server-side search","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"UPSTASH_REDIS_REST_URL","purpose":"Upstash Redis REST endpoint for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"UPSTASH_REDIS_REST_TOKEN","purpose":"Upstash Redis REST token for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_MEDIA_CDN_URL","purpose":"Public CDN base URL for catalog images and video visits","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_R2_BUCKET","purpose":"Production media storage","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_R2_ACCESS_KEY_ID","purpose":"Cloudflare R2 media storage access key id","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_R2_SECRET_ACCESS_KEY","purpose":"Cloudflare R2 media storage secret access key","requiredForProduction":true,"configured":false,"placeholder":false},{"name":"WEB_VITALS_ENDPOINT_URL","purpose":"Production browser Web Vitals sink","requiredForProduction":true,"configured":false,"placeholder":false}],"optional":[{"name":"SCHEDULE_API_URL","purpose":"Optional server-side forwarding to the separate schedule service when it exposes availability/request endpoints","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"SCHEDULE_API_TOKEN","purpose":"Bearer token for server-to-server schedule calls","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"SCHEDULE_AVAILABILITY_PATH","purpose":"Existing schedule API path for availability checks","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"SCHEDULE_REQUEST_PATH","purpose":"Existing schedule API path for request forwarding","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_PROJECT_URL","purpose":"Ready-made schedule project origin for iframe and widget integrations","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_EMBED_URL","purpose":"Ready-made schedule iframe URL without site/lang query params","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_WIDGET_URL","purpose":"Ready-made schedule widget script URL without site/lang query params","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_SITE","purpose":"Schedule tenant key, expected to be artesc in production","requiredForProduction":false,"configured":true,"placeholder":false},{"name":"NEXT_PUBLIC_SCHEDULE_LANG","purpose":"Default schedule language for iframe/widget rendering","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"OPENAI_API_KEY","purpose":"Approved SEO copy and Smart Match provider","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"OPENAI_MODEL","purpose":"Pinned OpenAI Responses API model for admin-reviewed SEO copy drafts","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"GOOGLE_TRANSLATE_API_KEY","purpose":"Approved production translation provider","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"ELASTICSEARCH_INDEX","purpose":"Elastic profile index name, defaults to profiles","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"ELASTICSEARCH_SEARCH_PATH","purpose":"Elastic search endpoint path, defaults to /{index}/_search","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"SEARCH_CACHE_TTL_SECONDS","purpose":"Upstash Redis TTL for repeated search results","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"MEDIA_AI_PROVIDER_URL","purpose":"Approved media enhancement provider","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"MEDIA_AI_PROVIDER_TOKEN","purpose":"Bearer token for the approved media enhancement provider","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"WEB_VITALS_ENDPOINT_TOKEN","purpose":"Bearer token for the production Web Vitals sink","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"NEXT_PUBLIC_VAPID_PUBLIC_KEY","purpose":"Browser public key for explicit PWA push subscription opt-in","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"PWA_PUSH_PROVIDER_URL","purpose":"Approved provider endpoint for storing explicit PushSubscription records","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"PWA_PUSH_PROVIDER_TOKEN","purpose":"Bearer token for the approved PWA push subscription provider","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_ACCOUNT_ID","purpose":"Cloudflare automation and mirror monitoring","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_ZONE_ID","purpose":"Cloudflare DNS/WAF zone","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"CLOUDFLARE_API_TOKEN","purpose":"Cloudflare API token for WAF, DNS, and mirror automation checks","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"PRIMARY_DOMAIN_CHECK_URL","purpose":"Canonical URL used by mirror and uptime checks","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"MIRROR_DOMAINS","purpose":"Comma-separated mirror domains for uptime checks","requiredForProduction":false,"configured":false,"placeholder":false},{"name":"MIRROR_TELEGRAM_ALERT_URL","purpose":"Telegram alert webhook for mirror and primary-domain monitoring","requiredForProduction":false,"configured":false,"placeholder":false}],"requiredMissing":["DATABASE_URL","ADMIN_API_TOKEN","ADMIN_SESSION_SECRET","TELEGRAM_WEBHOOK_SECRET","VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN","LEGAL_CONTACT_EMAIL","ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN","NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY","WEB_VITALS_ENDPOINT_URL"],"optionalMissing":["SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH","NEXT_PUBLIC_SCHEDULE_PROJECT_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_LANG","OPENAI_API_KEY","OPENAI_MODEL","GOOGLE_TRANSLATE_API_KEY","ELASTICSEARCH_INDEX","ELASTICSEARCH_SEARCH_PATH","SEARCH_CACHE_TTL_SECONDS","MEDIA_AI_PROVIDER_URL","MEDIA_AI_PROVIDER_TOKEN","WEB_VITALS_ENDPOINT_TOKEN","NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN","CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","PRIMARY_DOMAIN_CHECK_URL","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"productionReady":false},"productionBoundary":["A green local readiness result does not imply production readiness.","Production requires real env values, not example placeholders or localhost URLs.","Run secrets:rotation before env writes so generated secrets, owner/provider credentials, public defaults, and post-rotation audits are separated without printing values.","Run ci:audit before env writes so GitHub Actions has a no-write TZV3 quality gate for push and pull_request on main.","Run github-ci:audit before production promotion so the hosted GitHub Actions TZV3 CI run is completed successfully on main.","Run source:audit before env writes so the website source repository is GitHub parkourcafe/artesc, not a schedule-project repository.","Run vercel:link:audit before launch so local .vercel/project.json cannot point to the protected schedule project.","Run env:check:production before setting a deployment live.","Confirm /api/infrastructure/vercel-link is linked to the Artesc website project, not the protected schedule project.","Run origin:audit before launch so canonical domain, schedule link, media CDN, route URL proofs, and Vercel link status are checked together.","Run evidence:audit before launch so the no-write evidence plan covers every blocking launch stage and required deployed-domain command.","Run preflight:production with TZV3_BASE_URL before launch to execute the ordered local and production no-write gates.","Run admin:audit before launch so admin session policy, noindex shell, and anonymous rejection boundaries are verified without creating sessions.","Capture /api/database/audit-policy before running database:audit so the expected SELECT-only audit contract is recorded.","Run database:seed-payload before POST /api/admin/seed so the exact no-write static seed payload and hash are recorded.","Run database:audit before launch so required PostgreSQL tables, indexes, and seed baseline counts are verified with read-only queries.","Run telegram:handoff before telegram:audit so Telegram-native setWebhook secret_token, custom relay headers, and no-secret setup templates are confirmed.","Run telegram:audit before launch so the status webhook rejects bad tokens and invalid payloads without writes.","Run club:handoff before club:audit so the external VIP receiver headers, HMAC contract, idempotency, and human-approval boundary are confirmed without creating tickets.","Run club:audit before launch so VIP Club policy reports signed external-webhook forwarding without creating verification tickets.","Run legal:audit before launch so public legal pages, retention records, and a dedicated legal inbox are verified without submitting requests.","Run reviews:audit before launch so Review/AggregateRating JSON-LD is backed by real moderated PostgreSQL reviews without creating review intake.","Run media:public-urls before launch so media used by the catalog and external schedule provider drafts resolves to production-safe HTTPS URLs.","Run schedule:provider-handoff before launch so the external schedule admin/import has profile-mapped provider drafts for site=artesc.","Run schedule:provider-import-payload before launch so the external schedule admin/import receives a clean provider payload for site=artesc.","Run schedule:provider-reconciliation after import so public site=artesc providers match every Artesc profile slug before schedule:audit.","Run schedule:links:audit before launch so every profile CTA carries profile/site/lang into the ready-made schedule iframe.","Run schedule:audit before launch so the production schedule tenant has real providers, not only an empty iframe shell.","Run media:audit before launch so CDN delivery and Cloudflare R2 environment are verified without media writes.","Run pwa-push:audit before launch so VAPID, provider forwarding, and unsubscribe/delete evidence are verified without creating subscriptions.","Run search:bulk-payload before importing the Elastic profile index so settings, mappings, bulk NDJSON, and hashes are recorded.","Run search:audit before launch so Elastic and Upstash Redis are verified with read-only probes.","Run vitals:audit before launch so the approved Web Vitals sink is reachable without posting metrics.","Run Cloudflare audit, readiness, SEO audit, and load smoke against the deployed domain after DNS, database, schedule, and Telegram are connected.","Use /api/infrastructure/owner-inputs, /api/infrastructure/secret-rotation, and /api/infrastructure/launch-checklist as the owner-input, secret handoff, and evidence sequence before declaring TZV3 production-ready."]}}