fix(priority): expose runtime readback freshness
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 47s
CD Pipeline / build-and-deploy (push) Successful in 4m22s
CD Pipeline / post-deploy-checks (push) Successful in 1m44s

This commit is contained in:
Your Name
2026-07-02 15:54:03 +08:00
parent dc4547b1de
commit 2bbbd458bc
3 changed files with 55 additions and 0 deletions

View File

@@ -812,6 +812,7 @@ def load_latest_awoooi_priority_work_order_readback(
_enrich_from_current_readbacks(payload)
_require_mainline_consistency(payload, str(path))
_apply_commander_inserted_requirement_work_items(payload)
_mark_runtime_generated_at(payload)
return payload
@@ -960,6 +961,8 @@ def apply_controlled_cd_lane_live_metric_readback(
active_blockers
)
_mark_runtime_generated_at(payload)
def apply_stockplatform_public_api_runtime_readback(
payload: dict[str, Any],
@@ -3329,6 +3332,27 @@ def _apply_commander_inserted_requirement_work_items(
)
def _mark_runtime_generated_at(payload: dict[str, Any]) -> None:
snapshot_generated_at = str(
payload.get("snapshot_generated_at") or payload.get("generated_at") or ""
)
runtime_generated_at = _taipei_now_iso()
if snapshot_generated_at:
payload["snapshot_generated_at"] = snapshot_generated_at
payload["generated_at"] = runtime_generated_at
payload["runtime_readback_generated_at"] = runtime_generated_at
summary = _dict(payload.setdefault("summary", {}))
if snapshot_generated_at:
summary["snapshot_generated_at"] = snapshot_generated_at
summary["generated_at"] = runtime_generated_at
summary["runtime_readback_generated_at"] = runtime_generated_at
rollups = _dict(payload.setdefault("rollups", {}))
rollups["runtime_readback_generated_at_present"] = True
def _require_schema(payload: dict[str, Any], label: str) -> None:
actual = payload.get("schema_version")
if actual != _SCHEMA_VERSION:

View File

@@ -43,6 +43,10 @@ def test_awoooi_priority_work_order_readback_loader_returns_mainline_order():
payload = load_latest_awoooi_priority_work_order_readback()
assert payload["schema_version"] == "awoooi_priority_work_order_readback_v1"
assert payload["snapshot_generated_at"] == "2026-06-29T23:50:52+08:00"
assert payload["generated_at"] != payload["snapshot_generated_at"]
assert payload["generated_at"].endswith("+08:00")
assert payload["runtime_readback_generated_at"] == payload["generated_at"]
assert payload["status"] == "p0_006_blocked_reboot_auto_recovery_slo_not_ready"
assert payload["mainline_execution_state"]["active_p0_workplan_id"] == "P0-006"
assert payload["mainline_execution_state"]["active_p0_state"] == (
@@ -248,6 +252,12 @@ def test_awoooi_priority_work_order_readback_loader_returns_mainline_order():
payload["summary"]["controlled_service_data_backup_readback_present"]
is True
)
assert payload["summary"]["snapshot_generated_at"] == payload[
"snapshot_generated_at"
]
assert payload["summary"]["runtime_readback_generated_at"] == payload[
"runtime_readback_generated_at"
]
assert payload["summary"]["controlled_service_data_backup_blocker_count"] == 4
assert payload["summary"][
"controlled_service_data_backup_next_safe_action"
@@ -373,6 +383,10 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
assert response.status_code == 200
data = response.json()
assert data["snapshot_generated_at"] == "2026-06-29T23:50:52+08:00"
assert data["generated_at"] != data["snapshot_generated_at"]
assert data["runtime_readback_generated_at"] == data["generated_at"]
assert data["summary"]["runtime_readback_generated_at"] == data["generated_at"]
assert data["status"] == "p0_006_blocked_ai_loop_current_blocker_execution_queue"
assert data["mainline_execution_state"]["active_p0_workplan_id"] == "P0-006"
assert data["mainline_execution_state"]["active_p0_state"] == (

View File

@@ -52953,3 +52953,20 @@ production browser smoke:
- 沒有讀 secret / token / `.env` / raw sessions / SQLite / auth沒有要求或收集 Windows 密碼。
- 沒有使用 GitHub / gh / GitHub API / GitHub Actions。
- 沒有重啟主機,沒有 service restart沒有 VM power change沒有 Windows policy apply沒有 workflow_dispatch沒有 DROP / TRUNCATE / restore / prune。
## 2026-07-02 — Priority work-order runtime generated_at freshness 修正
**完成內容**
- `#4406` 已完成:`add790a47f` 的 controlled-runtime tests、API/Web image push、ArgoCD sync、API/Web/Worker rollout 與 production deploy readback 均成功production scorecard 已讀回 `2026-07-02T15:08:44+08:00`、readiness `43`、active blockers `11`
- production `awoooi-priority-work-order-readback``summary` / `mainline_execution_state` 已是最新 runtime truth`latest_successful_deployed_source_short_sha=add790a47f``windows99_management_readback_present=true``windows99_remote_execution_channel_ready=false``windows99_ssh_batch_status=permission_denied`、插入工作項 `55` 筆。
- 修正 priority readback 的 top-level freshness原始 snapshot 時間保留在 `snapshot_generated_at`top-level `generated_at``runtime_readback_generated_at` 改為 runtime readback 生成時間,避免監控或人工只看 top-level `generated_at=2026-06-29T23:50:52+08:00` 誤判 production stale。
**本地驗證結果**
- `DATABASE_URL=postgresql+asyncpg://test:test@localhost/test PYTHONPATH=apps/api python3.11 -m pytest apps/api/tests/test_awoooi_priority_work_order_readback_api.py -q -p no:cacheprovider``14 passed`
- `DATABASE_URL=postgresql+asyncpg://test:test@localhost/test PYTHONPATH=apps/api python3.11 -m pytest ops/runner/test_cd_controlled_runtime_profile.py scripts/reboot-recovery/tests/test_windows99_vmware_verify_collector.py scripts/reboot-recovery/tests/test_reboot_auto_recovery_slo_scorecard.py apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py apps/api/tests/test_delivery_closure_workbench_api.py -q -p no:cacheprovider``70 passed`
- `python3.11 -m py_compile apps/api/src/services/awoooi_priority_work_order_readback.py apps/api/tests/test_awoooi_priority_work_order_readback_api.py``python3 ops/runner/guard-gitea-runner-pressure.py --root .``git diff --check`:通過。
**仍維持**
- 沒有讀 secret / runner token / `.runner` 內容 / `.env` / raw sessions / SQLite / auth。
- 沒有使用 GitHub / gh / GitHub API / GitHub Actions。
- 沒有重啟主機,沒有 Docker / Nginx / K3s / DB / firewall restart沒有 workflow_dispatch沒有 DROP / TRUNCATE / restore / prune。