fix(api): record stockplatform recovery receipt
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 36s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped

This commit is contained in:
Your Name
2026-06-30 16:48:43 +08:00
parent 98cad13459
commit e12a8a4317
5 changed files with 231 additions and 16 deletions

View File

@@ -0,0 +1,128 @@
{
"schema_version": "stockplatform_public_api_runtime_recovery_control_receipt_v1",
"generated_at": "2026-06-30T18:52:40+08:00",
"status": "api_upstream_recovered_data_readiness_not_green",
"priority": "P0-006",
"scope": "stockplatform_public_api_runtime_recovery_control_path",
"target_selector": {
"product": "stockplatform-v2",
"public_base_url": "https://stock.wooo.work",
"target_endpoints": [
"/api/healthz",
"/api/v1/system/freshness",
"/api/v1/system/ingestion"
],
"expected_after_apply": "all target endpoints return HTTP 200; freshness.status=ok; ingestion.status=ok"
},
"source_of_truth_diff": {
"repo": "wooo/stockplatform-v2",
"gitea_main_sha": "080bc2b2eed796b4412bb34b736c87121fb7b3b8",
"commit_subject": "fix(ops): recover stock api upstream resolution",
"supporting_commits": [
{
"sha": "3cd2d824047ed02336cfa4d8f2f39c5f9f4458b5",
"subject": "fix(deploy): fail closed on stockplatform api health"
},
{
"sha": "080bc2b2eed796b4412bb34b736c87121fb7b3b8",
"subject": "fix(ops): recover stock api upstream resolution"
}
],
"files_changed": [
"infra/nginx/stockplatform-v2-edge.admin-auth.conf",
"infra/nginx/stockplatform-v2-edge.conf",
"infra/scripts/deploy-production.sh",
"package.json",
"scripts/ops/stockplatform-api-upstream-recovery-gate.sh",
"scripts/ops/test-stockplatform-api-upstream-recovery-gate.sh",
"scripts/ops/test-production-deploy-contract.sh"
],
"change_summary": [
"production deploy uses .env.production.local instead of compose defaults",
"edge is restarted after app containers are recreated to avoid stale api upstream resolution",
"local /api/healthz must return 200 before deploy can emit success receipt",
"edge nginx uses Docker DNS dynamic upstream resolution for api/web/admin",
"api upstream recovery gate provides verify-only, dry-run, and bounded apply modes",
"npm run check now includes the production deploy contract test"
]
},
"check_mode_or_dry_run": {
"performed": true,
"commands": [
"npm run check",
"python3 -m compileall -q apps/api services/worker services/scheduler scripts/ingestion scripts/migration",
"curl https://stock.wooo.work/api/healthz",
"curl https://stock.wooo.work/api/v1/system/freshness",
"curl https://stock.wooo.work/api/v1/system/ingestion"
],
"result": "source checks passed; live public API upstream is HTTP 200, but freshness and ingestion return status=not_configured with postgres_not_ready"
},
"rollback": {
"available": true,
"command": "git revert 080bc2b2eed796b4412bb34b736c87121fb7b3b8 3cd2d824047ed02336cfa4d8f2f39c5f9f4458b5 && rerun stockplatform production deploy and upstream recovery contract checks before any runtime apply"
},
"post_apply_public_api_verifier": {
"prepared": true,
"last_pre_apply_readback": {
"public_web_healthz": 200,
"public_api_healthz": 200,
"freshness": 200,
"freshness_status": "not_configured",
"freshness_blockers": [
"postgres_not_ready"
],
"ingestion": 200,
"ingestion_status": "not_configured",
"ingestion_blockers": [
"postgres_not_ready"
]
},
"passed": false
},
"provided_receipts": [
"target_selector",
"source_of_truth_diff_or_runtime_state_diff",
"check_mode_or_dry_run",
"rollback_command",
"controlled_api_upstream_recovery_readback",
"km_playbook_log_writeback_receipt"
],
"missing_receipts": [
"stockplatform_postgres_readiness_or_data_source_readback",
"post_apply_public_api_verifier_green"
],
"active_blockers": [
"stockplatform_postgres_not_ready",
"stockplatform_post_apply_public_api_verifier_not_green"
],
"safe_recovery_channels": [
"bounded_stockplatform_postgres_readiness_readback_without_manual_db_write",
"bounded_ssh_or_runner_recovery_readback_without_docker_daemon_restart"
],
"forbidden_recovery_channels": [
"docker_daemon_restart",
"host_reboot",
"docker_prune_or_volume_restore",
"manual_database_rows_or_fake_freshness",
"restore_push_deploy_trigger_during_110_capacity_freeze",
"read_secret_or_raw_session_values"
],
"required_receipts": [
"target_selector",
"source_of_truth_diff_or_runtime_state_diff",
"check_mode_or_dry_run",
"rollback_command",
"post_apply_public_api_verifier",
"km_playbook_log_writeback_receipt"
],
"operation_boundaries": {
"workflow_dispatch_performed": false,
"host_write_performed": false,
"docker_restart_performed": false,
"docker_daemon_restart_performed": false,
"host_reboot_performed": false,
"database_write_or_restore_performed": false,
"secret_or_runner_token_read": false,
"github_api_used": false
}
}