{"ok":true,"meta":{"generatedAt":"2026-06-30T13:18:21.156Z"},"data":{"version":"tzv3-owner-inputs-v1","endpoint":"/api/infrastructure/owner-inputs","command":"npm run owner-inputs","script":"scripts/tzv3-owner-inputs.mjs","configured":true,"safety":{"mode":"read-only","writes":false,"printsSecrets":false,"note":"Reports only env names, configured/placeholder booleans, owner inputs, and verification commands. It never prints env values."},"summary":{"stages":14,"ownerInputCount":52,"requiredEnvironmentCount":18,"configuredRequiredEnvironmentCount":2,"missingRequiredEnvironmentCount":16,"missingOptionalEnvironmentCount":26,"envBlockedStages":10,"evidenceBlockedStages":4},"ownerInputQueue":[{"input":"Final domain name","stageIds":["domain"],"firstStageOrder":1,"firstInputOrder":0,"firstStageTitle":"Canonical production domain","relatedEnvironment":["NEXT_PUBLIC_SITE_URL"],"firstVerification":"npm run source:audit"},{"input":"DNS or Cloudflare access","stageIds":["domain"],"firstStageOrder":1,"firstInputOrder":1,"firstStageTitle":"Canonical production domain","relatedEnvironment":["NEXT_PUBLIC_SITE_URL"],"firstVerification":"npm run source:audit"},{"input":"Final brand spelling","stageIds":["domain"],"firstStageOrder":1,"firstInputOrder":2,"firstStageTitle":"Canonical production domain","relatedEnvironment":["NEXT_PUBLIC_SITE_URL"],"firstVerification":"npm run source:audit"},{"input":"Public schedule URL","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":0,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Schedule iframe URL","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":1,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Schedule widget script URL","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":2,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Schedule admin/import access for provider creation","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":3,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Real providers attached to schedule tenant site=artesc","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":4,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Schedule API base URL only if server-side availability/request forwarding is required","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":5,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Schedule API token only if the optional server API requires auth","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":6,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Availability and request endpoint paths only if the optional server API differs from defaults","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":7,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Profile slug mapping used by the schedule service","stageIds":["schedule"],"firstStageOrder":2,"firstInputOrder":8,"firstStageTitle":"Ready-made schedule connector","relatedEnvironment":["NEXT_PUBLIC_SCHEDULE_URL","NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_SITE","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstVerification":"npm run schedule:provider-handoff"},{"input":"Supabase, Neon, or PostgreSQL DATABASE_URL","stageIds":["database"],"firstStageOrder":3,"firstInputOrder":0,"firstStageTitle":"Production PostgreSQL and seed import","relatedEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run database:seed-payload"},{"input":"Decision on production region","stageIds":["database"],"firstStageOrder":3,"firstInputOrder":1,"firstStageTitle":"Production PostgreSQL and seed import","relatedEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run database:seed-payload"},{"input":"Permission to generate secrets or supplied ADMIN_API_TOKEN and ADMIN_SESSION_SECRET","stageIds":["admin-security"],"firstStageOrder":4,"firstInputOrder":0,"firstStageTitle":"Admin secrets and audit","relatedEnvironment":["ADMIN_API_TOKEN","ADMIN_SESSION_SECRET"],"firstVerification":"npm run admin:audit"},{"input":"Admin actor naming convention","stageIds":["admin-security"],"firstStageOrder":4,"firstInputOrder":1,"firstStageTitle":"Admin secrets and audit","relatedEnvironment":["ADMIN_API_TOKEN","ADMIN_SESSION_SECRET"],"firstVerification":"npm run admin:audit"},{"input":"Telegram bot token","stageIds":["telegram-status"],"firstStageOrder":5,"firstInputOrder":0,"firstStageTitle":"Telegram live-status workflow","relatedEnvironment":["TELEGRAM_WEBHOOK_SECRET","DATABASE_URL"],"firstVerification":"npm run telegram:handoff"},{"input":"TELEGRAM_WEBHOOK_SECRET","stageIds":["telegram-status"],"firstStageOrder":5,"firstInputOrder":1,"firstStageTitle":"Telegram live-status workflow","relatedEnvironment":["TELEGRAM_WEBHOOK_SECRET","DATABASE_URL"],"firstVerification":"npm run telegram:handoff"},{"input":"Operator chat or workflow IDs","stageIds":["telegram-status"],"firstStageOrder":5,"firstInputOrder":2,"firstStageTitle":"Telegram live-status workflow","relatedEnvironment":["TELEGRAM_WEBHOOK_SECRET","DATABASE_URL"],"firstVerification":"npm run telegram:handoff"},{"input":"VIP Club Telegram workflow URL","stageIds":["vip-club"],"firstStageOrder":6,"firstInputOrder":0,"firstStageTitle":"VIP Club verification workflow","relatedEnvironment":["VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN"],"firstVerification":"npm run club:handoff"},{"input":"VIP Club webhook signing token","stageIds":["vip-club"],"firstStageOrder":6,"firstInputOrder":1,"firstStageTitle":"VIP Club verification workflow","relatedEnvironment":["VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN"],"firstVerification":"npm run club:handoff"},{"input":"Operator verification procedure","stageIds":["vip-club"],"firstStageOrder":6,"firstInputOrder":2,"firstStageTitle":"VIP Club verification workflow","relatedEnvironment":["VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN"],"firstVerification":"npm run club:handoff"},{"input":"NEXT_PUBLIC_MEDIA_CDN_URL","stageIds":["media-cdn"],"firstStageOrder":7,"firstInputOrder":0,"firstStageTitle":"Media storage and CDN delivery","relatedEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"input":"Cloudflare R2 bucket","stageIds":["media-cdn"],"firstStageOrder":7,"firstInputOrder":1,"firstStageTitle":"Media storage and CDN delivery","relatedEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"input":"R2 access key","stageIds":["media-cdn"],"firstStageOrder":7,"firstInputOrder":2,"firstStageTitle":"Media storage and CDN delivery","relatedEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"input":"R2 secret","stageIds":["media-cdn"],"firstStageOrder":7,"firstInputOrder":3,"firstStageTitle":"Media storage and CDN delivery","relatedEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"input":"Approved media upload workflow","stageIds":["media-cdn"],"firstStageOrder":7,"firstInputOrder":4,"firstStageTitle":"Media storage and CDN delivery","relatedEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"input":"Elastic URL","stageIds":["search-cache"],"firstStageOrder":8,"firstInputOrder":0,"firstStageTitle":"Elastic search and Redis cache","relatedEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","ELASTICSEARCH_INDEX","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"},{"input":"Elastic API key","stageIds":["search-cache"],"firstStageOrder":8,"firstInputOrder":1,"firstStageTitle":"Elastic search and Redis cache","relatedEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","ELASTICSEARCH_INDEX","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"},{"input":"Elastic profile index name","stageIds":["search-cache"],"firstStageOrder":8,"firstInputOrder":2,"firstStageTitle":"Elastic search and Redis cache","relatedEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","ELASTICSEARCH_INDEX","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"},{"input":"Upstash Redis REST URL","stageIds":["search-cache"],"firstStageOrder":8,"firstInputOrder":3,"firstStageTitle":"Elastic search and Redis cache","relatedEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","ELASTICSEARCH_INDEX","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"},{"input":"Upstash Redis REST token","stageIds":["search-cache"],"firstStageOrder":8,"firstInputOrder":4,"firstStageTitle":"Elastic search and Redis cache","relatedEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","ELASTICSEARCH_INDEX","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"},{"input":"At least one real moderated review","stageIds":["reviews-seo"],"firstStageOrder":9,"firstInputOrder":0,"firstStageTitle":"Real reviews and Review JSON-LD","relatedEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run reviews:audit"},{"input":"Admin moderation procedure","stageIds":["reviews-seo"],"firstStageOrder":9,"firstInputOrder":1,"firstStageTitle":"Real reviews and Review JSON-LD","relatedEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run reviews:audit"},{"input":"Decision to expose Review/AggregateRating JSON-LD","stageIds":["reviews-seo"],"firstStageOrder":9,"firstInputOrder":2,"firstStageTitle":"Real reviews and Review JSON-LD","relatedEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run reviews:audit"},{"input":"Approved PWA push provider endpoint","stageIds":["pwa-push"],"firstStageOrder":10,"firstInputOrder":0,"firstStageTitle":"PWA push provider and unsubscribe evidence","relatedEnvironment":["NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN"],"firstVerification":"npm run pwa-push:audit"},{"input":"VAPID public key","stageIds":["pwa-push"],"firstStageOrder":10,"firstInputOrder":1,"firstStageTitle":"PWA push provider and unsubscribe evidence","relatedEnvironment":["NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN"],"firstVerification":"npm run pwa-push:audit"},{"input":"PWA push provider bearer token","stageIds":["pwa-push"],"firstStageOrder":10,"firstInputOrder":2,"firstStageTitle":"PWA push provider and unsubscribe evidence","relatedEnvironment":["NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN"],"firstVerification":"npm run pwa-push:audit"},{"input":"Provider-side delete/export evidence before notification sends","stageIds":["pwa-push"],"firstStageOrder":10,"firstInputOrder":3,"firstStageTitle":"PWA push provider and unsubscribe evidence","relatedEnvironment":["NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN"],"firstVerification":"npm run pwa-push:audit"},{"input":"Approved analytics provider or endpoint","stageIds":["analytics"],"firstStageOrder":11,"firstInputOrder":0,"firstStageTitle":"Web Vitals and analytics sink","relatedEnvironment":["WEB_VITALS_ENDPOINT_URL","WEB_VITALS_ENDPOINT_TOKEN"],"firstVerification":"npm run vitals:audit"},{"input":"WEB_VITALS_ENDPOINT_URL","stageIds":["analytics"],"firstStageOrder":11,"firstInputOrder":1,"firstStageTitle":"Web Vitals and analytics sink","relatedEnvironment":["WEB_VITALS_ENDPOINT_URL","WEB_VITALS_ENDPOINT_TOKEN"],"firstVerification":"npm run vitals:audit"},{"input":"WEB_VITALS_ENDPOINT_TOKEN if required","stageIds":["analytics"],"firstStageOrder":11,"firstInputOrder":2,"firstStageTitle":"Web Vitals and analytics sink","relatedEnvironment":["WEB_VITALS_ENDPOINT_URL","WEB_VITALS_ENDPOINT_TOKEN"],"firstVerification":"npm run vitals:audit"},{"input":"LEGAL_CONTACT_EMAIL","stageIds":["legal"],"firstStageOrder":12,"firstInputOrder":0,"firstStageTitle":"Legal pages and takedown contact","relatedEnvironment":["LEGAL_CONTACT_EMAIL"],"firstVerification":"npm run legal:audit"},{"input":"Final legal wording","stageIds":["legal"],"firstStageOrder":12,"firstInputOrder":1,"firstStageTitle":"Legal pages and takedown contact","relatedEnvironment":["LEGAL_CONTACT_EMAIL"],"firstVerification":"npm run legal:audit"},{"input":"Counsel approval for retention and takedown flow","stageIds":["legal"],"firstStageOrder":12,"firstInputOrder":2,"firstStageTitle":"Legal pages and takedown contact","relatedEnvironment":["LEGAL_CONTACT_EMAIL"],"firstVerification":"npm run legal:audit"},{"input":"Cloudflare account ID","stageIds":["cloudflare"],"firstStageOrder":13,"firstInputOrder":0,"firstStageTitle":"Cloudflare DNS, WAF, and monitoring","relatedEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstVerification":"npm run cloudflare:audit"},{"input":"Zone ID","stageIds":["cloudflare"],"firstStageOrder":13,"firstInputOrder":1,"firstStageTitle":"Cloudflare DNS, WAF, and monitoring","relatedEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstVerification":"npm run cloudflare:audit"},{"input":"API token","stageIds":["cloudflare"],"firstStageOrder":13,"firstInputOrder":2,"firstStageTitle":"Cloudflare DNS, WAF, and monitoring","relatedEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstVerification":"npm run cloudflare:audit"},{"input":"Mirror domains if used","stageIds":["cloudflare"],"firstStageOrder":13,"firstInputOrder":3,"firstStageTitle":"Cloudflare DNS, WAF, and monitoring","relatedEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstVerification":"npm run cloudflare:audit"},{"input":"Telegram alert webhook if used","stageIds":["cloudflare"],"firstStageOrder":13,"firstInputOrder":4,"firstStageTitle":"Cloudflare DNS, WAF, and monitoring","relatedEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstVerification":"npm run cloudflare:audit"},{"input":"Deployed URL","stageIds":["final-qa"],"firstStageOrder":14,"firstInputOrder":0,"firstStageTitle":"Final deployed-domain QA","relatedEnvironment":["NEXT_PUBLIC_SITE_URL","NEXT_PUBLIC_SCHEDULE_URL","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"],"firstVerification":"TZV3_BASE_URL=https://your-domain.example npm run preflight:production"},{"input":"Approval to run read-only checks against production","stageIds":["final-qa"],"firstStageOrder":14,"firstInputOrder":1,"firstStageTitle":"Final deployed-domain QA","relatedEnvironment":["NEXT_PUBLIC_SITE_URL","NEXT_PUBLIC_SCHEDULE_URL","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"],"firstVerification":"TZV3_BASE_URL=https://your-domain.example npm run preflight:production"}],"stages":[{"id":"domain","order":1,"title":"Canonical production domain","status":"needs-deployed-evidence","ownerInputs":["Final domain name","DNS or Cloudflare access","Final brand spelling"],"environment":[{"name":"NEXT_PUBLIC_SITE_URL","purpose":"Canonical public domain for metadata, sitemap, structured data, and readiness checks","requiredForProduction":true,"configured":true,"placeholder":false,"missingFromStage":false}],"missingRequiredEnvironment":[],"missingOptionalEnvironment":[],"firstImplementationStep":"Set NEXT_PUBLIC_SITE_URL to the real HTTPS domain.","firstVerification":"npm run source:audit","verification":["npm run source:audit","npm run ci:audit","npm run github-ci:audit","npm run vercel:link:audit","npm run origin:audit -- --require-production","curl -s https://your-domain.example/api/infrastructure/source-control","curl -s https://your-domain.example/api/infrastructure/ci-policy","curl -s https://your-domain.example/api/infrastructure/public-origin-policy","curl -s https://your-domain.example/api/infrastructure/vercel-link","curl -s https://your-domain.example/robots.txt","curl -s https://your-domain.example/sitemap.xml","TZV3_BASE_URL=https://your-domain.example npm run seo:audit"],"nextAction":"npm run source:audit"},{"id":"schedule","order":2,"title":"Ready-made schedule connector","status":"needs-deployed-evidence","ownerInputs":["Public schedule URL","Schedule iframe URL","Schedule widget script URL","Schedule admin/import access for provider creation","Real providers attached to schedule tenant site=artesc","Schedule API base URL only if server-side availability/request forwarding is required","Schedule API token only if the optional server API requires auth","Availability and request endpoint paths only if the optional server API differs from defaults","Profile slug mapping used by the schedule service"],"environment":[{"name":"NEXT_PUBLIC_SCHEDULE_URL","purpose":"Public link to the separate scheduling module","requiredForProduction":true,"configured":true,"placeholder":false,"missingFromStage":false},{"name":"NEXT_PUBLIC_SCHEDULE_EMBED_URL","purpose":"Ready-made schedule iframe URL without site/lang query params","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"NEXT_PUBLIC_SCHEDULE_WIDGET_URL","purpose":"Ready-made schedule widget script URL without site/lang query params","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"NEXT_PUBLIC_SCHEDULE_SITE","purpose":"Schedule tenant key, expected to be artesc in production","requiredForProduction":false,"configured":true,"placeholder":false,"missingFromStage":false},{"name":"NEXT_PUBLIC_SCHEDULE_LANG","purpose":"Default schedule language for iframe/widget rendering","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"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,"missingFromStage":true},{"name":"SCHEDULE_API_TOKEN","purpose":"Bearer token for server-to-server schedule calls","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"SCHEDULE_AVAILABILITY_PATH","purpose":"Existing schedule API path for availability checks","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"SCHEDULE_REQUEST_PATH","purpose":"Existing schedule API path for request forwarding","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":[],"missingOptionalEnvironment":["NEXT_PUBLIC_SCHEDULE_EMBED_URL","NEXT_PUBLIC_SCHEDULE_WIDGET_URL","NEXT_PUBLIC_SCHEDULE_LANG","SCHEDULE_API_URL","SCHEDULE_API_TOKEN","SCHEDULE_AVAILABILITY_PATH","SCHEDULE_REQUEST_PATH"],"firstImplementationStep":"Set NEXT_PUBLIC_SCHEDULE_URL for all public CTA links.","firstVerification":"npm run schedule:provider-handoff","verification":["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","curl -s https://your-domain.example/api/schedule/provider-handoff-policy","curl -s https://your-domain.example/api/schedule/provider-import-payload","curl -s https://your-domain.example/api/schedule/provider-reconciliation","curl -s https://your-domain.example/api/schedule/link-audit-policy","curl -I https://your-domain.example/schedule-preview?site=artesc&lang=en","curl -s https://your-domain.example/api/schedule/tenant-status","curl -s https://your-domain.example/api/schedule/status","curl -s 'https://your-domain.example/api/schedule/availability?profile=sofia'"],"nextAction":"npm run schedule:provider-handoff"},{"id":"database","order":3,"title":"Production PostgreSQL and seed import","status":"missing-required-env","ownerInputs":["Supabase, Neon, or PostgreSQL DATABASE_URL","Decision on production region"],"environment":[{"name":"DATABASE_URL","purpose":"PostgreSQL catalog/admin/status persistence","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ADMIN_API_TOKEN","purpose":"Protected admin write and seed API access","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"missingOptionalEnvironment":[],"firstImplementationStep":"Record /api/database/audit-policy, /api/database/migration-manifest, /api/database/seed-manifest, and /api/database/seed-payload before touching production data.","firstVerification":"npm run database:seed-payload","verification":["npm run database:seed-payload","npm run database:audit","curl -s https://your-domain.example/api/database/bootstrap-policy","curl -s https://your-domain.example/api/database/audit-policy","curl -s https://your-domain.example/api/database/seed-payload","curl -s https://your-domain.example/api/health","curl -s https://your-domain.example/api/profiles"],"nextAction":"Set DATABASE_URL, ADMIN_API_TOKEN"},{"id":"admin-security","order":4,"title":"Admin secrets and audit","status":"missing-required-env","ownerInputs":["Permission to generate secrets or supplied ADMIN_API_TOKEN and ADMIN_SESSION_SECRET","Admin actor naming convention"],"environment":[{"name":"ADMIN_API_TOKEN","purpose":"Protected admin write and seed API access","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ADMIN_SESSION_SECRET","purpose":"Signed HttpOnly admin UI session cookies","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["ADMIN_API_TOKEN","ADMIN_SESSION_SECRET"],"missingOptionalEnvironment":[],"firstImplementationStep":"Run npm run secrets:rotation and confirm generated Artesc secrets, owner/provider credentials, public defaults, and post-rotation audits are separated before env writes.","firstVerification":"npm run admin:audit","verification":["npm run admin:audit","npm run secrets:rotation","curl -s https://your-domain.example/api/infrastructure/secret-rotation","curl -s https://your-domain.example/api/admin/session","curl -s https://your-domain.example/api/admin/security-audit-policy","Open https://your-domain.example/admin/profiles and confirm the editor is locked before login, then unlocked after POST /api/admin/session.","curl -s https://your-domain.example/api/admin/audit/policy"],"nextAction":"Set ADMIN_API_TOKEN, ADMIN_SESSION_SECRET"},{"id":"telegram-status","order":5,"title":"Telegram live-status workflow","status":"missing-required-env","ownerInputs":["Telegram bot token","TELEGRAM_WEBHOOK_SECRET","Operator chat or workflow IDs"],"environment":[{"name":"TELEGRAM_WEBHOOK_SECRET","purpose":"Telegram live-status webhook authentication","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"DATABASE_URL","purpose":"PostgreSQL catalog/admin/status persistence","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["TELEGRAM_WEBHOOK_SECRET","DATABASE_URL"],"missingOptionalEnvironment":[],"firstImplementationStep":"Run npm run telegram:handoff and review the no-secret BotFather/setWebhook handoff.","firstVerification":"npm run telegram:handoff","verification":["npm run telegram:handoff","npm run telegram:audit","curl -s https://your-domain.example/api/webhooks/telegram/setup-policy","curl -s https://your-domain.example/api/webhooks/telegram/status","curl -s https://your-domain.example/api/status","curl -N --max-time 2 https://your-domain.example/api/status/stream"],"nextAction":"Set TELEGRAM_WEBHOOK_SECRET, DATABASE_URL"},{"id":"vip-club","order":6,"title":"VIP Club verification workflow","status":"missing-required-env","ownerInputs":["VIP Club Telegram workflow URL","VIP Club webhook signing token","Operator verification procedure"],"environment":[{"name":"VIP_CLUB_WEBHOOK_URL","purpose":"Telegram workflow forwarding for VIP verification","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"VIP_CLUB_WEBHOOK_TOKEN","purpose":"Bearer token and HMAC signing secret for VIP Club workflow forwarding","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN"],"missingOptionalEnvironment":[],"firstImplementationStep":"Run npm run club:handoff and review the no-secret external receiver contract.","firstVerification":"npm run club:handoff","verification":["npm run club:handoff","npm run club:audit","curl -s https://your-domain.example/api/club/policy","curl -s https://your-domain.example/api/club/handoff-policy","curl -s https://your-domain.example/api/club/audit-policy","curl -I https://your-domain.example/club"],"nextAction":"Set VIP_CLUB_WEBHOOK_URL, VIP_CLUB_WEBHOOK_TOKEN"},{"id":"media-cdn","order":7,"title":"Media storage and CDN delivery","status":"missing-required-env","ownerInputs":["NEXT_PUBLIC_MEDIA_CDN_URL","Cloudflare R2 bucket","R2 access key","R2 secret","Approved media upload workflow"],"environment":[{"name":"NEXT_PUBLIC_MEDIA_CDN_URL","purpose":"Public CDN base URL for catalog images and video visits","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_BUCKET","purpose":"Production media storage","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_ACCESS_KEY_ID","purpose":"Cloudflare R2 media storage access key id","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_SECRET_ACCESS_KEY","purpose":"Cloudflare R2 media storage secret access key","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"missingOptionalEnvironment":[],"firstImplementationStep":"Open /api/media/asset-manifest and use its publicPath, r2Key, contentType, bytes, and sha256 values as the upload contract.","firstVerification":"npm run media:public-urls","verification":["npm run media:public-urls","npm run media:audit","curl -s https://your-domain.example/api/media/public-url-policy","curl -s https://your-domain.example/api/media/video-policy","curl -s https://your-domain.example/api/media/enhancement-policy","curl -s https://your-domain.example/api/media/asset-manifest"],"nextAction":"Set NEXT_PUBLIC_MEDIA_CDN_URL, CLOUDFLARE_R2_BUCKET, CLOUDFLARE_R2_ACCESS_KEY_ID..."},{"id":"search-cache","order":8,"title":"Elastic search and Redis cache","status":"missing-required-env","ownerInputs":["Elastic URL","Elastic API key","Elastic profile index name","Upstash Redis REST URL","Upstash Redis REST token"],"environment":[{"name":"ELASTICSEARCH_URL","purpose":"Elastic Cloud instant search","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ELASTICSEARCH_API_KEY","purpose":"Elastic Cloud API key for server-side search","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ELASTICSEARCH_INDEX","purpose":"Elastic profile index name, defaults to profiles","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"UPSTASH_REDIS_REST_URL","purpose":"Upstash Redis REST endpoint for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"UPSTASH_REDIS_REST_TOKEN","purpose":"Upstash Redis REST token for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"missingOptionalEnvironment":["ELASTICSEARCH_INDEX"],"firstImplementationStep":"Open /api/search/index-manifest and use its settings, mappings, document payload, and hashes as the index import contract.","firstVerification":"npm run search:bulk-payload","verification":["npm run search:bulk-payload","npm run search:audit","curl -s https://your-domain.example/api/search/policy","curl -s https://your-domain.example/api/search/index-manifest","curl -s https://your-domain.example/api/search/bulk-payload","curl -s 'https://your-domain.example/api/search?q=vip%20english'"],"nextAction":"Set ELASTICSEARCH_URL, ELASTICSEARCH_API_KEY, UPSTASH_REDIS_REST_URL..."},{"id":"reviews-seo","order":9,"title":"Real reviews and Review JSON-LD","status":"missing-required-env","ownerInputs":["At least one real moderated review","Admin moderation procedure","Decision to expose Review/AggregateRating JSON-LD"],"environment":[{"name":"DATABASE_URL","purpose":"PostgreSQL catalog/admin/status persistence","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ADMIN_API_TOKEN","purpose":"Protected admin write and seed API access","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"missingOptionalEnvironment":[],"firstImplementationStep":"Collect real review intake through /api/reviews after PostgreSQL is connected.","firstVerification":"npm run reviews:audit","verification":["npm run reviews:audit","curl -s https://your-domain.example/api/reviews/policy","curl -s https://your-domain.example/api/reviews/audit-policy","curl -s https://your-domain.example/api/seo/review-schema"],"nextAction":"Set DATABASE_URL, ADMIN_API_TOKEN"},{"id":"pwa-push","order":10,"title":"PWA push provider and unsubscribe evidence","status":"needs-deployed-evidence","ownerInputs":["Approved PWA push provider endpoint","VAPID public key","PWA push provider bearer token","Provider-side delete/export evidence before notification sends"],"environment":[{"name":"NEXT_PUBLIC_VAPID_PUBLIC_KEY","purpose":"Browser public key for explicit PWA push subscription opt-in","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"PWA_PUSH_PROVIDER_URL","purpose":"Approved provider endpoint for storing explicit PushSubscription records","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"PWA_PUSH_PROVIDER_TOKEN","purpose":"Bearer token for the approved PWA push subscription provider","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":[],"missingOptionalEnvironment":["NEXT_PUBLIC_VAPID_PUBLIC_KEY","PWA_PUSH_PROVIDER_URL","PWA_PUSH_PROVIDER_TOKEN"],"firstImplementationStep":"Set NEXT_PUBLIC_VAPID_PUBLIC_KEY, PWA_PUSH_PROVIDER_URL, and PWA_PUSH_PROVIDER_TOKEN.","firstVerification":"npm run pwa-push:audit","verification":["npm run pwa-push:audit","curl -s https://your-domain.example/api/pwa/push/policy","curl -s https://your-domain.example/api/pwa/push/audit-policy"],"nextAction":"npm run pwa-push:audit"},{"id":"analytics","order":11,"title":"Web Vitals and analytics sink","status":"missing-required-env","ownerInputs":["Approved analytics provider or endpoint","WEB_VITALS_ENDPOINT_URL","WEB_VITALS_ENDPOINT_TOKEN if required"],"environment":[{"name":"WEB_VITALS_ENDPOINT_URL","purpose":"Production browser Web Vitals sink","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"WEB_VITALS_ENDPOINT_TOKEN","purpose":"Bearer token for the production Web Vitals sink","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["WEB_VITALS_ENDPOINT_URL"],"missingOptionalEnvironment":["WEB_VITALS_ENDPOINT_TOKEN"],"firstImplementationStep":"Set WEB_VITALS_ENDPOINT_URL and optional WEB_VITALS_ENDPOINT_TOKEN.","firstVerification":"npm run vitals:audit","verification":["npm run vitals:audit","curl -s https://your-domain.example/api/performance/vitals"],"nextAction":"Set WEB_VITALS_ENDPOINT_URL"},{"id":"legal","order":12,"title":"Legal pages and takedown contact","status":"missing-required-env","ownerInputs":["LEGAL_CONTACT_EMAIL","Final legal wording","Counsel approval for retention and takedown flow"],"environment":[{"name":"LEGAL_CONTACT_EMAIL","purpose":"Dedicated legal/contact inbox for takedown, deletion, and data-subject requests","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["LEGAL_CONTACT_EMAIL"],"missingOptionalEnvironment":[],"firstImplementationStep":"Set LEGAL_CONTACT_EMAIL.","firstVerification":"npm run legal:audit","verification":["npm run legal:audit","curl -s https://your-domain.example/legal","curl -s https://your-domain.example/api/legal/retention-policy","curl -s https://your-domain.example/api/legal/contact-policy","curl -s https://your-domain.example/api/legal/audit-policy"],"nextAction":"Set LEGAL_CONTACT_EMAIL"},{"id":"cloudflare","order":13,"title":"Cloudflare DNS, WAF, and monitoring","status":"needs-deployed-evidence","ownerInputs":["Cloudflare account ID","Zone ID","API token","Mirror domains if used","Telegram alert webhook if used"],"environment":[{"name":"CLOUDFLARE_ACCOUNT_ID","purpose":"Cloudflare automation and mirror monitoring","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_ZONE_ID","purpose":"Cloudflare DNS/WAF zone","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_API_TOKEN","purpose":"Cloudflare API token for WAF, DNS, and mirror automation checks","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"MIRROR_DOMAINS","purpose":"Comma-separated mirror domains for uptime checks","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"MIRROR_TELEGRAM_ALERT_URL","purpose":"Telegram alert webhook for mirror and primary-domain monitoring","requiredForProduction":false,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":[],"missingOptionalEnvironment":["CLOUDFLARE_ACCOUNT_ID","CLOUDFLARE_ZONE_ID","CLOUDFLARE_API_TOKEN","MIRROR_DOMAINS","MIRROR_TELEGRAM_ALERT_URL"],"firstImplementationStep":"Proxy the production domain through Cloudflare.","firstVerification":"npm run cloudflare:audit","verification":["npm run cloudflare:audit","curl -s https://your-domain.example/api/infrastructure/cloudflare/policy","curl -s https://your-domain.example/api/security/policy","curl -s https://your-domain.example/api/infrastructure/mirrors/check"],"nextAction":"npm run cloudflare:audit"},{"id":"final-qa","order":14,"title":"Final deployed-domain QA","status":"missing-required-env","ownerInputs":["Deployed URL","Approval to run read-only checks against production"],"environment":[{"name":"NEXT_PUBLIC_SITE_URL","purpose":"Canonical public domain for metadata, sitemap, structured data, and readiness checks","requiredForProduction":true,"configured":true,"placeholder":false,"missingFromStage":false},{"name":"NEXT_PUBLIC_SCHEDULE_URL","purpose":"Public link to the separate scheduling module","requiredForProduction":true,"configured":true,"placeholder":false,"missingFromStage":false},{"name":"DATABASE_URL","purpose":"PostgreSQL catalog/admin/status persistence","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ADMIN_API_TOKEN","purpose":"Protected admin write and seed API access","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ADMIN_SESSION_SECRET","purpose":"Signed HttpOnly admin UI session cookies","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"TELEGRAM_WEBHOOK_SECRET","purpose":"Telegram live-status webhook authentication","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"VIP_CLUB_WEBHOOK_URL","purpose":"Telegram workflow forwarding for VIP verification","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"VIP_CLUB_WEBHOOK_TOKEN","purpose":"Bearer token and HMAC signing secret for VIP Club workflow forwarding","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"LEGAL_CONTACT_EMAIL","purpose":"Dedicated legal/contact inbox for takedown, deletion, and data-subject requests","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ELASTICSEARCH_URL","purpose":"Elastic Cloud instant search","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"ELASTICSEARCH_API_KEY","purpose":"Elastic Cloud API key for server-side search","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"UPSTASH_REDIS_REST_URL","purpose":"Upstash Redis REST endpoint for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"UPSTASH_REDIS_REST_TOKEN","purpose":"Upstash Redis REST token for search cache and rate-limit state","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"NEXT_PUBLIC_MEDIA_CDN_URL","purpose":"Public CDN base URL for catalog images and video visits","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_BUCKET","purpose":"Production media storage","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_ACCESS_KEY_ID","purpose":"Cloudflare R2 media storage access key id","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"CLOUDFLARE_R2_SECRET_ACCESS_KEY","purpose":"Cloudflare R2 media storage secret access key","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true},{"name":"WEB_VITALS_ENDPOINT_URL","purpose":"Production browser Web Vitals sink","requiredForProduction":true,"configured":false,"placeholder":false,"missingFromStage":true}],"missingRequiredEnvironment":["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"],"missingOptionalEnvironment":[],"firstImplementationStep":"Run production env check.","firstVerification":"TZV3_BASE_URL=https://your-domain.example npm run preflight:production","verification":["TZV3_BASE_URL=https://your-domain.example npm run preflight:production","npm run github-ci:audit","npm run secrets:rotation -- --require-production","npm run env:check:production","npm run origin:audit -- --require-production","npm run evidence:audit -- --require-production","curl -s https://your-domain.example/api/infrastructure/production-evidence","npm run admin:audit","npm run database:seed-payload","npm run database:audit","npm run cloudflare:audit","npm run media:public-urls","npm run media:audit","npm run pwa-push:audit","npm run legal:audit","npm run reviews:audit","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 search:bulk-payload","npm run search:audit","npm run telegram:handoff","npm run telegram:audit","npm run club:handoff","npm run vitals: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"],"nextAction":"Set DATABASE_URL, ADMIN_API_TOKEN, ADMIN_SESSION_SECRET..."}],"criticalPath":[{"stageId":"domain","order":1,"title":"Canonical production domain","status":"needs-deployed-evidence","nextAction":"npm run source:audit","ownerInputs":["Final domain name","DNS or Cloudflare access","Final brand spelling"],"missingRequiredEnvironment":[],"firstVerification":"npm run source:audit"},{"stageId":"schedule","order":2,"title":"Ready-made schedule connector","status":"needs-deployed-evidence","nextAction":"npm run schedule:provider-handoff","ownerInputs":["Public schedule URL","Schedule iframe URL","Schedule widget script URL","Schedule admin/import access for provider creation","Real providers attached to schedule tenant site=artesc","Schedule API base URL only if server-side availability/request forwarding is required","Schedule API token only if the optional server API requires auth","Availability and request endpoint paths only if the optional server API differs from defaults","Profile slug mapping used by the schedule service"],"missingRequiredEnvironment":[],"firstVerification":"npm run schedule:provider-handoff"},{"stageId":"database","order":3,"title":"Production PostgreSQL and seed import","status":"missing-required-env","nextAction":"Set DATABASE_URL, ADMIN_API_TOKEN","ownerInputs":["Supabase, Neon, or PostgreSQL DATABASE_URL","Decision on production region"],"missingRequiredEnvironment":["DATABASE_URL","ADMIN_API_TOKEN"],"firstVerification":"npm run database:seed-payload"},{"stageId":"admin-security","order":4,"title":"Admin secrets and audit","status":"missing-required-env","nextAction":"Set ADMIN_API_TOKEN, ADMIN_SESSION_SECRET","ownerInputs":["Permission to generate secrets or supplied ADMIN_API_TOKEN and ADMIN_SESSION_SECRET","Admin actor naming convention"],"missingRequiredEnvironment":["ADMIN_API_TOKEN","ADMIN_SESSION_SECRET"],"firstVerification":"npm run admin:audit"},{"stageId":"telegram-status","order":5,"title":"Telegram live-status workflow","status":"missing-required-env","nextAction":"Set TELEGRAM_WEBHOOK_SECRET, DATABASE_URL","ownerInputs":["Telegram bot token","TELEGRAM_WEBHOOK_SECRET","Operator chat or workflow IDs"],"missingRequiredEnvironment":["TELEGRAM_WEBHOOK_SECRET","DATABASE_URL"],"firstVerification":"npm run telegram:handoff"},{"stageId":"vip-club","order":6,"title":"VIP Club verification workflow","status":"missing-required-env","nextAction":"Set VIP_CLUB_WEBHOOK_URL, VIP_CLUB_WEBHOOK_TOKEN","ownerInputs":["VIP Club Telegram workflow URL","VIP Club webhook signing token","Operator verification procedure"],"missingRequiredEnvironment":["VIP_CLUB_WEBHOOK_URL","VIP_CLUB_WEBHOOK_TOKEN"],"firstVerification":"npm run club:handoff"},{"stageId":"media-cdn","order":7,"title":"Media storage and CDN delivery","status":"missing-required-env","nextAction":"Set NEXT_PUBLIC_MEDIA_CDN_URL, CLOUDFLARE_R2_BUCKET, CLOUDFLARE_R2_ACCESS_KEY_ID...","ownerInputs":["NEXT_PUBLIC_MEDIA_CDN_URL","Cloudflare R2 bucket","R2 access key","R2 secret","Approved media upload workflow"],"missingRequiredEnvironment":["NEXT_PUBLIC_MEDIA_CDN_URL","CLOUDFLARE_R2_BUCKET","CLOUDFLARE_R2_ACCESS_KEY_ID","CLOUDFLARE_R2_SECRET_ACCESS_KEY"],"firstVerification":"npm run media:public-urls"},{"stageId":"search-cache","order":8,"title":"Elastic search and Redis cache","status":"missing-required-env","nextAction":"Set ELASTICSEARCH_URL, ELASTICSEARCH_API_KEY, UPSTASH_REDIS_REST_URL...","ownerInputs":["Elastic URL","Elastic API key","Elastic profile index name","Upstash Redis REST URL","Upstash Redis REST token"],"missingRequiredEnvironment":["ELASTICSEARCH_URL","ELASTICSEARCH_API_KEY","UPSTASH_REDIS_REST_URL","UPSTASH_REDIS_REST_TOKEN"],"firstVerification":"npm run search:bulk-payload"}],"completionRule":"All owner inputs, required env values, and deployed-domain verification commands must be satisfied before TZV3 can be marked production-ready."}}