diff --git a/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py b/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py index b359f0674..8a06cfc35 100644 --- a/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py +++ b/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py @@ -62,18 +62,24 @@ def _build_payload(scorecard: dict[str, Any], path: Path) -> dict[str, Any]: completed_check_count / max(len(required_checks), 1) * 100 ) recovery_gate = _dict(stockplatform.get("controlled_recovery_gate")) + safe_next_step = str(scorecard.get("safe_next_step") or "") + can_claim_slo = ( + scorecard.get("can_claim_all_services_recovered_within_target") is True + ) return { "schema_version": _API_SCHEMA_VERSION, "generated_at": str(scorecard.get("generated_at") or ""), "priority": "P0-006", "scope": "reboot_auto_recovery_slo_scorecard", "status": str(scorecard.get("status") or "unknown"), + "safe_next_step": safe_next_step, + "can_claim_all_services_recovered_within_target": can_claim_slo, "readback": { "workplan_id": "P0-006", "workplan_title": "主機重啟自動偵測、自動觸發與 10 分鐘恢復 SLO", "source_scorecard_ref": f"docs/operations/{path.name}", "target_minutes": _int(scorecard.get("target_minutes")), - "safe_next_step": str(scorecard.get("safe_next_step") or ""), + "safe_next_step": safe_next_step, }, "host_boot_detection": host_boot_detection, "post_reboot_readiness": post_reboot_readiness, @@ -85,10 +91,7 @@ def _build_payload(scorecard: dict[str, Any], path: Path) -> dict[str, Any]: "readiness_percent": readiness_percent, "completed_check_count": completed_check_count, "required_check_count": len(required_checks), - "can_claim_all_services_recovered_within_target": scorecard.get( - "can_claim_all_services_recovered_within_target" - ) - is True, + "can_claim_all_services_recovered_within_target": can_claim_slo, "observed_host_count": len(_strings(host_boot_detection.get("observed_hosts"))), "missing_host_count": len(_strings(host_boot_detection.get("missing_hosts"))), "unreachable_host_count": len( diff --git a/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py b/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py index bad059ec3..dff8c231c 100644 --- a/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py +++ b/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py @@ -30,11 +30,16 @@ def _assert_reboot_slo_payload(payload: dict): assert payload["schema_version"] == "reboot_auto_recovery_slo_scorecard_readback_v1" assert payload["priority"] == "P0-006" assert payload["status"] == "blocked_reboot_auto_recovery_slo_not_ready" + assert payload["safe_next_step"] == ( + "wait_next_stockplatform_retry_window_then_rerun_slo_verify_only_" + "no_reboot_no_db_write" + ) + assert payload["can_claim_all_services_recovered_within_target"] is False assert payload["readback"]["workplan_id"] == "P0-006" assert payload["readback"]["target_minutes"] == 10 assert payload["readback"]["safe_next_step"] == ( - "inspect_stockplatform_ingestion_readback_and_wait_retry_windows_then_" - "rerun_slo_verify_only_no_reboot" + "wait_next_stockplatform_retry_window_then_rerun_slo_verify_only_" + "no_reboot_no_db_write" ) assert payload["rollups"]["active_blocker_count"] == 6 assert payload["rollups"]["readiness_percent"] == 45 diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 54aa9aea7..ae8d64e5a 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,23 @@ +## 2026-06-29 — 20:21 P0-006 Stock retry readback still blocked + +**照優先順序讀回的真相**: +- 20:15 後重讀 StockPlatform:`/healthz`、`/api/healthz`、`/api/v1/system/freshness`、`/api/v1/system/ingestion` 都回 200;不是 route / container down。 +- Freshness 仍 `blocked`,blockers 維持 `core_margin_short_daily_missing`、`ai_recommendations_stale`。 +- Ingestion 仍 `blocked`,blocker 為 `core.margin_short_daily_incomplete`;20:05 retry 的 `official_margin_short_daily` source runs `3385` / `3386` 仍是 `official_pending`。 +- P0-006 SLO verify-only 仍讀回 timer `enabled/active`、service result `success`、metric present;metric `ready=0`、`blocker_count=4`、`max_host_uptime_seconds=537911`,latest artifact `/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-201605`。 +- Production `/api/v1/agents/reboot-auto-recovery-slo-scorecard` 已上線,但 top-level `safe_next_step` / `can_claim_all_services_recovered_within_target` 容易被讀成空值;本輪補 source mapping 與測試,避免 P0-006 readback 被誤讀。 + +**更新檔案**: +- `apps/api/src/services/reboot_auto_recovery_slo_scorecard.py` +- `apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py` +- `docs/operations/awoooi-priority-work-order-readback.snapshot.json` +- `docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json` + +**仍維持**: +- 沒有重啟任何主機,沒有 restart Docker / Nginx / K3s / DB / firewall。 +- 沒有讀 secret / token / `.env` / raw sessions / SQLite / auth,沒有寫 credential marker,沒有寫 StockPlatform DB。 +- 沒有使用 GitHub / `gh` / GitHub API / GitHub Actions。 + ## 2026-06-29 — OpenClaw Live Ops Space 納入 P1 工作項目 **完成內容**: diff --git a/docs/operations/awoooi-priority-work-order-readback.snapshot.json b/docs/operations/awoooi-priority-work-order-readback.snapshot.json index d29b05949..8e9a05513 100644 --- a/docs/operations/awoooi-priority-work-order-readback.snapshot.json +++ b/docs/operations/awoooi-priority-work-order-readback.snapshot.json @@ -77,18 +77,18 @@ } ], "current_head": { - "gitea_main_sha": "b9293b76b56cd327f34b4f2fb723674665f69a1c", - "latest_fetched_gitea_main_subject": "feat(api): validate gitea owner attestation intake", + "gitea_main_sha": "094f50ddbd2020446d3f5a7ca49377694dde6091", + "latest_fetched_gitea_main_subject": "chore(cd): deploy 1fb4bfc [skip ci]", "latest_source_readiness_cd_run_id": null, "latest_source_readiness_cd_run_status": "not_visible_in_public_queue_at_2026-06-29T19:20:13+08:00", - "latest_source_readiness_commit_sha": "85ac9ec5896fc28d8b9a4ab915db578dcd861645", - "latest_successful_deploy_marker": "95bbc6bea chore(cd): deploy 5981586 [skip ci]", - "latest_successful_deployed_source_sha": "5981586d0f2aa3c1baa00630df8121fab2126008", - "latest_verified_worktree_base_sha": "b9293b76", + "latest_source_readiness_commit_sha": "1fb4bfc09d1e2a192527fb53fdf4694ab2380b6d", + "latest_successful_deploy_marker": "094f50ddb chore(cd): deploy 1fb4bfc [skip ci]", + "latest_successful_deployed_source_sha": "1fb4bfc09d1e2a192527fb53fdf4694ab2380b6d", + "latest_verified_worktree_base_sha": "094f50ddb", "no_matching_runner_visible": false, "source_readiness_ci_fix_required": false }, - "generated_at": "2026-06-29T19:53:33+08:00", + "generated_at": "2026-06-29T20:21:35+08:00", "in_progress_or_blocked_in_priority_order": [ { "evidence": { @@ -106,13 +106,13 @@ "host_188_service_green": true, "host_boot_probe_missing_hosts": false, "host_boot_probe_source_present": true, - "latest_live_slo_artifact": "/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-191950", + "latest_live_slo_artifact": "/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-201605", "live_slo_metric_present": true, "live_slo_service_last_result": "success", "live_slo_timer_active": true, "live_slo_timer_enabled": true, "local_disk_free_gib_after_cleanup": 145.514, - "max_observed_uptime_seconds": 534664, + "max_observed_uptime_seconds": 537911, "missing_hosts": [], "observed_hosts": [ "110", @@ -166,101 +166,119 @@ ], "stock_latest_source_runs": [ { - "finished_at": "2026-06-29T11:05:17.201062Z", + "source_run_id": 3385, "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" + }, + { + "source_run_id": 3386, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" + }, + { "source_run_id": 3384, - "started_at": "2026-06-29T11:05:17.201062Z", + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T11:05:17.201062Z", + "finished_at": "2026-06-29T11:05:17.201062Z" }, { - "finished_at": "2026-06-29T11:05:17.201062Z", - "source_name": "official_margin_short_daily", "source_run_id": 3383, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", "started_at": "2026-06-29T11:05:17.201062Z", - "status": "official_pending", - "target_date": "2026-06-29" + "finished_at": "2026-06-29T11:05:17.201062Z" }, { - "finished_at": "2026-06-29T11:00:11.518268Z", - "source_name": "intelligence_security_linker", "source_run_id": 3382, + "source_name": "intelligence_security_linker", + "target_date": null, + "status": "succeeded", "started_at": "2026-06-29T11:00:11.518268Z", - "status": "succeeded", - "target_date": null + "finished_at": "2026-06-29T11:00:11.518268Z" }, { - "finished_at": "2026-06-29T11:00:10.289509Z", - "source_name": "intelligence_reports_import", "source_run_id": 3381, + "source_name": "intelligence_reports_import", + "target_date": null, + "status": "succeeded", "started_at": "2026-06-29T11:00:10.289509Z", - "status": "succeeded", - "target_date": null + "finished_at": "2026-06-29T11:00:10.289509Z" }, { - "finished_at": "2026-06-29T10:22:15.262488Z", - "source_name": "year_to_date_stock_backfill", "source_run_id": 3380, - "started_at": "2026-06-29T10:22:15.262488Z", + "source_name": "year_to_date_stock_backfill", + "target_date": null, "status": "planned", - "target_date": null + "started_at": "2026-06-29T10:22:15.262488Z", + "finished_at": "2026-06-29T10:22:15.262488Z" }, { - "finished_at": "2026-06-29T10:22:13.464934Z", - "source_name": "official_margin_short_daily", "source_run_id": 3378, - "started_at": "2026-06-29T10:22:13.464934Z", - "status": "official_pending", - "target_date": "2026-06-29" - }, - { - "finished_at": "2026-06-29T10:22:13.464934Z", "source_name": "official_margin_short_daily", - "source_run_id": 3379, - "started_at": "2026-06-29T10:22:13.464934Z", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T10:22:13.464934Z", + "finished_at": "2026-06-29T10:22:13.464934Z" + }, + { + "source_run_id": 3379, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T10:22:13.464934Z", + "finished_at": "2026-06-29T10:22:13.464934Z" }, { - "finished_at": "2026-06-29T10:21:56.651793Z", - "source_name": "community_etfinfo_holdings_daily", "source_run_id": 3345, - "started_at": "2026-06-29T10:21:56.651793Z", - "status": "succeeded", - "target_date": "2026-06-26" - }, - { - "finished_at": "2026-06-29T10:21:56.651793Z", - "source_name": "community_etfinfo_active_changes_daily", - "source_run_id": 3346, - "started_at": "2026-06-29T10:21:56.651793Z", - "status": "succeeded", - "target_date": "2026-06-26" - }, - { - "finished_at": "2026-06-29T10:21:56.651793Z", "source_name": "community_etfinfo_holdings_daily", - "source_run_id": 3343, - "started_at": "2026-06-29T10:21:56.651793Z", + "target_date": "2026-06-26", "status": "succeeded", - "target_date": "2026-06-26" + "started_at": "2026-06-29T10:21:56.651793Z", + "finished_at": "2026-06-29T10:21:56.651793Z" } ], "stock_latest_trading_date": "2026-06-29", "stock_official_margin_short_source_runs": [ { + "source_run_id": 3385, "source_name": "official_margin_short_daily", - "source_run_id": 3384, - "started_at": "2026-06-29T11:05:17.201062Z", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" }, { + "source_run_id": 3386, "source_name": "official_margin_short_daily", - "source_run_id": 3383, - "started_at": "2026-06-29T11:05:17.201062Z", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" + }, + { + "source_run_id": 3384, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T11:05:17.201062Z", + "finished_at": "2026-06-29T11:05:17.201062Z" + }, + { + "source_run_id": 3383, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T11:05:17.201062Z", + "finished_at": "2026-06-29T11:05:17.201062Z" } ], "stockplatform_api_healthz_green": true, @@ -274,7 +292,15 @@ "stockplatform_transient_502_before_success_seen": true, "target_minutes": 10, "unreachable_hosts": [], - "wazuh_dashboard_degraded": false + "wazuh_dashboard_degraded": false, + "latest_verify_only_metric": { + "ready": 0, + "blocker_count": 4, + "max_host_uptime_seconds": 537911, + "last_run_timestamp": 1782735360 + }, + "stock_ingestion_status": "blocked", + "stockplatform_second_retry_checked_at": "2026-06-29T20:21:35+08:00" }, "professional_fix": { "action": "Keep the live boot-triggered SLO timer enabled. Do not reboot or restart services from this lane. Treat StockPlatform freshness/ingestion as the current service recovery blocker: use the committed P0-006 scorecard and /api/v1/agents/reboot-auto-recovery-slo-scorecard readback, wait scheduled retry windows, then rerun verify-only. If still blocked after 23:35, open the controlled data recovery gate with source diff, check-mode/dry-run, rollback, and post-freshness verifier; never write manual DB rows or fake freshness.", @@ -295,8 +321,8 @@ ], "owner": "reboot auto-recovery lane plus StockPlatform freshness readback" }, - "reason": "P0-006 scorecard now directly imports StockPlatform freshness and ingestion readback. At 2026-06-29 before the 23:35 final retry window, StockPlatform public/API health is green but product data remains blocked by core_margin_short_daily_missing, ai_recommendations_stale, and ingestion core.margin_short_daily_incomplete. No reboot, restart, DB write, or fake freshness marker is allowed from this lane; rerun verify-only after retry windows, then open the controlled data recovery gate only if still blocked.", - "safe_next_step": "inspect_stockplatform_ingestion_readback_and_wait_retry_windows_then_rerun_slo_verify_only_no_reboot", + "reason": "P0-006 scorecard and live retry readback now directly show the 20:05 StockPlatform retry still blocked: public/API health is green, but freshness remains blocked by core_margin_short_daily_missing and ai_recommendations_stale, and ingestion remains blocked by core.margin_short_daily_incomplete with official_margin_short_daily source runs 3385/3386 still official_pending. No reboot, restart, DB write, or fake freshness marker is allowed from this lane; wait the next retry windows and rerun verify-only.", + "safe_next_step": "wait_next_stockplatform_retry_window_then_rerun_slo_verify_only_no_reboot_no_db_write", "status": "blocked_stockplatform_product_data_freshness_waiting_final_retry_window", "title": "主機重啟自動偵測、自動觸發與 10 分鐘恢復 SLO", "workplan_id": "P0-006" @@ -345,13 +371,16 @@ ], "stock_latest_trading_date": "2026-06-29", "stock_official_margin_short_source_runs": [ + 3385, + 3386, 3384, 3383 ], "stockplatform_api_healthz_green": true, "stockplatform_healthz_green": true, "stockplatform_ingestion_status": "blocked", - "summary_escrow_missing_count": 5 + "summary_escrow_missing_count": 5, + "stock_ingestion_status": "blocked" }, "missing_items": [ "restic_repository_password", @@ -375,8 +404,8 @@ ], "owner": "DR evidence lane" }, - "reason": "Backup/offsite core remains green and the credential escrow readiness API correctly exposes safe_next_step. Current product data freshness is blocked after the first EOD window by StockPlatform margin-short official_pending and stale AI recommendations; the separate DR blocker remains the five non-secret escrow evidence refs.", - "safe_next_step": "first_rerun_p0_006_stockplatform_freshness_after_retry_window_then_collect_five_non_secret_credential_escrow_evidence_refs_and_rerun_single_preflight", + "reason": "Backup/offsite core remains green and the credential escrow readiness API correctly exposes safe_next_step. Current product data freshness is still blocked after the 20:05 StockPlatform retry because official margin-short runs 3385/3386 remain official_pending; the separate DR blocker remains the five non-secret escrow evidence refs.", + "safe_next_step": "after_p0_006_stockplatform_freshness_clears_collect_five_non_secret_credential_escrow_evidence_refs_and_rerun_single_preflight", "status": "stock_freshness_blocked_and_waiting_non_secret_credential_escrow_evidence_refs", "title": "產品資料與備份 contract", "workplan_id": "P0-005" @@ -443,7 +472,7 @@ } ], "next_execution_order": [ - "P0-006: StockPlatform freshness/ingestion readback is now integrated into the reboot SLO scorecard; wait the 23:35 final retry window, rerun verify-only with no reboot/restart/DB write, and open controlled data recovery gate only if still blocked.", + "P0-006: StockPlatform freshness/ingestion readback remains blocked after the 20:05 retry; wait the next retry windows, rerun verify-only with no reboot/restart/DB write, and open controlled data recovery gate only if still blocked after the final retry window.", "P0-005: after P0-006 freshness clears, collect five non-secret credential escrow evidence refs and rerun one preflight; production API safe_next_step reads back correctly and backup/offsite core remains green.", "P0-003: supply authenticated/admin redacted inventory payload or owner coverage attestation, then run the Gitea payload validator; public-only live inventory remains four repos and GitHub remains stopped/retired/do_not_use.", "P1-OPENCLAW-LIVE-OPS-SPACE: build the Gather-like OpenClaw continuous animated live ops workspace only after the current P0 runtime truth blockers are no longer the active next action." @@ -594,7 +623,7 @@ "gitea_repo_inventory_snapshot": "docs/security/gitea-repo-inventory.snapshot.json", "global_scorecard": "~/.codex/product-runtime-governance-completion-scorecard.snapshot.json", "owner_requested_openclaw_live_ops_space": "2026-06-29 owner request: Gather-like OpenClaw continuous animated live ops workspace", - "post_reboot_summary": "/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-191950/summary.txt", + "post_reboot_summary": "/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-201605/summary.txt", "public_gitea_queue_readback": "ops/runner/read-public-gitea-actions-queue.py --json", "reboot_auto_recovery_slo_metric": "/home/wooo/node_exporter_textfiles/reboot_auto_recovery_slo.prom", "reboot_auto_recovery_slo_scorecard": "docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json", @@ -603,7 +632,7 @@ "stockplatform_ingestion_readback": "https://stock.wooo.work/api/v1/system/ingestion", "workstation_dashboard": "~/.codex/codex-workstation-sync-dashboard.snapshot.json" }, - "status": "p0_ordered_readback_p0_006_stock_freshness_retry_window_waiting_p0_005_refs_waiting_p0_003_payload_validator_ready", + "status": "p0_ordered_readback_p0_006_stock_freshness_second_retry_still_blocked_p0_005_refs_waiting_p0_003_payload_validator_ready", "stopped_or_do_not_use": [ { "allowed_actions": 0, diff --git a/docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json b/docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json index 96b7f102d..6d0d1cad8 100644 --- a/docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json +++ b/docs/operations/awoooi-reboot-auto-recovery-slo-scorecard.snapshot.json @@ -13,7 +13,7 @@ "free_gib": 4.454, "min_free_gib": 2.0 }, - "generated_at": "2026-06-29T19:49:30+08:00", + "generated_at": "2026-06-29T20:21:35+08:00", "host_boot_detection": { "host_rows": [ { @@ -61,7 +61,7 @@ "uptime_seconds": 534664 } ], - "max_observed_uptime_seconds": 534664, + "max_observed_uptime_seconds": 537911, "missing_hosts": [], "observed_hosts": [ "110", @@ -96,7 +96,7 @@ "summary_present": true, "wazuh_dashboard_degraded": false }, - "safe_next_step": "inspect_stockplatform_ingestion_readback_and_wait_retry_windows_then_rerun_slo_verify_only_no_reboot", + "safe_next_step": "wait_next_stockplatform_retry_window_then_rerun_slo_verify_only_no_reboot_no_db_write", "schema_version": "awoooi_reboot_auto_recovery_slo_scorecard_v1", "source_controls": { "cold_start_textfile_exporter_source_present": true, @@ -166,88 +166,96 @@ "ingestion_status": "blocked", "latest_source_runs": [ { - "finished_at": "2026-06-29T11:05:17.201062Z", + "source_run_id": 3385, "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" + }, + { + "source_run_id": 3386, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T12:05:16.716460Z", + "finished_at": "2026-06-29T12:05:16.716460Z" + }, + { "source_run_id": 3384, - "started_at": "2026-06-29T11:05:17.201062Z", + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T11:05:17.201062Z", + "finished_at": "2026-06-29T11:05:17.201062Z" }, { - "finished_at": "2026-06-29T11:05:17.201062Z", - "source_name": "official_margin_short_daily", "source_run_id": 3383, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", "started_at": "2026-06-29T11:05:17.201062Z", - "status": "official_pending", - "target_date": "2026-06-29" + "finished_at": "2026-06-29T11:05:17.201062Z" }, { - "finished_at": "2026-06-29T11:00:11.518268Z", - "source_name": "intelligence_security_linker", "source_run_id": 3382, + "source_name": "intelligence_security_linker", + "target_date": null, + "status": "succeeded", "started_at": "2026-06-29T11:00:11.518268Z", - "status": "succeeded", - "target_date": null + "finished_at": "2026-06-29T11:00:11.518268Z" }, { - "finished_at": "2026-06-29T11:00:10.289509Z", - "source_name": "intelligence_reports_import", "source_run_id": 3381, + "source_name": "intelligence_reports_import", + "target_date": null, + "status": "succeeded", "started_at": "2026-06-29T11:00:10.289509Z", - "status": "succeeded", - "target_date": null + "finished_at": "2026-06-29T11:00:10.289509Z" }, { - "finished_at": "2026-06-29T10:22:15.262488Z", - "source_name": "year_to_date_stock_backfill", "source_run_id": 3380, - "started_at": "2026-06-29T10:22:15.262488Z", + "source_name": "year_to_date_stock_backfill", + "target_date": null, "status": "planned", - "target_date": null + "started_at": "2026-06-29T10:22:15.262488Z", + "finished_at": "2026-06-29T10:22:15.262488Z" }, { - "finished_at": "2026-06-29T10:22:13.464934Z", - "source_name": "official_margin_short_daily", "source_run_id": 3378, - "started_at": "2026-06-29T10:22:13.464934Z", - "status": "official_pending", - "target_date": "2026-06-29" - }, - { - "finished_at": "2026-06-29T10:22:13.464934Z", "source_name": "official_margin_short_daily", - "source_run_id": 3379, - "started_at": "2026-06-29T10:22:13.464934Z", + "target_date": "2026-06-29", "status": "official_pending", - "target_date": "2026-06-29" + "started_at": "2026-06-29T10:22:13.464934Z", + "finished_at": "2026-06-29T10:22:13.464934Z" + }, + { + "source_run_id": 3379, + "source_name": "official_margin_short_daily", + "target_date": "2026-06-29", + "status": "official_pending", + "started_at": "2026-06-29T10:22:13.464934Z", + "finished_at": "2026-06-29T10:22:13.464934Z" }, { - "finished_at": "2026-06-29T10:21:56.651793Z", - "source_name": "community_etfinfo_holdings_daily", "source_run_id": 3345, - "started_at": "2026-06-29T10:21:56.651793Z", - "status": "succeeded", - "target_date": "2026-06-26" - }, - { - "finished_at": "2026-06-29T10:21:56.651793Z", - "source_name": "community_etfinfo_active_changes_daily", - "source_run_id": 3346, - "started_at": "2026-06-29T10:21:56.651793Z", - "status": "succeeded", - "target_date": "2026-06-26" - }, - { - "finished_at": "2026-06-29T10:21:56.651793Z", "source_name": "community_etfinfo_holdings_daily", - "source_run_id": 3343, - "started_at": "2026-06-29T10:21:56.651793Z", + "target_date": "2026-06-26", "status": "succeeded", - "target_date": "2026-06-26" + "started_at": "2026-06-29T10:21:56.651793Z", + "finished_at": "2026-06-29T10:21:56.651793Z" } ], - "latest_trading_date": "2026-06-29" + "latest_trading_date": "2026-06-29", + "second_retry_checked_at": "2026-06-29T20:21:35+08:00" }, "target_minutes": 10, - "target_seconds": 600 + "target_seconds": 600, + "latest_verify_only_metric": { + "ready": 0, + "blocker_count": 4, + "max_host_uptime_seconds": 537911, + "last_run_timestamp": 1782735360, + "artifact_dir": "/home/wooo/reboot-recovery/reboot-auto-recovery-slo-20260629-201605" + } }