fix(stockplatform): classify ai recommendations stale after core recovery
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 58s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
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 58s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
This commit is contained in:
@@ -1417,6 +1417,41 @@ def test_awoooi_priority_work_order_readback_allows_parallel_mainline_on_stockpl
|
||||
assert payload["rollups"]["parallel_mainline_work_item_id"] == "CIR-P0-001"
|
||||
|
||||
|
||||
def test_awoooi_priority_work_order_readback_routes_stockplatform_ai_recommendations():
|
||||
payload = load_latest_awoooi_priority_work_order_readback()
|
||||
runtime = _stockplatform_runtime_ai_recommendations_stale_after_core_recovered()
|
||||
preflight = load_latest_stockplatform_public_api_controlled_recovery_preflight(
|
||||
runtime_readback=runtime
|
||||
)
|
||||
|
||||
apply_stockplatform_public_api_runtime_readback(payload, runtime)
|
||||
apply_stockplatform_public_api_controlled_recovery_preflight(payload, preflight)
|
||||
|
||||
state = payload["mainline_execution_state"]
|
||||
in_progress = payload["in_progress_or_blocked_in_priority_order"][0]
|
||||
evidence = in_progress["evidence"]
|
||||
assert state["stockplatform_public_api_data_dependency_classification"] == (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
assert state["next_executable_mainline_state"] == (
|
||||
"controlled_recovery_preflight_waiting_stockplatform_ai_"
|
||||
"recommendation_pipeline_readback_and_public_api_verifier"
|
||||
)
|
||||
assert evidence["stockplatform_freshness_status"] == "blocked"
|
||||
assert evidence["stockplatform_ingestion_status"] == "ok"
|
||||
assert evidence["stock_blockers"] == ["ai_recommendations_stale"]
|
||||
assert evidence["stock_ingestion_blockers"] == []
|
||||
assert evidence["stockplatform_source_contract_readback_status"] == (
|
||||
"stockplatform_source_contract_core_ready_ai_recommendations_stale"
|
||||
)
|
||||
assert "AI recommendation pipeline" in in_progress["professional_fix"]["action"]
|
||||
assert "AI recommendations are stale" in payload["next_execution_order"][0]
|
||||
assert payload["mainline_parallel_execution"]["enabled"] is True
|
||||
assert payload["mainline_parallel_execution"]["current_p0_wait_state"] == (
|
||||
"external_stockplatform_data_retry_wait"
|
||||
)
|
||||
|
||||
|
||||
def test_awoooi_priority_work_order_readback_normalizes_runtime_source_truth(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
):
|
||||
@@ -2010,6 +2045,54 @@ def _stockplatform_runtime_source_contract_blocked() -> dict:
|
||||
return payload
|
||||
|
||||
|
||||
def _stockplatform_runtime_ai_recommendations_stale_after_core_recovered() -> dict:
|
||||
payload = _stockplatform_runtime_source_contract_blocked()
|
||||
payload["safe_next_step"] = (
|
||||
"run_stockplatform_ai_recommendation_pipeline_readback_then_rerun_"
|
||||
"public_api_verifier"
|
||||
)
|
||||
payload["active_blockers"] = [
|
||||
"stockplatform_freshness_ai_recommendations_stale",
|
||||
"stockplatform_post_apply_public_api_verifier_not_green",
|
||||
]
|
||||
payload["readback"].update(
|
||||
{
|
||||
"freshness_status": "blocked",
|
||||
"ingestion_status": "ok",
|
||||
"freshness_blockers": ["ai_recommendations_stale"],
|
||||
"ingestion_blockers": [],
|
||||
"data_dependency_classification": (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
),
|
||||
"postgres_not_ready": False,
|
||||
}
|
||||
)
|
||||
payload["rollups"]["data_dependency_classification"] = (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
payload["rollups"]["postgres_not_ready"] = False
|
||||
payload["data_readiness_control_readback"]["status"] = (
|
||||
"blocked_stockplatform_ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
payload["data_readiness_control_readback"]["postgres_not_ready"] = False
|
||||
payload["source_contract_control_readback"]["status"] = (
|
||||
"stockplatform_source_contract_core_ready_ai_recommendations_stale"
|
||||
)
|
||||
payload["source_contract_control_readback"]["non_ok_source_count"] = 1
|
||||
payload["source_contract_control_readback"]["active_blockers"] = [
|
||||
"stockplatform_freshness_ai_recommendations_stale"
|
||||
]
|
||||
payload["source_contract_control_readback"]["blocking_sources"] = [
|
||||
{
|
||||
"source": "ai.recommendations",
|
||||
"category": "freshness",
|
||||
"status": "stale",
|
||||
"classification": "freshness_source_non_ok",
|
||||
},
|
||||
]
|
||||
return payload
|
||||
|
||||
|
||||
def _harbor_registry_ready() -> dict:
|
||||
return {
|
||||
"schema_version": "harbor_registry_controlled_recovery_preflight_v1",
|
||||
|
||||
@@ -184,6 +184,53 @@ def test_stockplatform_controlled_recovery_preflight_prefers_live_data_classific
|
||||
)
|
||||
|
||||
|
||||
def test_stockplatform_controlled_recovery_preflight_routes_ai_recommendations(
|
||||
tmp_path: Path,
|
||||
):
|
||||
payload = load_latest_stockplatform_public_api_controlled_recovery_preflight(
|
||||
runtime_readback=_runtime_ai_recommendations_stale_after_core_recovered(),
|
||||
route_source_path=_route_source(tmp_path),
|
||||
)
|
||||
|
||||
assert payload["status"] == (
|
||||
"controlled_data_dependency_preflight_packaged_waiting_control_path_readback"
|
||||
)
|
||||
assert payload["api_layer_classification"] == "api_live_data_dependency_not_ready"
|
||||
assert payload["data_dependency_classification"] == (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
assert payload["safe_next_step"] == (
|
||||
"run_stockplatform_ai_recommendation_pipeline_readback_then_"
|
||||
"public_api_verifier"
|
||||
)
|
||||
assert payload["controlled_apply_policy"]["current_apply_blocker"] == (
|
||||
"ai_recommendation_pipeline_readback_required_before_public_api_"
|
||||
"verifier"
|
||||
)
|
||||
assert "read_only_ai_recommendation_queue_status" in payload[
|
||||
"controlled_apply_policy"
|
||||
]["allowed_scope"]
|
||||
assert payload["source_of_truth_diff"][
|
||||
"data_readiness_control_readback_status"
|
||||
] == "blocked_stockplatform_ai_recommendations_stale_after_core_recovered"
|
||||
assert payload["source_of_truth_diff"][
|
||||
"source_contract_control_readback_status"
|
||||
] == "stockplatform_source_contract_core_ready_ai_recommendations_stale"
|
||||
assert payload["controlled_work_items"][0]["id"] == (
|
||||
"stockplatform-ai-recommendation-control-path-readback"
|
||||
)
|
||||
assert payload["controlled_work_items"][2]["id"] == (
|
||||
"stockplatform-ai-recommendation-pipeline-preflight"
|
||||
)
|
||||
assert payload["controlled_action_candidates"][0]["id"] == (
|
||||
"read_only_ai_recommendation_pipeline_readback"
|
||||
)
|
||||
assert payload["controlled_action_candidates"][1]["id"] == (
|
||||
"ai_recommendation_pipeline_verifier_preflight"
|
||||
)
|
||||
assert payload["operation_boundaries"]["database_write_or_restore_performed"] is False
|
||||
|
||||
|
||||
def test_stockplatform_controlled_recovery_preflight_endpoint_returns_payload(
|
||||
monkeypatch,
|
||||
tmp_path: Path,
|
||||
@@ -386,3 +433,46 @@ def _runtime_data_dependency_non_postgres_blocked() -> dict:
|
||||
],
|
||||
}
|
||||
return payload
|
||||
|
||||
|
||||
def _runtime_ai_recommendations_stale_after_core_recovered() -> dict:
|
||||
payload = _runtime_data_dependency_non_postgres_blocked()
|
||||
payload["safe_next_step"] = (
|
||||
"run_stockplatform_ai_recommendation_pipeline_readback_then_rerun_"
|
||||
"public_api_verifier"
|
||||
)
|
||||
payload["active_blockers"] = [
|
||||
"stockplatform_freshness_ai_recommendations_stale",
|
||||
"stockplatform_post_apply_public_api_verifier_not_green",
|
||||
]
|
||||
payload["readback"].update(
|
||||
{
|
||||
"freshness_status": "blocked",
|
||||
"ingestion_status": "ok",
|
||||
"freshness_blockers": ["ai_recommendations_stale"],
|
||||
"ingestion_blockers": [],
|
||||
"data_dependency_classification": (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
),
|
||||
}
|
||||
)
|
||||
payload["rollups"]["data_dependency_classification"] = (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
payload["data_readiness_control_readback"]["status"] = (
|
||||
"blocked_stockplatform_ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
payload["source_contract_control_readback"]["status"] = (
|
||||
"stockplatform_source_contract_core_ready_ai_recommendations_stale"
|
||||
)
|
||||
payload["source_contract_control_readback"]["active_blockers"] = [
|
||||
"stockplatform_freshness_ai_recommendations_stale"
|
||||
]
|
||||
payload["source_contract_control_readback"]["blocking_sources"] = [
|
||||
{
|
||||
"source": "ai.recommendations",
|
||||
"category": "freshness",
|
||||
"status": "stale",
|
||||
},
|
||||
]
|
||||
return payload
|
||||
|
||||
@@ -244,6 +244,56 @@ def test_stockplatform_public_api_runtime_readback_routes_data_dependency_withou
|
||||
]
|
||||
|
||||
|
||||
def test_stockplatform_public_api_runtime_readback_routes_ai_stale_after_core_recovered():
|
||||
payload = load_latest_stockplatform_public_api_runtime_readback(
|
||||
probe=_probe_public_api_ok_ai_recommendations_stale_after_core_recovered
|
||||
)
|
||||
|
||||
assert payload["status"] == "blocked_stockplatform_public_api_runtime_drift"
|
||||
assert payload["readback"]["api_health_http_status"] == 200
|
||||
assert payload["readback"]["freshness_status"] == "blocked"
|
||||
assert payload["readback"]["ingestion_status"] == "ok"
|
||||
assert payload["readback"]["freshness_latest_trading_date"] == "2026-07-02"
|
||||
assert payload["readback"]["freshness_blockers"] == [
|
||||
"ai_recommendations_stale"
|
||||
]
|
||||
assert payload["readback"]["data_dependency_classification"] == (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
assert payload["readback"][
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
] is True
|
||||
assert payload["safe_next_step"] == (
|
||||
"run_stockplatform_ai_recommendation_pipeline_readback_then_rerun_"
|
||||
"public_api_verifier"
|
||||
)
|
||||
assert payload["data_readiness_control_readback"]["status"] == (
|
||||
"blocked_stockplatform_ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
assert payload["source_contract_control_readback"]["status"] == (
|
||||
"stockplatform_source_contract_core_ready_ai_recommendations_stale"
|
||||
)
|
||||
assert payload["rollups"]["data_dependency_classification"] == (
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
)
|
||||
assert payload["rollups"][
|
||||
"ai_recommendations_stale_after_core_recovered"
|
||||
] is True
|
||||
assert "stockplatform_freshness_core_margin_short_daily_missing" not in payload[
|
||||
"active_blockers"
|
||||
]
|
||||
assert "stockplatform_ingestion_core.margin_short_daily_incomplete" not in payload[
|
||||
"active_blockers"
|
||||
]
|
||||
assert "stockplatform_postgres_not_ready" not in payload["active_blockers"]
|
||||
assert "stockplatform_freshness_ai_recommendations_stale" in payload[
|
||||
"active_blockers"
|
||||
]
|
||||
assert "stockplatform_post_apply_public_api_verifier_not_green" in payload[
|
||||
"active_blockers"
|
||||
]
|
||||
|
||||
|
||||
def test_stockplatform_public_api_runtime_endpoint_returns_readback(monkeypatch):
|
||||
monkeypatch.setattr(
|
||||
agents,
|
||||
@@ -378,3 +428,50 @@ def _probe_public_api_ok_data_dependency_blocked(
|
||||
"error": "",
|
||||
}
|
||||
return {"http_status": 200, "body": "ok", "error": ""}
|
||||
|
||||
|
||||
def _probe_public_api_ok_ai_recommendations_stale_after_core_recovered(
|
||||
url: str,
|
||||
timeout_seconds: float,
|
||||
) -> dict:
|
||||
del timeout_seconds
|
||||
if url.endswith("/api/v1/system/freshness"):
|
||||
return {
|
||||
"http_status": 200,
|
||||
"body": json.dumps(
|
||||
{
|
||||
"status": "blocked",
|
||||
"blockers": ["ai_recommendations_stale"],
|
||||
"latest_trading_date": "2026-07-02",
|
||||
"sources": [
|
||||
{"source": "core.price_daily", "status": "ok", "sla": {}},
|
||||
{
|
||||
"source": "core.margin_short_daily",
|
||||
"latest_date": "2026-07-02",
|
||||
"status": "ok",
|
||||
"sla": {},
|
||||
},
|
||||
{
|
||||
"source": "ai.recommendations",
|
||||
"latest_date": "2026-07-01",
|
||||
"status": "stale",
|
||||
"sla": {},
|
||||
},
|
||||
],
|
||||
}
|
||||
),
|
||||
"error": "",
|
||||
}
|
||||
if url.endswith("/api/v1/system/ingestion"):
|
||||
return {
|
||||
"http_status": 200,
|
||||
"body": json.dumps(
|
||||
{
|
||||
"status": "ok",
|
||||
"blockers": [],
|
||||
"latest_trading_date": "2026-07-02",
|
||||
}
|
||||
),
|
||||
"error": "",
|
||||
}
|
||||
return {"http_status": 200, "body": "ok", "error": ""}
|
||||
|
||||
Reference in New Issue
Block a user