forked from wangziqi/gongxue-base
252 lines
8.4 KiB
JSON
252 lines
8.4 KiB
JSON
{
|
|
"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": "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.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": "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": "pass",
|
|
"command": "@codex-security scan; save findings to docs/refactor/launch-artifacts/codex-security.md",
|
|
"completedAt": "2026-06-30T12:30:00+08:00",
|
|
"artifact": "launch-artifacts/codex-security.md",
|
|
"summary": {
|
|
"critical": 0,
|
|
"high": 0
|
|
}
|
|
}
|
|
],
|
|
"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."
|
|
},
|
|
{
|
|
"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."
|
|
}
|
|
]
|
|
}
|