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

This commit is contained in:
ogt
2026-07-02 21:20:30 +08:00
parent b9349159fb
commit 0beb3e4f10
7 changed files with 528 additions and 1 deletions

View File

@@ -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",

View File

@@ -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

View File

@@ -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": ""}