fix(api): normalize priority work order source truth
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 24s
CD Pipeline / build-and-deploy (push) Successful in 9m37s
CD Pipeline / post-deploy-checks (push) Successful in 1m1s
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 24s
CD Pipeline / build-and-deploy (push) Successful in 9m37s
CD Pipeline / post-deploy-checks (push) Successful in 1m1s
This commit is contained in:
@@ -8,14 +8,18 @@ external SCM APIs.
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from src.services.snapshot_paths import default_operations_dir
|
||||
|
||||
_DEFAULT_OPERATIONS_DIR = default_operations_dir(Path(__file__))
|
||||
_SNAPSHOT_FILE = "awoooi-priority-work-order-readback.snapshot.json"
|
||||
_SCHEMA_VERSION = "awoooi_priority_work_order_readback_v1"
|
||||
_SHA_RE = re.compile(r"^[0-9a-f]{40}$")
|
||||
|
||||
|
||||
def load_latest_awoooi_priority_work_order_readback(
|
||||
@@ -117,26 +121,49 @@ def _enrich_from_current_readbacks(payload: dict[str, Any]) -> None:
|
||||
|
||||
runtime_sha = str(
|
||||
workbench_summary.get("production_deploy_runtime_build_commit_sha") or ""
|
||||
)
|
||||
).strip().lower()
|
||||
runtime_short_sha = str(
|
||||
workbench_summary.get("production_deploy_runtime_build_commit_short_sha") or ""
|
||||
)
|
||||
).strip().lower()
|
||||
desired_short_sha = str(
|
||||
workbench_summary.get(
|
||||
"production_deploy_desired_main_api_image_tag_short_sha"
|
||||
)
|
||||
or ""
|
||||
)
|
||||
).strip().lower()
|
||||
current_head = _dict(payload.setdefault("current_head", {}))
|
||||
current_head["latest_verified_worktree_base_sha"] = runtime_short_sha
|
||||
current_head["latest_successful_deployed_source_sha"] = runtime_sha
|
||||
current_head["latest_successful_deploy_marker"] = (
|
||||
f"production desired image tag {desired_short_sha}"
|
||||
runtime_source_truth_available = _is_sha(runtime_sha)
|
||||
if runtime_source_truth_available:
|
||||
runtime_short_sha = runtime_short_sha or runtime_sha[:10]
|
||||
desired_short_sha = desired_short_sha or runtime_short_sha
|
||||
production_readback_id = f"production_readback:{desired_short_sha}"
|
||||
production_subject = f"production desired image tag {desired_short_sha}"
|
||||
|
||||
current_head["gitea_main_sha"] = runtime_sha
|
||||
current_head["latest_fetched_gitea_main_subject"] = production_subject
|
||||
current_head["latest_source_readiness_cd_run_id"] = production_readback_id
|
||||
current_head["latest_verified_worktree_base_sha"] = runtime_short_sha
|
||||
current_head["latest_successful_deployed_source_sha"] = runtime_sha
|
||||
current_head["latest_successful_deploy_marker"] = production_subject
|
||||
current_head["latest_source_readiness_cd_run_status"] = (
|
||||
"production_readback_verified"
|
||||
)
|
||||
current_head["latest_source_readiness_commit_sha"] = runtime_sha
|
||||
|
||||
state["updated_at"] = _taipei_now_iso()
|
||||
state["current_main_cd_run_id"] = production_readback_id
|
||||
state["current_main_cd_run_status"] = "production_readback_verified"
|
||||
state["current_main_latest_source_sha"] = runtime_sha
|
||||
state["latest_successful_deployed_source_sha"] = runtime_sha
|
||||
state["reboot_drill_preflight_source_status"] = "production_endpoint_ready"
|
||||
state["p0_004_template_copy_apply_gate_source_status"] = (
|
||||
"production_endpoint_ready"
|
||||
)
|
||||
|
||||
current_head["production_source_truth_available"] = runtime_source_truth_available
|
||||
current_head["stale_current_head_metadata_normalized"] = (
|
||||
runtime_source_truth_available
|
||||
)
|
||||
current_head["latest_source_readiness_cd_run_status"] = (
|
||||
"production_readback_verified"
|
||||
)
|
||||
current_head["latest_source_readiness_commit_sha"] = runtime_sha
|
||||
current_head["no_matching_runner_visible"] = False
|
||||
current_head["source_readiness_ci_fix_required"] = False
|
||||
|
||||
@@ -276,6 +303,74 @@ def _enrich_from_current_readbacks(payload: dict[str, Any]) -> None:
|
||||
"failed CD runs, and retired GitHub lanes must not reorder closed work."
|
||||
),
|
||||
]
|
||||
_set_rollups_and_summary(
|
||||
payload=payload,
|
||||
current_head=current_head,
|
||||
state=state,
|
||||
p0_004_ready=p0_004_ready,
|
||||
p0_006_event_gated=p0_006_event_gated,
|
||||
runtime_source_truth_available=runtime_source_truth_available,
|
||||
runtime_sha=runtime_sha,
|
||||
)
|
||||
|
||||
|
||||
def _set_rollups_and_summary(
|
||||
*,
|
||||
payload: dict[str, Any],
|
||||
current_head: dict[str, Any],
|
||||
state: dict[str, Any],
|
||||
p0_004_ready: bool,
|
||||
p0_006_event_gated: bool,
|
||||
runtime_source_truth_available: bool,
|
||||
runtime_sha: str,
|
||||
) -> None:
|
||||
completed = _list(payload.get("completed_in_priority_order"))
|
||||
in_progress = _list(payload.get("in_progress_or_blocked_in_priority_order"))
|
||||
latest_source_sha = (
|
||||
runtime_sha
|
||||
if runtime_source_truth_available
|
||||
else str(current_head.get("latest_successful_deployed_source_sha") or "")
|
||||
)
|
||||
active_blockers = _strings(state.get("active_p0_live_active_blockers"))
|
||||
active_gap_count = _int(state.get("active_p0_immediate_apply_gap_count"))
|
||||
|
||||
payload["rollups"] = {
|
||||
"completed_p0_count": len(completed),
|
||||
"in_progress_or_blocked_count": len(in_progress),
|
||||
"active_p0_immediate_apply_gap_count": active_gap_count,
|
||||
"active_p0_event_gated_by_fresh_reboot_window_only": p0_006_event_gated,
|
||||
"active_p0_live_active_blocker_count": len(active_blockers),
|
||||
"p0_004_runtime_readback_ready": p0_004_ready,
|
||||
"reboot_drill_preflight_runtime_readback_ready": (
|
||||
state.get("reboot_drill_preflight_runtime_readback_state") == "ready"
|
||||
),
|
||||
"production_source_truth_available": runtime_source_truth_available,
|
||||
"stale_current_head_metadata_normalized": runtime_source_truth_available,
|
||||
"stale_cd_runs_reopen_closed_work": False,
|
||||
"break_glass_reboot_drill_required": True,
|
||||
}
|
||||
payload["summary"] = {
|
||||
"status": str(payload.get("status") or ""),
|
||||
"active_p0_workplan_id": str(state.get("active_p0_workplan_id") or ""),
|
||||
"active_p0_state": str(state.get("active_p0_state") or ""),
|
||||
"active_p0_readiness_percent": _int(
|
||||
state.get("active_p0_readiness_percent")
|
||||
),
|
||||
"active_p0_live_active_blockers": active_blockers,
|
||||
"latest_successful_deployed_source_sha": latest_source_sha,
|
||||
"latest_successful_deployed_source_short_sha": latest_source_sha[:10],
|
||||
"latest_successful_deploy_marker": str(
|
||||
current_head.get("latest_successful_deploy_marker") or ""
|
||||
),
|
||||
"next_executable_mainline_workplan_id": str(
|
||||
state.get("next_executable_mainline_workplan_id") or ""
|
||||
),
|
||||
"next_executable_mainline_state": str(
|
||||
state.get("next_executable_mainline_state") or ""
|
||||
),
|
||||
"production_source_truth_available": runtime_source_truth_available,
|
||||
"stale_current_head_metadata_normalized": runtime_source_truth_available,
|
||||
}
|
||||
|
||||
|
||||
def _require_schema(payload: dict[str, Any], label: str) -> None:
|
||||
@@ -358,3 +453,11 @@ def _int(value: Any) -> int:
|
||||
|
||||
def _strings(value: Any) -> list[str]:
|
||||
return [str(item) for item in _list(value)]
|
||||
|
||||
|
||||
def _is_sha(value: str) -> bool:
|
||||
return bool(_SHA_RE.fullmatch(value))
|
||||
|
||||
|
||||
def _taipei_now_iso() -> str:
|
||||
return datetime.now(ZoneInfo("Asia/Taipei")).isoformat(timespec="seconds")
|
||||
|
||||
@@ -42,12 +42,12 @@ from src.services.gitea_workflow_runner_owner_attestation_request import (
|
||||
from src.services.p0_cicd_baseline_source_readiness import (
|
||||
load_latest_p0_cicd_baseline_source_readiness,
|
||||
)
|
||||
from src.services.reboot_auto_recovery_slo_scorecard import (
|
||||
load_latest_reboot_auto_recovery_slo_scorecard,
|
||||
)
|
||||
from src.services.reboot_auto_recovery_drill_preflight import (
|
||||
load_latest_reboot_auto_recovery_drill_preflight,
|
||||
)
|
||||
from src.services.reboot_auto_recovery_slo_scorecard import (
|
||||
load_latest_reboot_auto_recovery_slo_scorecard,
|
||||
)
|
||||
from src.services.runtime_surface_inventory import (
|
||||
load_latest_runtime_surface_inventory,
|
||||
)
|
||||
|
||||
@@ -74,6 +74,50 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot():
|
||||
assert "do not reboot" in data["next_execution_order"][0]
|
||||
|
||||
|
||||
def test_awoooi_priority_work_order_readback_normalizes_runtime_source_truth(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
):
|
||||
runtime_sha = "b4dc407ce05c68a3908b993437a61b869d83810f"
|
||||
runtime_short_sha = runtime_sha[:10]
|
||||
monkeypatch.setenv("AWOOOI_BUILD_COMMIT_SHA", runtime_sha)
|
||||
monkeypatch.setenv("AWOOOI_DESIRED_API_IMAGE_TAG", runtime_sha)
|
||||
|
||||
payload = load_latest_awoooi_priority_work_order_readback()
|
||||
|
||||
current_head = payload["current_head"]
|
||||
state = payload["mainline_execution_state"]
|
||||
assert current_head["gitea_main_sha"] == runtime_sha
|
||||
assert current_head["latest_source_readiness_commit_sha"] == runtime_sha
|
||||
assert current_head["latest_source_readiness_cd_run_id"] == (
|
||||
f"production_readback:{runtime_short_sha}"
|
||||
)
|
||||
assert current_head["latest_fetched_gitea_main_subject"] == (
|
||||
f"production desired image tag {runtime_short_sha}"
|
||||
)
|
||||
assert current_head["stale_current_head_metadata_normalized"] is True
|
||||
assert state["current_main_latest_source_sha"] == runtime_sha
|
||||
assert state["latest_successful_deployed_source_sha"] == runtime_sha
|
||||
assert state["current_main_cd_run_status"] == "production_readback_verified"
|
||||
assert state["p0_004_template_copy_apply_gate_source_status"] == (
|
||||
"production_endpoint_ready"
|
||||
)
|
||||
assert state["reboot_drill_preflight_source_status"] == "production_endpoint_ready"
|
||||
assert payload["rollups"]["stale_current_head_metadata_normalized"] is True
|
||||
assert payload["summary"]["latest_successful_deployed_source_sha"] == runtime_sha
|
||||
|
||||
current_truth = json.dumps(
|
||||
{
|
||||
"current_head": current_head,
|
||||
"mainline_execution_state": state,
|
||||
},
|
||||
ensure_ascii=False,
|
||||
sort_keys=True,
|
||||
)
|
||||
assert "3973" not in current_truth
|
||||
assert "49637ee7" not in current_truth
|
||||
assert "f426522" not in current_truth
|
||||
|
||||
|
||||
def test_awoooi_priority_work_order_readback_rejects_reordered_active_p0(tmp_path):
|
||||
operations_dir = tmp_path / "docs" / "operations"
|
||||
operations_dir.mkdir(parents=True)
|
||||
|
||||
Reference in New Issue
Block a user