{ "schemaVersion": 1, "environment": "production", "commit": "replace-with-deployed-git-sha", "target": { "apiBaseUrl": "https://api.example.com", "studentH5Url": "https://www.example.com", "tenantAdminH5Url": "https://admin.example.com", "platformAdminH5Url": "https://console.example.com" }, "checks": [ { "id": "readiness.production.env", "status": "pass", "command": "npm run readiness:production -- --json > docs/refactor/launch-artifacts/readiness-production.json", "completedAt": "2026-06-30T10:00:00+08:00", "artifact": "launch-artifacts/readiness-production.json", "summary": { "blocker": 0 } }, { "id": "readiness.production.db", "status": "pass", "command": "npm run readiness:production:db -- --json > docs/refactor/launch-artifacts/readiness-production-db.json", "completedAt": "2026-06-30T10:05:00+08:00", "artifact": "launch-artifacts/readiness-production-db.json", "summary": { "blocker": 0 } }, { "id": "auth.remote-smoke", "status": "pass", "command": "AUTH_SMOKE_REQUIRE_ADMIN_TOKENS=true npm run smoke:auth:remote > docs/refactor/launch-artifacts/auth-remote-smoke.log", "completedAt": "2026-06-30T10:10:00+08:00", "artifact": "launch-artifacts/auth-remote-smoke.log", "summary": { "failed": 0, "requireAdminTokens": true } }, { "id": "rls.tenant-isolation", "status": "pass", "command": "npm run test:rls > docs/refactor/launch-artifacts/rls-tenant-isolation.log", "completedAt": "2026-06-30T10:20:00+08:00", "artifact": "launch-artifacts/rls-tenant-isolation.log", "summary": { "failed": 0 } }, { "id": "migration.pb-production-dry-run", "status": "pass", "command": "npm run pb:import:dry-run -- --profile=production --json --fail-on-warnings > docs/refactor/launch-artifacts/pb-production-dry-run.json", "completedAt": "2026-06-30T10:30:00+08:00", "artifact": "launch-artifacts/pb-production-dry-run.json", "summary": { "blocker": 0, "warning": 0, "migrationProfile": "production", "requiredCollectionsMissing": 0, "criticalFieldCoverageWarnings": 0 } }, { "id": "migration.pb-import-validate", "status": "pass", "command": "FAIL_ON_WARNINGS=true npm run pb:import:validate > docs/refactor/launch-artifacts/pb-import-validate.log", "completedAt": "2026-06-30T10:40:00+08:00", "artifact": "launch-artifacts/pb-import-validate.log", "summary": { "fail": 0 } }, { "id": "migration.pb-import-sample", "status": "pass", "command": "PB_SAMPLE_WRITE_REPORT=true npm run pb:import:sample > docs/refactor/launch-artifacts/pb-import-sample.log", "completedAt": "2026-06-30T10:45:00+08:00", "artifact": "launch-artifacts/pb-import-sample.log", "summary": { "fail": 0, "warn": 0, "skip": 0, "pass": 0 } }, { "id": "performance.api-real-data-read", "status": "pass", "command": "PERF_START_SERVER=false PERF_API_BASE=https://api.example.com PERF_DURATION_SECONDS=300 PERF_CONCURRENCY=30 PERF_RAMP_SECONDS=30 PERF_INCLUDE_WRITES=false npm run perf:api:local > docs/refactor/launch-artifacts/api-real-data-read-benchmark.log", "completedAt": "2026-06-30T10:48:00+08:00", "artifact": "launch-artifacts/api-real-data-read-benchmark.log", "summary": { "errors": 0, "errorRate": 0, "p95Ms": 0, "p99Ms": 0, "concurrency": 30, "durationSeconds": 300, "includeWrites": false } }, { "id": "api.integration", "status": "pass", "command": "npm run test:api > docs/refactor/launch-artifacts/api-integration.log", "completedAt": "2026-06-30T10:50:00+08:00", "artifact": "launch-artifacts/api-integration.log", "summary": { "failed": 0 } }, { "id": "worker.assets", "status": "pass", "command": "npm run test:worker:assets > docs/refactor/launch-artifacts/worker-assets.log", "completedAt": "2026-06-30T11:00:00+08:00", "artifact": "launch-artifacts/worker-assets.log", "summary": { "failed": 0 } }, { "id": "worker.commerce", "status": "pass", "command": "npm run test:worker:commerce > docs/refactor/launch-artifacts/worker-commerce.log", "completedAt": "2026-06-30T11:10:00+08:00", "artifact": "launch-artifacts/worker-commerce.log", "summary": { "failed": 0 } }, { "id": "worker.platform-billing", "status": "pass", "command": "npm run test:worker:platform-billing > docs/refactor/launch-artifacts/worker-platform-billing.log", "completedAt": "2026-06-30T11:15:00+08:00", "artifact": "launch-artifacts/worker-platform-billing.log", "summary": { "failed": 0 } }, { "id": "worker.platform-dunning", "status": "pass", "command": "npm run test:worker:platform-dunning > docs/refactor/launch-artifacts/worker-platform-dunning.log", "completedAt": "2026-06-30T11:18:00+08:00", "artifact": "launch-artifacts/worker-platform-dunning.log", "summary": { "failed": 0 } }, { "id": "worker.imports", "status": "pass", "command": "npm run test:worker:imports > docs/refactor/launch-artifacts/worker-imports.log", "completedAt": "2026-06-30T11:20:00+08:00", "artifact": "launch-artifacts/worker-imports.log", "summary": { "failed": 0 } }, { "id": "worker.public-banks", "status": "pass", "command": "npm run test:worker:public-banks > docs/refactor/launch-artifacts/worker-public-banks.log", "completedAt": "2026-06-30T11:30:00+08:00", "artifact": "launch-artifacts/worker-public-banks.log", "summary": { "failed": 0 } }, { "id": "taro.check", "status": "pass", "command": "npm run check:taro > docs/refactor/launch-artifacts/taro-check.log", "completedAt": "2026-06-30T11:40:00+08:00", "artifact": "launch-artifacts/taro-check.log", "summary": { "failed": 0 } }, { "id": "taro.build.student", "status": "pass", "command": "npm run build:taro:h5:student > docs/refactor/launch-artifacts/taro-build-student.log", "completedAt": "2026-06-30T11:50:00+08:00", "artifact": "launch-artifacts/taro-build-student.log", "summary": { "failed": 0 } }, { "id": "taro.build.tenant", "status": "pass", "command": "npm run build:taro:h5:tenant > docs/refactor/launch-artifacts/taro-build-tenant.log", "completedAt": "2026-06-30T12:00:00+08:00", "artifact": "launch-artifacts/taro-build-tenant.log", "summary": { "failed": 0 } }, { "id": "taro.build.platform", "status": "pass", "command": "npm run build:taro:h5:platform > docs/refactor/launch-artifacts/taro-build-platform.log", "completedAt": "2026-06-30T12:10:00+08:00", "artifact": "launch-artifacts/taro-build-platform.log", "summary": { "failed": 0 } }, { "id": "taro.h5-static-smoke", "status": "pass", "command": "npm --silent run smoke:taro:h5 -- --json > docs/refactor/launch-artifacts/taro-h5-static-smoke.json", "completedAt": "2026-06-30T12:12:00+08:00", "artifact": "launch-artifacts/taro-h5-static-smoke.json", "summary": { "fail": 0, "portals": 3, "tenantResolveRequests": 3 } }, { "id": "taro.h5-interaction-smoke", "status": "pass", "command": "npm --silent run smoke:taro:h5:interaction -- --json > docs/refactor/launch-artifacts/taro-h5-interaction-smoke.json", "completedAt": "2026-06-30T12:13:00+08:00", "artifact": "launch-artifacts/taro-h5-interaction-smoke.json", "summary": { "fail": 0, "pass": 11, "mockApi": { "keyRequests": { "answers": 1, "favorites": 2, "tenantResolve": 3 } } } }, { "id": "taro.h5-release-guardrails", "status": "pass", "command": "node scripts/taro-h5-release-guardrails-test.js --require-dist --require-runtime-config --json > docs/refactor/launch-artifacts/taro-h5-release-guardrails.json", "completedAt": "2026-06-30T12:15:00+08:00", "artifact": "launch-artifacts/taro-h5-release-guardrails.json", "summary": { "fail": 0, "warn": 0 } }, { "id": "audit.runtime", "status": "pass", "command": "npm run audit:runtime > docs/refactor/launch-artifacts/audit-runtime.log", "completedAt": "2026-06-30T12:20:00+08:00", "artifact": "launch-artifacts/audit-runtime.log", "summary": { "critical": 0, "high": 0 } }, { "id": "security.codex-scan", "status": "replace-with-pass-after-real-scan", "command": "Run the real @codex-security scan only when the tool is exposed; save findings to docs/refactor/launch-artifacts/codex-security.md", "completedAt": "replace-with-real-scan-time", "artifact": "launch-artifacts/codex-security.md", "summary": { "critical": "replace-with-number", "high": "replace-with-number" } } ], "attestations": [ { "id": "backup.snapshot", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:00:00+08:00", "notes": "Production database backup/snapshot ID and restore test notes." }, { "id": "rollback.plan", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:05:00+08:00", "notes": "Old PocketBase read-only snapshot, DNS rollback path and responsible people are confirmed." }, { "id": "migration.sampling", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:10:00+08:00", "notes": "Real users, questions, orders, entitlements, assets and learning records sampled; pb:import:sample warnings, skips and manual review rows have owner-approved handling conclusions." }, { "id": "provider.production-accounts", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:15:00+08:00", "notes": "Aliyun/Tencent SMS, WeChat/QQ OAuth, WeChat Pay and Alipay callbacks verified." }, { "id": "object-storage.production-controls", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:20:00+08:00", "notes": "AV/content scanner, CDN anti-leeching, watermark, lifecycle and private asset access sampled." }, { "id": "payment.reconciliation-sampling", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:25:00+08:00", "notes": "Real payment/refund bills sampled and reconciliation differences handled." }, { "id": "frontend.runtime-config-review", "status": "approved", "approver": "replace-with-owner", "approvedAt": "2026-06-30T13:30:00+08:00", "notes": "Student, tenant-admin and platform-admin runtime-config.json contain public values only." } ] }