forked from wangziqi/gongxue-base
687 lines
30 KiB
JSON
687 lines
30 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"environment": "production",
|
|
"releaseTargets": [
|
|
"h5"
|
|
],
|
|
"artifactIntegrityNote": "Every check must record artifactSha256. Generate it with sha256sum or shasum -a 256; launch gate rejects missing, empty, or hash-mismatched artifacts. The H5 release manifest also records full-directory treeSha256 values, which deployment verifies against the candidate release.",
|
|
"commit": "replace-with-deployed-git-sha",
|
|
"target": {
|
|
"apiBaseUrl": "replace-with-real-production-api-https-url",
|
|
"studentH5Url": "replace-with-real-production-student-h5-https-url",
|
|
"tenantAdminH5Url": "replace-with-real-production-tenant-admin-h5-https-url",
|
|
"platformAdminH5Url": "replace-with-real-production-platform-admin-h5-https-url"
|
|
},
|
|
"liveH5": {
|
|
"releaseManifestArtifact": "launch-artifacts/taro-h5-release-manifest.json",
|
|
"releaseManifestSha256": "replace-with-64-char-sha256"
|
|
},
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"blocker": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "db.migration-history",
|
|
"status": "pass",
|
|
"command": "node -e \"const fs=require('fs'),crypto=require('crypto');const source='docs/refactor/launch-artifacts/readiness-production-db.json';const bytes=fs.readFileSync(source);const readiness=JSON.parse(bytes);const check=readiness.checks.find(item=>item.id==='db.migrations.current'&&item.status==='pass');if(!check)throw new Error('readiness db.migrations.current pass evidence is missing');const d=check.details||{};const payload={schemaVersion:1,status:'pass',failed:0,latestRepositoryMigration:String(d.expectedVersion||''),latestAppliedMigration:String(d.latestAppliedVersion||''),missingMigrations:d.expectedVersionApplied===true?[]:[String(d.expectedVersion||'')],readinessArtifactSha256:crypto.createHash('sha256').update(bytes).digest('hex')};fs.writeFileSync('docs/refactor/launch-artifacts/db-migration-history.json',JSON.stringify(payload,null,2)+'\\n')\"",
|
|
"completedAt": "2026-06-30T10:06:00+08:00",
|
|
"artifact": "launch-artifacts/db-migration-history.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"schemaVersion": 1,
|
|
"status": "pass",
|
|
"failed": 0,
|
|
"latestRepositoryMigration": "replace-with-repository-latest-migration-version",
|
|
"latestAppliedMigration": "replace-with-production-latest-applied-migration-version",
|
|
"missingMigrations": [],
|
|
"readinessArtifactSha256": "replace-with-64-char-sha256"
|
|
}
|
|
},
|
|
{
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:auth.remote-smoke' >> docs/refactor/launch-artifacts/auth-remote-smoke.log",
|
|
"completedAt": "2026-06-30T10:10:00+08:00",
|
|
"artifact": "launch-artifacts/auth-remote-smoke.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0,
|
|
"requireAdminTokens": true
|
|
}
|
|
},
|
|
{
|
|
"id": "auth.platform-admin-bootstrap",
|
|
"status": "pass",
|
|
"command": "Run npm run bootstrap:platform-admin dry-run, then npm run bootstrap:platform-admin -- --apply --confirm BOOTSTRAP_FIRST_PLATFORM_ADMIN, verify the platform.admin.bootstrapped audit event, and run npm run smoke:auth:remote with AUTH_SMOKE_EXPECTED_PLATFORM_ADMIN_USER_ID set to the same Auth identity; save the three raw artifacts and generate this redacted summary with SHA-256 identity bindings",
|
|
"completedAt": "2026-06-30T10:10:30+08:00",
|
|
"artifact": "launch-artifacts/platform-admin-bootstrap.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"schemaVersion": 1,
|
|
"status": "pass",
|
|
"failed": 0,
|
|
"dryRunVerified": true,
|
|
"applied": true,
|
|
"adminUserIdSha256": "replace-with-sha256-of-bootstrap-auth-user-uuid",
|
|
"authSmokeExpectedUserIdSha256": "replace-with-same-sha256",
|
|
"identityMatches": true,
|
|
"auditEvent": "platform.admin.bootstrapped",
|
|
"auditVerified": true,
|
|
"dryRunArtifactSha256": "replace-with-64-char-sha256",
|
|
"applyArtifactSha256": "replace-with-64-char-sha256",
|
|
"authSmokeArtifactSha256": "replace-with-64-char-sha256",
|
|
"auditArtifactSha256": "replace-with-64-char-sha256"
|
|
}
|
|
},
|
|
{
|
|
"id": "auth.sms-pnvs-diagnostics",
|
|
"status": "pass",
|
|
"command": "PNVS_TENANT_ID=00000000-0000-0000-0000-000000000001 npm run diagnose:aliyun-pnvs > docs/refactor/launch-artifacts/sms-pnvs-diagnostics.json",
|
|
"completedAt": "2026-06-30T10:11:00+08:00",
|
|
"artifact": "launch-artifacts/sms-pnvs-diagnostics.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"ok": true,
|
|
"env": {
|
|
"providerMatchesPnvs": true
|
|
},
|
|
"provider": {
|
|
"found": true,
|
|
"provider": "aliyun-pnvs",
|
|
"status": "active",
|
|
"publicConfig": {
|
|
"templateParamHasCodePlaceholder": true
|
|
}
|
|
},
|
|
"secret": {
|
|
"found": true,
|
|
"accessKeyIdLength": 16,
|
|
"accessKeySecretLength": 32
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"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 -- --write 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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0,
|
|
"provider": "aliyun-pnvs",
|
|
"loginVerified": true,
|
|
"authMe": true
|
|
}
|
|
},
|
|
{
|
|
"id": "rls.tenant-isolation",
|
|
"status": "pass",
|
|
"command": "DATABASE_URL=<isolated-production-schema-clone-url> npm run test:rls > docs/refactor/launch-artifacts/rls-tenant-isolation.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:rls.tenant-isolation' >> docs/refactor/launch-artifacts/rls-tenant-isolation.log",
|
|
"completedAt": "2026-06-30T10:20:00+08:00",
|
|
"artifact": "launch-artifacts/rls-tenant-isolation.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0,
|
|
"databaseEnvironment": "ci",
|
|
"databaseSource": "isolated-production-schema-or-sanitized-snapshot-clone"
|
|
}
|
|
},
|
|
{
|
|
"id": "db.tenant-foreign-key-audit",
|
|
"status": "pass",
|
|
"command": "DATABASE_URL=<isolated-production-schema-clone-url> npm run audit:tenant-foreign-keys -- --confirm=SMOKE_SEED_LOCAL_OR_CI_ONLY --write=docs/refactor/launch-artifacts/tenant-foreign-key-audit.json",
|
|
"completedAt": "2026-06-30T10:25:00+08:00",
|
|
"artifact": "launch-artifacts/tenant-foreign-key-audit.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"status": "pass",
|
|
"kind": "tenant-foreign-key-audit",
|
|
"safety": {
|
|
"databaseEnvironment": "ci"
|
|
},
|
|
"schema": {
|
|
"schemaMatches": true,
|
|
"relationCount": 189,
|
|
"exceptionCount": 3
|
|
},
|
|
"data": {
|
|
"auditedRelations": 189,
|
|
"invalidRelations": 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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:migration.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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:migration.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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:performance.api-real-data-read' >> 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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:performance.api-real-data-mixed' >> 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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"errors": 0,
|
|
"errorRate": 0,
|
|
"p95Ms": 0,
|
|
"p99Ms": 0,
|
|
"concurrency": 50,
|
|
"durationSeconds": 120,
|
|
"includeWrites": true
|
|
}
|
|
},
|
|
{
|
|
"id": "performance.tenant-students-100k",
|
|
"status": "pass",
|
|
"command": "output_dir=$(mktemp -d) && DATABASE_URL=<target-spec-isolated-production-schema-clone-url> npm run perf:tenant-students:evidence -- --count=100000 --batch-size=10000 --iterations=20 --warmup-iterations=3 --output-dir=\"$output_dir\" --confirm=SMOKE_SEED_LOCAL_OR_CI_ONLY && cp \"$output_dir\"/tenant-student-capacity-*.json docs/refactor/launch-artifacts/tenant-student-capacity-100k.json",
|
|
"completedAt": "2026-06-30T10:49:10+08:00",
|
|
"artifact": "launch-artifacts/tenant-student-capacity-100k.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"databaseEnvironment": "test",
|
|
"fixture": {
|
|
"platformUsers": 100000,
|
|
"tenantMemberships": 100000,
|
|
"studentProfiles": 100000
|
|
},
|
|
"caseCount": 5,
|
|
"deepCursorApproximateOffset": 90000,
|
|
"firstPageP95Ms": 0,
|
|
"deepCursorP95Ms": 0,
|
|
"searchP95MaxMs": 0,
|
|
"keysetIndexUsed": true,
|
|
"trigramIndexUsed": true,
|
|
"cleanupVerified": true,
|
|
"remainingManagedUsers": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "api.dynamic-tenant-cors-smoke",
|
|
"status": "pass",
|
|
"command": "TENANT_CORS_API_BASE_URL=https://api.example.com TENANT_CORS_ACTIVE_ORIGIN=https://active-tenant.example.com TENANT_CORS_DISABLED_ORIGIN=https://disabled-tenant.example.com TENANT_CORS_UNKNOWN_ORIGIN=https://unknown-tenant.example.com npm run smoke:tenant-cors:remote -- --write docs/refactor/launch-artifacts/tenant-cors-remote-smoke.json",
|
|
"completedAt": "2026-06-30T10:49:15+08:00",
|
|
"artifact": "launch-artifacts/tenant-cors-remote-smoke.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0,
|
|
"activeTenantOriginAllowed": true,
|
|
"unknownOriginDenied": true,
|
|
"disabledOriginDenied": true,
|
|
"noOriginHealthAllowed": true
|
|
}
|
|
},
|
|
{
|
|
"id": "deploy.linux-systemd-verify",
|
|
"status": "pass",
|
|
"command": "(systemd-analyze verify /etc/systemd/system/tiku-api.service /etc/systemd/system/tiku-worker@.service /etc/systemd/system/tiku-worker-job@.service /etc/systemd/system/tiku-worker-*.service /etc/systemd/system/tiku-worker-*.timer && systemctl is-active tiku-api.service tiku-workers.target && systemctl list-timers 'tiku-worker-*' --no-legend && echo 'TIKU_LAUNCH_GATE_SUCCESS:deploy.linux-systemd-verify') > docs/refactor/launch-artifacts/linux-systemd-verify.log",
|
|
"completedAt": "2026-06-30T10:49:20+08:00",
|
|
"artifact": "launch-artifacts/linux-systemd-verify.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0,
|
|
"apiServiceActive": true,
|
|
"workerTargetActive": true,
|
|
"workerJobServices": 9,
|
|
"enabledTimers": 6
|
|
}
|
|
},
|
|
{
|
|
"id": "backup.restore-drill",
|
|
"status": "pass",
|
|
"command": "RESTORE_DRILL_VERIFY_COMMAND=<provider-specific-isolated-restore-and-integrity-command> && eval \"$RESTORE_DRILL_VERIFY_COMMAND\" > docs/refactor/launch-artifacts/backup-restore-verification.log && node -e \"const fs=require('fs'),crypto=require('crypto');const required=name=>{const value=String(process.env[name]||'').trim();if(!value)throw new Error(name+' is required');return value};const number=name=>{const value=Number(required(name));if(!Number.isFinite(value)||value<0)throw new Error(name+' must be non-negative');return value};const verification=fs.readFileSync('docs/refactor/launch-artifacts/backup-restore-verification.log');const payload={schemaVersion:1,status:'pass',failed:0,snapshotId:required('RESTORE_DRILL_SNAPSHOT_ID'),restoreTarget:required('RESTORE_DRILL_TARGET'),isolated:true,integrityVerified:true,rtoMinutes:number('RESTORE_DRILL_RTO_MINUTES'),rpoMinutes:number('RESTORE_DRILL_RPO_MINUTES'),verificationArtifactSha256:crypto.createHash('sha256').update(verification).digest('hex')};fs.writeFileSync('docs/refactor/launch-artifacts/backup-restore-drill.json',JSON.stringify(payload,null,2)+'\\n')\"",
|
|
"completedAt": "2026-06-30T10:49:25+08:00",
|
|
"artifact": "launch-artifacts/backup-restore-drill.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"schemaVersion": 1,
|
|
"status": "pass",
|
|
"failed": 0,
|
|
"snapshotId": "replace-with-provider-snapshot-or-backup-id",
|
|
"restoreTarget": "replace-with-isolated-restore-target",
|
|
"isolated": true,
|
|
"integrityVerified": true,
|
|
"rtoMinutes": 0,
|
|
"rpoMinutes": 0,
|
|
"verificationArtifactSha256": "replace-with-64-char-sha256"
|
|
}
|
|
},
|
|
{
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 && echo 'TIKU_LAUNCH_GATE_SUCCESS:api.integration' >> docs/refactor/launch-artifacts/api-integration.log",
|
|
"completedAt": "2026-06-30T10:50:00+08:00",
|
|
"artifact": "launch-artifacts/api-integration.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.assets",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:assets > docs/refactor/launch-artifacts/worker-assets.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:worker.assets' >> docs/refactor/launch-artifacts/worker-assets.log",
|
|
"completedAt": "2026-06-30T11:00:00+08:00",
|
|
"artifact": "launch-artifacts/worker-assets.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.commerce",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:commerce > docs/refactor/launch-artifacts/worker-commerce.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:worker.commerce' >> docs/refactor/launch-artifacts/worker-commerce.log",
|
|
"completedAt": "2026-06-30T11:10:00+08:00",
|
|
"artifact": "launch-artifacts/worker-commerce.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.platform-billing",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:platform-billing > docs/refactor/launch-artifacts/worker-platform-billing.log && echo 'TIKU_LAUNCH_GATE_SUCCESS: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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.platform-dunning",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:platform-dunning > docs/refactor/launch-artifacts/worker-platform-dunning.log && echo 'TIKU_LAUNCH_GATE_SUCCESS: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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.imports",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:imports > docs/refactor/launch-artifacts/worker-imports.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:worker.imports' >> docs/refactor/launch-artifacts/worker-imports.log",
|
|
"completedAt": "2026-06-30T11:20:00+08:00",
|
|
"artifact": "launch-artifacts/worker-imports.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "worker.public-banks",
|
|
"status": "pass",
|
|
"command": "npm run test:worker:public-banks > docs/refactor/launch-artifacts/worker-public-banks.log && echo 'TIKU_LAUNCH_GATE_SUCCESS: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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "taro.check",
|
|
"status": "pass",
|
|
"command": "npm run check:taro > docs/refactor/launch-artifacts/taro-check.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:taro.check' >> docs/refactor/launch-artifacts/taro-check.log",
|
|
"completedAt": "2026-06-30T11:40:00+08:00",
|
|
"artifact": "launch-artifacts/taro-check.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "taro.supply-chain",
|
|
"status": "pass",
|
|
"command": "npm --silent run audit:taro:supply-chain -- --json > docs/refactor/launch-artifacts/taro-supply-chain.json",
|
|
"completedAt": "2026-06-30T11:45:00+08:00",
|
|
"artifact": "launch-artifacts/taro-supply-chain.json",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"schemaVersion": 1,
|
|
"status": "pass-with-reviewed-toolchain-risk",
|
|
"securedBundleDependencies": {
|
|
"swiper": "12.1.2",
|
|
"lodash-es": "4.18.1"
|
|
},
|
|
"audit": {
|
|
"counts": {
|
|
"critical": 3,
|
|
"high": 10
|
|
}
|
|
},
|
|
"reviewedInvalidEdgeCount": 4,
|
|
"riskBoundaryPresent": true,
|
|
"riskControlCount": 4
|
|
}
|
|
},
|
|
{
|
|
"id": "taro.build.student",
|
|
"status": "pass",
|
|
"command": "npm run build:taro:h5:student > docs/refactor/launch-artifacts/taro-build-student.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:taro.build.student' >> docs/refactor/launch-artifacts/taro-build-student.log",
|
|
"completedAt": "2026-06-30T11:50:00+08:00",
|
|
"artifact": "launch-artifacts/taro-build-student.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "taro.build.tenant",
|
|
"status": "pass",
|
|
"command": "npm run build:taro:h5:tenant > docs/refactor/launch-artifacts/taro-build-tenant.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:taro.build.tenant' >> docs/refactor/launch-artifacts/taro-build-tenant.log",
|
|
"completedAt": "2026-06-30T12:00:00+08:00",
|
|
"artifact": "launch-artifacts/taro-build-tenant.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"failed": 0
|
|
}
|
|
},
|
|
{
|
|
"id": "taro.build.platform",
|
|
"status": "pass",
|
|
"command": "npm run build:taro:h5:platform > docs/refactor/launch-artifacts/taro-build-platform.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:taro.build.platform' >> docs/refactor/launch-artifacts/taro-build-platform.log",
|
|
"completedAt": "2026-06-30T12:10:00+08:00",
|
|
"artifact": "launch-artifacts/taro-build-platform.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"summary": {
|
|
"fail": 0,
|
|
"warn": 0,
|
|
"portals": 3,
|
|
"distReady": 3,
|
|
"runtimeConfigs": 3,
|
|
"treeHashes": 3
|
|
}
|
|
},
|
|
{
|
|
"id": "audit.runtime",
|
|
"status": "pass",
|
|
"command": "npm run audit:runtime > docs/refactor/launch-artifacts/audit-runtime.log && echo 'TIKU_LAUNCH_GATE_SUCCESS:audit.runtime' >> docs/refactor/launch-artifacts/audit-runtime.log",
|
|
"completedAt": "2026-06-30T12:20:00+08:00",
|
|
"artifact": "launch-artifacts/audit-runtime.log",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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 and append a final line TIKU_LAUNCH_GATE_SUCCESS:security.codex-scan only after the scan exits successfully",
|
|
"completedAt": "replace-with-real-scan-time",
|
|
"artifact": "launch-artifacts/codex-security.md",
|
|
"artifactSha256": "replace-with-64-char-sha256",
|
|
"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."
|
|
}
|
|
]
|
|
}
|