Files
gongxue-base/docs/refactor/production-launch-evidence.template.json

454 lines
16 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": "postgres.tuning-evidence",
"status": "pass",
"command": "PG_TUNING_PROFILE=shared-host npm run perf:postgres:evidence -- --strict --json > docs/refactor/launch-artifacts/postgres-tuning-evidence.json",
"completedAt": "2026-06-30T10:08:00+08:00",
"artifact": "launch-artifacts/postgres-tuning-evidence.json",
"summary": {
"status": "pass",
"profile": "shared-host",
"failures": 0,
"pgStatStatementsAvailable": true,
"pendingRestart": 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": "auth.sms-pnvs-remote-smoke",
"status": "pass",
"command": "SMS_SMOKE_API_BASE_URL=https://api.example.com SMS_SMOKE_TENANT_ID=00000000-0000-0000-0000-000000000001 SMS_SMOKE_PHONE=replace-with-real-phone SMS_SMOKE_ORIGIN=https://admin.example.com npm run smoke:sms-login:remote -- --json > docs/refactor/launch-artifacts/sms-pnvs-remote-smoke.json",
"completedAt": "2026-06-30T10:12:00+08:00",
"artifact": "launch-artifacts/sms-pnvs-remote-smoke.json",
"summary": {
"failed": 0,
"provider": "aliyun-pnvs",
"loginVerified": true,
"authMe": 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": "performance.api-real-data-mixed",
"status": "pass",
"command": "PERF_START_SERVER=false PERF_API_BASE=https://api.example.com PERF_DURATION_SECONDS=120 PERF_CONCURRENCY=50 PERF_RAMP_SECONDS=15 PERF_INCLUDE_WRITES=true PERF_PRACTICE_FLOW_RATIO=0.1 PERF_AUTH_MODE=app_session npm run perf:api:local > docs/refactor/launch-artifacts/api-real-data-mixed-benchmark.log",
"completedAt": "2026-06-30T10:49:00+08:00",
"artifact": "launch-artifacts/api-real-data-mixed-benchmark.log",
"summary": {
"errors": 0,
"errorRate": 0,
"p95Ms": 0,
"p99Ms": 0,
"concurrency": 50,
"durationSeconds": 120,
"includeWrites": true
}
},
{
"id": "api.launch-persona-smoke",
"status": "pass",
"command": "LAUNCH_SMOKE_AUTH_MODE=app_session npm run smoke:launch-persona -- --write docs/refactor/launch-artifacts/launch-persona-smoke.json --write-md docs/refactor/launch-artifacts/launch-persona-smoke.md > docs/refactor/launch-artifacts/launch-persona-smoke.log",
"completedAt": "2026-06-30T10:49:30+08:00",
"artifact": "launch-artifacts/launch-persona-smoke.json",
"summary": {
"status": "pass",
"authMode": "app_session",
"student": {
"status": "pass",
"result": {
"entitlement": {
"isSvip": true
},
"practice": {
"questionCount": 3
},
"favorite": {
"favoriteCount": 1,
"reviewSessionId": "replace-with-favorite-review-session-id"
},
"wrongReview": {
"reviewPlanCount": 0
}
}
},
"tenantAdmin": {
"status": "pass",
"result": {
"guards": {
"studentDashboardDenied": "TENANT_ADMIN_REQUIRED",
"crossTenantDenied": "AUTH_TENANT_MISMATCH"
}
}
},
"platformAdmin": {
"status": "pass",
"result": {
"guards": {
"studentPlatformDenied": "PLATFORM_ADMIN_REQUIRED"
}
}
}
}
},
{
"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": 32,
"mockApi": {
"keyRequests": {
"answers": 1,
"favorites": 2,
"ordersCreated": 1,
"paymentsCreated": 1,
"orderStatus": 1,
"tenantResolve": 3,
"tenantContentWrites": 1,
"tenantAdminWrites": 1,
"crmWrites": 1,
"commissionWrites": 1,
"platformAdminWrites": 1
}
}
}
},
{
"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": "taro.h5-release-manifest",
"status": "pass",
"command": "npm --silent run manifest:taro:h5 -- --require-dist --require-runtime-config --json --write docs/refactor/launch-artifacts/taro-h5-release-manifest.json > docs/refactor/launch-artifacts/taro-h5-release-manifest.stdout.json",
"completedAt": "2026-06-30T12:16:00+08:00",
"artifact": "launch-artifacts/taro-h5-release-manifest.json",
"summary": {
"fail": 0,
"warn": 0,
"portals": 3,
"distReady": 3,
"runtimeConfigs": 3
}
},
{
"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.repo-scan",
"status": "pass",
"command": "npm run security:repo -- --json > docs/refactor/launch-artifacts/repo-security-scan.json",
"completedAt": "2026-06-30T12:22:00+08:00",
"artifact": "launch-artifacts/repo-security-scan.json",
"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."
}
]
}